1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_accessibility.hxx" 30 #include <accessibility/standard/vclxaccessibletoolboxitem.hxx> 31 #include <toolkit/helper/convert.hxx> 32 #include <accessibility/helper/accresmgr.hxx> 33 #include <accessibility/helper/accessiblestrings.hrc> 34 #include <com/sun/star/awt/Point.hpp> 35 #include <com/sun/star/awt/Rectangle.hpp> 36 #include <com/sun/star/awt/Size.hpp> 37 38 #include <com/sun/star/accessibility/AccessibleEventId.hpp> 39 #include <com/sun/star/accessibility/AccessibleRole.hpp> 40 #include <com/sun/star/accessibility/AccessibleStateType.hpp> 41 #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp> 42 #include <com/sun/star/datatransfer/clipboard/XFlushableClipboard.hpp> 43 #include <tools/debug.hxx> 44 #include <vcl/svapp.hxx> 45 #include <vcl/toolbox.hxx> 46 #include <vcl/unohelp2.hxx> 47 #include <vcl/help.hxx> 48 #include <toolkit/awt/vclxwindow.hxx> 49 #include <toolkit/helper/externallock.hxx> 50 #include <unotools/accessiblestatesethelper.hxx> 51 #include <unotools/accessiblerelationsethelper.hxx> 52 #include <cppuhelper/typeprovider.hxx> 53 #include <comphelper/sequence.hxx> 54 55 #include <com/sun/star/accessibility/XAccessibleSelection.hpp> 56 57 // class VCLXAccessibleToolBoxItem ------------------------------------------ 58 59 using namespace ::com::sun::star::accessibility; 60 using namespace ::com::sun::star::uno; 61 using namespace ::com::sun::star::beans; 62 using namespace ::com::sun::star::lang; 63 using namespace ::com::sun::star; 64 using namespace ::comphelper; 65 66 DBG_NAME(VCLXAccessibleToolBoxItem) 67 68 // ----------------------------------------------------------------------------- 69 // Ctor() and Dtor() 70 // ----------------------------------------------------------------------------- 71 VCLXAccessibleToolBoxItem::VCLXAccessibleToolBoxItem( ToolBox* _pToolBox, sal_Int32 _nPos ) : 72 73 AccessibleTextHelper_BASE( new VCLExternalSolarLock() ), 74 75 m_pToolBox ( _pToolBox ), 76 m_nIndexInParent( _nPos ), 77 m_nRole ( AccessibleRole::PUSH_BUTTON ), 78 m_nItemId ( 0 ), 79 m_bHasFocus ( sal_False ), 80 m_bIsChecked ( sal_False ), 81 m_bIndeterminate( false ) 82 83 { 84 DBG_CTOR( VCLXAccessibleToolBoxItem, NULL ); 85 86 m_pExternalLock = static_cast< VCLExternalSolarLock* >( getExternalLock( ) ); 87 88 DBG_ASSERT( m_pToolBox, "invalid toolbox" ); 89 m_nItemId = m_pToolBox->GetItemId( (sal_uInt16)m_nIndexInParent ); 90 m_sOldName = GetText( true ); 91 m_bIsChecked = m_pToolBox->IsItemChecked( m_nItemId ); 92 m_bIndeterminate = ( m_pToolBox->GetItemState( m_nItemId ) == STATE_DONTKNOW ); 93 ToolBoxItemType eType = m_pToolBox->GetItemType( (sal_uInt16)m_nIndexInParent ); 94 switch ( eType ) 95 { 96 case TOOLBOXITEM_BUTTON : 97 { 98 ToolBoxItemBits nBits = m_pToolBox->GetItemBits( m_nItemId ); 99 if (( nBits & TIB_DROPDOWN ) == TIB_DROPDOWN) 100 m_nRole = AccessibleRole::BUTTON_DROPDOWN; 101 else if (( ( nBits & TIB_CHECKABLE ) == TIB_CHECKABLE ) || 102 ( ( nBits & TIB_AUTOCHECK ) == TIB_AUTOCHECK ) ) 103 m_nRole = AccessibleRole::TOGGLE_BUTTON; 104 else if ( m_pToolBox->GetItemWindow( m_nItemId ) ) 105 m_nRole = AccessibleRole::PANEL; 106 break; 107 } 108 109 case TOOLBOXITEM_SPACE : 110 m_nRole = AccessibleRole::FILLER; 111 break; 112 113 case TOOLBOXITEM_SEPARATOR : 114 case TOOLBOXITEM_BREAK : 115 m_nRole = AccessibleRole::SEPARATOR; 116 break; 117 118 default: 119 { 120 DBG_ERRORFILE( "unsupported toolbox itemtype" ); 121 } 122 } 123 } 124 // ----------------------------------------------------------------------------- 125 VCLXAccessibleToolBoxItem::~VCLXAccessibleToolBoxItem() 126 { 127 DBG_DTOR( VCLXAccessibleToolBoxItem, NULL ); 128 129 delete m_pExternalLock; 130 m_pExternalLock = NULL; 131 } 132 // ----------------------------------------------------------------------------- 133 ::rtl::OUString VCLXAccessibleToolBoxItem::GetText( bool _bAsName ) 134 { 135 ::rtl::OUString sRet; 136 // no text for separators and spaces 137 if ( m_pToolBox && m_nItemId > 0 && ( _bAsName || m_pToolBox->GetButtonType() != BUTTON_SYMBOL ) ) 138 { 139 sRet = m_pToolBox->GetItemText( m_nItemId ); 140 //OJ #108243# we only read the name of the toolboxitem 141 // 142 // Window* pItemWindow = m_pToolBox->GetItemWindow( m_nItemId ); 143 // if ( pItemWindow && pItemWindow->GetAccessible().is() && 144 // pItemWindow->GetAccessible()->getAccessibleContext().is() ) 145 // { 146 // ::rtl::OUString sWinText = pItemWindow->GetAccessible()->getAccessibleContext()->getAccessibleName(); 147 // if ( ( sRet.getLength() > 0 ) && ( sWinText.getLength() > 0 ) ) 148 // sRet += String( RTL_CONSTASCII_USTRINGPARAM( " " ) ); 149 // sRet += sWinText; 150 // } 151 } 152 return sRet; 153 } 154 // ----------------------------------------------------------------------------- 155 void VCLXAccessibleToolBoxItem::SetFocus( sal_Bool _bFocus ) 156 { 157 if ( m_bHasFocus != _bFocus ) 158 { 159 Any aOldValue; 160 Any aNewValue; 161 if ( m_bHasFocus ) 162 aOldValue <<= AccessibleStateType::FOCUSED; 163 else 164 aNewValue <<= AccessibleStateType::FOCUSED; 165 m_bHasFocus = _bFocus; 166 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue ); 167 } 168 } 169 // ----------------------------------------------------------------------------- 170 void VCLXAccessibleToolBoxItem::SetChecked( sal_Bool _bCheck ) 171 { 172 if ( m_bIsChecked != _bCheck ) 173 { 174 Any aOldValue; 175 Any aNewValue; 176 if ( m_bIsChecked ) 177 aOldValue <<= AccessibleStateType::CHECKED; 178 else 179 aNewValue <<= AccessibleStateType::CHECKED; 180 m_bIsChecked = _bCheck; 181 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue ); 182 } 183 } 184 // ----------------------------------------------------------------------------- 185 void VCLXAccessibleToolBoxItem::SetIndeterminate( bool _bIndeterminate ) 186 { 187 if ( m_bIndeterminate != _bIndeterminate ) 188 { 189 Any aOldValue, aNewValue; 190 if ( m_bIndeterminate ) 191 aOldValue <<= AccessibleStateType::INDETERMINATE; 192 else 193 aNewValue <<= AccessibleStateType::INDETERMINATE; 194 m_bIndeterminate = _bIndeterminate; 195 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue ); 196 } 197 } 198 // ----------------------------------------------------------------------------- 199 void VCLXAccessibleToolBoxItem::NameChanged() 200 { 201 ::rtl::OUString sNewName = implGetText(); 202 if ( sNewName != m_sOldName ) 203 { 204 Any aOldValue, aNewValue; 205 aOldValue <<= m_sOldName; 206 // save new name as old name for next change 207 m_sOldName = sNewName; 208 aNewValue <<= m_sOldName; 209 NotifyAccessibleEvent( AccessibleEventId::NAME_CHANGED, aOldValue, aNewValue ); 210 } 211 } 212 // ----------------------------------------------------------------------------- 213 void VCLXAccessibleToolBoxItem::SetChild( const Reference< XAccessible >& _xChild ) 214 { 215 m_xChild = _xChild; 216 } 217 // ----------------------------------------------------------------------------- 218 void VCLXAccessibleToolBoxItem::NotifyChildEvent( const Reference< XAccessible >& _xChild, bool _bShow ) 219 { 220 Any aOld = _bShow ? Any() : makeAny( _xChild ); 221 Any aNew = _bShow ? makeAny( _xChild ) : Any(); 222 NotifyAccessibleEvent( AccessibleEventId::CHILD, aOld, aNew ); 223 } 224 // ----------------------------------------------------------------------------- 225 void VCLXAccessibleToolBoxItem::ToggleEnableState() 226 { 227 Any aOldValue[2], aNewValue[2]; 228 if ( m_pToolBox->IsItemEnabled( m_nItemId ) ) 229 { 230 aNewValue[0] <<= AccessibleStateType::SENSITIVE; 231 aNewValue[1] <<= AccessibleStateType::ENABLED; 232 } 233 else 234 { 235 aOldValue[0] <<= AccessibleStateType::ENABLED; 236 aOldValue[1] <<= AccessibleStateType::SENSITIVE; 237 } 238 239 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue[0], aNewValue[0] ); 240 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue[1], aNewValue[1] ); 241 } 242 // ----------------------------------------------------------------------------- 243 awt::Rectangle SAL_CALL VCLXAccessibleToolBoxItem::implGetBounds( ) throw (RuntimeException) 244 { 245 awt::Rectangle aRect; 246 if ( m_pToolBox ) 247 aRect = AWTRectangle( m_pToolBox->GetItemPosRect( (sal_uInt16)m_nIndexInParent ) ); 248 249 return aRect; 250 } 251 // ----------------------------------------------------------------------------- 252 ::rtl::OUString VCLXAccessibleToolBoxItem::implGetText() 253 { 254 return GetText (true); 255 } 256 // ----------------------------------------------------------------------------- 257 Locale VCLXAccessibleToolBoxItem::implGetLocale() 258 { 259 return Application::GetSettings().GetUILocale(); 260 } 261 // ----------------------------------------------------------------------------- 262 void VCLXAccessibleToolBoxItem::implGetSelection( sal_Int32& nStartIndex, sal_Int32& nEndIndex ) 263 { 264 nStartIndex = 0; 265 nEndIndex = 0; 266 } 267 // ----------------------------------------------------------------------------- 268 // XInterface 269 // ----------------------------------------------------------------------------- 270 IMPLEMENT_FORWARD_REFCOUNT( VCLXAccessibleToolBoxItem, AccessibleTextHelper_BASE ) 271 Any SAL_CALL VCLXAccessibleToolBoxItem::queryInterface( const Type& _rType ) throw (RuntimeException) 272 { 273 // --> PB 2004-09-03 #i33611# - toolbox buttons without text don't support XAccessibleText 274 if ( _rType == ::getCppuType( ( const Reference< XAccessibleText >* ) 0 ) 275 && ( !m_pToolBox || m_pToolBox->GetButtonType() == BUTTON_SYMBOL ) ) 276 return Any(); 277 // <-- 278 279 ::com::sun::star::uno::Any aReturn = AccessibleTextHelper_BASE::queryInterface( _rType ); 280 if ( !aReturn.hasValue() ) 281 aReturn = VCLXAccessibleToolBoxItem_BASE::queryInterface( _rType ); 282 return aReturn; 283 } 284 // ----------------------------------------------------------------------------- 285 // XTypeProvider 286 // ----------------------------------------------------------------------------- 287 IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXAccessibleToolBoxItem, AccessibleTextHelper_BASE, VCLXAccessibleToolBoxItem_BASE ) 288 // ----------------------------------------------------------------------------- 289 // XComponent 290 // ----------------------------------------------------------------------------- 291 void SAL_CALL VCLXAccessibleToolBoxItem::disposing() 292 { 293 AccessibleTextHelper_BASE::disposing(); 294 m_pToolBox = NULL; 295 } 296 // ----------------------------------------------------------------------------- 297 // XServiceInfo 298 // ----------------------------------------------------------------------------- 299 ::rtl::OUString VCLXAccessibleToolBoxItem::getImplementationName() throw (RuntimeException) 300 { 301 return ::rtl::OUString::createFromAscii( "com.sun.star.comp.toolkit.AccessibleToolBoxItem" ); 302 } 303 // ----------------------------------------------------------------------------- 304 sal_Bool VCLXAccessibleToolBoxItem::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException) 305 { 306 Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() ); 307 const ::rtl::OUString* pNames = aNames.getConstArray(); 308 const ::rtl::OUString* pEnd = pNames + aNames.getLength(); 309 for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames ) 310 ; 311 312 return pNames != pEnd; 313 } 314 // ----------------------------------------------------------------------------- 315 Sequence< ::rtl::OUString > VCLXAccessibleToolBoxItem::getSupportedServiceNames() throw (RuntimeException) 316 { 317 Sequence< ::rtl::OUString > aNames(4); 318 aNames[0] = ::rtl::OUString::createFromAscii( "com.sun.star.accessibility.AccessibleContext" ); 319 aNames[1] = ::rtl::OUString::createFromAscii( "com.sun.star.accessibility.AccessibleComponent" ); 320 aNames[2] = ::rtl::OUString::createFromAscii( "com.sun.star.accessibility.AccessibleExtendedComponent" ); 321 aNames[3] = ::rtl::OUString::createFromAscii( "com.sun.star.accessibility.AccessibleToolBoxItem" ); 322 return aNames; 323 } 324 // ----------------------------------------------------------------------------- 325 // XAccessible 326 // ----------------------------------------------------------------------------- 327 Reference< XAccessibleContext > SAL_CALL VCLXAccessibleToolBoxItem::getAccessibleContext( ) throw (RuntimeException) 328 { 329 return this; 330 } 331 // ----------------------------------------------------------------------------- 332 // XAccessibleContext 333 // ----------------------------------------------------------------------------- 334 sal_Int32 SAL_CALL VCLXAccessibleToolBoxItem::getAccessibleChildCount( ) throw (RuntimeException) 335 { 336 OContextEntryGuard aGuard( this ); 337 338 return m_xChild.is() ? 1 : 0; 339 } 340 // ----------------------------------------------------------------------------- 341 Reference< XAccessible > SAL_CALL VCLXAccessibleToolBoxItem::getAccessibleChild( sal_Int32 i ) throw (RuntimeException, com::sun::star::lang::IndexOutOfBoundsException) 342 { 343 OContextEntryGuard aGuard( this ); 344 345 // no child -> so index is out of bounds 346 if ( !m_xChild.is() || i != 0 ) 347 throw IndexOutOfBoundsException(); 348 349 return m_xChild; 350 } 351 // ----------------------------------------------------------------------------- 352 Reference< XAccessible > SAL_CALL VCLXAccessibleToolBoxItem::getAccessibleParent( ) throw (RuntimeException) 353 { 354 OContextEntryGuard aGuard( this ); 355 356 return m_pToolBox->GetAccessible(); 357 } 358 // ----------------------------------------------------------------------------- 359 sal_Int32 SAL_CALL VCLXAccessibleToolBoxItem::getAccessibleIndexInParent( ) throw (RuntimeException) 360 { 361 OContextEntryGuard aGuard( this ); 362 363 return m_nIndexInParent; 364 } 365 // ----------------------------------------------------------------------------- 366 sal_Int16 SAL_CALL VCLXAccessibleToolBoxItem::getAccessibleRole( ) throw (RuntimeException) 367 { 368 OContextEntryGuard aGuard( this ); 369 370 return m_nRole; 371 } 372 // ----------------------------------------------------------------------------- 373 ::rtl::OUString SAL_CALL VCLXAccessibleToolBoxItem::getAccessibleDescription( ) throw (RuntimeException) 374 { 375 OExternalLockGuard aGuard( this ); 376 377 ::rtl::OUString sDescription; 378 if ( m_pToolBox ) 379 sDescription = m_pToolBox->GetHelpText( m_nItemId ); 380 381 return sDescription; 382 } 383 // ----------------------------------------------------------------------------- 384 ::rtl::OUString SAL_CALL VCLXAccessibleToolBoxItem::getAccessibleName( ) throw (RuntimeException) 385 { 386 OExternalLockGuard aGuard( this ); 387 388 // entry text == accessible name 389 return GetText( true ); 390 } 391 // ----------------------------------------------------------------------------- 392 Reference< XAccessibleRelationSet > SAL_CALL VCLXAccessibleToolBoxItem::getAccessibleRelationSet( ) throw (RuntimeException) 393 { 394 OContextEntryGuard aGuard( this ); 395 396 utl::AccessibleRelationSetHelper* pRelationSetHelper = new utl::AccessibleRelationSetHelper; 397 Reference< XAccessibleRelationSet > xSet = pRelationSetHelper; 398 return xSet; 399 } 400 // ----------------------------------------------------------------------------- 401 Reference< XAccessibleStateSet > SAL_CALL VCLXAccessibleToolBoxItem::getAccessibleStateSet( ) throw (RuntimeException) 402 { 403 OExternalLockGuard aGuard( this ); 404 405 utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper; 406 Reference< XAccessibleStateSet > xStateSet = pStateSetHelper; 407 408 if ( m_pToolBox && !rBHelper.bDisposed && !rBHelper.bInDispose ) 409 { 410 pStateSetHelper->AddState( AccessibleStateType::FOCUSABLE ); 411 if ( m_bIsChecked ) 412 pStateSetHelper->AddState( AccessibleStateType::CHECKED ); 413 if ( m_bIndeterminate ) 414 pStateSetHelper->AddState( AccessibleStateType::INDETERMINATE ); 415 if ( m_pToolBox->IsItemEnabled( m_nItemId ) ) 416 { 417 pStateSetHelper->AddState( AccessibleStateType::ENABLED ); 418 pStateSetHelper->AddState( AccessibleStateType::SENSITIVE ); 419 } 420 if ( m_pToolBox->IsItemVisible( m_nItemId ) ) 421 pStateSetHelper->AddState( AccessibleStateType::VISIBLE ); 422 if ( m_pToolBox->IsItemReallyVisible( m_nItemId ) ) 423 pStateSetHelper->AddState( AccessibleStateType::SHOWING ); 424 if ( m_bHasFocus ) 425 pStateSetHelper->AddState( AccessibleStateType::FOCUSED ); 426 } 427 else 428 pStateSetHelper->AddState( AccessibleStateType::DEFUNC ); 429 430 return xStateSet; 431 } 432 // ----------------------------------------------------------------------------- 433 // XAccessibleText 434 // ----------------------------------------------------------------------------- 435 sal_Int32 SAL_CALL VCLXAccessibleToolBoxItem::getCaretPosition() throw (RuntimeException) 436 { 437 return -1; 438 } 439 // ----------------------------------------------------------------------------- 440 sal_Bool SAL_CALL VCLXAccessibleToolBoxItem::setCaretPosition( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 441 { 442 OExternalLockGuard aGuard( this ); 443 444 if ( !implIsValidRange( nIndex, nIndex, implGetText().getLength() ) ) 445 throw IndexOutOfBoundsException(); 446 447 return sal_False; 448 } 449 // ----------------------------------------------------------------------------- 450 Sequence< PropertyValue > SAL_CALL VCLXAccessibleToolBoxItem::getCharacterAttributes( sal_Int32 nIndex, const Sequence< ::rtl::OUString >& ) throw (IndexOutOfBoundsException, RuntimeException) 451 { 452 OExternalLockGuard aGuard( this ); 453 454 ::rtl::OUString sText( implGetText() ); 455 456 if ( !implIsValidIndex( nIndex, sText.getLength() ) ) 457 throw IndexOutOfBoundsException(); 458 459 return Sequence< PropertyValue >(); 460 } 461 // ----------------------------------------------------------------------------- 462 awt::Rectangle SAL_CALL VCLXAccessibleToolBoxItem::getCharacterBounds( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 463 { 464 OExternalLockGuard aGuard( this ); 465 466 ::rtl::OUString sText( implGetText() ); 467 468 if ( !implIsValidIndex( nIndex, sText.getLength() ) ) 469 throw IndexOutOfBoundsException(); 470 471 awt::Rectangle aBounds( 0, 0, 0, 0 ); 472 if ( m_pToolBox && m_pToolBox->GetButtonType() != BUTTON_SYMBOL ) // symbol buttons have no character bounds 473 { 474 Rectangle aCharRect = m_pToolBox->GetCharacterBounds( m_nItemId, nIndex ); 475 Rectangle aItemRect = m_pToolBox->GetItemRect( m_nItemId ); 476 aCharRect.Move( -aItemRect.Left(), -aItemRect.Top() ); 477 aBounds = AWTRectangle( aCharRect ); 478 } 479 480 return aBounds; 481 } 482 // ----------------------------------------------------------------------------- 483 sal_Int32 SAL_CALL VCLXAccessibleToolBoxItem::getIndexAtPoint( const awt::Point& aPoint ) throw (RuntimeException) 484 { 485 OExternalLockGuard aGuard( this ); 486 487 sal_Int32 nIndex = -1; 488 if ( m_pToolBox && m_pToolBox->GetButtonType() != BUTTON_SYMBOL ) // symbol buttons have no character bounds 489 { 490 sal_uInt16 nItemId = 0; 491 Rectangle aItemRect = m_pToolBox->GetItemRect( m_nItemId ); 492 Point aPnt( VCLPoint( aPoint ) ); 493 aPnt += aItemRect.TopLeft(); 494 sal_Int32 nIdx = m_pToolBox->GetIndexForPoint( aPnt, nItemId ); 495 if ( nIdx != -1 && nItemId == m_nItemId ) 496 nIndex = nIdx; 497 } 498 499 return nIndex; 500 } 501 // ----------------------------------------------------------------------------- 502 sal_Bool SAL_CALL VCLXAccessibleToolBoxItem::setSelection( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException) 503 { 504 OExternalLockGuard aGuard( this ); 505 506 if ( !implIsValidRange( nStartIndex, nEndIndex, implGetText().getLength() ) ) 507 throw IndexOutOfBoundsException(); 508 509 return sal_False; 510 } 511 // ----------------------------------------------------------------------------- 512 sal_Bool SAL_CALL VCLXAccessibleToolBoxItem::copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException) 513 { 514 OExternalLockGuard aGuard( this ); 515 516 if ( !implIsValidRange( nStartIndex, nEndIndex, implGetText().getLength() ) ) 517 throw IndexOutOfBoundsException(); 518 519 sal_Bool bReturn = sal_False; 520 521 if ( m_pToolBox ) 522 { 523 Reference< datatransfer::clipboard::XClipboard > xClipboard = m_pToolBox->GetClipboard(); 524 if ( xClipboard.is() ) 525 { 526 ::rtl::OUString sText( getTextRange( nStartIndex, nEndIndex ) ); 527 528 ::vcl::unohelper::TextDataObject* pDataObj = new ::vcl::unohelper::TextDataObject( sText ); 529 const sal_uInt32 nRef = Application::ReleaseSolarMutex(); 530 xClipboard->setContents( pDataObj, NULL ); 531 532 Reference< datatransfer::clipboard::XFlushableClipboard > xFlushableClipboard( xClipboard, uno::UNO_QUERY ); 533 if( xFlushableClipboard.is() ) 534 xFlushableClipboard->flushClipboard(); 535 536 Application::AcquireSolarMutex( nRef ); 537 538 bReturn = sal_True; 539 } 540 } 541 542 return bReturn; 543 } 544 // ----------------------------------------------------------------------------- 545 // XAccessibleComponent 546 // ----------------------------------------------------------------------------- 547 Reference< XAccessible > SAL_CALL VCLXAccessibleToolBoxItem::getAccessibleAtPoint( const awt::Point& ) throw (RuntimeException) 548 { 549 return Reference< XAccessible >(); 550 } 551 // ----------------------------------------------------------------------------- 552 void SAL_CALL VCLXAccessibleToolBoxItem::grabFocus( ) throw (RuntimeException) 553 { 554 Reference< XAccessible > xParent(getAccessibleParent()); 555 556 if( xParent.is() ) 557 { 558 Reference< XAccessibleSelection > rxAccessibleSelection(xParent->getAccessibleContext(), UNO_QUERY); 559 560 if ( rxAccessibleSelection.is() ) 561 { 562 rxAccessibleSelection -> selectAccessibleChild ( getAccessibleIndexInParent() ); 563 } 564 } 565 } 566 // ----------------------------------------------------------------------------- 567 sal_Int32 SAL_CALL VCLXAccessibleToolBoxItem::getForeground( ) throw (RuntimeException) 568 { 569 OExternalLockGuard aGuard( this ); 570 571 sal_Int32 nColor = 0; 572 if ( m_pToolBox ) 573 nColor = m_pToolBox->GetControlForeground().GetColor(); 574 575 return nColor; 576 } 577 // ----------------------------------------------------------------------------- 578 sal_Int32 SAL_CALL VCLXAccessibleToolBoxItem::getBackground( ) throw (RuntimeException) 579 { 580 OExternalLockGuard aGuard( this ); 581 582 sal_Int32 nColor = 0; 583 if ( m_pToolBox ) 584 nColor = m_pToolBox->GetControlBackground().GetColor(); 585 586 return nColor; 587 } 588 // ----------------------------------------------------------------------------- 589 // XAccessibleExtendedComponent 590 // ----------------------------------------------------------------------------- 591 Reference< awt::XFont > SAL_CALL VCLXAccessibleToolBoxItem::getFont( ) throw (RuntimeException) 592 { 593 return uno::Reference< awt::XFont >(); 594 } 595 // ----------------------------------------------------------------------------- 596 awt::FontDescriptor SAL_CALL VCLXAccessibleToolBoxItem::getFontMetrics( const Reference< awt::XFont >& xFont ) throw (RuntimeException) 597 { 598 return xFont->getFontDescriptor(); 599 } 600 // ----------------------------------------------------------------------------- 601 ::rtl::OUString SAL_CALL VCLXAccessibleToolBoxItem::getTitledBorderText( ) throw (RuntimeException) 602 { 603 OExternalLockGuard aGuard( this ); 604 605 ::rtl::OUString sRet; 606 if ( m_pToolBox ) 607 sRet = m_pToolBox->GetItemText( m_nItemId ); 608 609 return sRet; 610 } 611 // ----------------------------------------------------------------------------- 612 ::rtl::OUString SAL_CALL VCLXAccessibleToolBoxItem::getToolTipText( ) throw (RuntimeException) 613 { 614 OExternalLockGuard aGuard( this ); 615 616 ::rtl::OUString sRet; 617 if ( m_pToolBox ) 618 { 619 if ( Help::IsExtHelpEnabled() ) 620 sRet = m_pToolBox->GetHelpText( m_nItemId ); 621 else 622 sRet = m_pToolBox->GetQuickHelpText( m_nItemId ); 623 if ( !sRet.getLength() ) 624 // no help text set, so use item text 625 sRet = m_pToolBox->GetItemText( m_nItemId ); 626 } 627 return sRet; 628 } 629 // ----------------------------------------------------------------------------- 630 // XAccessibleAction 631 // ----------------------------------------------------------------------------- 632 sal_Int32 VCLXAccessibleToolBoxItem::getAccessibleActionCount( ) throw (RuntimeException) 633 { 634 // only one action -> "Click" 635 return 1; 636 } 637 // ----------------------------------------------------------------------------- 638 sal_Bool VCLXAccessibleToolBoxItem::doAccessibleAction ( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 639 { 640 OExternalLockGuard aGuard( this ); 641 642 if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) 643 throw IndexOutOfBoundsException(); 644 645 if ( m_pToolBox ) 646 m_pToolBox->TriggerItem( m_nItemId ); 647 648 return sal_True; 649 } 650 // ----------------------------------------------------------------------------- 651 ::rtl::OUString VCLXAccessibleToolBoxItem::getAccessibleActionDescription ( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 652 { 653 OExternalLockGuard aGuard( this ); 654 655 if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) 656 throw IndexOutOfBoundsException(); 657 658 return ::rtl::OUString( TK_RES_STRING( RID_STR_ACC_ACTION_CLICK ) ); 659 } 660 // ----------------------------------------------------------------------------- 661 Reference< XAccessibleKeyBinding > VCLXAccessibleToolBoxItem::getAccessibleActionKeyBinding( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 662 { 663 OContextEntryGuard aGuard( this ); 664 665 if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) 666 throw IndexOutOfBoundsException(); 667 668 return Reference< XAccessibleKeyBinding >(); 669 } 670 // ----------------------------------------------------------------------------- 671 // XAccessibleValue 672 // ----------------------------------------------------------------------------- 673 Any VCLXAccessibleToolBoxItem::getCurrentValue( ) throw (RuntimeException) 674 { 675 OExternalLockGuard aGuard( this ); 676 677 Any aValue; 678 if ( m_pToolBox ) 679 aValue <<= (sal_Int32)m_pToolBox->IsItemChecked( m_nItemId ); 680 681 return aValue; 682 } 683 // ----------------------------------------------------------------------------- 684 sal_Bool VCLXAccessibleToolBoxItem::setCurrentValue( const Any& aNumber ) throw (RuntimeException) 685 { 686 OExternalLockGuard aGuard( this ); 687 688 sal_Bool bReturn = sal_False; 689 690 if ( m_pToolBox ) 691 { 692 sal_Int32 nValue = 0; 693 OSL_VERIFY( aNumber >>= nValue ); 694 695 if ( nValue < 0 ) 696 nValue = 0; 697 else if ( nValue > 1 ) 698 nValue = 1; 699 700 m_pToolBox->CheckItem( m_nItemId, (sal_Bool) nValue ); 701 bReturn = sal_True; 702 } 703 704 return bReturn; 705 } 706 // ----------------------------------------------------------------------------- 707 Any VCLXAccessibleToolBoxItem::getMaximumValue( ) throw (RuntimeException) 708 { 709 return makeAny((sal_Int32)1); 710 } 711 // ----------------------------------------------------------------------------- 712 Any VCLXAccessibleToolBoxItem::getMinimumValue( ) throw (RuntimeException) 713 { 714 return makeAny((sal_Int32)0); 715 } 716 // ----------------------------------------------------------------------------- 717 718 719