1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
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/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
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 .
18  */
19 
20 #ifndef INCLUDED_SFX2_SOURCE_CONTROL_THUMBNAILVIEWACC_HXX
21 #define INCLUDED_SFX2_SOURCE_CONTROL_THUMBNAILVIEWACC_HXX
22 
23 #include <osl/mutex.hxx>
24 #include <cppuhelper/implbase.hxx>
25 #include <cppuhelper/compbase.hxx>
26 #include <cppuhelper/basemutex.hxx>
27 
28 #include <com/sun/star/lang/XUnoTunnel.hpp>
29 #include <com/sun/star/accessibility/XAccessible.hpp>
30 #include <com/sun/star/accessibility/XAccessibleContext.hpp>
31 #include <com/sun/star/accessibility/XAccessibleComponent.hpp>
32 #include <com/sun/star/accessibility/XAccessibleSelection.hpp>
33 #include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
34 #include <com/sun/star/lang/DisposedException.hpp>
35 
36 #include <vcl/vclptr.hxx>
37 #include <vector>
38 
39 class ThumbnailView;
40 class SfxThumbnailView;
41 class ThumbnailViewItem;
42 
43 typedef ::cppu::WeakComponentImplHelper<
44     css::accessibility::XAccessible,
45     css::accessibility::XAccessibleEventBroadcaster,
46     css::accessibility::XAccessibleContext,
47     css::accessibility::XAccessibleComponent,
48     css::accessibility::XAccessibleSelection,
49     css::lang::XUnoTunnel >
50     ValueSetAccComponentBase;
51 
52 class ThumbnailViewAcc :
53     public ::cppu::BaseMutex,
54     public ValueSetAccComponentBase
55 {
56 public:
57 
58     ThumbnailViewAcc( ThumbnailView* pParent );
59     virtual ~ThumbnailViewAcc() override;
60 
61     void FireAccessibleEvent( short nEventId,
62                               const css::uno::Any& rOldValue,
63                               const css::uno::Any& rNewValue );
64 
HasAccessibleListeners() const65     bool HasAccessibleListeners() const { return( mxEventListeners.size() > 0 ); }
66 
67     static ThumbnailViewAcc* getImplementation( const css::uno::Reference< css::uno::XInterface >& rxData ) throw();
68 
69 public:
70 
71     /** Called by the corresponding ValueSet when it gets the focus.
72         Stores the new focus state and broadcasts a state change event.
73     */
74     void GetFocus();
75 
76     /** Called by the corresponding ValueSet when it loses the focus.
77         Stores the new focus state and broadcasts a state change event.
78     */
79     void LoseFocus();
80 
81     // XAccessible
82     virtual css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext(  ) override;
83 
84     // XAccessibleEventBroadcaster
85     virtual void SAL_CALL addAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override;
86     virtual void SAL_CALL removeAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override;
87 
88     // XAccessibleContext
89     virtual sal_Int32 SAL_CALL getAccessibleChildCount(  ) override;
90     virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int32 i ) override;
91     virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleParent(  ) override;
92     virtual sal_Int32 SAL_CALL getAccessibleIndexInParent(  ) override;
93     virtual sal_Int16 SAL_CALL getAccessibleRole(  ) override;
94     virtual OUString SAL_CALL getAccessibleDescription(  ) override;
95     virtual OUString SAL_CALL getAccessibleName(  ) override;
96     virtual css::uno::Reference< css::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet(  ) override;
97     virtual css::uno::Reference< css::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet(  ) override;
98     virtual css::lang::Locale SAL_CALL getLocale(  ) override;
99 
100     // XAccessibleComponent
101     virtual sal_Bool SAL_CALL containsPoint( const css::awt::Point& aPoint ) override;
102     virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint( const css::awt::Point& aPoint ) override;
103     virtual css::awt::Rectangle SAL_CALL getBounds(  ) override;
104     virtual css::awt::Point SAL_CALL getLocation(  ) override;
105     virtual css::awt::Point SAL_CALL getLocationOnScreen(  ) override;
106     virtual css::awt::Size SAL_CALL getSize(  ) override;
107     virtual void SAL_CALL grabFocus(  ) override;
108     virtual sal_Int32 SAL_CALL getForeground(  ) override;
109     virtual sal_Int32 SAL_CALL getBackground(  ) override;
110 
111     // XAccessibleSelection
112     virtual void SAL_CALL selectAccessibleChild( sal_Int32 nChildIndex ) override;
113     virtual sal_Bool SAL_CALL isAccessibleChildSelected( sal_Int32 nChildIndex ) override;
114     virtual void SAL_CALL clearAccessibleSelection(  ) override;
115     virtual void SAL_CALL selectAllAccessibleChildren(  ) override;
116     virtual sal_Int32 SAL_CALL getSelectedAccessibleChildCount(  ) override;
117     virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) override;
118     virtual void SAL_CALL deselectAccessibleChild( sal_Int32 nSelectedChildIndex ) override;
119 
120     // XUnoTunnel
121     static const css::uno::Sequence< sal_Int8 >& getUnoTunnelId();
122     virtual sal_Int64 SAL_CALL getSomething( const css::uno::Sequence< sal_Int8 >& rId ) override;
123 
124 private:
125     ::std::vector< css::uno::Reference<
126         css::accessibility::XAccessibleEventListener > >   mxEventListeners;
127     VclPtr<ThumbnailView>                                               mpParent;
128     /// The current FOCUSED state.
129     bool mbIsFocused;
130 
131     /** Tell all listeners that the object is dying.  This callback is
132         usually called from the WeakComponentImplHelper class.
133     */
134     virtual void SAL_CALL disposing() override;
135 
136     /** Return the number of items.  This takes the None-Item into account.
137     */
138     sal_uInt16 getItemCount() const;
139 
140     /** Return the item associated with the given index.  The None-Item is
141         taken into account which, when present, is taken to be the first
142         (with index 0) item.
143         @param nIndex
144             Index of the item to return.  The index 0 denotes the None-Item
145             when present.
146         @return
147             Returns NULL when the given index is out of range.
148     */
149     ThumbnailViewItem* getItem (sal_uInt16 nIndex) const;
150 
151     /** Check whether or not the object has been disposed (or is in the
152         state of being disposed).  If that is the case then
153         DisposedException is thrown to inform the (indirect) caller of the
154         foul deed.
155 
156         @throws css::lang::DisposedException
157     */
158     void ThrowIfDisposed();
159 };
160 
161 class SfxThumbnailViewAcc :
162     public ::cppu::BaseMutex,
163     public ValueSetAccComponentBase
164 {
165 public:
166 
167     SfxThumbnailViewAcc( SfxThumbnailView* pParent );
168     virtual ~SfxThumbnailViewAcc() override;
169 
170 public:
171 
172     // XAccessible
173     virtual css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext(  ) override;
174 
175     // XAccessibleEventBroadcaster
176     virtual void SAL_CALL addAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override;
177     virtual void SAL_CALL removeAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override;
178 
179     // XAccessibleContext
180     virtual sal_Int32 SAL_CALL getAccessibleChildCount(  ) override;
181     virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int32 i ) override;
182     virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleParent(  ) override;
183     virtual sal_Int32 SAL_CALL getAccessibleIndexInParent(  ) override;
184     virtual sal_Int16 SAL_CALL getAccessibleRole(  ) override;
185     virtual OUString SAL_CALL getAccessibleDescription(  ) override;
186     virtual OUString SAL_CALL getAccessibleName(  ) override;
187     virtual css::uno::Reference< css::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet(  ) override;
188     virtual css::uno::Reference< css::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet(  ) override;
189     virtual css::lang::Locale SAL_CALL getLocale(  ) override;
190 
191     // XAccessibleComponent
192     virtual sal_Bool SAL_CALL containsPoint( const css::awt::Point& aPoint ) override;
193     virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint( const css::awt::Point& aPoint ) override;
194     virtual css::awt::Rectangle SAL_CALL getBounds(  ) override;
195     virtual css::awt::Point SAL_CALL getLocation(  ) override;
196     virtual css::awt::Point SAL_CALL getLocationOnScreen(  ) override;
197     virtual css::awt::Size SAL_CALL getSize(  ) override;
198     virtual void SAL_CALL grabFocus(  ) override;
199     virtual sal_Int32 SAL_CALL getForeground(  ) override;
200     virtual sal_Int32 SAL_CALL getBackground(  ) override;
201 
202     // XAccessibleSelection
203     virtual void SAL_CALL selectAccessibleChild( sal_Int32 nChildIndex ) override;
204     virtual sal_Bool SAL_CALL isAccessibleChildSelected( sal_Int32 nChildIndex ) override;
205     virtual void SAL_CALL clearAccessibleSelection(  ) override;
206     virtual void SAL_CALL selectAllAccessibleChildren(  ) override;
207     virtual sal_Int32 SAL_CALL getSelectedAccessibleChildCount(  ) override;
208     virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) override;
209     virtual void SAL_CALL deselectAccessibleChild( sal_Int32 nSelectedChildIndex ) override;
210 
211     // XUnoTunnel
212     static const css::uno::Sequence< sal_Int8 >& getUnoTunnelId();
213     virtual sal_Int64 SAL_CALL getSomething( const css::uno::Sequence< sal_Int8 >& rId ) override;
214 
215 private:
216     ::std::vector< css::uno::Reference<
217         css::accessibility::XAccessibleEventListener > >   mxEventListeners;
218     SfxThumbnailView*                                               mpParent;
219 
220     /** Tell all listeners that the object is dying.  This callback is
221         usually called from the WeakComponentImplHelper class.
222     */
223     virtual void SAL_CALL disposing() override;
224 
225     /** Return the number of items.  This takes the None-Item into account.
226     */
227     sal_uInt16 getItemCount() const;
228 
229     /** Return the item associated with the given index.  The None-Item is
230         taken into account which, when present, is taken to be the first
231         (with index 0) item.
232         @param nIndex
233             Index of the item to return.  The index 0 denotes the None-Item
234             when present.
235         @return
236             Returns NULL when the given index is out of range.
237     */
238     ThumbnailViewItem* getItem (sal_uInt16 nIndex) const;
239 
240     /** Check whether or not the object has been disposed (or is in the
241         state of being disposed).  If that is the case then
242         DisposedException is thrown to inform the (indirect) caller of the
243         foul deed.
244 
245         @throws css::lang::DisposedException
246     */
247     void ThrowIfDisposed();
248 };
249 
250 
251 class ThumbnailViewItemAcc : public ::cppu::WeakImplHelper< css::accessibility::XAccessible,
252                                                      css::accessibility::XAccessibleEventBroadcaster,
253                                                      css::accessibility::XAccessibleContext,
254                                                      css::accessibility::XAccessibleComponent,
255                                                      css::lang::XUnoTunnel >
256 {
257 private:
258 
259     ::std::vector< css::uno::Reference< css::accessibility::XAccessibleEventListener > >
260                                                                         mxEventListeners;
261     ::osl::Mutex                                                        maMutex;
262     ThumbnailViewItem*                                                  mpParent;
263     bool const                                                          mbIsTransientChildrenDisabled;
264 
265 public:
266 
267     ThumbnailViewItemAcc( ThumbnailViewItem* pParent, bool bIsTransientChildrenDisabled );
268     virtual ~ThumbnailViewItemAcc() override;
269 
270     void    ParentDestroyed();
271 
272     static ThumbnailViewItemAcc* getImplementation( const css::uno::Reference< css::uno::XInterface >& rxData ) throw();
273 
274 public:
275 
276     // XAccessible
277     virtual css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext(  ) override;
278 
279     // XAccessibleEventBroadcaster
280     virtual void SAL_CALL addAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override;
281     virtual void SAL_CALL removeAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override;
282 
283     // XAccessibleContext
284     virtual sal_Int32 SAL_CALL getAccessibleChildCount(  ) override;
285     virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int32 i ) override;
286     virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleParent(  ) override;
287     virtual sal_Int32 SAL_CALL getAccessibleIndexInParent(  ) override;
288     virtual sal_Int16 SAL_CALL getAccessibleRole(  ) override;
289     virtual OUString SAL_CALL getAccessibleDescription(  ) override;
290     virtual OUString SAL_CALL getAccessibleName(  ) override;
291     virtual css::uno::Reference< css::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet(  ) override;
292     virtual css::uno::Reference< css::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet(  ) override;
293     virtual css::lang::Locale SAL_CALL getLocale(  ) override;
294 
295     // XAccessibleComponent
296     virtual sal_Bool SAL_CALL containsPoint( const css::awt::Point& aPoint ) override;
297     virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint( const css::awt::Point& aPoint ) override;
298     virtual css::awt::Rectangle SAL_CALL getBounds(  ) override;
299     virtual css::awt::Point SAL_CALL getLocation(  ) override;
300     virtual css::awt::Point SAL_CALL getLocationOnScreen(  ) override;
301     virtual css::awt::Size SAL_CALL getSize(  ) override;
302     virtual void SAL_CALL grabFocus(  ) override;
303     virtual sal_Int32 SAL_CALL getForeground(  ) override;
304     virtual sal_Int32 SAL_CALL getBackground(  ) override;
305 
306     // XUnoTunnel
307     static const css::uno::Sequence< sal_Int8 >& getUnoTunnelId();
308     virtual sal_Int64 SAL_CALL getSomething( const css::uno::Sequence< sal_Int8 >& rId ) override;
309 };
310 
311 #endif // INCLUDED_SFX2_SOURCE_CONTROL_THUMBNAILVIEWACC_HXX
312 
313 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
314