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 "svxrectctaccessiblecontext.hxx"
21 : #include <com/sun/star/accessibility/AccessibleRole.hpp>
22 : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
23 : #include <unotools/accessiblestatesethelper.hxx>
24 : #include <com/sun/star/accessibility/AccessibleStateType.hpp>
25 : #include <com/sun/star/beans/PropertyChangeEvent.hpp>
26 : #include <com/sun/star/awt/XWindow.hpp>
27 : #include <cppuhelper/typeprovider.hxx>
28 : #include <toolkit/helper/vclunohelper.hxx>
29 : #include <toolkit/helper/convert.hxx>
30 : #include <vcl/svapp.hxx>
31 : #include <osl/mutex.hxx>
32 : #include <tools/debug.hxx>
33 : #include <tools/gen.hxx>
34 :
35 : #include <svx/dialogs.hrc>
36 : #include "accessibility.hrc"
37 : #include <svx/dlgctrl.hxx>
38 : #include <svx/dialmgr.hxx>
39 : #include <comphelper/accessibleeventnotifier.hxx>
40 :
41 :
42 : using namespace ::cppu;
43 : using namespace ::osl;
44 : using namespace ::com::sun::star;
45 : using namespace ::com::sun::star::uno;
46 : using namespace ::com::sun::star::accessibility;
47 :
48 :
49 : #define MAX_NUM_OF_CHILDREN 9
50 : #define NOCHILDSELECTED -1
51 :
52 :
53 : DBG_NAME( SvxRectCtlAccessibleContext )
54 :
55 :
56 : //===== internal ============================================================
57 :
58 : namespace
59 : {
60 : struct ChildIndexToPointData
61 : {
62 : short nResIdName;
63 : short nResIdDescr;
64 : RECT_POINT ePoint;
65 : };
66 : }
67 :
68 :
69 0 : static const ChildIndexToPointData* IndexToPoint( long nIndex, sal_Bool bAngleControl )
70 : {
71 : DBG_ASSERT( nIndex < ( bAngleControl? 8 : 9 ) && nIndex >= 0, "-IndexToPoint(): invalid child index! You have been warned..." );
72 :
73 : // angles are counted reverse counter clock wise
74 : static const ChildIndexToPointData pAngleData[] =
75 : { // index
76 : { RID_SVXSTR_RECTCTL_ACC_CHLD_A000, RID_SVXSTR_RECTCTL_ACC_CHLD_A000, RP_RM }, // 0
77 : { RID_SVXSTR_RECTCTL_ACC_CHLD_A045, RID_SVXSTR_RECTCTL_ACC_CHLD_A045, RP_RT }, // 1
78 : { RID_SVXSTR_RECTCTL_ACC_CHLD_A090, RID_SVXSTR_RECTCTL_ACC_CHLD_A090, RP_MT }, // 2
79 : { RID_SVXSTR_RECTCTL_ACC_CHLD_A135, RID_SVXSTR_RECTCTL_ACC_CHLD_A135, RP_LT }, // 3
80 : { RID_SVXSTR_RECTCTL_ACC_CHLD_A180, RID_SVXSTR_RECTCTL_ACC_CHLD_A180, RP_LM }, // 4
81 : { RID_SVXSTR_RECTCTL_ACC_CHLD_A225, RID_SVXSTR_RECTCTL_ACC_CHLD_A225, RP_LB }, // 5
82 : { RID_SVXSTR_RECTCTL_ACC_CHLD_A270, RID_SVXSTR_RECTCTL_ACC_CHLD_A270, RP_MB }, // 6
83 : { RID_SVXSTR_RECTCTL_ACC_CHLD_A315, RID_SVXSTR_RECTCTL_ACC_CHLD_A315, RP_RB } // 7
84 : };
85 :
86 : // corners are counted from left to right and top to bottom
87 : static const ChildIndexToPointData pCornerData[] =
88 : { // index
89 : { RID_SVXSTR_RECTCTL_ACC_CHLD_LT, RID_SVXSTR_RECTCTL_ACC_CHLD_LT, RP_LT }, // 0
90 : { RID_SVXSTR_RECTCTL_ACC_CHLD_MT, RID_SVXSTR_RECTCTL_ACC_CHLD_MT, RP_MT }, // 1
91 : { RID_SVXSTR_RECTCTL_ACC_CHLD_RT, RID_SVXSTR_RECTCTL_ACC_CHLD_RT, RP_RT }, // 2
92 : { RID_SVXSTR_RECTCTL_ACC_CHLD_LM, RID_SVXSTR_RECTCTL_ACC_CHLD_LM, RP_LM }, // 3
93 : { RID_SVXSTR_RECTCTL_ACC_CHLD_MM, RID_SVXSTR_RECTCTL_ACC_CHLD_MM, RP_MM }, // 4
94 : { RID_SVXSTR_RECTCTL_ACC_CHLD_RM, RID_SVXSTR_RECTCTL_ACC_CHLD_RM, RP_RM }, // 5
95 : { RID_SVXSTR_RECTCTL_ACC_CHLD_LB, RID_SVXSTR_RECTCTL_ACC_CHLD_LB, RP_LB }, // 6
96 : { RID_SVXSTR_RECTCTL_ACC_CHLD_MB, RID_SVXSTR_RECTCTL_ACC_CHLD_MB, RP_MB }, // 7
97 : { RID_SVXSTR_RECTCTL_ACC_CHLD_RB, RID_SVXSTR_RECTCTL_ACC_CHLD_RB, RP_RB } // 8
98 : };
99 :
100 0 : return ( bAngleControl? pAngleData : pCornerData ) + nIndex;
101 : }
102 :
103 :
104 0 : static long PointToIndex( RECT_POINT ePoint, sal_Bool bAngleControl )
105 : {
106 0 : long nRet( (long) ePoint );
107 0 : if( bAngleControl )
108 : { // angle control
109 : // angles are counted reverse counter clock wise
110 0 : switch( ePoint )
111 : {
112 0 : case RP_LT: nRet = 3; break;
113 0 : case RP_MT: nRet = 2; break;
114 0 : case RP_RT: nRet = 1; break;
115 0 : case RP_LM: nRet = 4; break;
116 0 : case RP_MM: nRet = NOCHILDSELECTED; break;
117 0 : case RP_RM: nRet = 0; break;
118 0 : case RP_LB: nRet = 5; break;
119 0 : case RP_MB: nRet = 6; break;
120 0 : case RP_RB: nRet = 7; break;
121 : }
122 : }
123 : else
124 : { // corner control
125 : // corners are counted from left to right and top to bottom
126 : DBG_ASSERT( RP_LT == 0 && RP_MT == 1 && RP_RT == 2 && RP_LM == 3 && RP_MM == 4 && RP_RM == 5 &&
127 : RP_LB == 6 && RP_MB == 7 && RP_RB == 8, "*PointToIndex(): unexpected enum value!" );
128 :
129 0 : nRet = ( long ) ePoint;
130 : }
131 :
132 0 : return nRet;
133 : }
134 :
135 :
136 0 : SvxRectCtlAccessibleContext::SvxRectCtlAccessibleContext(
137 : const Reference< XAccessible >& rxParent,
138 : SvxRectCtl& rRepr,
139 : const ::rtl::OUString* pName,
140 : const ::rtl::OUString* pDesc ) :
141 :
142 : SvxRectCtlAccessibleContext_Base( m_aMutex ),
143 : mxParent( rxParent ),
144 : mpRepr( &rRepr ),
145 : mpChildren( NULL ),
146 : mnClientId( 0 ),
147 : mnSelectedChild( NOCHILDSELECTED ),
148 0 : mbAngleMode( rRepr.GetNumOfChildren() == 8 )
149 : {
150 : DBG_CTOR( SvxRectCtlAccessibleContext, NULL );
151 :
152 0 : if( pName )
153 0 : msName = *pName;
154 : else
155 : {
156 0 : ::SolarMutexGuard aSolarGuard;
157 0 : msName = SVX_RESSTR( mbAngleMode? RID_SVXSTR_RECTCTL_ACC_ANGL_NAME : RID_SVXSTR_RECTCTL_ACC_CORN_NAME );
158 : }
159 :
160 0 : if( pDesc )
161 0 : msDescription = *pDesc;
162 : else
163 : {
164 0 : ::SolarMutexGuard aSolarGuard;
165 0 : msDescription = SVX_RESSTR( mbAngleMode? RID_SVXSTR_RECTCTL_ACC_ANGL_DESCR : RID_SVXSTR_RECTCTL_ACC_CORN_DESCR );
166 : }
167 :
168 0 : mpChildren = new SvxRectCtlChildAccessibleContext*[ MAX_NUM_OF_CHILDREN ];
169 :
170 0 : SvxRectCtlChildAccessibleContext** p = mpChildren;
171 0 : for( int i = MAX_NUM_OF_CHILDREN ; i ; --i, ++p )
172 0 : *p = NULL;
173 0 : }
174 :
175 :
176 0 : SvxRectCtlAccessibleContext::~SvxRectCtlAccessibleContext()
177 : {
178 : DBG_DTOR( SvxRectCtlAccessibleContext, NULL );
179 :
180 0 : if( IsAlive() )
181 : {
182 0 : osl_atomic_increment( &m_refCount );
183 0 : dispose(); // set mpRepr = NULL & release all children
184 : }
185 0 : }
186 :
187 : //===== XAccessible =========================================================
188 :
189 0 : Reference< XAccessibleContext > SAL_CALL SvxRectCtlAccessibleContext::getAccessibleContext( void ) throw( RuntimeException )
190 : {
191 0 : return this;
192 : }
193 :
194 : //===== XAccessibleComponent ================================================
195 :
196 0 : sal_Bool SAL_CALL SvxRectCtlAccessibleContext::containsPoint( const awt::Point& rPoint ) throw( RuntimeException )
197 : {
198 : // no guard -> done in getBounds()
199 : // return GetBoundingBox().IsInside( VCLPoint( rPoint ) );
200 0 : return Rectangle( Point( 0, 0 ), GetBoundingBox().GetSize() ).IsInside( VCLPoint( rPoint ) );
201 : }
202 :
203 0 : Reference< XAccessible > SAL_CALL SvxRectCtlAccessibleContext::getAccessibleAtPoint( const awt::Point& rPoint ) throw( RuntimeException )
204 : {
205 0 : ::osl::MutexGuard aGuard( m_aMutex );
206 :
207 0 : ThrowExceptionIfNotAlive();
208 :
209 0 : Reference< XAccessible > xRet;
210 :
211 0 : long nChild = PointToIndex( mpRepr->GetApproxRPFromPixPt( rPoint ), mbAngleMode );
212 :
213 0 : if( nChild != NOCHILDSELECTED )
214 0 : xRet = getAccessibleChild( nChild );
215 :
216 0 : return xRet;
217 : }
218 :
219 0 : awt::Rectangle SAL_CALL SvxRectCtlAccessibleContext::getBounds() throw( RuntimeException )
220 : {
221 : // no guard -> done in GetBoundingBox()
222 0 : return AWTRectangle( GetBoundingBox() );
223 : }
224 :
225 0 : awt::Point SAL_CALL SvxRectCtlAccessibleContext::getLocation() throw( RuntimeException )
226 : {
227 : // no guard -> done in GetBoundingBox()
228 0 : return AWTPoint( GetBoundingBox().TopLeft() );
229 : }
230 :
231 0 : awt::Point SAL_CALL SvxRectCtlAccessibleContext::getLocationOnScreen() throw( RuntimeException )
232 : {
233 : // no guard -> done in GetBoundingBoxOnScreen()
234 0 : return AWTPoint( GetBoundingBoxOnScreen().TopLeft() );
235 : }
236 :
237 0 : awt::Size SAL_CALL SvxRectCtlAccessibleContext::getSize() throw( RuntimeException )
238 : {
239 : // no guard -> done in GetBoundingBox()
240 0 : return AWTSize( GetBoundingBox().GetSize() );
241 : }
242 :
243 0 : sal_Bool SAL_CALL SvxRectCtlAccessibleContext::isShowing() throw( RuntimeException )
244 : {
245 0 : return sal_True;
246 : }
247 :
248 0 : sal_Bool SAL_CALL SvxRectCtlAccessibleContext::isVisible() throw( RuntimeException )
249 : {
250 0 : ::osl::MutexGuard aGuard( m_aMutex );
251 :
252 0 : ThrowExceptionIfNotAlive();
253 :
254 0 : return mpRepr->IsVisible();
255 : }
256 :
257 0 : sal_Bool SAL_CALL SvxRectCtlAccessibleContext::isFocusTraversable() throw( RuntimeException )
258 : {
259 0 : return sal_True;
260 : }
261 :
262 : //===== XAccessibleContext ==================================================
263 :
264 0 : sal_Int32 SAL_CALL SvxRectCtlAccessibleContext::getAccessibleChildCount( void ) throw( RuntimeException )
265 : {
266 0 : ::osl::MutexGuard aGuard( m_aMutex );
267 :
268 0 : ThrowExceptionIfNotAlive();
269 :
270 0 : return mpRepr->GetNumOfChildren();
271 : }
272 :
273 0 : Reference< XAccessible > SAL_CALL SvxRectCtlAccessibleContext::getAccessibleChild( sal_Int32 nIndex )
274 : throw( RuntimeException, lang::IndexOutOfBoundsException )
275 : {
276 0 : checkChildIndex( nIndex );
277 :
278 0 : Reference< XAccessible > xChild = mpChildren[ nIndex ];
279 0 : if( !xChild.is() )
280 : {
281 0 : ::SolarMutexGuard aSolarGuard;
282 :
283 0 : ::osl::MutexGuard aGuard( m_aMutex );
284 :
285 0 : ThrowExceptionIfNotAlive();
286 :
287 0 : xChild = mpChildren[ nIndex ];
288 :
289 0 : if( !xChild.is() )
290 : {
291 0 : const ChildIndexToPointData* p = IndexToPoint( nIndex, mbAngleMode );
292 0 : ::rtl::OUString aName(SVX_RESSTR(p->nResIdName));
293 0 : ::rtl::OUString aDescr(SVX_RESSTR(p->nResIdDescr));
294 :
295 0 : Rectangle aFocusRect( mpRepr->CalculateFocusRectangle( p->ePoint ) );
296 :
297 0 : Rectangle aBoundingBoxOnScreen( mpRepr->OutputToScreenPixel( aFocusRect.TopLeft() ), aFocusRect.GetSize() );
298 :
299 : SvxRectCtlChildAccessibleContext* pChild = new SvxRectCtlChildAccessibleContext(
300 0 : this, *mpRepr, aName, aDescr, aFocusRect, nIndex );
301 0 : xChild = mpChildren[ nIndex ] = pChild;
302 0 : pChild->acquire();
303 :
304 : // set actual state
305 0 : if( mnSelectedChild == nIndex )
306 0 : pChild->setStateChecked( sal_True );
307 0 : }
308 : }
309 :
310 0 : return xChild;
311 : }
312 :
313 0 : Reference< XAccessible > SAL_CALL SvxRectCtlAccessibleContext::getAccessibleParent( void ) throw( RuntimeException )
314 : {
315 0 : return mxParent;
316 : }
317 :
318 0 : sal_Int32 SAL_CALL SvxRectCtlAccessibleContext::getAccessibleIndexInParent( void ) throw( RuntimeException )
319 : {
320 0 : ::osl::MutexGuard aGuard( m_aMutex );
321 : // Use a simple but slow solution for now. Optimize later.
322 :
323 : // Iterate over all the parent's children and search for this object.
324 0 : if( mxParent.is() )
325 : {
326 0 : Reference< XAccessibleContext > xParentContext( mxParent->getAccessibleContext() );
327 0 : if( xParentContext.is() )
328 : {
329 0 : sal_Int32 nChildCount = xParentContext->getAccessibleChildCount();
330 0 : for( sal_Int32 i = 0 ; i < nChildCount ; ++i )
331 : {
332 0 : Reference< XAccessible > xChild( xParentContext->getAccessibleChild( i ) );
333 0 : if( xChild.get() == ( XAccessible* ) this )
334 0 : return i;
335 0 : }
336 0 : }
337 : }
338 :
339 : // Return -1 to indicate that this object's parent does not know about the
340 : // object.
341 0 : return -1;
342 : }
343 :
344 0 : sal_Int16 SAL_CALL SvxRectCtlAccessibleContext::getAccessibleRole( void ) throw( RuntimeException )
345 : {
346 0 : return AccessibleRole::PANEL;
347 : }
348 :
349 0 : ::rtl::OUString SAL_CALL SvxRectCtlAccessibleContext::getAccessibleDescription( void ) throw( RuntimeException )
350 : {
351 0 : ::osl::MutexGuard aGuard( m_aMutex );
352 0 : return msDescription;
353 : }
354 :
355 0 : ::rtl::OUString SAL_CALL SvxRectCtlAccessibleContext::getAccessibleName( void ) throw( RuntimeException )
356 : {
357 0 : ::osl::MutexGuard aGuard( m_aMutex );
358 0 : return msName;
359 : }
360 :
361 : /** Return empty reference to indicate that the relation set is not
362 : supported.
363 : */
364 0 : Reference< XAccessibleRelationSet > SAL_CALL SvxRectCtlAccessibleContext::getAccessibleRelationSet( void ) throw( RuntimeException )
365 : {
366 0 : return Reference< XAccessibleRelationSet >();
367 : }
368 :
369 0 : Reference< XAccessibleStateSet > SAL_CALL SvxRectCtlAccessibleContext::getAccessibleStateSet( void ) throw( RuntimeException )
370 : {
371 0 : ::osl::MutexGuard aGuard( m_aMutex );
372 0 : utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
373 :
374 0 : if( IsAlive() )
375 : {
376 0 : pStateSetHelper->AddState( AccessibleStateType::FOCUSABLE );
377 0 : if( mpRepr->HasFocus() )
378 0 : pStateSetHelper->AddState( AccessibleStateType::FOCUSED );
379 0 : pStateSetHelper->AddState( AccessibleStateType::OPAQUE );
380 :
381 0 : if( isShowing() )
382 0 : pStateSetHelper->AddState( AccessibleStateType::SHOWING );
383 :
384 0 : if( isVisible() )
385 0 : pStateSetHelper->AddState( AccessibleStateType::VISIBLE );
386 : }
387 : else
388 0 : pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
389 :
390 0 : return pStateSetHelper;
391 : }
392 :
393 0 : lang::Locale SAL_CALL SvxRectCtlAccessibleContext::getLocale( void ) throw( IllegalAccessibleComponentStateException, RuntimeException )
394 : {
395 0 : ::osl::MutexGuard aGuard( m_aMutex );
396 0 : if( mxParent.is() )
397 : {
398 0 : Reference< XAccessibleContext > xParentContext( mxParent->getAccessibleContext() );
399 0 : if( xParentContext.is() )
400 0 : return xParentContext->getLocale();
401 : }
402 :
403 : // No parent. Therefore throw exception to indicate this cluelessness.
404 0 : throw IllegalAccessibleComponentStateException();
405 : }
406 :
407 0 : void SAL_CALL SvxRectCtlAccessibleContext::addAccessibleEventListener( const Reference< XAccessibleEventListener >& xListener )
408 : throw( RuntimeException )
409 : {
410 0 : if (xListener.is())
411 : {
412 0 : ::osl::MutexGuard aGuard( m_aMutex );
413 0 : if (!mnClientId)
414 0 : mnClientId = comphelper::AccessibleEventNotifier::registerClient( );
415 0 : comphelper::AccessibleEventNotifier::addEventListener( mnClientId, xListener );
416 : }
417 0 : }
418 :
419 0 : void SAL_CALL SvxRectCtlAccessibleContext::removeAccessibleEventListener( const Reference< XAccessibleEventListener >& xListener )
420 : throw( RuntimeException )
421 : {
422 0 : if (xListener.is())
423 : {
424 0 : ::osl::MutexGuard aGuard( m_aMutex );
425 :
426 0 : sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, xListener );
427 0 : if ( !nListenerCount )
428 : {
429 : // no listeners anymore
430 : // -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
431 : // and at least to us not firing any events anymore, in case somebody calls
432 : // NotifyAccessibleEvent, again
433 0 : comphelper::AccessibleEventNotifier::revokeClient( mnClientId );
434 0 : mnClientId = 0;
435 0 : }
436 : }
437 0 : }
438 :
439 0 : void SAL_CALL SvxRectCtlAccessibleContext::addFocusListener( const Reference< awt::XFocusListener >& xListener )
440 : throw( RuntimeException )
441 : {
442 0 : if( xListener.is() )
443 : {
444 0 : ::osl::MutexGuard aGuard( m_aMutex );
445 :
446 0 : ThrowExceptionIfNotAlive();
447 :
448 0 : Reference< awt::XWindow > xWindow = VCLUnoHelper::GetInterface( mpRepr );
449 0 : if( xWindow.is() )
450 0 : xWindow->addFocusListener( xListener );
451 : }
452 0 : }
453 :
454 0 : void SAL_CALL SvxRectCtlAccessibleContext::removeFocusListener( const Reference< awt::XFocusListener >& xListener )
455 : throw (RuntimeException)
456 : {
457 0 : if( xListener.is() )
458 : {
459 0 : ::osl::MutexGuard aGuard( m_aMutex );
460 :
461 0 : ThrowExceptionIfNotAlive();
462 :
463 0 : Reference< awt::XWindow > xWindow = VCLUnoHelper::GetInterface( mpRepr );
464 0 : if( xWindow.is() )
465 0 : xWindow->removeFocusListener( xListener );
466 : }
467 0 : }
468 :
469 0 : void SAL_CALL SvxRectCtlAccessibleContext::grabFocus() throw( RuntimeException )
470 : {
471 0 : ::SolarMutexGuard aSolarGuard;
472 0 : ::osl::MutexGuard aGuard( m_aMutex );
473 :
474 0 : ThrowExceptionIfNotAlive();
475 :
476 0 : mpRepr->GrabFocus();
477 0 : }
478 :
479 0 : Any SAL_CALL SvxRectCtlAccessibleContext::getAccessibleKeyBinding() throw( RuntimeException )
480 : {
481 : // here is no implementation, because here are no KeyBindings for every object
482 0 : return Any();
483 : }
484 :
485 0 : sal_Int32 SvxRectCtlAccessibleContext::getForeground( )
486 : throw (::com::sun::star::uno::RuntimeException)
487 : {
488 0 : ::SolarMutexGuard aSolarGuard;
489 0 : ::osl::MutexGuard aGuard( m_aMutex );
490 0 : ThrowExceptionIfNotAlive();
491 :
492 0 : return mpRepr->GetControlForeground().GetColor();
493 : }
494 0 : sal_Int32 SvxRectCtlAccessibleContext::getBackground( )
495 : throw (::com::sun::star::uno::RuntimeException)
496 : {
497 0 : ::SolarMutexGuard aSolarGuard;
498 0 : ::osl::MutexGuard aGuard( m_aMutex );
499 0 : ThrowExceptionIfNotAlive();
500 :
501 0 : return mpRepr->GetControlBackground().GetColor();
502 : }
503 :
504 : //===== XServiceInfo ========================================================
505 :
506 0 : ::rtl::OUString SAL_CALL SvxRectCtlAccessibleContext::getImplementationName( void ) throw( RuntimeException )
507 : {
508 0 : return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.ui.SvxRectCtlAccessibleContext" ) );
509 : }
510 :
511 0 : sal_Bool SAL_CALL SvxRectCtlAccessibleContext::supportsService( const ::rtl::OUString& sServiceName ) throw( RuntimeException )
512 : {
513 0 : ::osl::MutexGuard aGuard( m_aMutex );
514 : // Iterate over all supported service names and return true if on of them
515 : // matches the given name.
516 0 : Sequence< ::rtl::OUString > aSupportedServices( getSupportedServiceNames() );
517 0 : int nLength = aSupportedServices.getLength();
518 0 : const ::rtl::OUString* pStr = aSupportedServices.getConstArray();
519 :
520 0 : for( int i = nLength ; i ; --i, ++pStr )
521 : {
522 0 : if( sServiceName == *pStr )
523 0 : return sal_True;
524 : }
525 :
526 0 : return sal_False;
527 : }
528 :
529 0 : Sequence< ::rtl::OUString > SAL_CALL SvxRectCtlAccessibleContext::getSupportedServiceNames( void ) throw( RuntimeException )
530 : {
531 0 : const ::rtl::OUString sServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.accessibility.AccessibleContext" ) );
532 0 : return Sequence< ::rtl::OUString >( &sServiceName, 1 );
533 : }
534 :
535 : //===== XTypeProvider =======================================================
536 :
537 0 : Sequence< sal_Int8 > SAL_CALL SvxRectCtlAccessibleContext::getImplementationId( void ) throw( RuntimeException )
538 : {
539 0 : return getUniqueId();
540 : }
541 :
542 : //===== XAccessibleSelection =============================================
543 :
544 0 : void SAL_CALL SvxRectCtlAccessibleContext::selectAccessibleChild( sal_Int32 nIndex ) throw( lang::IndexOutOfBoundsException, RuntimeException )
545 : {
546 0 : ::SolarMutexGuard aSolarGuard;
547 :
548 0 : ::osl::MutexGuard aGuard( m_aMutex );
549 :
550 0 : checkChildIndex( nIndex );
551 :
552 0 : ThrowExceptionIfNotAlive();
553 :
554 0 : const ChildIndexToPointData* pData = IndexToPoint( nIndex, mbAngleMode );
555 :
556 : DBG_ASSERT( pData,
557 : "SvxRectCtlAccessibleContext::selectAccessibleChild(): this is an impossible state! Or at least should be..." );
558 :
559 : // this does all wich is needed, including the change of the child's state!
560 0 : mpRepr->SetActualRP( pData->ePoint );
561 0 : }
562 :
563 0 : sal_Bool SAL_CALL SvxRectCtlAccessibleContext::isAccessibleChildSelected( sal_Int32 nIndex ) throw( lang::IndexOutOfBoundsException, RuntimeException )
564 : {
565 0 : ::osl::MutexGuard aGuard( m_aMutex );
566 :
567 0 : checkChildIndex( nIndex );
568 :
569 0 : return nIndex == mnSelectedChild;
570 : }
571 :
572 0 : void SAL_CALL SvxRectCtlAccessibleContext::clearAccessibleSelection() throw( RuntimeException )
573 : {
574 : DBG_ASSERT( sal_False, "SvxRectCtlAccessibleContext::clearAccessibleSelection() is not possible!" );
575 0 : }
576 :
577 0 : void SAL_CALL SvxRectCtlAccessibleContext::selectAllAccessibleChildren() throw( RuntimeException )
578 : {
579 : // guard in selectAccessibleChild()!
580 :
581 0 : selectAccessibleChild( 0 ); // default per definition
582 0 : }
583 :
584 0 : sal_Int32 SAL_CALL SvxRectCtlAccessibleContext::getSelectedAccessibleChildCount() throw( RuntimeException )
585 : {
586 0 : ::osl::MutexGuard aGuard( m_aMutex );
587 :
588 0 : return mnSelectedChild == NOCHILDSELECTED? 0 : 1;
589 : }
590 :
591 0 : Reference< XAccessible > SAL_CALL SvxRectCtlAccessibleContext::getSelectedAccessibleChild( sal_Int32 nIndex )
592 : throw( lang::IndexOutOfBoundsException, RuntimeException )
593 : {
594 0 : ::osl::MutexGuard aGuard( m_aMutex );
595 :
596 0 : checkChildIndexOnSelection( nIndex );
597 :
598 0 : return getAccessibleChild( mnSelectedChild );
599 : }
600 :
601 0 : void SAL_CALL SvxRectCtlAccessibleContext::deselectAccessibleChild( sal_Int32 /*nIndex*/ ) throw( lang::IndexOutOfBoundsException, RuntimeException )
602 : {
603 0 : ::rtl::OUString aMessage( RTL_CONSTASCII_USTRINGPARAM( "deselectAccessibleChild is not possible in this context" ) );
604 :
605 : DBG_ASSERT( sal_False, "SvxRectCtlAccessibleContext::deselectAccessibleChild() is not possible!" );
606 :
607 0 : throw lang::IndexOutOfBoundsException( aMessage, *this ); // never possible
608 : }
609 :
610 : //===== internals ========================================================
611 :
612 0 : void SvxRectCtlAccessibleContext::checkChildIndex( long nIndex ) throw( lang::IndexOutOfBoundsException )
613 : {
614 0 : if( nIndex < 0 || nIndex >= getAccessibleChildCount() )
615 0 : throw lang::IndexOutOfBoundsException();
616 0 : }
617 :
618 0 : void SvxRectCtlAccessibleContext::checkChildIndexOnSelection( long nIndex ) throw( lang::IndexOutOfBoundsException )
619 : {
620 0 : if( nIndex || mnSelectedChild == NOCHILDSELECTED )
621 : // in our case only for the first (0) _selected_ child this is a valid request
622 0 : throw lang::IndexOutOfBoundsException();
623 0 : }
624 :
625 0 : void SvxRectCtlAccessibleContext::selectChild( long nNew )
626 : {
627 0 : ::osl::MutexGuard aGuard( m_aMutex );
628 0 : if( nNew != mnSelectedChild )
629 : {
630 0 : long nNumOfChildren = getAccessibleChildCount();
631 0 : if( nNew < nNumOfChildren )
632 : { // valid index
633 : SvxRectCtlChildAccessibleContext* pChild;
634 0 : if( mnSelectedChild != NOCHILDSELECTED )
635 : { // deselect old selected child if one is selected
636 0 : pChild = mpChildren[ mnSelectedChild ];
637 0 : if( pChild )
638 0 : pChild->setStateChecked( sal_False );
639 : }
640 :
641 : // select new child
642 0 : mnSelectedChild = nNew;
643 :
644 0 : if( nNew != NOCHILDSELECTED )
645 : {
646 0 : pChild = mpChildren[ nNew ];
647 0 : if( pChild )
648 0 : pChild->setStateChecked( sal_True );
649 : }
650 : }
651 : else
652 0 : mnSelectedChild = NOCHILDSELECTED;
653 0 : }
654 0 : }
655 :
656 0 : void SvxRectCtlAccessibleContext::selectChild( RECT_POINT eButton )
657 : {
658 : // no guard -> is done in next selectChild
659 0 : selectChild( PointToIndex( eButton, mbAngleMode ) );
660 0 : }
661 :
662 0 : void SAL_CALL SvxRectCtlAccessibleContext::disposing()
663 : {
664 0 : if( !rBHelper.bDisposed )
665 : {
666 : {
667 0 : ::osl::MutexGuard aGuard( m_aMutex );
668 0 : mpRepr = NULL; // object dies with representation
669 :
670 0 : SvxRectCtlChildAccessibleContext** p = mpChildren;
671 0 : for( int i = MAX_NUM_OF_CHILDREN ; i ; --i, ++p )
672 : {
673 0 : SvxRectCtlChildAccessibleContext* pChild = *p;
674 0 : if( pChild )
675 : {
676 0 : pChild->dispose();
677 0 : pChild->release();
678 0 : *p = NULL;
679 : }
680 : }
681 :
682 0 : delete[] mpChildren;
683 0 : mpChildren = NULL;
684 : }
685 :
686 : {
687 0 : ::osl::MutexGuard aGuard( m_aMutex );
688 :
689 : // Send a disposing to all listeners.
690 0 : if ( mnClientId )
691 : {
692 0 : comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this );
693 0 : mnClientId = 0;
694 : }
695 :
696 0 : mxParent = Reference< XAccessible >();
697 : }
698 : }
699 0 : }
700 :
701 0 : Rectangle SvxRectCtlAccessibleContext::GetBoundingBoxOnScreen( void ) throw( RuntimeException )
702 : {
703 0 : ::SolarMutexGuard aSolarGuard;
704 0 : ::osl::MutexGuard aGuard( m_aMutex );
705 :
706 0 : ThrowExceptionIfNotAlive();
707 :
708 0 : return Rectangle( mpRepr->GetParent()->OutputToScreenPixel( mpRepr->GetPosPixel() ), mpRepr->GetSizePixel() );
709 : }
710 :
711 0 : Rectangle SvxRectCtlAccessibleContext::GetBoundingBox( void ) throw( RuntimeException )
712 : {
713 0 : ::SolarMutexGuard aSolarGuard;
714 0 : ::osl::MutexGuard aGuard( m_aMutex );
715 :
716 0 : ThrowExceptionIfNotAlive();
717 :
718 0 : return Rectangle( mpRepr->GetPosPixel(), mpRepr->GetSizePixel() );
719 : }
720 :
721 0 : Sequence< sal_Int8 > SvxRectCtlAccessibleContext::getUniqueId( void )
722 : {
723 : static OImplementationId* pId = 0;
724 0 : if( !pId )
725 : {
726 0 : MutexGuard aGuard( Mutex::getGlobalMutex() );
727 0 : if( !pId)
728 : {
729 0 : static OImplementationId aId;
730 0 : pId = &aId;
731 0 : }
732 : }
733 0 : return pId->getImplementationId();
734 : }
735 :
736 0 : void SvxRectCtlAccessibleContext::ThrowExceptionIfNotAlive( void ) throw( lang::DisposedException )
737 : {
738 0 : if( IsNotAlive() )
739 0 : throw lang::DisposedException();
740 0 : }
741 :
742 : // -------------------------------------------------------------------------------------------------
743 :
744 :
745 : DBG_NAME( SvxRectCtlChildAccessibleContext )
746 :
747 :
748 0 : SvxRectCtlChildAccessibleContext::SvxRectCtlChildAccessibleContext(
749 : const Reference<XAccessible>& rxParent,
750 : const Window& rParentWindow,
751 : const ::rtl::OUString& rName,
752 : const ::rtl::OUString& rDescription,
753 : const Rectangle& rBoundingBox,
754 : long nIndexInParent ) :
755 :
756 : SvxRectCtlChildAccessibleContext_Base( maMutex ),
757 : msDescription( rDescription ),
758 : msName( rName ),
759 : mxParent(rxParent),
760 : mpBoundingBox( new Rectangle( rBoundingBox ) ),
761 : mrParentWindow( rParentWindow ),
762 : mnClientId( 0 ),
763 : mnIndexInParent( nIndexInParent ),
764 0 : mbIsChecked( sal_False )
765 : {
766 : DBG_CTOR( SvxRectCtlChildAccessibleContext, NULL );
767 0 : }
768 :
769 :
770 0 : SvxRectCtlChildAccessibleContext::~SvxRectCtlChildAccessibleContext()
771 : {
772 : DBG_DTOR( SvxRectCtlChildAccessibleContext, NULL );
773 :
774 0 : if( IsAlive() )
775 : {
776 0 : osl_atomic_increment( &m_refCount );
777 0 : dispose(); // set mpRepr = NULL & release all children
778 : }
779 0 : }
780 :
781 : //===== XAccessible =========================================================
782 :
783 0 : Reference< XAccessibleContext> SAL_CALL SvxRectCtlChildAccessibleContext::getAccessibleContext( void ) throw( RuntimeException )
784 : {
785 0 : return this;
786 : }
787 :
788 : //===== XAccessibleComponent ================================================
789 :
790 0 : sal_Bool SAL_CALL SvxRectCtlChildAccessibleContext::containsPoint( const awt::Point& rPoint ) throw( RuntimeException )
791 : {
792 : // no guard -> done in getBounds()
793 0 : return Rectangle( Point( 0, 0 ), GetBoundingBox().GetSize() ).IsInside( VCLPoint( rPoint ) );
794 : }
795 :
796 0 : Reference< XAccessible > SAL_CALL SvxRectCtlChildAccessibleContext::getAccessibleAtPoint( const awt::Point& /*rPoint*/ ) throw( RuntimeException )
797 : {
798 0 : return Reference< XAccessible >();
799 : }
800 :
801 0 : awt::Rectangle SAL_CALL SvxRectCtlChildAccessibleContext::getBounds() throw( RuntimeException )
802 : {
803 : // no guard -> done in getBoundingBox()
804 0 : return AWTRectangle( GetBoundingBox() );
805 : }
806 :
807 0 : awt::Point SAL_CALL SvxRectCtlChildAccessibleContext::getLocation() throw( RuntimeException )
808 : {
809 : // no guard -> done in getBoundingBox()
810 0 : return AWTPoint( GetBoundingBox().TopLeft() );
811 : }
812 :
813 0 : awt::Point SAL_CALL SvxRectCtlChildAccessibleContext::getLocationOnScreen() throw( RuntimeException )
814 : {
815 : // no guard -> done in getBoundingBoxOnScreen()
816 0 : return AWTPoint( GetBoundingBoxOnScreen().TopLeft() );
817 : }
818 :
819 0 : awt::Size SAL_CALL SvxRectCtlChildAccessibleContext::getSize() throw( RuntimeException )
820 : {
821 : // no guard -> done in getBoundingBox()
822 0 : return AWTSize( GetBoundingBox().GetSize() );
823 : }
824 :
825 0 : sal_Bool SAL_CALL SvxRectCtlChildAccessibleContext::isShowing() throw( RuntimeException )
826 : {
827 0 : return sal_True;
828 : }
829 :
830 0 : sal_Bool SAL_CALL SvxRectCtlChildAccessibleContext::isVisible() throw( RuntimeException )
831 : {
832 0 : ::osl::MutexGuard aGuard( maMutex );
833 :
834 0 : ThrowExceptionIfNotAlive();
835 :
836 0 : return mxParent.is()? ( static_cast< SvxRectCtlAccessibleContext* >( mxParent.get() ) )->isVisible() : sal_False;
837 : }
838 :
839 0 : sal_Bool SAL_CALL SvxRectCtlChildAccessibleContext::isFocusTraversable() throw( RuntimeException )
840 : {
841 0 : return sal_False;
842 : }
843 :
844 0 : void SAL_CALL SvxRectCtlChildAccessibleContext::addFocusListener( const Reference< awt::XFocusListener >& /*xListener*/ )
845 : throw( RuntimeException )
846 : {
847 : OSL_FAIL( "SvxRectCtlChildAccessibleContext::addFocusListener: not implemented" );
848 0 : }
849 :
850 0 : void SAL_CALL SvxRectCtlChildAccessibleContext::removeFocusListener( const Reference< awt::XFocusListener >& /*xListener*/ )
851 : throw (RuntimeException)
852 : {
853 : OSL_FAIL( "SvxRectCtlChildAccessibleContext::removeFocusListener: not implemented" );
854 0 : }
855 :
856 0 : void SAL_CALL SvxRectCtlChildAccessibleContext::grabFocus() throw( RuntimeException )
857 : {
858 0 : }
859 :
860 0 : Any SAL_CALL SvxRectCtlChildAccessibleContext::getAccessibleKeyBinding() throw( RuntimeException )
861 : {
862 : // here is no implementation, because here are no KeyBindings for every object
863 0 : return Any();
864 : }
865 0 : sal_Int32 SvxRectCtlChildAccessibleContext::getForeground( )
866 : throw (::com::sun::star::uno::RuntimeException)
867 : {
868 0 : ::SolarMutexGuard aSolarGuard;
869 0 : ::osl::MutexGuard aGuard( maMutex );
870 0 : ThrowExceptionIfNotAlive();
871 0 : return mrParentWindow.GetControlForeground().GetColor();
872 : }
873 0 : sal_Int32 SvxRectCtlChildAccessibleContext::getBackground( )
874 : throw (::com::sun::star::uno::RuntimeException)
875 : {
876 0 : ::SolarMutexGuard aSolarGuard;
877 0 : ::osl::MutexGuard aGuard( maMutex );
878 :
879 0 : ThrowExceptionIfNotAlive();
880 0 : return mrParentWindow.GetControlBackground().GetColor();
881 : }
882 :
883 : //===== XAccessibleContext ==================================================
884 :
885 0 : sal_Int32 SAL_CALL SvxRectCtlChildAccessibleContext::getAccessibleChildCount( void ) throw( RuntimeException )
886 : {
887 0 : return 0;
888 : }
889 :
890 0 : Reference< XAccessible > SAL_CALL SvxRectCtlChildAccessibleContext::getAccessibleChild( sal_Int32 /*nIndex*/ ) throw ( RuntimeException, lang::IndexOutOfBoundsException )
891 : {
892 0 : throw lang::IndexOutOfBoundsException();
893 : }
894 :
895 0 : Reference< XAccessible > SAL_CALL SvxRectCtlChildAccessibleContext::getAccessibleParent( void ) throw( RuntimeException )
896 : {
897 0 : return mxParent;
898 : }
899 :
900 0 : sal_Int32 SAL_CALL SvxRectCtlChildAccessibleContext::getAccessibleIndexInParent( void ) throw( RuntimeException )
901 : {
902 0 : return mnIndexInParent;
903 : }
904 :
905 0 : sal_Int16 SAL_CALL SvxRectCtlChildAccessibleContext::getAccessibleRole( void ) throw( RuntimeException )
906 : {
907 0 : return AccessibleRole::RADIO_BUTTON;
908 : }
909 :
910 0 : ::rtl::OUString SAL_CALL SvxRectCtlChildAccessibleContext::getAccessibleDescription( void ) throw( RuntimeException )
911 : {
912 0 : ::osl::MutexGuard aGuard( maMutex );
913 0 : return msDescription;
914 : }
915 :
916 0 : ::rtl::OUString SAL_CALL SvxRectCtlChildAccessibleContext::getAccessibleName( void ) throw( RuntimeException )
917 : {
918 0 : ::osl::MutexGuard aGuard( maMutex );
919 0 : return msName;
920 : }
921 :
922 : /** Return empty reference to indicate that the relation set is not
923 : supported.
924 : */
925 0 : Reference<XAccessibleRelationSet> SAL_CALL SvxRectCtlChildAccessibleContext::getAccessibleRelationSet( void ) throw( RuntimeException )
926 : {
927 0 : return Reference< XAccessibleRelationSet >();
928 : }
929 :
930 0 : Reference< XAccessibleStateSet > SAL_CALL SvxRectCtlChildAccessibleContext::getAccessibleStateSet( void ) throw( RuntimeException )
931 : {
932 0 : ::osl::MutexGuard aGuard( maMutex );
933 0 : utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
934 :
935 0 : if( IsAlive() )
936 : {
937 0 : if( mbIsChecked )
938 : {
939 0 : pStateSetHelper->AddState( AccessibleStateType::CHECKED );
940 : // pStateSetHelper->AddState( AccessibleStateType::SELECTED );
941 : }
942 :
943 0 : pStateSetHelper->AddState( AccessibleStateType::ENABLED );
944 0 : pStateSetHelper->AddState( AccessibleStateType::SENSITIVE );
945 0 : pStateSetHelper->AddState( AccessibleStateType::OPAQUE );
946 0 : pStateSetHelper->AddState( AccessibleStateType::SELECTABLE );
947 0 : pStateSetHelper->AddState( AccessibleStateType::SHOWING );
948 0 : pStateSetHelper->AddState( AccessibleStateType::VISIBLE );
949 : }
950 : else
951 0 : pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
952 :
953 0 : return pStateSetHelper;
954 : }
955 :
956 0 : lang::Locale SAL_CALL SvxRectCtlChildAccessibleContext::getLocale( void ) throw( IllegalAccessibleComponentStateException, RuntimeException )
957 : {
958 0 : ::osl::MutexGuard aGuard( maMutex );
959 0 : if( mxParent.is() )
960 : {
961 0 : Reference< XAccessibleContext > xParentContext( mxParent->getAccessibleContext() );
962 0 : if( xParentContext.is() )
963 0 : return xParentContext->getLocale();
964 : }
965 :
966 : // No locale and no parent. Therefore throw exception to indicate this
967 : // cluelessness.
968 0 : throw IllegalAccessibleComponentStateException();
969 : }
970 :
971 0 : void SAL_CALL SvxRectCtlChildAccessibleContext::addAccessibleEventListener( const Reference< XAccessibleEventListener >& xListener )
972 : throw( RuntimeException )
973 : {
974 0 : if (xListener.is())
975 : {
976 0 : ::osl::MutexGuard aGuard( maMutex );
977 0 : if (!mnClientId)
978 0 : mnClientId = comphelper::AccessibleEventNotifier::registerClient( );
979 0 : comphelper::AccessibleEventNotifier::addEventListener( mnClientId, xListener );
980 : }
981 0 : }
982 :
983 :
984 :
985 :
986 0 : void SAL_CALL SvxRectCtlChildAccessibleContext::removeAccessibleEventListener( const Reference< XAccessibleEventListener >& xListener )
987 : throw( RuntimeException )
988 : {
989 0 : if (xListener.is())
990 : {
991 0 : ::osl::MutexGuard aGuard( maMutex );
992 :
993 0 : sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, xListener );
994 0 : if ( !nListenerCount )
995 : {
996 : // no listeners anymore
997 : // -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
998 : // and at least to us not firing any events anymore, in case somebody calls
999 : // NotifyAccessibleEvent, again
1000 0 : comphelper::AccessibleEventNotifier::revokeClient( mnClientId );
1001 0 : mnClientId = 0;
1002 0 : }
1003 : }
1004 0 : }
1005 :
1006 : //===== XAccessibleValue ================================================
1007 :
1008 0 : Any SAL_CALL SvxRectCtlChildAccessibleContext::getCurrentValue() throw( RuntimeException )
1009 : {
1010 0 : ThrowExceptionIfNotAlive();
1011 :
1012 0 : Any aRet;
1013 0 : aRet <<= ( mbIsChecked? 1.0 : 0.0 );
1014 0 : return aRet;
1015 : }
1016 :
1017 0 : sal_Bool SAL_CALL SvxRectCtlChildAccessibleContext::setCurrentValue( const Any& /*aNumber*/ ) throw( RuntimeException )
1018 : {
1019 0 : return sal_False;
1020 : }
1021 :
1022 0 : Any SAL_CALL SvxRectCtlChildAccessibleContext::getMaximumValue() throw( RuntimeException )
1023 : {
1024 0 : Any aRet;
1025 0 : aRet <<= 1.0;
1026 0 : return aRet;
1027 : }
1028 :
1029 0 : Any SAL_CALL SvxRectCtlChildAccessibleContext::getMinimumValue() throw( RuntimeException )
1030 : {
1031 0 : Any aRet;
1032 0 : aRet <<= 0.0;
1033 0 : return aRet;
1034 : }
1035 :
1036 : //===== XServiceInfo ========================================================
1037 :
1038 0 : ::rtl::OUString SAL_CALL SvxRectCtlChildAccessibleContext::getImplementationName( void ) throw( RuntimeException )
1039 : {
1040 0 : return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.ui.SvxRectCtlChildAccessibleContext" ) );
1041 : }
1042 :
1043 0 : sal_Bool SAL_CALL SvxRectCtlChildAccessibleContext::supportsService( const ::rtl::OUString& sServiceName ) throw( RuntimeException )
1044 : {
1045 : // Iterate over all supported service names and return true if on of them
1046 : // matches the given name.
1047 0 : ::osl::MutexGuard aGuard( maMutex );
1048 0 : Sequence< ::rtl::OUString > aSupportedServices ( getSupportedServiceNames() );
1049 0 : int nLength = aSupportedServices.getLength();
1050 0 : for( int i = 0 ; i < nLength; ++i )
1051 : {
1052 0 : if( sServiceName == aSupportedServices[ i ] )
1053 0 : return sal_True;
1054 : }
1055 :
1056 0 : return sal_False;
1057 : }
1058 :
1059 0 : Sequence< ::rtl::OUString > SAL_CALL SvxRectCtlChildAccessibleContext::getSupportedServiceNames( void ) throw( RuntimeException )
1060 : {
1061 0 : const ::rtl::OUString sServiceName (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.accessibility.AccessibleContext"));
1062 0 : return Sequence< ::rtl::OUString >( &sServiceName, 1 );
1063 : }
1064 :
1065 : //===== XTypeProvider =======================================================
1066 :
1067 0 : Sequence< sal_Int8 > SAL_CALL SvxRectCtlChildAccessibleContext::getImplementationId( void ) throw( RuntimeException )
1068 : {
1069 : static OImplementationId* pId = 0;
1070 0 : if( !pId )
1071 : {
1072 0 : MutexGuard aGuard( Mutex::getGlobalMutex() );
1073 0 : if( !pId)
1074 : {
1075 0 : static OImplementationId aId;
1076 0 : pId = &aId;
1077 0 : }
1078 : }
1079 0 : return pId->getImplementationId();
1080 : }
1081 :
1082 : //===== internal ============================================================
1083 :
1084 0 : void SvxRectCtlChildAccessibleContext::CommitChange( const AccessibleEventObject& rEvent )
1085 : {
1086 0 : if (mnClientId)
1087 0 : comphelper::AccessibleEventNotifier::addEvent( mnClientId, rEvent );
1088 0 : }
1089 :
1090 0 : void SAL_CALL SvxRectCtlChildAccessibleContext::disposing()
1091 : {
1092 0 : if( !rBHelper.bDisposed )
1093 : {
1094 0 : ::osl::MutexGuard aGuard( maMutex );
1095 :
1096 : // Send a disposing to all listeners.
1097 0 : if ( mnClientId )
1098 : {
1099 0 : comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this );
1100 0 : mnClientId = 0;
1101 : }
1102 :
1103 0 : mxParent = Reference< XAccessible >();
1104 :
1105 0 : delete mpBoundingBox;
1106 : }
1107 0 : }
1108 :
1109 0 : void SvxRectCtlChildAccessibleContext::ThrowExceptionIfNotAlive( void ) throw( lang::DisposedException )
1110 : {
1111 0 : if( IsNotAlive() )
1112 0 : throw lang::DisposedException();
1113 0 : }
1114 :
1115 0 : Rectangle SvxRectCtlChildAccessibleContext::GetBoundingBoxOnScreen( void ) throw( RuntimeException )
1116 : {
1117 0 : ::osl::MutexGuard aGuard( maMutex );
1118 :
1119 : // no ThrowExceptionIfNotAlive() because its done in GetBoundingBox()
1120 0 : Rectangle aRect( GetBoundingBox() );
1121 :
1122 0 : return Rectangle( mrParentWindow.OutputToScreenPixel( aRect.TopLeft() ), aRect.GetSize() );
1123 : }
1124 :
1125 0 : Rectangle SvxRectCtlChildAccessibleContext::GetBoundingBox( void ) throw( RuntimeException )
1126 : {
1127 : // no guard neccessary, because no one changes mpBoundingBox after creating it
1128 0 : ThrowExceptionIfNotAlive();
1129 :
1130 0 : return *mpBoundingBox;
1131 : }
1132 :
1133 0 : void SvxRectCtlChildAccessibleContext::setStateChecked( sal_Bool bChecked )
1134 : {
1135 0 : if( mbIsChecked != bChecked )
1136 : {
1137 0 : mbIsChecked = bChecked;
1138 :
1139 0 : const Reference< XInterface > xSource( *this );
1140 :
1141 0 : Any aOld;
1142 0 : Any aNew;
1143 0 : Any& rMod = bChecked? aNew : aOld;
1144 :
1145 0 : rMod <<= AccessibleStateType::CHECKED;
1146 :
1147 0 : CommitChange( AccessibleEventObject( xSource, AccessibleEventId::STATE_CHANGED, aNew, aOld ) );
1148 : }
1149 57 : }
1150 :
1151 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|