xref: /trunk/main/accessibility/inc/accessibility/extended/AccessibleBrowseBox.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
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 
23 
24 
25 #ifndef ACCESSIBILITY_EXT_ACCESSIBLEBROWSEBOX_HXX
26 #define ACCESSIBILITY_EXT_ACCESSIBLEBROWSEBOX_HXX
27 
28 #include <accessibility/extended/AccessibleBrowseBoxBase.hxx>
29 #include <cppuhelper/weakref.hxx>
30 #include <svtools/accessibletableprovider.hxx>
31 
32 
33 #include <memory>
34 
35 // ============================================================================
36 
37 namespace accessibility {
38 
39     class AccessibleBrowseBoxImpl;
40     class AccessibleBrowseBoxTable;
41 
42 // ============================================================================
43 
44 /** This class represents the complete accessible BrowseBox object. */
45 class AccessibleBrowseBox : public AccessibleBrowseBoxBase
46 {
47     friend class AccessibleBrowseBoxAccess;
48 
49 protected:
50     AccessibleBrowseBox(
51         const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxParent,
52         const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxCreator,
53         ::svt::IAccessibleTableProvider& _rBrowseBox
54     );
55 
56     virtual ~AccessibleBrowseBox();
57 
58     /** sets the XAccessible which created the context
59 
60         <p>To be called only once, and only if in the ctor NULL was passed.</p>
61     */
62     void    setCreator(
63         const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxCreator
64     );
65 
66     /** Cleans up members. */
67     using AccessibleBrowseBoxBase::disposing;
68     virtual void SAL_CALL disposing();
69 
70 protected:
71     // XAccessibleContext -----------------------------------------------------
72 
73     /** @return  The count of visible children. */
74     virtual sal_Int32 SAL_CALL getAccessibleChildCount()
75         throw ( ::com::sun::star::uno::RuntimeException );
76 
77     /** @return  The XAccessible interface of the specified child. */
78     virtual ::com::sun::star::uno::Reference<
79         ::com::sun::star::accessibility::XAccessible > SAL_CALL
80     getAccessibleChild( sal_Int32 nChildIndex )
81         throw ( ::com::sun::star::lang::IndexOutOfBoundsException,
82                 ::com::sun::star::uno::RuntimeException );
83 
84     /** @return  The role of this object (a table). */
85 //    virtual sal_Int16 SAL_CALL getAccessibleRole()
86 //        throw ( ::com::sun::star::uno::RuntimeException );
87 
88     // XAccessibleComponent ---------------------------------------------------
89 
90     /** @return
91             The accessible child rendered under the given point.
92     */
93     virtual ::com::sun::star::uno::Reference<
94         ::com::sun::star::accessibility::XAccessible > SAL_CALL
95     getAccessibleAtPoint( const ::com::sun::star::awt::Point& rPoint )
96         throw ( ::com::sun::star::uno::RuntimeException );
97 
98     /** Grabs the focus to the BrowseBox. */
99     virtual void SAL_CALL grabFocus()
100         throw ( ::com::sun::star::uno::RuntimeException );
101 
102     /** @return  The key bindings associated with this object. */
103     virtual ::com::sun::star::uno::Any SAL_CALL getAccessibleKeyBinding()
104         throw ( ::com::sun::star::uno::RuntimeException );
105 
106     // XServiceInfo -----------------------------------------------------------
107 
108     /** @return
109             The name of this class.
110     */
111     virtual ::rtl::OUString SAL_CALL getImplementationName()
112         throw ( ::com::sun::star::uno::RuntimeException );
113 
114 public:
115     // helper functions
116     /** commitHeaderBarEvent commit the event at all listeners of the column/row header bar
117         @param nEventId
118             the event id
119         @param rNewValue
120             the new value
121         @param rOldValue
122             the old value
123     */
124     void commitHeaderBarEvent(sal_Int16 nEventId,
125             const ::com::sun::star::uno::Any& rNewValue,
126             const ::com::sun::star::uno::Any& rOldValue,sal_Bool _bColumnHeaderBar = sal_True);
127 
128     // helper functions
129     /** commitTableEvent commit the event at all listeners of the table
130         @param nEventId
131             the event id
132         @param rNewValue
133             the new value
134         @param rOldValue
135             the old value
136     */
137     void commitTableEvent(sal_Int16 nEventId,
138             const ::com::sun::star::uno::Any& rNewValue,
139             const ::com::sun::star::uno::Any& rOldValue);
140 
141     /** returns the accessible object for the row or the column header bar
142     */
143     inline ::com::sun::star::uno::Reference<
144         ::com::sun::star::accessibility::XAccessible >
getHeaderBar(::svt::AccessibleBrowseBoxObjType _eObjType)145         getHeaderBar( ::svt::AccessibleBrowseBoxObjType _eObjType )
146         {
147             return implGetHeaderBar(_eObjType);
148         }
149 
150     /** returns the accessible object for the table representation
151     */
152     inline ::com::sun::star::uno::Reference<
153         ::com::sun::star::accessibility::XAccessible >
getTable()154         getTable( )
155         {
156             return implGetTable();
157         }
158 
159 protected:
160     // internal virtual methods -----------------------------------------------
161 
162     /** @attention  This method requires locked mutex's and a living object.
163         @return  The bounding box (VCL rect.) relative to the parent window. */
164     virtual Rectangle implGetBoundingBox();
165     /** @attention  This method requires locked mutex's and a living object.
166         @return  The bounding box (VCL rect.) in screen coordinates. */
167     virtual Rectangle implGetBoundingBoxOnScreen();
168 
169     // internal helper methods ------------------------------------------------
170 
171     /** This method creates (once) and returns the accessible data table child.
172         @attention  This method requires locked mutex's and a living object.
173         @return  The XAccessible interface of the data table. */
174     virtual ::com::sun::star::uno::Reference<
175         ::com::sun::star::accessibility::XAccessible > implGetTable();
176 
177     /** This method creates (once) and returns the specified header bar.
178         @attention  This method requires locked mutex's and a living object.
179         @return  The XAccessible interface of the header bar. */
180     ::com::sun::star::uno::Reference<
181         ::com::sun::star::accessibility::XAccessible >
182         implGetHeaderBar( ::svt::AccessibleBrowseBoxObjType eObjType );
183 
184     /** This method returns one of the children that are always present:
185         Data table, row and column header bar or corner control.
186         @attention  This method requires locked mutex's and a living object.
187         @return  The XAccessible interface of the specified child. */
188     ::com::sun::star::uno::Reference<
189         ::com::sun::star::accessibility::XAccessible >
190     implGetFixedChild( sal_Int32 nChildIndex );
191 
192     /** This method creates and returns an accessible table.
193         @return  An AccessibleBrowseBoxTable. */
194     virtual AccessibleBrowseBoxTable*   createAccessibleTable();
195 
196 private:
197     // members ----------------------------------------------------------------
198     ::std::auto_ptr< AccessibleBrowseBoxImpl > m_pImpl;
199 };
200 
201 // ============================================================================
202 /** the XAccessible which creates/returns an AccessibleBrowseBox
203 
204     <p>The instance holds it's XAccessibleContext with a hard reference, while
205     the contxt holds this instance weak.</p>
206 */
207 typedef ::cppu::WeakImplHelper1 <   ::com::sun::star::accessibility::XAccessible
208                                 >   AccessibleBrowseBoxAccess_Base;
209 
210 class AccessibleBrowseBoxAccess :public AccessibleBrowseBoxAccess_Base
211                                 ,public ::svt::IAccessibleBrowseBox
212 {
213 private:
214     ::osl::Mutex                m_aMutex;
215     ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
216                                         m_xParent;
217     ::svt::IAccessibleTableProvider&    m_rBrowseBox;
218 
219     ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext >
220                                 m_xContext;
221     AccessibleBrowseBox*        m_pContext;
222                                     // note that this pointer is valid as long as m_xContext is valid!
223 
224 public:
225     AccessibleBrowseBoxAccess(
226         const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxParent,
227         ::svt::IAccessibleTableProvider& _rBrowseBox
228     );
229 
230     /// checks whether the accessible context is still alive
231     bool                            isContextAlive() const;
232 
233     /// returns the AccessibleContext belonging to this Accessible
getContext()234     inline AccessibleBrowseBox*            getContext()         { return m_pContext; }
getContext() const235     inline const AccessibleBrowseBox*      getContext() const   { return m_pContext; }
236 
237 protected:
238     virtual ~AccessibleBrowseBoxAccess();
239 
240     // XAccessible
241     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext >
242         SAL_CALL getAccessibleContext() throw ( ::com::sun::star::uno::RuntimeException );
243 
244     // IAccessibleBrowseBox
245     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
getMyself()246         getMyself()
247     {
248         return this;
249     }
250     void dispose();
isAlive() const251     virtual sal_Bool isAlive() const
252     {
253         return isContextAlive();
254     }
255     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
getHeaderBar(::svt::AccessibleBrowseBoxObjType _eObjType)256         getHeaderBar( ::svt::AccessibleBrowseBoxObjType _eObjType )
257     {
258         ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xAccessible;
259         AccessibleBrowseBox* pContext( getContext() );
260         if ( pContext )
261             xAccessible = pContext->getHeaderBar( _eObjType );
262         return xAccessible;
263     }
264     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
getTable()265         getTable()
266     {
267         ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xAccessible;
268         AccessibleBrowseBox* pContext( getContext() );
269         if ( pContext )
270             xAccessible = pContext->getTable();
271         return xAccessible;
272     }
commitHeaderBarEvent(sal_Int16 nEventId,const::com::sun::star::uno::Any & rNewValue,const::com::sun::star::uno::Any & rOldValue,sal_Bool _bColumnHeaderBar)273     virtual void commitHeaderBarEvent( sal_Int16 nEventId, const ::com::sun::star::uno::Any& rNewValue,
274         const ::com::sun::star::uno::Any& rOldValue, sal_Bool _bColumnHeaderBar )
275     {
276         AccessibleBrowseBox* pContext( getContext() );
277         if ( pContext )
278             pContext->commitHeaderBarEvent( nEventId, rNewValue, rOldValue, _bColumnHeaderBar );
279     }
commitTableEvent(sal_Int16 nEventId,const::com::sun::star::uno::Any & rNewValue,const::com::sun::star::uno::Any & rOldValue)280     virtual void commitTableEvent( sal_Int16 nEventId,
281         const ::com::sun::star::uno::Any& rNewValue, const ::com::sun::star::uno::Any& rOldValue )
282     {
283         AccessibleBrowseBox* pContext( getContext() );
284         if ( pContext )
285             pContext->commitTableEvent( nEventId, rNewValue, rOldValue );
286     }
commitEvent(sal_Int16 nEventId,const::com::sun::star::uno::Any & rNewValue,const::com::sun::star::uno::Any & rOldValue)287     virtual void commitEvent( sal_Int16 nEventId,
288         const ::com::sun::star::uno::Any& rNewValue, const ::com::sun::star::uno::Any& rOldValue )
289     {
290         AccessibleBrowseBox* pContext( getContext() );
291         if ( pContext )
292             pContext->commitEvent( nEventId, rNewValue, rOldValue );
293     }
294 
295 private:
296     AccessibleBrowseBoxAccess();                                                // never implemented
297     AccessibleBrowseBoxAccess( const AccessibleBrowseBoxAccess& );              // never implemented
298     AccessibleBrowseBoxAccess& operator=( const AccessibleBrowseBoxAccess& );   // never implemented
299 };
300 
301 // ============================================================================
302 } // namespace accessibility
303 
304 // ============================================================================
305 
306 #endif
307