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