xref: /AOO41X/main/sw/inc/accmap.hxx (revision 4d7c9de063a797b8b4f3d45e3561e82ad1f8ef1f)
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 #ifndef _ACCMAP_HXX
24 #define _ACCMAP_HXX
25 
26 #include <cppuhelper/weakref.hxx>
27 #include <com/sun/star/accessibility/XAccessible.hpp>
28 #include <vos/ref.hxx>
29 #include <vos/mutex.hxx>
30 #include <svx/IAccessibleViewForwarder.hxx>
31 #include <svx/IAccessibleParent.hxx>
32 #include <tools/debug.hxx>
33 #include <tools/fract.hxx>
34 
35 #include <svx/AccessibleControlShape.hxx>
36 #include <svx/AccessibleShape.hxx>
37 #include "fesh.hxx"
38 #include <vector>
39 #include <set>
40 class SwAccessibleParagraph;
41 
42 class ViewShell;
43 class Rectangle;
44 class SwFrm;
45 class SwTxtFrm;
46 class SwPageFrm;
47 class SwAccessibleContext;
48 class SwAccessibleContextMap_Impl;
49 class SwAccessibleEventList_Impl;
50 class SwAccessibleEventMap_Impl;
51 class SwShapeList_Impl;
52 class SdrObject;
53 namespace accessibility {
54     class AccessibleShape;
55 }
56 class SwAccessibleShapeMap_Impl;
57 struct SwAccessibleEvent_Impl;
58 class SwAccessibleSelectedParas_Impl;
59 class SwRect;
60 class MapMode;
61 class SwAccPreviewData;
62 struct PrevwPage;
63 class Window;
64 
65 // real states for events
66 #define ACC_STATE_EDITABLE 0x01
67 #define ACC_STATE_OPAQUE 0x02
68 
69 // pseudo states for events
70 // --> OD 2009-01-07 #i88069# - pseudo state for event TEXT_ATTRIBUTE_CHANGED
71 #define ACC_STATE_TEXT_ATTRIBUTE_CHANGED 0x0200
72 // <--
73 // --> OD 2005-12-12 #i27301# - pseudo state for event TEXT_SELECTION_CHANGED
74 #define ACC_STATE_TEXT_SELECTION_CHANGED 0x0100
75 // <--
76 #define ACC_STATE_CARET 0x80
77 #define ACC_STATE_RELATION_FROM 0x40
78 #define ACC_STATE_RELATION_TO 0x20
79 
80 #define ACC_STATE_RELATION_MASK 0x60
81 
82 #define ACC_STATE_MASK 0x1F
83 
84 // --> OD 2005-12-12 #i27301# - introduce type definition of states
85 typedef sal_uInt16 tAccessibleStates;
86 // <--
87 
88 class SwAccessibleMap : public ::accessibility::IAccessibleViewForwarder,
89                         public ::accessibility::IAccessibleParent
90 {
91     mutable ::vos::OMutex maMutex;
92     ::vos::OMutex maEventMutex;
93     SwAccessibleContextMap_Impl *mpFrmMap;
94     SwAccessibleShapeMap_Impl *mpShapeMap;
95     SwShapeList_Impl *mpShapes;
96     SwAccessibleEventList_Impl *mpEvents;
97     SwAccessibleEventMap_Impl *mpEventMap;
98     // --> OD 2005-12-13 #i27301# - data structure to keep information about
99     // accessible paragraph, which have a selection.
100     SwAccessibleSelectedParas_Impl* mpSelectedParas;
101     // <--
102     ViewShell *mpVSh;
103     /// for page preview: store preview data, VisArea, and mapping of
104     /// preview-to-display coordinates
105     SwAccPreviewData* mpPreview;
106 
107     ::com::sun::star::uno::WeakReference < ::com::sun::star::accessibility::XAccessible > mxCursorContext;
108 
109     sal_Int32 mnPara;
110     sal_Int32 mnFootnote;
111     sal_Int32 mnEndnote;
112 
113 
114     sal_Bool mbShapeSelected;
115 
116     void FireEvent( const SwAccessibleEvent_Impl& rEvent );
117 
118     void AppendEvent( const SwAccessibleEvent_Impl& rEvent );
119 
120     void InvalidateCursorPosition(
121         const ::com::sun::star::uno::Reference<
122             ::com::sun::star::accessibility::XAccessible>& rAcc );
123     void DoInvalidateShapeSelection(sal_Bool bInvalidateFocusMode = sal_False);
124 
125     //Replace by DoInvalidateShapeSelection
126     //void DoInvalidateShapeFocus();
127     void InvalidateShapeSelection();
128 
129     //mpSelectedFrmMap contains the old selected objects.
130     SwAccessibleContextMap_Impl *mpSeletedFrmMap;
131     //IvalidateShapeInParaSelection() method is reponsible for the updating the selected states of the objects.
132     void InvalidateShapeInParaSelection();
133 
134     void _InvalidateRelationSet( const SwFrm* pFrm, sal_Bool bFrom );
135 
136     ::com::sun::star::uno::Reference<
137         ::com::sun::star::accessibility::XAccessible>
138             _GetDocumentView( sal_Bool bPagePreview );
139 
140     /** method to build up a new data structure of the accessible pararaphs,
141         which have a selection
142 
143         OD 2005-12-13 #i27301#
144         Important note: method has to used inside a mutual exclusive section
145 
146         @author OD
147     */
148     SwAccessibleSelectedParas_Impl* _BuildSelectedParas();
149 
150 public:
151 
152     SwAccessibleMap( ViewShell *pSh );
153     ~SwAccessibleMap();
154 
155     ::com::sun::star::uno::Reference<
156         ::com::sun::star::accessibility::XAccessible> GetDocumentView();
157 
158     // OD 15.01.2003 #103492# - complete re-factoring of method due to new
159     // page/print preview functionality.
160     ::com::sun::star::uno::Reference<
161         ::com::sun::star::accessibility::XAccessible> GetDocumentPreview(
162                             const std::vector<PrevwPage*>& _rPrevwPages,
163                             const Fraction&  _rScale,
164                             const SwPageFrm* _pSelectedPageFrm,
165                             const Size&      _rPrevwWinSize );
166 
167     ::vos::ORef < SwAccessibleContext > GetContextImpl(
168                                                 const SwFrm *pFrm,
169                                                 sal_Bool bCreate = sal_True );
170     ::com::sun::star::uno::Reference<
171         ::com::sun::star::accessibility::XAccessible> GetContext(
172                                                 const SwFrm *pFrm,
173                                                 sal_Bool bCreate = sal_True );
174 
175     ::vos::ORef < ::accessibility::AccessibleShape > GetContextImpl(
176                                         const SdrObject *pObj,
177                                         SwAccessibleContext *pParentImpl,
178                                         sal_Bool bCreate = sal_True );
179     ::com::sun::star::uno::Reference<
180         ::com::sun::star::accessibility::XAccessible> GetContext(
181                                         const SdrObject *pObj,
182                                         SwAccessibleContext *pParentImpl,
183                                         sal_Bool bCreate = sal_True );
184 
GetShell() const185     inline ViewShell* GetShell() const
186     {
187         return mpVSh;
188     }
189     sal_Bool IsInSameLevel(const SdrObject* pObj, const SwFEShell* pFESh);
190     void AddShapeContext(const SdrObject *pObj,
191                              ::com::sun::star::uno::Reference < ::com::sun::star::accessibility::XAccessible > xAccShape);
192 
193     void AddGroupContext(const SdrObject *pParentObj,
194                     ::com::sun::star::uno::Reference < ::com::sun::star::accessibility::XAccessible > xAccParent);
195     void RemoveGroupContext(const SdrObject *pParentObj, ::com::sun::star::uno::Reference < ::com::sun::star::accessibility::XAccessible > xAccParent);
196 
197     const SwRect& GetVisArea() const;
198 
199     /** get size of a dedicated preview page
200 
201         OD 15.01.2003 #103492#
202         complete re-factoring of previous method due to new page/print preview
203         functionality.
204 
205         @author OD
206 
207         @param _nPrevwPageNum
208         input parameter - physical page number of page visible in the page preview
209 
210         @return an object of class <Size>
211     */
212     Size GetPreViewPageSize( sal_uInt16 _nPrevwPageNum ) const;
213 
214     void RemoveContext( const SwFrm *pFrm );
215     void RemoveContext( const SdrObject *pObj );
216 
217     // Dispose frame and its children if bRecursive is set
218     void Dispose( const SwFrm* pFrm,
219                   const SdrObject* pObj,
220                   Window* pWindow,
221                   sal_Bool bRecursive = sal_False );
222 
223     void InvalidatePosOrSize( const SwFrm* pFrm,
224                               const SdrObject* pObj,
225                               Window* pWindow,
226                               const SwRect& rOldFrm );
227 
228     void InvalidateContent( const SwFrm *pFrm );
229 
230     // --> OD 2009-01-06 #i88069#
231     void InvalidateAttr( const SwTxtFrm& rTxtFrm );
232     // <--
233 
234     void InvalidateCursorPosition( const SwFrm *pFrm );
235     void InvalidateFocus();
236     void FirePageChangeEvent(sal_uInt16 nOldPage, sal_uInt16 nNewPage);
237     void FireSectionChangeEvent(sal_uInt16 nOldSection, sal_uInt16 nNewSection);
238     void FireColumnChangeEvent(sal_uInt16 nOldColumn, sal_uInt16 nNewColumn);
239     void SetCursorContext(
240         const ::vos::ORef < SwAccessibleContext >& rCursorContext );
241 
242     // Invalidate state of whole tree. If an action is open, this call
243     // is processed when the last action ends.
244     // --> OD 2005-12-12 #i27301# - use new type definition for <_nStates>
245     void InvalidateStates( tAccessibleStates _nStates,
246                            const SwFrm* _pFrm = 0 );
247 
248     void InvalidateRelationSet( const SwFrm* pMaster, const SwFrm* pFollow );
249 
250     /** invalidation CONTENT_FLOWS_FROM/_TO relation of a paragraph
251 
252         OD 2005-12-01 #i27138#
253 
254         @author OD
255 
256         @param _rTxtFrm
257         input parameter - reference to paragraph, whose CONTENT_FLOWS_FROM/_TO
258         has to be invalidated.
259 
260         @param _bFrom
261         input parameter - boolean indicating, if relation CONTENT_FLOWS_FROM
262         (value <true>) or CONTENT_FLOWS_TO (value <false>) has to be invalidated.
263     */
264     void InvalidateParaFlowRelation( const SwTxtFrm& _rTxtFrm,
265                                      const bool _bFrom );
266 
267     /** invalidation of text selection of a paragraph
268 
269         OD 2005-12-12 #i27301#
270 
271         @author OD
272     */
273     void InvalidateParaTextSelection( const SwTxtFrm& _rTxtFrm );
274 
275     /** invalidation of text selection of all paragraphs
276 
277         OD 2005-12-13 #i27301#
278 
279         @author OD
280     */
281     void InvalidateTextSelectionOfAllParas();
282 
283     sal_Int32 GetChildIndex( const SwFrm& rParentFrm,
284                              Window& rChild ) const;
285 
286     // update preview data (and fire events if necessary)
287     // OD 15.01.2003 #103492# - complete re-factoring of method due to new
288     // page/print preview functionality.
289     void UpdatePreview( const std::vector<PrevwPage*>& _rPrevwPages,
290                         const Fraction&  _rScale,
291                         const SwPageFrm* _pSelectedPageFrm,
292                         const Size&      _rPrevwWinSize );
293 
294     void InvalidatePreViewSelection( sal_uInt16 nSelPage );
295     sal_Bool IsPageSelected( const SwPageFrm *pPageFrm ) const;
296 
297     void FireEvents();
298 
299 
300     // IAccessibleViewForwarder
301 
302     virtual sal_Bool IsValid() const;
303     virtual Rectangle GetVisibleArea() const;
304     virtual Point LogicToPixel (const Point& rPoint) const;
305     virtual Size LogicToPixel (const Size& rSize) const;
306     virtual Point PixelToLogic (const Point& rPoint) const;
307     virtual Size PixelToLogic (const Size& rSize) const;
308 
309     // IAccessibleParent
310     virtual sal_Bool ReplaceChild (
311         ::accessibility::AccessibleShape* pCurrentChild,
312         const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& _rxShape,
313         const long _nIndex,
314         const ::accessibility::AccessibleShapeTreeInfo& _rShapeTreeInfo
315     )   throw (::com::sun::star::uno::RuntimeException);
316     virtual ::accessibility::AccessibleControlShape* GetAccControlShapeFromModel
317         (::com::sun::star::beans::XPropertySet* pSet)
318         throw (::com::sun::star::uno::RuntimeException);
319     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >   GetAccessibleCaption (
320         const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & xShape)
321     throw (::com::sun::star::uno::RuntimeException);
322 
323     // additional Core/Pixel conversions for internal use; also works
324     // for preview
325     Point PixelToCore (const Point& rPoint) const;
326     Rectangle CoreToPixel (const Rectangle& rRect) const;
327 
328 private:
329     /** get mapping mode for LogicToPixel and PixelToLogic conversions
330 
331         OD 15.01.2003 #103492#
332         Replacement method <PreviewAdjust(..)> by new method <GetMapMode>.
333         Method returns mapping mode of current output device and adjusts it,
334         if the shell is in page/print preview.
335         Necessary, because <PreviewAdjust(..)> changes mapping mode at current
336         output device for mapping logic document positions to page preview window
337         positions and vice versa and doesn't take care to recover its changes.
338 
339         @author OD
340 
341         @param _rPoint
342         input parameter - constant reference to point to determine the mapping
343         mode adjustments for page/print preview.
344 
345         @param _orMapMode
346         output parameter - reference to the mapping mode, which is determined
347         by the method
348     */
349     void GetMapMode( const Point& _rPoint,
350                      MapMode&     _orMapMode ) const;
351 public:
352     virtual sal_Bool IsDocumentSelAll();
353 
354     ::com::sun::star::uno::WeakReference < ::com::sun::star::accessibility::XAccessible >
GetCursorContext() const355         GetCursorContext() const { return mxCursorContext; }
356 
357     //Para Container for InvalidateCursorPosition
358     typedef std::set< SwAccessibleParagraph* >  SET_PARA;
359     SET_PARA m_setParaAdd;
360     SET_PARA m_setParaRemove;
361 };
362 #endif
363