xref: /aoo4110/main/sw/inc/accmap.hxx (revision b1cdbd2c)
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