xref: /AOO41X/main/svtools/source/control/accessibleruler.cxx (revision 4d7c9de063a797b8b4f3d45e3561e82ad1f8ef1f)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_svtools.hxx"
24 
25 #ifndef _SVTRULERACCESSIBLE_HXX
26 #include <svtools/accessibleruler.hxx>
27 #endif
28 
29 #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_
30 #include <com/sun/star/accessibility/AccessibleRole.hpp>
31 #endif
32 #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEEVENTID_HPP_
33 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
34 #endif
35 #ifndef _UTL_ACCESSIBLESTATESETHELPER_HXX_
36 #include <unotools/accessiblestatesethelper.hxx>
37 #endif
38 #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLESTATETYPE_HPP_
39 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
40 #endif
41 
42 #ifndef _COM_SUN_STAR_BEANS_PROPERTYCHANGEEVENT_HPP_
43 #include <com/sun/star/beans/PropertyChangeEvent.hpp>
44 #endif
45 
46 #ifndef _COM_SUN_STAR_AWT_XWINDOW_HPP_
47 #include <com/sun/star/awt/XWindow.hpp>
48 #endif
49 
50 #ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
51 #include <cppuhelper/typeprovider.hxx>
52 #endif
53 
54 #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
55 #include <toolkit/helper/vclunohelper.hxx>
56 #endif
57 #ifndef _TOOLKIT_HELPER_CONVERT_HXX_
58 #include <toolkit/helper/convert.hxx>
59 #endif
60 
61 #ifndef _SV_SVAPP_HXX
62 #include <vcl/svapp.hxx>
63 #endif
64 
65 #ifndef _OSL_MUTEX_HXX_
66 #include <osl/mutex.hxx>
67 #endif
68 #ifndef _RTL_UUID_H_
69 #include <rtl/uuid.h>
70 #endif
71 #ifndef _TOOLS_DEBUG_HXX
72 #include <tools/debug.hxx>
73 #endif
74 #ifndef _SV_GEN_HXX
75 #include <tools/gen.hxx>
76 #endif
77 
78 #include "ruler.hxx"
79 
80 #ifndef COMPHELPER_ACCESSIBLE_EVENT_NOTIFIER
81 #include <comphelper/accessibleeventnotifier.hxx>
82 #endif
83 
84 using namespace ::cppu;
85 using namespace ::osl;
86 using namespace ::rtl;
87 using namespace ::com::sun::star;
88 using namespace ::com::sun::star::uno;
89 using namespace ::com::sun::star::accessibility;
90 
DBG_NAME(SvtRulerAccessible)91 DBG_NAME( SvtRulerAccessible )
92 
93 
94 //=====  internal  ============================================================
95 
96 SvtRulerAccessible::SvtRulerAccessible(
97     const uno::Reference< XAccessible >& rxParent, Ruler& rRepr, const OUString& rName ) :
98 
99     SvtRulerAccessible_Base( m_aMutex ),
100     msName( rName ),
101     mxParent( rxParent ),
102     mpRepr( &rRepr ),
103     mnClientId( 0 )
104 {
105     DBG_CTOR( SvtRulerAccessible, NULL );
106 }
107 
~SvtRulerAccessible()108 SvtRulerAccessible::~SvtRulerAccessible()
109 {
110     DBG_DTOR( SvtRulerAccessible, NULL );
111 
112     if( IsAlive() )
113     {
114         osl_incrementInterlockedCount( &m_refCount );
115         dispose();      // set mpRepr = NULL & release all childs
116     }
117 }
118 
119 //=====  XAccessible  =========================================================
120 
getAccessibleContext(void)121 uno::Reference< XAccessibleContext > SAL_CALL SvtRulerAccessible::getAccessibleContext( void ) throw( RuntimeException )
122 {
123     return this;
124 }
125 
126 //=====  XAccessibleComponent  ================================================
127 
containsPoint(const awt::Point & rPoint)128 sal_Bool SAL_CALL SvtRulerAccessible::containsPoint( const awt::Point& rPoint ) throw( RuntimeException )
129 {
130     // no guard -> done in getBounds()
131 //  return GetBoundingBox().IsInside( VCLPoint( rPoint ) );
132     return Rectangle( Point( 0, 0 ), GetBoundingBox().GetSize() ).IsInside( VCLPoint( rPoint ) );
133 }
134 
getAccessibleAtPoint(const awt::Point &)135 uno::Reference< XAccessible > SAL_CALL SvtRulerAccessible::getAccessibleAtPoint( const awt::Point& ) throw( RuntimeException )
136 {
137     ::osl::MutexGuard           aGuard( m_aMutex );
138 
139     ThrowExceptionIfNotAlive();
140 
141     uno::Reference< XAccessible >   xRet;
142 
143 
144     return xRet;
145 }
146 
getBounds()147 awt::Rectangle SAL_CALL SvtRulerAccessible::getBounds() throw( RuntimeException )
148 {
149     // no guard -> done in GetBoundingBox()
150     return AWTRectangle( GetBoundingBox() );
151 }
152 
getLocation()153 awt::Point SAL_CALL SvtRulerAccessible::getLocation() throw( RuntimeException )
154 {
155     // no guard -> done in GetBoundingBox()
156     return AWTPoint( GetBoundingBox().TopLeft() );
157 }
158 
getLocationOnScreen()159 awt::Point SAL_CALL SvtRulerAccessible::getLocationOnScreen() throw( RuntimeException )
160 {
161     // no guard -> done in GetBoundingBoxOnScreen()
162     return AWTPoint( GetBoundingBoxOnScreen().TopLeft() );
163 }
164 
getSize()165 awt::Size SAL_CALL SvtRulerAccessible::getSize() throw( RuntimeException )
166 {
167     // no guard -> done in GetBoundingBox()
168     return AWTSize( GetBoundingBox().GetSize() );
169 }
170 
isShowing()171 sal_Bool SAL_CALL SvtRulerAccessible::isShowing() throw( RuntimeException )
172 {
173     return sal_True;
174 }
175 
isVisible()176 sal_Bool SAL_CALL SvtRulerAccessible::isVisible() throw( RuntimeException )
177 {
178     ::osl::MutexGuard           aGuard( m_aMutex );
179 
180     ThrowExceptionIfNotAlive();
181 
182     return mpRepr->IsVisible();
183 }
184 
isFocusTraversable()185 sal_Bool SAL_CALL SvtRulerAccessible::isFocusTraversable() throw( RuntimeException )
186 {
187     return sal_True;
188 }
189 
190 //=====  XAccessibleContext  ==================================================
191 
getAccessibleChildCount(void)192 sal_Int32 SAL_CALL SvtRulerAccessible::getAccessibleChildCount( void ) throw( RuntimeException )
193 {
194     ::osl::MutexGuard   aGuard( m_aMutex );
195 
196     ThrowExceptionIfNotAlive();
197 
198     return 0;
199 }
200 
getAccessibleChild(sal_Int32)201 uno::Reference< XAccessible > SAL_CALL SvtRulerAccessible::getAccessibleChild( sal_Int32 )
202     throw( RuntimeException, lang::IndexOutOfBoundsException )
203 {
204     uno::Reference< XAccessible >   xChild ;
205 
206     return xChild;
207 }
208 
getAccessibleParent(void)209 uno::Reference< XAccessible > SAL_CALL SvtRulerAccessible::getAccessibleParent( void ) throw( RuntimeException )
210 {
211     return mxParent;
212 }
213 
getAccessibleIndexInParent(void)214 sal_Int32 SAL_CALL SvtRulerAccessible::getAccessibleIndexInParent( void ) throw( RuntimeException )
215 {
216     ::osl::MutexGuard   aGuard( m_aMutex );
217     //  Use a simple but slow solution for now.  Optimize later.
218 
219     //  Iterate over all the parent's children and search for this object.
220     if( mxParent.is() )
221     {
222         uno::Reference< XAccessibleContext >        xParentContext( mxParent->getAccessibleContext() );
223         if( xParentContext.is() )
224         {
225             sal_Int32                       nChildCount = xParentContext->getAccessibleChildCount();
226             for( sal_Int32 i = 0 ; i < nChildCount ; ++i )
227             {
228                 uno::Reference< XAccessible >   xChild( xParentContext->getAccessibleChild( i ) );
229                 if( xChild.get() == ( XAccessible* ) this )
230                     return i;
231             }
232         }
233    }
234 
235    //   Return -1 to indicate that this object's parent does not know about the
236    //   object.
237    return -1;
238 }
239 
getAccessibleRole(void)240 sal_Int16 SAL_CALL SvtRulerAccessible::getAccessibleRole( void ) throw( RuntimeException )
241 {
242     return AccessibleRole::RULER;
243 }
244 
getAccessibleDescription(void)245 OUString SAL_CALL SvtRulerAccessible::getAccessibleDescription( void ) throw( RuntimeException )
246 {
247     ::osl::MutexGuard   aGuard( m_aMutex );
248     return msDescription;
249 }
250 
getAccessibleName(void)251 OUString SAL_CALL SvtRulerAccessible::getAccessibleName( void ) throw( RuntimeException )
252 {
253     ::osl::MutexGuard   aGuard( m_aMutex );
254     return msName;
255 }
256 
257 /** Return empty uno::Reference to indicate that the relation set is not
258     supported.
259 */
getAccessibleRelationSet(void)260 uno::Reference< XAccessibleRelationSet > SAL_CALL SvtRulerAccessible::getAccessibleRelationSet( void ) throw( RuntimeException )
261 {
262     return uno::Reference< XAccessibleRelationSet >();
263 }
264 
265 
getAccessibleStateSet(void)266 uno::Reference< XAccessibleStateSet > SAL_CALL SvtRulerAccessible::getAccessibleStateSet( void ) throw( RuntimeException )
267 {
268     ::osl::MutexGuard                       aGuard( m_aMutex );
269     utl::AccessibleStateSetHelper*          pStateSetHelper = new utl::AccessibleStateSetHelper;
270 
271     if( IsAlive() )
272     {
273         pStateSetHelper->AddState( AccessibleStateType::ENABLED );
274 
275         if( isShowing() )
276             pStateSetHelper->AddState( AccessibleStateType::SHOWING );
277 
278         if( isVisible() )
279             pStateSetHelper->AddState( AccessibleStateType::VISIBLE );
280 
281 
282         if ( mpRepr )
283         {
284             if ( mpRepr->GetStyle() & WB_HORZ )
285                 pStateSetHelper->AddState( AccessibleStateType::HORIZONTAL );
286             else
287                 pStateSetHelper->AddState( AccessibleStateType::VERTICAL );
288         }
289         if(pStateSetHelper->contains(AccessibleStateType::FOCUSABLE))
290         {
291             pStateSetHelper->RemoveState( AccessibleStateType::FOCUSABLE );
292         }
293 
294     }
295 
296 
297     return pStateSetHelper;
298 }
299 
getLocale(void)300 lang::Locale SAL_CALL SvtRulerAccessible::getLocale( void ) throw( IllegalAccessibleComponentStateException, RuntimeException )
301 {
302     ::osl::MutexGuard                           aGuard( m_aMutex );
303     if( mxParent.is() )
304     {
305         uno::Reference< XAccessibleContext >    xParentContext( mxParent->getAccessibleContext() );
306         if( xParentContext.is() )
307             return xParentContext->getLocale();
308     }
309 
310     //  No parent.  Therefore throw exception to indicate this cluelessness.
311     throw IllegalAccessibleComponentStateException();
312 }
313 
addEventListener(const uno::Reference<XAccessibleEventListener> & xListener)314 void SAL_CALL SvtRulerAccessible::addEventListener( const uno::Reference< XAccessibleEventListener >& xListener )
315     throw( RuntimeException )
316 {
317     if (xListener.is())
318     {
319         ::osl::MutexGuard   aGuard( m_aMutex );
320         if (!mnClientId)
321             mnClientId = comphelper::AccessibleEventNotifier::registerClient( );
322         comphelper::AccessibleEventNotifier::addEventListener( mnClientId, xListener );
323     }
324 }
325 
removeEventListener(const uno::Reference<XAccessibleEventListener> & xListener)326 void SAL_CALL SvtRulerAccessible::removeEventListener( const uno::Reference< XAccessibleEventListener >& xListener )
327     throw( RuntimeException )
328 {
329     if (xListener.is())
330     {
331         ::osl::MutexGuard   aGuard( m_aMutex );
332 
333         sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, xListener );
334         if ( !nListenerCount )
335         {
336             // no listeners anymore
337             // -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
338             // and at least to us not firing any events anymore, in case somebody calls
339             // NotifyAccessibleEvent, again
340             comphelper::AccessibleEventNotifier::revokeClient( mnClientId );
341             mnClientId = 0;
342         }
343     }
344 }
345 
addFocusListener(const uno::Reference<awt::XFocusListener> & xListener)346 void SAL_CALL SvtRulerAccessible::addFocusListener( const uno::Reference< awt::XFocusListener >& xListener )
347     throw( RuntimeException )
348 {
349     if( xListener.is() )
350     {
351         ::osl::MutexGuard   aGuard( m_aMutex );
352 
353         ThrowExceptionIfNotAlive();
354 
355         uno::Reference< awt::XWindow >  xWindow = VCLUnoHelper::GetInterface( mpRepr );
356         if( xWindow.is() )
357             xWindow->addFocusListener( xListener );
358     }
359 }
360 
removeFocusListener(const uno::Reference<awt::XFocusListener> & xListener)361 void SAL_CALL SvtRulerAccessible::removeFocusListener( const uno::Reference< awt::XFocusListener >& xListener )
362     throw (RuntimeException)
363 {
364     if( xListener.is() )
365     {
366         ::osl::MutexGuard   aGuard( m_aMutex );
367 
368         ThrowExceptionIfNotAlive();
369 
370         uno::Reference< awt::XWindow >  xWindow = VCLUnoHelper::GetInterface( mpRepr );
371         if( xWindow.is() )
372             xWindow->removeFocusListener( xListener );
373     }
374 }
375 
grabFocus()376 void SAL_CALL SvtRulerAccessible::grabFocus() throw( RuntimeException )
377 {
378     ::vos::OGuard       aSolarGuard( Application::GetSolarMutex() );
379     ::osl::MutexGuard   aGuard( m_aMutex );
380 
381     ThrowExceptionIfNotAlive();
382 
383     mpRepr->GrabFocus();
384 }
385 
getAccessibleKeyBinding()386 Any SAL_CALL SvtRulerAccessible::getAccessibleKeyBinding() throw( RuntimeException )
387 {
388     // here is no implementation, because here are no KeyBindings for every object
389     return Any();
390 }
391 
getForeground()392 sal_Int32 SvtRulerAccessible::getForeground(  )
393         throw (::com::sun::star::uno::RuntimeException)
394 {
395     ::vos::OGuard       aSolarGuard( Application::GetSolarMutex() );
396     ::osl::MutexGuard   aGuard( m_aMutex );
397     ThrowExceptionIfNotAlive();
398 
399     return mpRepr->GetControlForeground().GetColor();
400 }
getBackground()401 sal_Int32 SvtRulerAccessible::getBackground(  )
402         throw (::com::sun::star::uno::RuntimeException)
403 {
404     ::vos::OGuard       aSolarGuard( Application::GetSolarMutex() );
405     ::osl::MutexGuard   aGuard( m_aMutex );
406     ThrowExceptionIfNotAlive();
407 
408     return mpRepr->GetControlBackground().GetColor();
409 }
410 
411 //=====  XServiceInfo  ========================================================
412 
getImplementationName(void)413 OUString SAL_CALL SvtRulerAccessible::getImplementationName( void ) throw( RuntimeException )
414 {
415     return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.ui.SvtRulerAccessible" ) );
416 }
417 
supportsService(const OUString & sServiceName)418 sal_Bool SAL_CALL SvtRulerAccessible::supportsService( const OUString& sServiceName ) throw( RuntimeException )
419 {
420     ::osl::MutexGuard   aGuard( m_aMutex );
421     //  Iterate over all supported service names and return true if on of them
422     //  matches the given name.
423     Sequence< OUString >    aSupportedServices( getSupportedServiceNames() );
424     int                     nLength = aSupportedServices.getLength();
425     const OUString*         pStr = aSupportedServices.getConstArray();
426 
427     for( int i = nLength ; i ; --i, ++pStr )
428     {
429         if( sServiceName == *pStr )
430             return sal_True;
431     }
432 
433     return sal_False;
434 }
435 
getSupportedServiceNames(void)436 Sequence< OUString > SAL_CALL SvtRulerAccessible::getSupportedServiceNames( void ) throw( RuntimeException )
437 {
438     const OUString sServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.accessibility.AccessibleContext" ) );
439     return Sequence< OUString >( &sServiceName, 1 );
440 }
441 
442 //=====  XTypeProvider  =======================================================
443 
getImplementationId(void)444 Sequence< sal_Int8 > SAL_CALL SvtRulerAccessible::getImplementationId( void ) throw( RuntimeException )
445 {
446     return getUniqueId();
447 }
448 
449 
450 //=====  internals ========================================================
451 
setName(const OUString & rName)452 void SvtRulerAccessible::setName( const OUString& rName )
453 {
454         msName = rName;
455 
456 }
457 
setDescription(const OUString & rDescr)458 void SvtRulerAccessible::setDescription( const OUString& rDescr )
459 {
460 
461         msDescription = rDescr;
462 
463 }
464 
465 
466 
disposing()467 void SAL_CALL SvtRulerAccessible::disposing()
468 {
469     if( !rBHelper.bDisposed )
470     {
471         {
472             ::osl::MutexGuard   aGuard( m_aMutex );
473             mpRepr = NULL;      // object dies with representation
474 
475         }
476 
477         {
478             ::osl::MutexGuard   aGuard( m_aMutex );
479 
480             // Send a disposing to all listeners.
481             if ( mnClientId )
482             {
483                 comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this );
484                 mnClientId =  0;
485             }
486             mxParent = uno::Reference< XAccessible >();
487         }
488     }
489 }
490 
GetBoundingBoxOnScreen(void)491 Rectangle SvtRulerAccessible::GetBoundingBoxOnScreen( void ) throw( RuntimeException )
492 {
493     ::vos::OGuard       aSolarGuard( Application::GetSolarMutex() );
494     ::osl::MutexGuard   aGuard( m_aMutex );
495 
496     ThrowExceptionIfNotAlive();
497     //the absolute on screen pixel is wrong
498     //return Rectangle( mpRepr->GetParent()->OutputToScreenPixel( mpRepr->GetPosPixel() ), mpRepr->GetSizePixel() );
499     return Rectangle( mpRepr->GetParent()->OutputToAbsoluteScreenPixel( mpRepr->GetPosPixel() ), mpRepr->GetSizePixel() );
500 }
501 
GetBoundingBox(void)502 Rectangle SvtRulerAccessible::GetBoundingBox( void ) throw( RuntimeException )
503 {
504     ::vos::OGuard       aSolarGuard( Application::GetSolarMutex() );
505     ::osl::MutexGuard   aGuard( m_aMutex );
506 
507     ThrowExceptionIfNotAlive();
508 
509     return Rectangle( mpRepr->GetPosPixel(), mpRepr->GetSizePixel() );
510 }
511 
getUniqueId(void)512 Sequence< sal_Int8 > SvtRulerAccessible::getUniqueId( void )
513 {
514     static OImplementationId*   pId = 0;
515     if( !pId )
516     {
517         MutexGuard                      aGuard( Mutex::getGlobalMutex() );
518         if( !pId)
519         {
520             static OImplementationId    aId;
521             pId = &aId;
522         }
523     }
524     return pId->getImplementationId();
525 }
526 
ThrowExceptionIfNotAlive(void)527 void SvtRulerAccessible::ThrowExceptionIfNotAlive( void ) throw( lang::DisposedException )
528 {
529     if( IsNotAlive() )
530         throw lang::DisposedException();
531 }
532 
addEventListener(const::com::sun::star::uno::Reference<::com::sun::star::lang::XEventListener> & xListener)533 void SvtRulerAccessible::addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener )throw( com::sun::star::uno::RuntimeException )
534 {
535     cppu::WeakAggComponentImplHelperBase::addEventListener( xListener );
536 }
537 
removeEventListener(const::com::sun::star::uno::Reference<::com::sun::star::lang::XEventListener> & xListener)538 void SvtRulerAccessible::removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw( com::sun::star::uno::RuntimeException )
539 {
540     cppu::WeakAggComponentImplHelperBase::removeEventListener( xListener );
541 }
542 
543 
544 // -------------------------------------------------------------------------------------------------
545 
546