1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
21 #include "accessibility/extended/AccessibleToolPanelDeckTabBarItem.hxx"
23 #include <com/sun/star/accessibility/AccessibleRole.hpp>
24 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
25 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
26 #include <com/sun/star/lang/DisposedException.hpp>
28 #include <svtools/toolpanel/toolpaneldeck.hxx>
29 #include <svtools/toolpanel/paneltabbar.hxx>
30 #include <unotools/accessiblestatesethelper.hxx>
31 #include <unotools/accessiblerelationsethelper.hxx>
32 #include <tools/diagnose_ex.h>
33 #include <vcl/svapp.hxx>
34 #include <osl/mutex.hxx>
36 //......................................................................................................................
37 namespace accessibility
39 //......................................................................................................................
41 typedef ::com::sun::star::awt::Rectangle UnoRectangle
;
42 typedef ::com::sun::star::awt::Point UnoPoint
;
44 /** === begin UNO using === **/
45 using ::com::sun::star::uno::Reference
;
46 using ::com::sun::star::uno::XInterface
;
47 using ::com::sun::star::uno::UNO_QUERY
;
48 using ::com::sun::star::uno::UNO_QUERY_THROW
;
49 using ::com::sun::star::uno::UNO_SET_THROW
;
50 using ::com::sun::star::uno::Exception
;
51 using ::com::sun::star::uno::RuntimeException
;
52 using ::com::sun::star::uno::Any
;
53 using ::com::sun::star::uno::makeAny
;
54 using ::com::sun::star::uno::Sequence
;
55 using ::com::sun::star::uno::Type
;
56 using ::com::sun::star::accessibility::XAccessible
;
57 using ::com::sun::star::lang::DisposedException
;
58 using ::com::sun::star::lang::IndexOutOfBoundsException
;
59 using ::com::sun::star::accessibility::XAccessibleRelationSet
;
60 using ::com::sun::star::accessibility::XAccessibleStateSet
;
61 using ::com::sun::star::accessibility::XAccessibleComponent
;
62 using ::com::sun::star::accessibility::XAccessibleExtendedComponent
;
63 using ::com::sun::star::awt::XFont
;
64 /** === end UNO using === **/
66 namespace AccessibleRole
= ::com::sun::star::accessibility::AccessibleRole
;
67 namespace AccessibleStateType
= ::com::sun::star::accessibility::AccessibleStateType
;
68 namespace AccessibleEventId
= ::com::sun::star::accessibility::AccessibleEventId
;
70 //==================================================================================================================
71 //= AccessibleToolPanelDeckTabBarItem_Impl
72 //==================================================================================================================
73 class AccessibleToolPanelDeckTabBarItem_Impl
: public ::svt::IToolPanelDeckListener
76 AccessibleToolPanelDeckTabBarItem_Impl(
77 AccessibleToolPanelDeckTabBarItem
& i_rAntiImpl
,
78 const Reference
< XAccessible
>& i_rAccessibleParent
,
79 ::svt::IToolPanelDeck
& i_rPanelDeck
,
80 ::svt::PanelTabBar
& i_rTabBar
,
81 const size_t i_nItemPos
83 virtual ~AccessibleToolPanelDeckTabBarItem_Impl();
85 ::svt::PanelTabBar
* getTabBar() const { return m_pTabBar
; }
87 // IToolPanelDeckListener
88 virtual void PanelInserted( const ::svt::PToolPanel
& i_pPanel
, const size_t i_nPosition
);
89 virtual void PanelRemoved( const size_t i_nPosition
);
90 virtual void ActivePanelChanged( const ::boost::optional
< size_t >& i_rOldActive
, const ::boost::optional
< size_t >& i_rNewActive
);
91 virtual void LayouterChanged( const ::svt::PDeckLayouter
& i_rNewLayouter
);
95 bool isDisposed() const { return m_pPanelDeck
== NULL
; }
96 void checkDisposed() const;
99 const Reference
< XAccessible
>&
100 getAccessibleParent() const { return m_xAccessibleParent
; }
101 size_t getItemPos() const { return m_nItemPos
; }
103 Reference
< XAccessibleComponent
> getParentAccessibleComponent() const;
104 ::svt::IToolPanelDeck
* getPanelDeck() const { return m_pPanelDeck
; }
105 OUString
getPanelDisplayName();
108 void impl_notifyBoundRectChanges();
109 void impl_notifyStateChange( const sal_Int16 i_nLostState
, const sal_Int16 i_nGainedState
);
112 AccessibleToolPanelDeckTabBarItem
& m_rAntiImpl
;
113 Reference
< XAccessible
> m_xAccessibleParent
;
114 ::svt::IToolPanelDeck
* m_pPanelDeck
;
115 ::svt::PanelTabBar
* m_pTabBar
;
119 //==================================================================================================================
120 //= AccessibleToolPanelDeckTabBarItem_Impl
121 //==================================================================================================================
122 //------------------------------------------------------------------------------------------------------------------
123 AccessibleToolPanelDeckTabBarItem_Impl::AccessibleToolPanelDeckTabBarItem_Impl( AccessibleToolPanelDeckTabBarItem
& i_rAntiImpl
,
124 const Reference
< XAccessible
>& i_rAccessibleParent
, ::svt::IToolPanelDeck
& i_rPanelDeck
, ::svt::PanelTabBar
& i_rTabBar
,
125 const size_t i_nItemPos
)
126 :m_rAntiImpl( i_rAntiImpl
)
127 ,m_xAccessibleParent( i_rAccessibleParent
)
128 ,m_pPanelDeck( &i_rPanelDeck
)
129 ,m_pTabBar( &i_rTabBar
)
130 ,m_nItemPos( i_nItemPos
)
132 m_pPanelDeck
->AddListener( *this );
135 //------------------------------------------------------------------------------------------------------------------
136 AccessibleToolPanelDeckTabBarItem_Impl::~AccessibleToolPanelDeckTabBarItem_Impl()
140 //------------------------------------------------------------------------------------------------------------------
141 void AccessibleToolPanelDeckTabBarItem_Impl::checkDisposed() const
144 throw DisposedException( OUString(), *&m_rAntiImpl
);
147 //------------------------------------------------------------------------------------------------------------------
148 void AccessibleToolPanelDeckTabBarItem_Impl::dispose()
150 ENSURE_OR_RETURN_VOID( !isDisposed(), "AccessibleToolPanelDeckTabBarItem_Impl::dispose: disposed twice!" );
152 m_xAccessibleParent
.clear();
153 m_pPanelDeck
->RemoveListener( *this );
158 //------------------------------------------------------------------------------------------------------------------
159 Reference
< XAccessibleComponent
> AccessibleToolPanelDeckTabBarItem_Impl::getParentAccessibleComponent() const
161 Reference
< XAccessible
> xAccessibleParent( m_rAntiImpl
.getAccessibleParent(), UNO_QUERY_THROW
);
162 return Reference
< XAccessibleComponent
>( xAccessibleParent
->getAccessibleContext(), UNO_QUERY
);
165 //------------------------------------------------------------------------------------------------------------------
166 OUString
AccessibleToolPanelDeckTabBarItem_Impl::getPanelDisplayName()
168 const ::svt::PToolPanel
pPanel( m_pPanelDeck
->GetPanel( getItemPos() ) );
169 if ( pPanel
.get() == NULL
)
170 throw DisposedException();
171 return pPanel
->GetDisplayName();
174 //------------------------------------------------------------------------------------------------------------------
175 void AccessibleToolPanelDeckTabBarItem_Impl::impl_notifyBoundRectChanges()
177 m_rAntiImpl
.NotifyAccessibleEvent( AccessibleEventId::BOUNDRECT_CHANGED
, Any(), Any() );
180 //------------------------------------------------------------------------------------------------------------------
181 void AccessibleToolPanelDeckTabBarItem_Impl::impl_notifyStateChange( const sal_Int16 i_nLostState
, const sal_Int16 i_nGainedState
)
183 m_rAntiImpl
.NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED
,
184 i_nLostState
> -1 ? makeAny( i_nLostState
) : Any(),
185 i_nGainedState
> -1 ? makeAny( i_nGainedState
) : Any()
189 //------------------------------------------------------------------------------------------------------------------
190 void AccessibleToolPanelDeckTabBarItem_Impl::PanelInserted( const ::svt::PToolPanel
& i_pPanel
, const size_t i_nPosition
)
193 if ( i_nPosition
<= m_nItemPos
)
195 impl_notifyBoundRectChanges();
198 //------------------------------------------------------------------------------------------------------------------
199 void AccessibleToolPanelDeckTabBarItem_Impl::PanelRemoved( const size_t i_nPosition
)
201 if ( i_nPosition
== m_nItemPos
)
203 m_rAntiImpl
.dispose();
205 else if ( i_nPosition
< m_nItemPos
)
208 impl_notifyBoundRectChanges();
212 //------------------------------------------------------------------------------------------------------------------
213 void AccessibleToolPanelDeckTabBarItem_Impl::ActivePanelChanged( const ::boost::optional
< size_t >& i_rOldActive
, const ::boost::optional
< size_t >& i_rNewActive
)
215 if ( m_nItemPos
== i_rOldActive
)
217 impl_notifyStateChange( AccessibleStateType::ACTIVE
, -1 );
218 impl_notifyStateChange( AccessibleStateType::SELECTED
, -1 );
220 else if ( m_nItemPos
== i_rNewActive
)
222 impl_notifyStateChange( -1, AccessibleStateType::ACTIVE
);
223 impl_notifyStateChange( -1, AccessibleStateType::SELECTED
);
227 //------------------------------------------------------------------------------------------------------------------
228 void AccessibleToolPanelDeckTabBarItem_Impl::LayouterChanged( const ::svt::PDeckLayouter
& i_rNewLayouter
)
230 (void)i_rNewLayouter
;
231 // if the tool panel deck has a new layouter, then the old layouter, and thus all items it was
232 // responsible for, died. So do we.
236 //------------------------------------------------------------------------------------------------------------------
237 void AccessibleToolPanelDeckTabBarItem_Impl::Dying()
239 // if the tool panel deck is dying, then its layouter dies, so should we.
243 //==================================================================================================================
245 //==================================================================================================================
246 class ItemMethodGuard
249 ItemMethodGuard( AccessibleToolPanelDeckTabBarItem_Impl
& i_rImpl
)
252 i_rImpl
.checkDisposed();
259 SolarMutexGuard m_aGuard
;
262 //==================================================================================================================
263 //= AccessibleToolPanelDeckTabBarItem
264 //==================================================================================================================
265 //------------------------------------------------------------------------------------------------------------------
266 AccessibleToolPanelDeckTabBarItem::AccessibleToolPanelDeckTabBarItem( const Reference
< XAccessible
>& i_rAccessibleParent
,
267 ::svt::IToolPanelDeck
& i_rPanelDeck
, ::svt::PanelTabBar
& i_rTabBar
, const size_t i_nItemPos
)
268 :m_pImpl( new AccessibleToolPanelDeckTabBarItem_Impl( *this, i_rAccessibleParent
, i_rPanelDeck
, i_rTabBar
, i_nItemPos
) )
272 //------------------------------------------------------------------------------------------------------------------
273 AccessibleToolPanelDeckTabBarItem::~AccessibleToolPanelDeckTabBarItem()
277 //--------------------------------------------------------------------
278 sal_Int32 SAL_CALL
AccessibleToolPanelDeckTabBarItem::getAccessibleChildCount( ) throw (RuntimeException
)
283 //--------------------------------------------------------------------
284 Reference
< XAccessible
> SAL_CALL
AccessibleToolPanelDeckTabBarItem::getAccessibleChild( sal_Int32 i
) throw (IndexOutOfBoundsException
, RuntimeException
)
287 throw IndexOutOfBoundsException( OUString(), *this );
290 //--------------------------------------------------------------------
291 Reference
< XAccessible
> SAL_CALL
AccessibleToolPanelDeckTabBarItem::getAccessibleParent( ) throw (RuntimeException
)
293 ItemMethodGuard
aGuard( *m_pImpl
);
294 return m_pImpl
->getAccessibleParent();
297 //--------------------------------------------------------------------
298 sal_Int16 SAL_CALL
AccessibleToolPanelDeckTabBarItem::getAccessibleRole( ) throw (RuntimeException
)
300 return AccessibleRole::PAGE_TAB
;
303 //--------------------------------------------------------------------
304 OUString SAL_CALL
AccessibleToolPanelDeckTabBarItem::getAccessibleDescription( ) throw (RuntimeException
)
306 ItemMethodGuard
aGuard( *m_pImpl
);
307 return m_pImpl
->getPanelDisplayName();
310 //--------------------------------------------------------------------
311 OUString SAL_CALL
AccessibleToolPanelDeckTabBarItem::getAccessibleName( ) throw (RuntimeException
)
313 ItemMethodGuard
aGuard( *m_pImpl
);
314 return m_pImpl
->getPanelDisplayName();
317 //--------------------------------------------------------------------
318 Reference
< XAccessibleRelationSet
> SAL_CALL
AccessibleToolPanelDeckTabBarItem::getAccessibleRelationSet( ) throw (RuntimeException
)
320 ItemMethodGuard
aGuard( *m_pImpl
);
321 ::utl::AccessibleRelationSetHelper
* pRelationSet
= new utl::AccessibleRelationSetHelper
;
325 //--------------------------------------------------------------------
326 Reference
< XAccessibleStateSet
> SAL_CALL
AccessibleToolPanelDeckTabBarItem::getAccessibleStateSet( ) throw (RuntimeException
)
328 ItemMethodGuard
aGuard( *m_pImpl
);
330 ::utl::AccessibleStateSetHelper
* pStateSet( new ::utl::AccessibleStateSetHelper
);
331 pStateSet
->AddState( AccessibleStateType::FOCUSABLE
);
332 pStateSet
->AddState( AccessibleStateType::SELECTABLE
);
333 pStateSet
->AddState( AccessibleStateType::ICONIFIED
);
335 if ( m_pImpl
->getItemPos() == m_pImpl
->getPanelDeck()->GetActivePanel() )
337 pStateSet
->AddState( AccessibleStateType::ACTIVE
);
338 pStateSet
->AddState( AccessibleStateType::SELECTED
);
341 if ( m_pImpl
->getItemPos() == m_pImpl
->getTabBar()->GetFocusedPanelItem() )
342 pStateSet
->AddState( AccessibleStateType::FOCUSED
);
344 if ( m_pImpl
->getTabBar()->IsEnabled() )
345 pStateSet
->AddState( AccessibleStateType::ENABLED
);
347 if ( m_pImpl
->getTabBar()->IsVisible() )
349 pStateSet
->AddState( AccessibleStateType::SHOWING
);
350 pStateSet
->AddState( AccessibleStateType::VISIBLE
);
357 //--------------------------------------------------------------------
358 Reference
< XAccessible
> SAL_CALL
AccessibleToolPanelDeckTabBarItem::getAccessibleAtPoint( const UnoPoint
& i_rLocation
) throw (RuntimeException
)
360 ItemMethodGuard
aGuard( *m_pImpl
);
361 // we do not have children ...
366 //--------------------------------------------------------------------
367 void SAL_CALL
AccessibleToolPanelDeckTabBarItem::grabFocus( ) throw (RuntimeException
)
369 ItemMethodGuard
aGuard( *m_pImpl
);
370 m_pImpl
->getTabBar()->FocusPanelItem( m_pImpl
->getItemPos() );
373 //--------------------------------------------------------------------
374 ::sal_Int32 SAL_CALL
AccessibleToolPanelDeckTabBarItem::getForeground( ) throw (RuntimeException
)
376 ItemMethodGuard
aGuard( *m_pImpl
);
377 Reference
< XAccessibleComponent
> xParentComponent( m_pImpl
->getParentAccessibleComponent(), UNO_SET_THROW
);
378 return xParentComponent
->getForeground();
381 //--------------------------------------------------------------------
382 ::sal_Int32 SAL_CALL
AccessibleToolPanelDeckTabBarItem::getBackground( ) throw (RuntimeException
)
384 ItemMethodGuard
aGuard( *m_pImpl
);
385 Reference
< XAccessibleComponent
> xParentComponent( m_pImpl
->getParentAccessibleComponent(), UNO_SET_THROW
);
386 return xParentComponent
->getBackground();
389 //--------------------------------------------------------------------
390 Reference
< XFont
> SAL_CALL
AccessibleToolPanelDeckTabBarItem::getFont( ) throw (RuntimeException
)
392 ItemMethodGuard
aGuard( *m_pImpl
);
393 Reference
< XAccessibleExtendedComponent
> xParentComponent( m_pImpl
->getParentAccessibleComponent(), UNO_QUERY_THROW
);
394 // TODO: strictly, this is not correct: The TabBar implementation of the TabLayouter might use
395 // a different font ...
396 return xParentComponent
->getFont();
399 //--------------------------------------------------------------------
400 OUString SAL_CALL
AccessibleToolPanelDeckTabBarItem::getTitledBorderText( ) throw (RuntimeException
)
402 ItemMethodGuard
aGuard( *m_pImpl
);
407 //--------------------------------------------------------------------
408 OUString SAL_CALL
AccessibleToolPanelDeckTabBarItem::getToolTipText( ) throw (RuntimeException
)
410 ItemMethodGuard
aGuard( *m_pImpl
);
411 return m_pImpl
->getPanelDisplayName();
414 //--------------------------------------------------------------------
415 UnoRectangle SAL_CALL
AccessibleToolPanelDeckTabBarItem::implGetBounds() throw (RuntimeException
)
417 ItemMethodGuard
aGuard( *m_pImpl
);
419 const ::Rectangle
aItemScreenRect( m_pImpl
->getTabBar()->GetItemScreenRect( m_pImpl
->getItemPos() ) );
421 Reference
< XAccessibleComponent
> xParentComponent( m_pImpl
->getParentAccessibleComponent(), UNO_SET_THROW
);
422 const UnoPoint
aParentLocation( xParentComponent
->getLocationOnScreen() );
424 aItemScreenRect
.Left() - aParentLocation
.X
,
425 aItemScreenRect
.Top() - aParentLocation
.Y
,
426 aItemScreenRect
.GetWidth(),
427 aItemScreenRect
.GetHeight()
431 //--------------------------------------------------------------------
432 void SAL_CALL
AccessibleToolPanelDeckTabBarItem::disposing()
434 ItemMethodGuard
aGuard( *m_pImpl
);
438 //......................................................................................................................
439 } // namespace accessibility
440 //......................................................................................................................
442 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */