xref: /trunk/main/sc/source/ui/inc/AccessibleContextBase.hxx (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 
29 #ifndef _SC_ACCESSIBLECONTEXTBASE_HXX
30 #define _SC_ACCESSIBLECONTEXTBASE_HXX
31 
32 #include <com/sun/star/accessibility/XAccessible.hpp>
33 #include <com/sun/star/accessibility/XAccessibleComponent.hpp>
34 #include <com/sun/star/accessibility/XAccessibleContext.hpp>
35 #include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
36 #ifndef _COM_SUN_STAR_ACCESSIBILITY_IllegalAccessibleComponentStateException_HPP_
37 #include <com/sun/star/accessibility/IllegalAccessibleComponentStateException.hpp>
38 #endif
39 #include <com/sun/star/lang/DisposedException.hpp>
40 #include <com/sun/star/uno/Reference.hxx>
41 #include <cppuhelper/weak.hxx>
42 #include <com/sun/star/lang/XServiceInfo.hpp>
43 #include <com/sun/star/lang/XTypeProvider.hpp>
44 #include <com/sun/star/lang/XServiceName.hpp>
45 #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
46 #include <vos/mutex.hxx>
47 #include <cppuhelper/interfacecontainer.h>
48 
49 
50 #include <svl/lstner.hxx>
51 #include <cppuhelper/compbase5.hxx>
52 #include <cppuhelper/implbase1.hxx>
53 #include <comphelper/servicehelper.hxx>
54 #include <comphelper/broadcasthelper.hxx>
55 
56 class Rectangle;
57 
58 /** @descr
59         This base class provides an implementation of the
60         <code>AccessibleContext</code> service.
61 */
62 
63 typedef cppu::WeakAggComponentImplHelper5<
64                 ::com::sun::star::accessibility::XAccessible,
65                 ::com::sun::star::accessibility::XAccessibleComponent,
66                 ::com::sun::star::accessibility::XAccessibleContext,
67                 ::com::sun::star::accessibility::XAccessibleEventBroadcaster,
68                 ::com::sun::star::lang::XServiceInfo
69                 > ScAccessibleContextBaseWeakImpl;
70 
71 typedef cppu::ImplHelper1<
72                 ::com::sun::star::accessibility::XAccessibleEventListener
73                 > ScAccessibleContextBaseImplEvent;
74 
75 class ScAccessibleContextBase
76     :   public comphelper::OBaseMutex,
77         public ScAccessibleContextBaseWeakImpl,
78         public ScAccessibleContextBaseImplEvent,
79         public SfxListener
80 {
81 public:
82     //=====  internal  ========================================================
83     ScAccessibleContextBase(
84         const ::com::sun::star::uno::Reference<
85         ::com::sun::star::accessibility::XAccessible>& rxParent,
86         const sal_Int16 aRole);
87 
88     virtual void Init();
89     virtual void SAL_CALL disposing();
90 protected:
91     virtual ~ScAccessibleContextBase(void);
92 public:
93     using WeakAggComponentImplHelperBase::addEventListener;
94     using WeakAggComponentImplHelperBase::removeEventListener;
95 
96     ///=====  SfxListener  =====================================================
97 
98     virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
99 
100     ///=====  XInterface  =====================================================
101 
102     virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(
103         ::com::sun::star::uno::Type const & rType )
104         throw (::com::sun::star::uno::RuntimeException);
105 
106     virtual void SAL_CALL acquire() throw ();
107 
108     virtual void SAL_CALL release() throw ();
109 
110     ///=====  XAccessible  =====================================================
111 
112     /// Return the XAccessibleContext.
113     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext> SAL_CALL
114         getAccessibleContext(void) throw (::com::sun::star::uno::RuntimeException);
115 
116     ///=====  XAccessibleComponent  ============================================
117 
118     virtual sal_Bool SAL_CALL containsPoint(
119         const ::com::sun::star::awt::Point& rPoint )
120         throw (::com::sun::star::uno::RuntimeException);
121 
122     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
123         SAL_CALL getAccessibleAtPoint(
124         const ::com::sun::star::awt::Point& rPoint )
125         throw (::com::sun::star::uno::RuntimeException);
126 
127     virtual ::com::sun::star::awt::Rectangle SAL_CALL getBounds(  )
128         throw (::com::sun::star::uno::RuntimeException);
129 
130     virtual ::com::sun::star::awt::Point SAL_CALL getLocation(  )
131         throw (::com::sun::star::uno::RuntimeException);
132 
133     virtual ::com::sun::star::awt::Point SAL_CALL getLocationOnScreen(  )
134         throw (::com::sun::star::uno::RuntimeException);
135 
136     virtual ::com::sun::star::awt::Size SAL_CALL getSize(  )
137         throw (::com::sun::star::uno::RuntimeException);
138 
139     virtual sal_Bool SAL_CALL isShowing(  )
140         throw (::com::sun::star::uno::RuntimeException);
141 
142     virtual sal_Bool SAL_CALL isVisible(  )
143         throw (::com::sun::star::uno::RuntimeException);
144 
145     virtual void SAL_CALL grabFocus(  )
146         throw (::com::sun::star::uno::RuntimeException);
147 
148     virtual sal_Int32 SAL_CALL getForeground(  )
149         throw (::com::sun::star::uno::RuntimeException);
150 
151     virtual sal_Int32 SAL_CALL getBackground(  )
152         throw (::com::sun::star::uno::RuntimeException);
153 
154     ///=====  XAccessibleContext  ==============================================
155 
156     /// Return the number of currently visible children.
157     virtual sal_Int32 SAL_CALL
158         getAccessibleChildCount(void) throw (::com::sun::star::uno::RuntimeException);
159 
160     /// Return the specified child or NULL if index is invalid.
161     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible> SAL_CALL
162         getAccessibleChild(sal_Int32 nIndex)
163         throw (::com::sun::star::uno::RuntimeException,
164                 ::com::sun::star::lang::IndexOutOfBoundsException);
165 
166     /// Return a reference to the parent.
167     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible> SAL_CALL
168         getAccessibleParent(void)
169         throw (::com::sun::star::uno::RuntimeException);
170 
171     /// Return this objects index among the parents children.
172     virtual sal_Int32 SAL_CALL
173         getAccessibleIndexInParent(void)
174         throw (::com::sun::star::uno::RuntimeException);
175 
176     /// Return this object's role.
177     virtual sal_Int16 SAL_CALL
178         getAccessibleRole(void)
179         throw (::com::sun::star::uno::RuntimeException);
180 
181     /// Return this object's description.
182     virtual ::rtl::OUString SAL_CALL
183         getAccessibleDescription(void)
184         throw (::com::sun::star::uno::RuntimeException);
185 
186     /// Return the object's current name.
187     virtual ::rtl::OUString SAL_CALL
188         getAccessibleName(void)
189         throw (::com::sun::star::uno::RuntimeException);
190 
191     /// Return NULL to indicate that an empty relation set.
192     virtual ::com::sun::star::uno::Reference<
193             ::com::sun::star::accessibility::XAccessibleRelationSet> SAL_CALL
194         getAccessibleRelationSet(void)
195         throw (::com::sun::star::uno::RuntimeException);
196 
197     /// Return the set of current states.
198     virtual ::com::sun::star::uno::Reference<
199             ::com::sun::star::accessibility::XAccessibleStateSet> SAL_CALL
200         getAccessibleStateSet(void)
201         throw (::com::sun::star::uno::RuntimeException);
202 
203     /** Return the parents locale or throw exception if this object has no
204         parent yet/anymore.
205     */
206     virtual ::com::sun::star::lang::Locale SAL_CALL
207         getLocale(void)
208         throw (::com::sun::star::uno::RuntimeException,
209             ::com::sun::star::accessibility::IllegalAccessibleComponentStateException);
210 
211     ///=====  XAccessibleEventBroadcaster  =====================================
212 
213     /** Add listener that is informed of future changes of name,
214         description and so on events.
215     */
216     virtual void SAL_CALL
217         addEventListener(
218             const ::com::sun::star::uno::Reference<
219                 ::com::sun::star::accessibility::XAccessibleEventListener>& xListener)
220         throw (com::sun::star::uno::RuntimeException);
221 
222     //  Remove an existing event listener.
223     virtual void SAL_CALL
224         removeEventListener(
225             const ::com::sun::star::uno::Reference<
226                 ::com::sun::star::accessibility::XAccessibleEventListener>& xListener)
227         throw (com::sun::star::uno::RuntimeException);
228 
229     ///=====  XAccessibleEventListener  ========================================
230 
231     virtual void SAL_CALL
232         disposing( const ::com::sun::star::lang::EventObject& Source )
233         throw (::com::sun::star::uno::RuntimeException);
234 
235     virtual void SAL_CALL
236         notifyEvent(
237         const ::com::sun::star::accessibility::AccessibleEventObject& aEvent )
238         throw (::com::sun::star::uno::RuntimeException);
239 
240     ///=====  XServiceInfo  ====================================================
241 
242     /** Returns an identifier for the implementation of this object.
243     */
244     virtual ::rtl::OUString SAL_CALL
245         getImplementationName(void)
246         throw (::com::sun::star::uno::RuntimeException);
247 
248     /** Return whether the specified service is supported by this class.
249     */
250     virtual sal_Bool SAL_CALL
251         supportsService(const ::rtl::OUString& sServiceName)
252         throw (::com::sun::star::uno::RuntimeException);
253 
254     /** Returns a list of all supported services.  In this case that is just
255         the AccessibleContext and Accessible service.
256     */
257     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString> SAL_CALL
258         getSupportedServiceNames(void)
259         throw (::com::sun::star::uno::RuntimeException);
260 
261     ///=====  XTypeProvider  ===================================================
262 
263     /// returns the possible types
264     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL
265         getTypes()
266         throw (::com::sun::star::uno::RuntimeException);
267 
268     /** Returns a implementation id.
269     */
270     virtual ::com::sun::star::uno::Sequence<sal_Int8> SAL_CALL
271         getImplementationId(void)
272         throw (::com::sun::star::uno::RuntimeException);
273 
274 protected:
275     /// Return this object's description.
276     virtual ::rtl::OUString SAL_CALL
277         createAccessibleDescription(void)
278         throw (::com::sun::star::uno::RuntimeException);
279 
280     /// Return the object's current name.
281     virtual ::rtl::OUString SAL_CALL
282         createAccessibleName(void)
283         throw (::com::sun::star::uno::RuntimeException);
284 
285     /// Return the object's current bounding box relative to the desktop.
286     virtual Rectangle GetBoundingBoxOnScreen(void) const
287         throw (::com::sun::star::uno::RuntimeException);
288 
289     /// Return the object's current bounding box relative to the parent object.
290     virtual Rectangle GetBoundingBox(void) const
291         throw (::com::sun::star::uno::RuntimeException);
292 
293 public:
294     /// Calls all Listener to tell they the change.
295     void
296         CommitChange(const com::sun::star::accessibility::AccessibleEventObject& rEvent) const;
297 
298     /// change the name and call the listener to tell they the change
299     void
300         ChangeName();
301 
302 protected:
303     /// Calls all FocusListener to tell they that the focus is gained.
304     void CommitFocusGained() const;
305 
306     /// Calls all FocusListener to tell they that the focus is lost.
307     void CommitFocusLost() const;
308 
309     sal_Bool IsDefunc() const { return rBHelper.bDisposed; }
310 
311     virtual void IsObjectValid() const
312         throw (::com::sun::star::lang::DisposedException);
313 
314     /// Use this method to set initial Name without notification
315     void SetName(const rtl::OUString& rName) { msName = rName; }
316     /// Use this method to set initial Description without notification
317     void SetDescription(const rtl::OUString& rDesc) { msDescription = rDesc; }
318 
319     /// Reference to the parent object.
320     ::com::sun::star::uno::Reference<
321          ::com::sun::star::accessibility::XAccessible> mxParent;
322 
323 private:
324     /** Description of this object.  This is not a constant because it can
325         be set from the outside.  Furthermore, it changes according the the
326         draw page's display mode.
327     */
328     ::rtl::OUString msDescription;
329 
330     /** Name of this object.  It changes according the the draw page's
331         display mode.
332     */
333     ::rtl::OUString msName;
334 
335     /// client id in the AccessibleEventNotifier queue
336     sal_uInt32 mnClientId;
337 
338     /** This is the role of this object.
339     */
340     sal_Int16 maRole;
341 };
342 
343 
344 #endif
345