Version 4.0.2.1, tag libreoffice-4.0.2.1
[LibreOffice.git] / accessibility / source / extended / AccessibleToolPanelDeckTabBarItem.cxx
bloba17ce8d153b7f9b412a5dca5ace1917846dd1c2f
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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
75 public:
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 );
92 virtual void Dying();
94 public:
95 bool isDisposed() const { return m_pPanelDeck == NULL; }
96 void checkDisposed() const;
97 void dispose();
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();
107 private:
108 void impl_notifyBoundRectChanges();
109 void impl_notifyStateChange( const sal_Int16 i_nLostState, const sal_Int16 i_nGainedState );
111 private:
112 AccessibleToolPanelDeckTabBarItem& m_rAntiImpl;
113 Reference< XAccessible > m_xAccessibleParent;
114 ::svt::IToolPanelDeck* m_pPanelDeck;
115 ::svt::PanelTabBar* m_pTabBar;
116 size_t m_nItemPos;
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
143 if ( isDisposed() )
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 );
154 m_pPanelDeck = NULL;
155 m_pTabBar = NULL;
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 )
192 (void)i_pPanel;
193 if ( i_nPosition <= m_nItemPos )
194 ++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 )
207 --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.
233 dispose();
236 //------------------------------------------------------------------------------------------------------------------
237 void AccessibleToolPanelDeckTabBarItem_Impl::Dying()
239 // if the tool panel deck is dying, then its layouter dies, so should we.
240 dispose();
243 //==================================================================================================================
244 //= ItemMethodGuard
245 //==================================================================================================================
246 class ItemMethodGuard
248 public:
249 ItemMethodGuard( AccessibleToolPanelDeckTabBarItem_Impl& i_rImpl )
250 :m_aGuard()
252 i_rImpl.checkDisposed();
254 ~ItemMethodGuard()
258 private:
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)
280 return 0;
283 //--------------------------------------------------------------------
284 Reference< XAccessible > SAL_CALL AccessibleToolPanelDeckTabBarItem::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException, RuntimeException)
286 (void)i;
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;
322 return pRelationSet;
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 );
353 return pStateSet;
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 ...
362 (void)i_rLocation;
363 return NULL;
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 );
403 // no support
404 return OUString();
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() );
423 return UnoRectangle(
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 );
435 m_pImpl->dispose();
438 //......................................................................................................................
439 } // namespace accessibility
440 //......................................................................................................................
442 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */