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 31 // includes -------------------------------------------------------------- 32 #include <accessibility/standard/vclxaccessibleedit.hxx> 33 34 #include <toolkit/awt/vclxwindows.hxx> 35 #include <toolkit/helper/convert.hxx> 36 #include <accessibility/helper/accresmgr.hxx> 37 #include <accessibility/helper/accessiblestrings.hrc> 38 39 #include <unotools/accessiblestatesethelper.hxx> 40 #include <unotools/accessiblerelationsethelper.hxx> 41 #include <com/sun/star/accessibility/AccessibleStateType.hpp> 42 #include <com/sun/star/accessibility/AccessibleEventId.hpp> 43 #include <com/sun/star/accessibility/AccessibleRole.hpp> 44 #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp> 45 #include <cppuhelper/typeprovider.hxx> 46 #include <comphelper/sequence.hxx> 47 #include <vcl/svapp.hxx> 48 #include <vcl/window.hxx> 49 #include <vcl/edit.hxx> 50 #include <sot/exchange.hxx> 51 #include <sot/formats.hxx> 52 53 #include <algorithm> 54 55 using namespace ::com::sun::star; 56 using namespace ::com::sun::star::uno; 57 using namespace ::com::sun::star::lang; 58 using namespace ::com::sun::star::beans; 59 using namespace ::com::sun::star::accessibility; 60 using namespace ::comphelper; 61 62 63 // ----------------------------------------------------------------------------- 64 // VCLXAccessibleEdit 65 // ----------------------------------------------------------------------------- 66 67 VCLXAccessibleEdit::VCLXAccessibleEdit( VCLXWindow* pVCLWindow ) 68 :VCLXAccessibleTextComponent( pVCLWindow ) 69 { 70 m_nSelectionStart = getSelectionStart(); 71 m_nCaretPosition = getCaretPosition(); 72 } 73 74 // ----------------------------------------------------------------------------- 75 76 VCLXAccessibleEdit::~VCLXAccessibleEdit() 77 { 78 } 79 80 // ----------------------------------------------------------------------------- 81 82 void VCLXAccessibleEdit::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) 83 { 84 switch ( rVclWindowEvent.GetId() ) 85 { 86 case VCLEVENT_EDIT_MODIFY: 87 { 88 SetText( implGetText() ); 89 } 90 break; 91 case VCLEVENT_EDIT_SELECTIONCHANGED: 92 { 93 sal_Int32 nOldCaretPosition = m_nCaretPosition; 94 sal_Int32 nOldSelectionStart = m_nSelectionStart; 95 96 m_nCaretPosition = getCaretPosition(); 97 m_nSelectionStart = getSelectionStart(); 98 99 Window* pWindow = GetWindow(); 100 if ( pWindow && pWindow->HasChildPathFocus() ) 101 { 102 if ( m_nCaretPosition != nOldCaretPosition ) 103 { 104 Any aOldValue, aNewValue; 105 aOldValue <<= (sal_Int32) nOldCaretPosition; 106 aNewValue <<= (sal_Int32) m_nCaretPosition; 107 NotifyAccessibleEvent( AccessibleEventId::CARET_CHANGED, aOldValue, aNewValue ); 108 } 109 110 // #i104470# VCL only has SELECTION_CHANGED, but UAA distinguishes between SELECTION_CHANGED and CARET_CHANGED 111 sal_Bool bHasSelection = ( m_nSelectionStart != m_nCaretPosition ); 112 sal_Bool bHadSelection = ( nOldSelectionStart != nOldCaretPosition ); 113 if ( ( bHasSelection != bHadSelection ) || ( bHasSelection && ( ( m_nCaretPosition != nOldCaretPosition ) || ( m_nSelectionStart != nOldSelectionStart ) ) ) ) 114 { 115 NotifyAccessibleEvent( AccessibleEventId::TEXT_SELECTION_CHANGED, Any(), Any() ); 116 } 117 118 } 119 } 120 break; 121 default: 122 VCLXAccessibleTextComponent::ProcessWindowEvent( rVclWindowEvent ); 123 } 124 } 125 126 // ----------------------------------------------------------------------------- 127 128 void VCLXAccessibleEdit::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet ) 129 { 130 VCLXAccessibleTextComponent::FillAccessibleStateSet( rStateSet ); 131 132 VCLXEdit* pVCLXEdit = static_cast< VCLXEdit* >( GetVCLXWindow() ); 133 if ( pVCLXEdit ) 134 { 135 rStateSet.AddState( AccessibleStateType::FOCUSABLE ); 136 rStateSet.AddState( AccessibleStateType::SINGLE_LINE ); 137 if ( pVCLXEdit->isEditable() ) 138 rStateSet.AddState( AccessibleStateType::EDITABLE ); 139 } 140 } 141 142 // ----------------------------------------------------------------------------- 143 // OCommonAccessibleText 144 // ----------------------------------------------------------------------------- 145 146 ::rtl::OUString VCLXAccessibleEdit::implGetText() 147 { 148 ::rtl::OUString aText; 149 150 Edit* pEdit = static_cast< Edit* >( GetWindow() ); 151 if ( pEdit ) 152 { 153 aText = OutputDevice::GetNonMnemonicString( pEdit->GetText() ); 154 155 if ( getAccessibleRole() == AccessibleRole::PASSWORD_TEXT ) 156 { 157 xub_Unicode cEchoChar = pEdit->GetEchoChar(); 158 if ( !cEchoChar ) 159 cEchoChar = '*'; 160 XubString sTmp; 161 aText = sTmp.Fill( (sal_uInt16)aText.getLength(), cEchoChar ); 162 } 163 } 164 165 return aText; 166 } 167 168 // ----------------------------------------------------------------------------- 169 170 void VCLXAccessibleEdit::implGetSelection( sal_Int32& nStartIndex, sal_Int32& nEndIndex ) 171 { 172 awt::Selection aSelection; 173 VCLXEdit* pVCLXEdit = static_cast< VCLXEdit* >( GetVCLXWindow() ); 174 if ( pVCLXEdit ) 175 aSelection = pVCLXEdit->getSelection(); 176 177 nStartIndex = aSelection.Min; 178 nEndIndex = aSelection.Max; 179 } 180 181 // ----------------------------------------------------------------------------- 182 // XInterface 183 // ----------------------------------------------------------------------------- 184 185 IMPLEMENT_FORWARD_XINTERFACE2( VCLXAccessibleEdit, VCLXAccessibleTextComponent, VCLXAccessibleEdit_BASE ) 186 187 // ----------------------------------------------------------------------------- 188 // XTypeProvider 189 // ----------------------------------------------------------------------------- 190 191 IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXAccessibleEdit, VCLXAccessibleTextComponent, VCLXAccessibleEdit_BASE ) 192 193 // ----------------------------------------------------------------------------- 194 // XServiceInfo 195 // ----------------------------------------------------------------------------- 196 197 ::rtl::OUString VCLXAccessibleEdit::getImplementationName() throw (RuntimeException) 198 { 199 return ::rtl::OUString::createFromAscii( "com.sun.star.comp.toolkit.AccessibleEdit" ); 200 } 201 202 // ----------------------------------------------------------------------------- 203 204 Sequence< ::rtl::OUString > VCLXAccessibleEdit::getSupportedServiceNames() throw (RuntimeException) 205 { 206 Sequence< ::rtl::OUString > aNames(1); 207 aNames[0] = ::rtl::OUString::createFromAscii( "com.sun.star.awt.AccessibleEdit" ); 208 return aNames; 209 } 210 211 // ----------------------------------------------------------------------------- 212 // XAccessibleContext 213 // ----------------------------------------------------------------------------- 214 215 sal_Int32 VCLXAccessibleEdit::getAccessibleChildCount() throw (RuntimeException) 216 { 217 OExternalLockGuard aGuard( this ); 218 219 return 0; 220 } 221 222 // ----------------------------------------------------------------------------- 223 224 Reference< XAccessible > VCLXAccessibleEdit::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException, RuntimeException) 225 { 226 OExternalLockGuard aGuard( this ); 227 228 if ( i < 0 || i >= getAccessibleChildCount() ) 229 throw IndexOutOfBoundsException(); 230 231 return Reference< XAccessible >(); 232 } 233 234 // ----------------------------------------------------------------------------- 235 236 sal_Int16 VCLXAccessibleEdit::getAccessibleRole( ) throw (RuntimeException) 237 { 238 OExternalLockGuard aGuard( this ); 239 240 sal_Int16 nRole; 241 Edit* pEdit = static_cast< Edit* >( GetWindow() ); 242 if ( pEdit && ( ( pEdit->GetStyle() & WB_PASSWORD ) || pEdit->GetEchoChar() ) ) 243 nRole = AccessibleRole::PASSWORD_TEXT; 244 else 245 nRole = AccessibleRole::TEXT; 246 247 return nRole; 248 } 249 250 // ----------------------------------------------------------------------------- 251 // XAccessibleAction 252 // ----------------------------------------------------------------------------- 253 254 sal_Int32 VCLXAccessibleEdit::getAccessibleActionCount( ) throw (RuntimeException) 255 { 256 OExternalLockGuard aGuard( this ); 257 258 // There is one action: activate 259 return 1; 260 } 261 262 // ----------------------------------------------------------------------------- 263 264 sal_Bool VCLXAccessibleEdit::doAccessibleAction ( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 265 { 266 OExternalLockGuard aGuard( this ); 267 268 if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) 269 throw IndexOutOfBoundsException(); 270 271 sal_Bool bDoAction = sal_False; 272 Window* pWindow = GetWindow(); 273 if ( pWindow ) 274 { 275 pWindow->GrabFocus(); 276 bDoAction = sal_True; 277 } 278 279 return bDoAction; 280 } 281 282 // ----------------------------------------------------------------------------- 283 284 ::rtl::OUString VCLXAccessibleEdit::getAccessibleActionDescription ( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 285 { 286 OExternalLockGuard aGuard( this ); 287 288 if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) 289 throw IndexOutOfBoundsException(); 290 291 static const ::rtl::OUString sAction( RTL_CONSTASCII_USTRINGPARAM( "activate" ) ); 292 return sAction; 293 } 294 295 // ----------------------------------------------------------------------------- 296 297 Reference< XAccessibleKeyBinding > VCLXAccessibleEdit::getAccessibleActionKeyBinding( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 298 { 299 OExternalLockGuard aGuard( this ); 300 301 if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) 302 throw IndexOutOfBoundsException(); 303 304 return Reference< XAccessibleKeyBinding >(); 305 } 306 307 // ----------------------------------------------------------------------------- 308 // XAccessibleText 309 // ----------------------------------------------------------------------------- 310 311 sal_Int32 VCLXAccessibleEdit::getCaretPosition( ) throw (RuntimeException) 312 { 313 return getSelectionEnd(); 314 } 315 316 // ----------------------------------------------------------------------------- 317 318 sal_Bool VCLXAccessibleEdit::setCaretPosition( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 319 { 320 return setSelection( nIndex, nIndex ); 321 } 322 323 // ----------------------------------------------------------------------------- 324 325 sal_Unicode VCLXAccessibleEdit::getCharacter( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 326 { 327 OExternalLockGuard aGuard( this ); 328 329 return VCLXAccessibleTextComponent::getCharacter( nIndex ); 330 } 331 332 // ----------------------------------------------------------------------------- 333 334 Sequence< PropertyValue > VCLXAccessibleEdit::getCharacterAttributes( sal_Int32 nIndex, const Sequence< ::rtl::OUString >& aRequestedAttributes ) throw (IndexOutOfBoundsException, RuntimeException) 335 { 336 OExternalLockGuard aGuard( this ); 337 338 return VCLXAccessibleTextComponent::getCharacterAttributes( nIndex, aRequestedAttributes ); 339 } 340 341 // ----------------------------------------------------------------------------- 342 343 awt::Rectangle VCLXAccessibleEdit::getCharacterBounds( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 344 { 345 OExternalLockGuard aGuard( this ); 346 347 awt::Rectangle aBounds( 0, 0, 0, 0 ); 348 sal_Int32 nLength = implGetText().getLength(); 349 350 if ( !implIsValidRange( nIndex, nIndex, nLength ) ) 351 throw IndexOutOfBoundsException(); 352 353 Control* pControl = static_cast< Control* >( GetWindow() ); 354 if ( pControl ) 355 { 356 if ( nIndex == nLength ) 357 { 358 // #108914# calculate virtual bounding rectangle 359 for ( sal_Int32 i = 0; i < nLength; ++i ) 360 { 361 Rectangle aRect = pControl->GetCharacterBounds( i ); 362 sal_Int32 nHeight = aRect.GetHeight(); 363 if ( aBounds.Height < nHeight ) 364 { 365 aBounds.Y = aRect.Top(); 366 aBounds.Height = nHeight; 367 } 368 if ( i == nLength - 1 ) 369 { 370 aBounds.X = aRect.Right() + 1; 371 aBounds.Width = 1; 372 } 373 } 374 } 375 else 376 { 377 aBounds = AWTRectangle( pControl->GetCharacterBounds( nIndex ) ); 378 } 379 } 380 381 return aBounds; 382 } 383 384 // ----------------------------------------------------------------------------- 385 386 sal_Int32 VCLXAccessibleEdit::getCharacterCount( ) throw (RuntimeException) 387 { 388 OExternalLockGuard aGuard( this ); 389 390 return VCLXAccessibleTextComponent::getCharacterCount(); 391 } 392 393 // ----------------------------------------------------------------------------- 394 395 sal_Int32 VCLXAccessibleEdit::getIndexAtPoint( const awt::Point& aPoint ) throw (RuntimeException) 396 { 397 OExternalLockGuard aGuard( this ); 398 399 return VCLXAccessibleTextComponent::getIndexAtPoint( aPoint ); 400 } 401 402 // ----------------------------------------------------------------------------- 403 404 ::rtl::OUString VCLXAccessibleEdit::getSelectedText( ) throw (RuntimeException) 405 { 406 OExternalLockGuard aGuard( this ); 407 408 return VCLXAccessibleTextComponent::getSelectedText(); 409 } 410 411 // ----------------------------------------------------------------------------- 412 413 sal_Int32 VCLXAccessibleEdit::getSelectionStart( ) throw (RuntimeException) 414 { 415 OExternalLockGuard aGuard( this ); 416 417 return VCLXAccessibleTextComponent::getSelectionStart(); 418 } 419 420 // ----------------------------------------------------------------------------- 421 422 sal_Int32 VCLXAccessibleEdit::getSelectionEnd( ) throw (RuntimeException) 423 { 424 OExternalLockGuard aGuard( this ); 425 426 return VCLXAccessibleTextComponent::getSelectionEnd(); 427 } 428 429 // ----------------------------------------------------------------------------- 430 431 sal_Bool VCLXAccessibleEdit::setSelection( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException) 432 { 433 OExternalLockGuard aGuard( this ); 434 435 sal_Bool bReturn = sal_False; 436 ::rtl::OUString sText( implGetText() ); 437 438 if ( !implIsValidRange( nStartIndex, nEndIndex, sText.getLength() ) ) 439 throw IndexOutOfBoundsException(); 440 441 VCLXEdit* pVCLXEdit = static_cast< VCLXEdit* >( GetVCLXWindow() ); 442 Edit* pEdit = static_cast< Edit* >( GetWindow() ); 443 if ( pVCLXEdit && pEdit && pEdit->IsEnabled() ) 444 { 445 pVCLXEdit->setSelection( awt::Selection( nStartIndex, nEndIndex ) ); 446 bReturn = sal_True; 447 } 448 449 return bReturn; 450 } 451 452 // ----------------------------------------------------------------------------- 453 454 ::rtl::OUString VCLXAccessibleEdit::getText( ) throw (RuntimeException) 455 { 456 OExternalLockGuard aGuard( this ); 457 458 return VCLXAccessibleTextComponent::getText(); 459 } 460 461 // ----------------------------------------------------------------------------- 462 463 ::rtl::OUString VCLXAccessibleEdit::getTextRange( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException) 464 { 465 OExternalLockGuard aGuard( this ); 466 467 return VCLXAccessibleTextComponent::getTextRange( nStartIndex, nEndIndex ); 468 } 469 470 // ----------------------------------------------------------------------------- 471 472 ::com::sun::star::accessibility::TextSegment VCLXAccessibleEdit::getTextAtIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) 473 { 474 OExternalLockGuard aGuard( this ); 475 476 return VCLXAccessibleTextComponent::getTextAtIndex( nIndex, aTextType ); 477 } 478 479 // ----------------------------------------------------------------------------- 480 481 ::com::sun::star::accessibility::TextSegment VCLXAccessibleEdit::getTextBeforeIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) 482 { 483 OExternalLockGuard aGuard( this ); 484 485 return VCLXAccessibleTextComponent::getTextBeforeIndex( nIndex, aTextType ); 486 } 487 488 // ----------------------------------------------------------------------------- 489 490 ::com::sun::star::accessibility::TextSegment VCLXAccessibleEdit::getTextBehindIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) 491 { 492 OExternalLockGuard aGuard( this ); 493 494 return VCLXAccessibleTextComponent::getTextBehindIndex( nIndex, aTextType ); 495 } 496 497 // ----------------------------------------------------------------------------- 498 499 sal_Bool VCLXAccessibleEdit::copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException) 500 { 501 OExternalLockGuard aGuard( this ); 502 503 return VCLXAccessibleTextComponent::copyText( nStartIndex, nEndIndex ); 504 } 505 506 // ----------------------------------------------------------------------------- 507 // XAccessibleEditableText 508 // ----------------------------------------------------------------------------- 509 510 sal_Bool VCLXAccessibleEdit::cutText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException) 511 { 512 OExternalLockGuard aGuard( this ); 513 514 return copyText( nStartIndex, nEndIndex ) && deleteText( nStartIndex, nEndIndex ); 515 } 516 517 // ----------------------------------------------------------------------------- 518 519 sal_Bool VCLXAccessibleEdit::pasteText( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 520 { 521 OExternalLockGuard aGuard( this ); 522 523 sal_Bool bReturn = sal_False; 524 525 if ( GetWindow() ) 526 { 527 Reference< datatransfer::clipboard::XClipboard > xClipboard = GetWindow()->GetClipboard(); 528 if ( xClipboard.is() ) 529 { 530 const sal_uInt32 nRef = Application::ReleaseSolarMutex(); 531 Reference< datatransfer::XTransferable > xDataObj = xClipboard->getContents(); 532 Application::AcquireSolarMutex( nRef ); 533 if ( xDataObj.is() ) 534 { 535 datatransfer::DataFlavor aFlavor; 536 SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor ); 537 if ( xDataObj->isDataFlavorSupported( aFlavor ) ) 538 { 539 Any aData = xDataObj->getTransferData( aFlavor ); 540 ::rtl::OUString sText; 541 aData >>= sText; 542 bReturn = replaceText( nIndex, nIndex, sText ); 543 } 544 } 545 } 546 } 547 548 return bReturn; 549 } 550 551 // ----------------------------------------------------------------------------- 552 553 sal_Bool VCLXAccessibleEdit::deleteText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException) 554 { 555 OExternalLockGuard aGuard( this ); 556 557 return replaceText( nStartIndex, nEndIndex, ::rtl::OUString() ); 558 } 559 560 // ----------------------------------------------------------------------------- 561 562 sal_Bool VCLXAccessibleEdit::insertText( const ::rtl::OUString& sText, sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 563 { 564 OExternalLockGuard aGuard( this ); 565 566 return replaceText( nIndex, nIndex, sText ); 567 } 568 569 // ----------------------------------------------------------------------------- 570 571 sal_Bool VCLXAccessibleEdit::replaceText( sal_Int32 nStartIndex, sal_Int32 nEndIndex, const ::rtl::OUString& sReplacement ) throw (IndexOutOfBoundsException, RuntimeException) 572 { 573 OExternalLockGuard aGuard( this ); 574 575 sal_Bool bReturn = sal_False; 576 ::rtl::OUString sText( implGetText() ); 577 578 if ( !implIsValidRange( nStartIndex, nEndIndex, sText.getLength() ) ) 579 throw IndexOutOfBoundsException(); 580 581 sal_Int32 nMinIndex = ::std::min( nStartIndex, nEndIndex ); 582 sal_Int32 nMaxIndex = ::std::max( nStartIndex, nEndIndex ); 583 584 VCLXEdit* pVCLXEdit = static_cast< VCLXEdit* >( GetVCLXWindow() ); 585 if ( pVCLXEdit && pVCLXEdit->isEditable() ) 586 { 587 pVCLXEdit->setText( sText.replaceAt( nMinIndex, nMaxIndex - nMinIndex, sReplacement ) ); 588 sal_Int32 nIndex = nMinIndex + sReplacement.getLength(); 589 setSelection( nIndex, nIndex ); 590 bReturn = sal_True; 591 } 592 593 return bReturn; 594 } 595 596 // ----------------------------------------------------------------------------- 597 598 sal_Bool VCLXAccessibleEdit::setAttributes( sal_Int32 nStartIndex, sal_Int32 nEndIndex, const Sequence<PropertyValue>& ) throw (IndexOutOfBoundsException, RuntimeException) 599 { 600 OExternalLockGuard aGuard( this ); 601 602 if ( !implIsValidRange( nStartIndex, nEndIndex, implGetText().getLength() ) ) 603 throw IndexOutOfBoundsException(); 604 605 return sal_False; // attributes cannot be set for an edit 606 } 607 608 // ----------------------------------------------------------------------------- 609 610 sal_Bool VCLXAccessibleEdit::setText( const ::rtl::OUString& sText ) throw (RuntimeException) 611 { 612 OExternalLockGuard aGuard( this ); 613 614 sal_Bool bSuccess = sal_False; 615 try 616 { 617 bSuccess = replaceText( 0, implGetText().getLength(), sText ); 618 } 619 catch( const IndexOutOfBoundsException& ) 620 { 621 OSL_ENSURE( sal_False, "VCLXAccessibleText::setText: caught an exception!" ); 622 } 623 return bSuccess; 624 } 625 626 // ----------------------------------------------------------------------------- 627