xref: /trunk/main/accessibility/source/extended/accessibletabbar.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_accessibility.hxx"
30 #include <accessibility/extended/accessibletabbar.hxx>
31 #include <svtools/tabbar.hxx>
32 #include <accessibility/extended/accessibletabbarpagelist.hxx>
33 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
34 #include <com/sun/star/accessibility/AccessibleRole.hpp>
35 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
36 #include <unotools/accessiblestatesethelper.hxx>
37 #include <unotools/accessiblerelationsethelper.hxx>
38 #include <vcl/svapp.hxx>
39 #include <toolkit/awt/vclxfont.hxx>
40 #include <toolkit/helper/convert.hxx>
41 
42 #include <vector>
43 
44 
45 //.........................................................................
46 namespace accessibility
47 {
48 //.........................................................................
49 
50     using namespace ::com::sun::star;
51     using namespace ::com::sun::star::uno;
52     using namespace ::com::sun::star::lang;
53     using namespace ::com::sun::star::accessibility;
54     using namespace ::comphelper;
55 
56     DBG_NAME( AccessibleTabBar )
57 
58     //  ----------------------------------------------------
59     //  class AccessibleTabBar
60     //  ----------------------------------------------------
61 
62     AccessibleTabBar::AccessibleTabBar( TabBar* pTabBar )
63         :AccessibleTabBarBase( pTabBar )
64     {
65         DBG_CTOR( AccessibleTabBar, NULL );
66 
67         if ( m_pTabBar )
68             m_aAccessibleChildren.assign( m_pTabBar->GetAccessibleChildWindowCount() + 1, Reference< XAccessible >() );
69     }
70 
71     // -----------------------------------------------------------------------------
72 
73     AccessibleTabBar::~AccessibleTabBar()
74     {
75         DBG_DTOR( AccessibleTabBar, NULL );
76     }
77 
78     // -----------------------------------------------------------------------------
79 
80     void AccessibleTabBar::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
81     {
82         Any aOldValue, aNewValue;
83 
84         switch ( rVclWindowEvent.GetId() )
85         {
86             case VCLEVENT_WINDOW_ENABLED:
87             {
88                 aNewValue <<= AccessibleStateType::SENSITIVE;
89                 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
90                 aNewValue <<= AccessibleStateType::ENABLED;
91                 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
92             }
93             break;
94             case VCLEVENT_WINDOW_DISABLED:
95             {
96                 aOldValue <<= AccessibleStateType::ENABLED;
97                 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
98                 aOldValue <<= AccessibleStateType::SENSITIVE;
99                 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
100             }
101             break;
102             case VCLEVENT_WINDOW_GETFOCUS:
103             {
104                 aNewValue <<= AccessibleStateType::FOCUSED;
105                 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
106             }
107             break;
108             case VCLEVENT_WINDOW_LOSEFOCUS:
109             {
110                 aOldValue <<= AccessibleStateType::FOCUSED;
111                 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
112             }
113             break;
114             case VCLEVENT_WINDOW_SHOW:
115             {
116                 aNewValue <<= AccessibleStateType::SHOWING;
117                 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
118             }
119             break;
120             case VCLEVENT_WINDOW_HIDE:
121             {
122                 aOldValue <<= AccessibleStateType::SHOWING;
123                 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
124             }
125             break;
126             default:
127             {
128                 AccessibleTabBarBase::ProcessWindowEvent( rVclWindowEvent );
129             }
130             break;
131         }
132     }
133 
134     // -----------------------------------------------------------------------------
135 
136     void AccessibleTabBar::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet )
137     {
138         if ( m_pTabBar )
139         {
140             if ( m_pTabBar->IsEnabled() )
141             {
142                 rStateSet.AddState( AccessibleStateType::ENABLED );
143                 rStateSet.AddState( AccessibleStateType::SENSITIVE );
144             }
145 
146             rStateSet.AddState( AccessibleStateType::FOCUSABLE );
147 
148             if ( m_pTabBar->HasFocus() )
149                 rStateSet.AddState( AccessibleStateType::FOCUSED );
150 
151             rStateSet.AddState( AccessibleStateType::VISIBLE );
152 
153             if ( m_pTabBar->IsVisible() )
154                 rStateSet.AddState( AccessibleStateType::SHOWING );
155 
156             if ( m_pTabBar->GetStyle() & WB_SIZEABLE )
157                 rStateSet.AddState( AccessibleStateType::RESIZABLE );
158         }
159     }
160 
161     // -----------------------------------------------------------------------------
162     // OCommonAccessibleComponent
163     // -----------------------------------------------------------------------------
164 
165     awt::Rectangle AccessibleTabBar::implGetBounds() throw (RuntimeException)
166     {
167         awt::Rectangle aBounds;
168         if ( m_pTabBar )
169             aBounds = AWTRectangle( Rectangle( m_pTabBar->GetPosPixel(), m_pTabBar->GetSizePixel() ) );
170 
171         return aBounds;
172     }
173 
174     // -----------------------------------------------------------------------------
175     // XInterface
176     // -----------------------------------------------------------------------------
177 
178     IMPLEMENT_FORWARD_XINTERFACE2( AccessibleTabBar, AccessibleExtendedComponentHelper_BASE, AccessibleTabBar_BASE )
179 
180     // -----------------------------------------------------------------------------
181     // XTypeProvider
182     // -----------------------------------------------------------------------------
183 
184     IMPLEMENT_FORWARD_XTYPEPROVIDER2( AccessibleTabBar, AccessibleExtendedComponentHelper_BASE, AccessibleTabBar_BASE )
185 
186     // -----------------------------------------------------------------------------
187     // XComponent
188     // -----------------------------------------------------------------------------
189 
190     void AccessibleTabBar::disposing()
191     {
192         AccessibleTabBarBase::disposing();
193 
194         // dispose all children
195         for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i )
196         {
197             Reference< XComponent > xComponent( m_aAccessibleChildren[i], UNO_QUERY );
198             if ( xComponent.is() )
199                 xComponent->dispose();
200         }
201         m_aAccessibleChildren.clear();
202     }
203 
204     // -----------------------------------------------------------------------------
205     // XServiceInfo
206     // -----------------------------------------------------------------------------
207 
208     ::rtl::OUString AccessibleTabBar::getImplementationName() throw (RuntimeException)
209     {
210         return ::rtl::OUString::createFromAscii( "com.sun.star.comp.svtools.AccessibleTabBar" );
211     }
212 
213     // -----------------------------------------------------------------------------
214 
215     sal_Bool AccessibleTabBar::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException)
216     {
217         Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() );
218         const ::rtl::OUString* pNames = aNames.getConstArray();
219         const ::rtl::OUString* pEnd = pNames + aNames.getLength();
220         for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames )
221             ;
222 
223         return pNames != pEnd;
224     }
225 
226     // -----------------------------------------------------------------------------
227 
228     Sequence< ::rtl::OUString > AccessibleTabBar::getSupportedServiceNames() throw (RuntimeException)
229     {
230         Sequence< ::rtl::OUString > aNames(1);
231         aNames[0] = ::rtl::OUString::createFromAscii( "com.sun.star.awt.AccessibleTabBar" );
232         return aNames;
233     }
234 
235     // -----------------------------------------------------------------------------
236     // XAccessible
237     // -----------------------------------------------------------------------------
238 
239     Reference< XAccessibleContext > AccessibleTabBar::getAccessibleContext(  ) throw (RuntimeException)
240     {
241         OExternalLockGuard aGuard( this );
242 
243         return this;
244     }
245 
246     // -----------------------------------------------------------------------------
247     // XAccessibleContext
248     // -----------------------------------------------------------------------------
249 
250     sal_Int32 AccessibleTabBar::getAccessibleChildCount() throw (RuntimeException)
251     {
252         OExternalLockGuard aGuard( this );
253 
254         return m_aAccessibleChildren.size();
255     }
256 
257     // -----------------------------------------------------------------------------
258 
259     Reference< XAccessible > AccessibleTabBar::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException, RuntimeException)
260     {
261         OExternalLockGuard aGuard( this );
262 
263         if ( i < 0 || i >= getAccessibleChildCount() )
264             throw IndexOutOfBoundsException();
265 
266         Reference< XAccessible > xChild = m_aAccessibleChildren[i];
267         if ( !xChild.is() )
268         {
269             if ( m_pTabBar )
270             {
271                 sal_Int32 nCount = m_pTabBar->GetAccessibleChildWindowCount();
272 
273                 if ( i < nCount )
274                 {
275                     Window* pChild = m_pTabBar->GetAccessibleChildWindow( (sal_uInt16)i );
276                     if ( pChild )
277                         xChild = pChild->GetAccessible();
278                 }
279                 else if ( i == nCount )
280                 {
281                     xChild = new AccessibleTabBarPageList( m_pTabBar, i );
282                 }
283 
284                 // insert into child list
285                 m_aAccessibleChildren[i] = xChild;
286             }
287         }
288 
289         return xChild;
290     }
291 
292     // -----------------------------------------------------------------------------
293 
294     Reference< XAccessible > AccessibleTabBar::getAccessibleParent(  ) throw (RuntimeException)
295     {
296         OExternalLockGuard aGuard( this );
297 
298         Reference< XAccessible > xParent;
299         if ( m_pTabBar )
300         {
301             Window* pParent = m_pTabBar->GetAccessibleParentWindow();
302             if ( pParent )
303                 xParent = pParent->GetAccessible();
304         }
305 
306         return xParent;
307     }
308 
309     // -----------------------------------------------------------------------------
310 
311     sal_Int32 AccessibleTabBar::getAccessibleIndexInParent(  ) throw (RuntimeException)
312     {
313         OExternalLockGuard aGuard( this );
314 
315         sal_Int32 nIndexInParent = -1;
316         if ( m_pTabBar )
317         {
318             Window* pParent = m_pTabBar->GetAccessibleParentWindow();
319             if ( pParent )
320             {
321                 for ( sal_uInt16 i = 0, nCount = pParent->GetAccessibleChildWindowCount(); i < nCount; ++i )
322                 {
323                     Window* pChild = pParent->GetAccessibleChildWindow( i );
324                     if ( pChild == static_cast< Window* >( m_pTabBar ) )
325                     {
326                         nIndexInParent = i;
327                         break;
328                     }
329                 }
330             }
331         }
332 
333         return nIndexInParent;
334     }
335 
336     // -----------------------------------------------------------------------------
337 
338     sal_Int16 AccessibleTabBar::getAccessibleRole(  ) throw (RuntimeException)
339     {
340         OExternalLockGuard aGuard( this );
341 
342         return AccessibleRole::PANEL;
343     }
344 
345     // -----------------------------------------------------------------------------
346 
347     ::rtl::OUString AccessibleTabBar::getAccessibleDescription( ) throw (RuntimeException)
348     {
349         OExternalLockGuard aGuard( this );
350 
351         ::rtl::OUString sDescription;
352         if ( m_pTabBar )
353             sDescription = m_pTabBar->GetAccessibleDescription();
354 
355         return sDescription;
356     }
357 
358     // -----------------------------------------------------------------------------
359 
360     ::rtl::OUString AccessibleTabBar::getAccessibleName(  ) throw (RuntimeException)
361     {
362         OExternalLockGuard aGuard( this );
363 
364         ::rtl::OUString sName;
365         if ( m_pTabBar )
366             sName = m_pTabBar->GetAccessibleName();
367 
368         return sName;
369     }
370 
371     // -----------------------------------------------------------------------------
372 
373     Reference< XAccessibleRelationSet > AccessibleTabBar::getAccessibleRelationSet(  ) throw (RuntimeException)
374     {
375         OExternalLockGuard aGuard( this );
376 
377         utl::AccessibleRelationSetHelper* pRelationSetHelper = new utl::AccessibleRelationSetHelper;
378         Reference< XAccessibleRelationSet > xSet = pRelationSetHelper;
379         return xSet;
380     }
381 
382     // -----------------------------------------------------------------------------
383 
384     Reference< XAccessibleStateSet > AccessibleTabBar::getAccessibleStateSet(  ) throw (RuntimeException)
385     {
386         OExternalLockGuard aGuard( this );
387 
388         utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
389         Reference< XAccessibleStateSet > xSet = pStateSetHelper;
390 
391         if ( !rBHelper.bDisposed && !rBHelper.bInDispose )
392         {
393             FillAccessibleStateSet( *pStateSetHelper );
394         }
395         else
396         {
397             pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
398         }
399 
400         return xSet;
401     }
402 
403     // -----------------------------------------------------------------------------
404 
405     Locale AccessibleTabBar::getLocale(  ) throw (IllegalAccessibleComponentStateException, RuntimeException)
406     {
407         OExternalLockGuard aGuard( this );
408 
409         return Application::GetSettings().GetLocale();
410     }
411 
412     // -----------------------------------------------------------------------------
413     // XAccessibleComponent
414     // -----------------------------------------------------------------------------
415 
416     Reference< XAccessible > AccessibleTabBar::getAccessibleAtPoint( const awt::Point& rPoint ) throw (RuntimeException)
417     {
418         OExternalLockGuard aGuard( this );
419 
420         Reference< XAccessible > xChild;
421         for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i )
422         {
423             Reference< XAccessible > xAcc = getAccessibleChild( i );
424             if ( xAcc.is() )
425             {
426                 Reference< XAccessibleComponent > xComp( xAcc->getAccessibleContext(), UNO_QUERY );
427                 if ( xComp.is() )
428                 {
429                     Rectangle aRect = VCLRectangle( xComp->getBounds() );
430                     Point aPos = VCLPoint( rPoint );
431                     if ( aRect.IsInside( aPos ) )
432                     {
433                         xChild = xAcc;
434                         break;
435                     }
436                 }
437             }
438         }
439 
440         return xChild;
441     }
442 
443     // -----------------------------------------------------------------------------
444 
445     void AccessibleTabBar::grabFocus(  ) throw (RuntimeException)
446     {
447         OExternalLockGuard aGuard( this );
448 
449         if ( m_pTabBar )
450             m_pTabBar->GrabFocus();
451     }
452 
453     // -----------------------------------------------------------------------------
454 
455     sal_Int32 AccessibleTabBar::getForeground(  ) throw (RuntimeException)
456     {
457         OExternalLockGuard aGuard( this );
458 
459         sal_Int32 nColor = 0;
460         if ( m_pTabBar )
461         {
462             if ( m_pTabBar->IsControlForeground() )
463                 nColor = m_pTabBar->GetControlForeground().GetColor();
464             else
465             {
466                 Font aFont;
467                 if ( m_pTabBar->IsControlFont() )
468                     aFont = m_pTabBar->GetControlFont();
469                 else
470                     aFont = m_pTabBar->GetFont();
471                 nColor = aFont.GetColor().GetColor();
472             }
473         }
474 
475         return nColor;
476     }
477 
478     // -----------------------------------------------------------------------------
479 
480     sal_Int32 AccessibleTabBar::getBackground(  ) throw (RuntimeException)
481     {
482         OExternalLockGuard aGuard( this );
483 
484         sal_Int32 nColor = 0;
485         if ( m_pTabBar )
486         {
487             if ( m_pTabBar->IsControlBackground() )
488                 nColor = m_pTabBar->GetControlBackground().GetColor();
489             else
490                 nColor = m_pTabBar->GetBackground().GetColor().GetColor();
491         }
492 
493         return nColor;
494     }
495 
496     // -----------------------------------------------------------------------------
497     // XAccessibleExtendedComponent
498     // -----------------------------------------------------------------------------
499 
500     Reference< awt::XFont > AccessibleTabBar::getFont(  ) throw (RuntimeException)
501     {
502         OExternalLockGuard aGuard( this );
503 
504         Reference< awt::XFont > xFont;
505         if ( m_pTabBar )
506         {
507             Reference< awt::XDevice > xDev( m_pTabBar->GetComponentInterface(), UNO_QUERY );
508             if ( xDev.is() )
509             {
510                 Font aFont;
511                 if ( m_pTabBar->IsControlFont() )
512                     aFont = m_pTabBar->GetControlFont();
513                 else
514                     aFont = m_pTabBar->GetFont();
515                 VCLXFont* pVCLXFont = new VCLXFont;
516                 pVCLXFont->Init( *xDev.get(), aFont );
517                 xFont = pVCLXFont;
518             }
519         }
520 
521         return xFont;
522     }
523 
524     // -----------------------------------------------------------------------------
525 
526     ::rtl::OUString AccessibleTabBar::getTitledBorderText(  ) throw (RuntimeException)
527     {
528         OExternalLockGuard aGuard( this );
529 
530         ::rtl::OUString sText;
531         if ( m_pTabBar )
532             sText = m_pTabBar->GetText();
533 
534         return sText;
535     }
536 
537     // -----------------------------------------------------------------------------
538 
539     ::rtl::OUString AccessibleTabBar::getToolTipText(  ) throw (RuntimeException)
540     {
541         OExternalLockGuard aGuard( this );
542 
543         ::rtl::OUString sText;
544         if ( m_pTabBar )
545             sText = m_pTabBar->GetQuickHelpText();
546 
547         return sText;
548     }
549 
550     // -----------------------------------------------------------------------------
551 
552 //.........................................................................
553 }   // namespace accessibility
554 //.........................................................................
555