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