xref: /aoo4110/main/svx/inc/svx/svdview.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 
24 #ifndef _SVDVIEW_HXX
25 #define _SVDVIEW_HXX
26 
27 // HACK to avoid too deep includes and to have some
28 // levels free in svdmark itself (MS compiler include depth limit)
29 #include <svx/svdhdl.hxx>
30 #include <tools/weakbase.hxx>
31 #include <svtools/accessibilityoptions.hxx>
32 #include "svx/svxdllapi.h"
33 #include <svx/svdcrtv.hxx>
34 #include <unotools/options.hxx>
35 #include <basegfx/polygon/b2dpolypolygon.hxx>
36 #include <basegfx/polygon/b2dpolygon.hxx>
37 
38 ////////////////////////////////////////////////////////////////////////////////////////////////////
39 //
40 //  Klassenhierarchie der View:
41 //         SfxListener
42 //         SdrPaintView    PntV   Action            ModChg   Attr   Notify
43 //         SdrSnapView     SnpV   Action
44 //
45 //         SdrMarkView     MrkV   Action   MrkChg   ModChg          Notify
46 //
47 //         SdrEditView     EdtV            MrkChg   ModChg   Attr
48 //         SdrPolyEditView PoEV
49 //         SdrGlueEditView GlEV
50 //         SdrObjEditView  EdxV   Action            ModChg   Attr   Notify
51 //
52 //         SdrExchangeView XcgV
53 //         SdrDragView     DrgV   Action
54 //
55 //         SdrCreateView   CrtV   Action
56 //         SdrView         View
57 //
58 ////////////////////////////////////////////////////////////////////////////////////////////////////
59 
60 //************************************************************
61 //   Vorausdeklarationen
62 //************************************************************
63 
64 class SvxURLField;
65 
66 //************************************************************
67 //   Defines
68 //************************************************************
69 
70 enum SdrViewContext {SDRCONTEXT_STANDARD,
71 					 SDRCONTEXT_POINTEDIT,
72 					 SDRCONTEXT_GLUEPOINTEDIT,
73 					 SDRCONTEXT_GRAPHIC,
74 					 SDRCONTEXT_MEDIA,
75 					 SDRCONTEXT_TABLE};
76 
77 enum SdrEventKind  {SDREVENT_NONE,
78 					SDREVENT_TEXTEDIT,
79 					SDREVENT_MOVACTION,
80 					SDREVENT_ENDACTION,
81 					SDREVENT_BCKACTION,
82 					SDREVENT_BRKACTION,
83 					SDREVENT_ENDCREATE,
84 					SDREVENT_ENDDRAG,
85 					SDREVENT_MARKOBJ,
86 					SDREVENT_MARKPOINT,
87 					SDREVENT_MARKGLUEPOINT,
88 					SDREVENT_BEGMARK,
89 					SDREVENT_BEGINSOBJPOINT,
90 					SDREVENT_ENDINSOBJPOINT,
91 					SDREVENT_BEGINSGLUEPOINT,
92 					SDREVENT_BEGDRAGHELPLINE,
93 					SDREVENT_BEGDRAGOBJ,
94 					SDREVENT_BEGCREATEOBJ,
95 					SDREVENT_BEGMACROOBJ,
96 					SDREVENT_BEGTEXTEDIT,
97 					SDREVENT_ENDMARK,
98 					SDREVENT_BRKMARK,
99 					SDREVENT_EXECUTEURL};
100 
101 #define SDRMOUSEBUTTONDOWN 1
102 #define SDRMOUSEMOVE       2
103 #define SDRMOUSEBUTTONUP   3
104 
105 //************************************************************
106 //   Hilfsklasse SdrViewEvent
107 //************************************************************
108 
109 struct SVX_DLLPUBLIC SdrViewEvent
110 {
111 	SdrHdl*						pHdl;
112 	SdrObject*					pObj;
113 	SdrObject*					pRootObj;        // Dieses Markieren bei SdrBeginTextEdit
114 	SdrPageView*				pPV;
115 	const SvxURLField*			pURLField;
116 
117 	Point						aLogicPos;
118 	SdrHitKind					eHit;
119 	SdrEventKind				eEvent;
120 	SdrHdlKind					eHdlKind;
121 	SdrCreateCmd				eEndCreateCmd;   // auch fuer EndInsPoint
122 
123 	sal_uInt16						nMouseClicks;
124 	sal_uInt16						nMouseMode;
125 	sal_uInt16						nMouseCode;
126 	sal_uInt16						nHlplIdx;
127 	sal_uInt16						nGlueId;
128 
129 	unsigned					bMouseDown : 1;
130 	unsigned					bMouseUp : 1;
131 	unsigned					bDoubleHdlSize : 1;  // Doppelte Handlegroesse wg. TextEdit
132 	unsigned					bIsAction : 1;       // Action ist aktiv
133 	unsigned					bIsTextEdit : 1;     // TextEdit laeuft zur Zeit
134 	unsigned					bTextEditHit : 1;    // offene OutlinerView getroffen
135 	unsigned					bAddMark : 1;
136 	unsigned					bUnmark : 1;
137 	unsigned					bPrevNextMark : 1;
138 	unsigned					bMarkPrev : 1;
139 	unsigned					bInsPointNewObj : 1;
140 	unsigned					bDragWithCopy : 1;
141 	unsigned					bCaptureMouse : 1;
142 	unsigned					bReleaseMouse : 1;
143 
144 public:
145 	SdrViewEvent();
146 	~SdrViewEvent();
147 
148 	// nEventKind ist SDRMOUSEBUTTONDOWN, SDRMOUSEMOVE oder SDRMOUSEBUTTONUP
149 	void SetMouseEvent(const MouseEvent& rMEvt, sal_uInt16 nEventKind);
150 };
151 
152 ////////////////////////////////////////////////////////////////////////////////////////////////////
153 // helper class for all D&D overlays
154 
155 class SVX_DLLPUBLIC SdrDropMarkerOverlay
156 {
157 	// The OverlayObjects
158 	::sdr::overlay::OverlayObjectList				maObjects;
159 
160 	void ImplCreateOverlays(
161         const SdrView& rView,
162         const basegfx::B2DPolyPolygon& rLinePolyPolygon);
163 
164 public:
165 	SdrDropMarkerOverlay(const SdrView& rView, const SdrObject& rObject);
166 	SdrDropMarkerOverlay(const SdrView& rView, const Rectangle& rRectangle);
167 	SdrDropMarkerOverlay(const SdrView& rView, const Point& rStart, const Point& rEnd);
168 	~SdrDropMarkerOverlay();
169 };
170 
171 ////////////////////////////////////////////////////////////////////////////////////////////////////
172 ////////////////////////////////////////////////////////////////////////////////////////////////////
173 //
174 //  @@ @@ @@ @@@@@ @@   @@
175 //  @@ @@ @@ @@    @@   @@
176 //  @@ @@ @@ @@    @@ @ @@
177 //  @@@@@ @@ @@@@  @@@@@@@
178 //   @@@  @@ @@    @@@@@@@
179 //   @@@  @@ @@    @@@ @@@
180 //    @   @@ @@@@@ @@   @@
181 //
182 ////////////////////////////////////////////////////////////////////////////////////////////////////
183 ////////////////////////////////////////////////////////////////////////////////////////////////////
184 
185 class SVX_DLLPUBLIC SdrView: public SdrCreateView, public tools::WeakBase< SdrView >
186 {
187 	friend class				SdrPageView;
188 
189 	unsigned					bNoExtendedMouseDispatcher : 1;
190 	unsigned					bNoExtendedKeyDispatcher : 1;
191 	unsigned					bNoExtendedCommandDispatcher : 1;
192 	unsigned					bTextEditOnObjectsWithoutTextIfTextTool : 1;
193 	unsigned					mbMasterPagePaintCaching : 1;
194 
195 protected:
196 	SvtAccessibilityOptions	maAccessibilityOptions;
197 
198 public:
199 	TYPEINFO();
200 	SdrView(SdrModel* pModel1, OutputDevice* pOut = 0L);
201 	virtual ~SdrView();
202 
203 	// Default sind alle Dispatcher aktiviert. Will die App z.B. fuer
204 	// Sonderbehandlungen im MouseDispatcher eingreifen, so muss sie
205 	// den erweiterten MouseDispather mit unten stehender Methode deaktivieren
206 	// und selbst nachimplementieren. Beispiel fuer MouseButtonDown:
207 	//      SdrViewEvent aVEvt;
208 	//      SdrHitKind eHit=pSdrView->PickAnything(rMEvt,SDRMOUSEBUTTONDOWN,aVEvt);
209 	//      ... hier Applikationsspezifischer Eingriff ...
210 	//      pSdrView->DoMouseEvent(aVEvt);
211 	//      SetPointer(GetPreferedPointer(...))
212 	//      CaptureMouse(...)
EnableExtendedMouseEventDispatcher(sal_Bool bOn)213 	void EnableExtendedMouseEventDispatcher(sal_Bool bOn) { bNoExtendedMouseDispatcher = !bOn; }
IsExtendedMouseEventDispatcherEnabled() const214 	sal_Bool IsExtendedMouseEventDispatcherEnabled() const { return bNoExtendedMouseDispatcher; }
215 
EnableExtendedKeyInputDispatcher(sal_Bool bOn)216 	void EnableExtendedKeyInputDispatcher(sal_Bool bOn) { bNoExtendedKeyDispatcher=!bOn; }
IsExtendedKeyInputDispatcherEnabled() const217 	sal_Bool IsExtendedKeyInputDispatcherEnabled() const { return bNoExtendedKeyDispatcher; }
218 
EnableExtendedCommandEventDispatcher(sal_Bool bOn)219 	void EnableExtendedCommandEventDispatcher(sal_Bool bOn) { bNoExtendedCommandDispatcher=!bOn; }
IsExtendedCommandEventDispatcherEnabled() const220 	sal_Bool IsExtendedCommandEventDispatcherEnabled() const { return bNoExtendedCommandDispatcher; }
221 
EnableTextEditOnObjectsWithoutTextIfTextTool(sal_Bool bOn)222 	void EnableTextEditOnObjectsWithoutTextIfTextTool(sal_Bool bOn) { bTextEditOnObjectsWithoutTextIfTextTool=bOn; }
IsEnableTextEditOnObjectsWithoutTextIfTextToolEnabled() const223 	sal_Bool IsEnableTextEditOnObjectsWithoutTextIfTextToolEnabled() const { return bTextEditOnObjectsWithoutTextIfTextTool; }
224 
225 	void SetMasterPagePaintCaching(sal_Bool bOn);
IsMasterPagePaintCaching() const226 	sal_Bool IsMasterPagePaintCaching() const { return mbMasterPagePaintCaching; }
227 
228 	sal_Bool KeyInput(const KeyEvent& rKEvt, Window* pWin);
229 	virtual sal_Bool MouseButtonDown(const MouseEvent& rMEvt, Window* pWin);
230 	virtual sal_Bool MouseButtonUp(const MouseEvent& rMEvt, Window* pWin);
231 	virtual sal_Bool MouseMove(const MouseEvent& rMEvt, Window* pWin);
232 	virtual sal_Bool Command(const CommandEvent& rCEvt, Window* pWin);
233 
234 	virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 );
235 
SetAttributes(const SfxItemSet & rSet,sal_Bool bReplaceAll=sal_False)236 	sal_Bool SetAttributes(const SfxItemSet& rSet, sal_Bool bReplaceAll=sal_False) { return SdrCreateView::SetAttributes(rSet,bReplaceAll); }
SetStyleSheet(SfxStyleSheet * pStyleSheet,sal_Bool bDontRemoveHardAttr=sal_False)237 	sal_Bool SetStyleSheet(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr=sal_False) { return SdrCreateView::SetStyleSheet(pStyleSheet,bDontRemoveHardAttr); }
238 
239 	/* new interface src537 */
240 	sal_Bool GetAttributes(SfxItemSet& rTargetSet, sal_Bool bOnlyHardAttr=sal_False) const;
241 
242 	SfxStyleSheet* GetStyleSheet() const;
243 
244 	// unvollstaendige Implementation:
245 	// Das OutputDevice ist notwendig, damit ich die HandleSize ermitteln kann.
246 	// Bei NULL wird das 1. angemeldete Win verwendet.
247 	Pointer GetPreferedPointer(const Point& rMousePos, const OutputDevice* pOut, sal_uInt16 nModifier=0, sal_Bool bLeftDown=sal_False) const;
248 	SdrHitKind PickAnything(const MouseEvent& rMEvt, sal_uInt16 nMouseDownOrMoveOrUp, SdrViewEvent& rVEvt) const;
249 	SdrHitKind PickAnything(const Point& rLogicPos, SdrViewEvent& rVEvt) const;
250 	sal_Bool DoMouseEvent(const SdrViewEvent& rVEvt);
251 	virtual SdrViewContext GetContext() const;
252 
253 	// Die Methoden beruecksichtigen den jeweiligen Kontex:
254 	// - Einfaches Zeichnen
255 	// - Punktbearbeitungs-Mode
256 	// - Klebepunkt-Editmode
257 	// - TextEdit
258 	// - ... to be continued
259 	sal_Bool IsMarkPossible() const;
260 	void MarkAll();
261 	void UnmarkAll();
262 	sal_Bool IsAllMarked() const;
263 	sal_Bool IsAllMarkPrevNextPossible() const; // das geht naemlich nicht bei TextEdit!
264 	sal_Bool MarkNext(sal_Bool bPrev=sal_False);
265 	sal_Bool MarkNext(const Point& rPnt, sal_Bool bPrev=sal_False);
266 
267 	const Rectangle& GetMarkedRect() const;
268 	void SetMarkedRect(const Rectangle& rRect);
269 
270 	virtual void DeleteMarked();
271 	sal_Bool IsDeleteMarkedPossible() const;
IsDeletePossible() const272 	sal_Bool IsDeletePossible() const { return IsDeleteMarkedPossible(); }
273 
274 	// Markieren von Objekten, Polygonpunkten oder Klebepunkten (je nach View-
275 	// Kontext) durch Aufziehen eines Selektionsrahmens.
276 	//   bAddMark=TRUE: zur bestehenden Selektion hinzumarkieren (->Shift)
277 	//   bUnmark=TRUE: Bereits selektierte Objekte/Punkte/Klebepunkte die innerhalb
278 	//                 des aufgezogenen Rahmens liegen werden deselektiert.
279 	sal_Bool BegMark(const Point& rPnt, sal_Bool bAddMark=sal_False, sal_Bool bUnmark=sal_False);
280 
281 	// Folgende Actions sind moeglich:
282 	//   - ObjectCreating
283 	//   - ObjectMarking
284 	//   - Object-specific dragging
285 	//   - General dragging
286 	// und mehr...
287 	String GetStatusText();
288 
289 	SvtAccessibilityOptions& getAccessibilityOptions();
290 
291 	virtual void onAccessibilityOptionsChanged();
292 };
293 
294 #endif //_SVDVIEW_HXX
295 
296 ////////////////////////////////////////////////////////////////////////////////////////////////////
297 //
298 // Die App macht sich zunaechst ein SdrModel.
299 // Anschliessend oeffnet sie ein Win und erzeugt dann eine SdrView.
300 // An der SdrView meldet sie dann mit der Methode ShowSdrPage() eine Seite an.
301 // Eine SdrView kann in beliebig vielen Fenstern gleichzeitig angezeigt werden.
302 // Intern:
303 // Eine SdrView kann beliebig viele Seiten gleichzeitig anzeigen. Seiten
304 // werden an- und abgemeldet mit ShowSdrPage()/HideSdrPage(). Fuer jede angemeldete
305 // Seite wird eine SdrPageView-Instanz im Container aPages angelegt. Bei
306 // gleichzeitiger Anzeige mehrerer Seiten ist darauf zu achten, dass der Offset-
307 // Parameter von ShowSdrPage() der Seitengroesse angepasst ist, da sich sonst die
308 // Seiten ueberlappen koennten.
309 //
310 // Elementare Methoden:
311 // ~~~~~~~~~~~~~~~~~~~~
312 //   Einfache Events:
313 //   ~~~~~~~~~~~~~~~~
314 //     sal_Bool KeyInput(const KeyEvent& rKEvt, Window* pWin);
315 //     sal_Bool MouseButtonDown(const MouseEvent& rMEvt, Window* pWin);
316 //     sal_Bool MouseButtonUp(const MouseEvent& rMEvt, Window* pWin);
317 //     sal_Bool MouseMove(const MouseEvent& rMEvt, Window* pWin);
318 //     sal_Bool Command(const CommandEvent& rCEvt, Window* pWin);
319 //
320 //   Exchange (Clipboard derzeit noch ohne SdrPrivateData):
321 //   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
322 //     sal_Bool Cut(sal_uIntPtr nFormat=SDR_ANYFORMAT);
323 //     sal_Bool Yank(sal_uIntPtr nFormat=SDR_ANYFORMAT);
324 //     sal_Bool Paste(Window* pWin=NULL, sal_uIntPtr nFormat=SDR_ANYFORMAT);
325 //
326 //   SfxItems:
327 //   ~~~~~~~~~
328 //     sal_Bool GetAttributes(SfxItemSet& rTargetSet, sal_Bool bOnlyHardAttr=sal_False) const;
329 //     sal_Bool SetAttributes(const SfxItemSet& rSet, sal_Bool bReplaceAll);
330 //     SfxStyleSheet* GetStyleSheet() const;
331 //     sal_Bool SetStyleSheet(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr);
332 //
333 //   Sonstiges:
334 //   ~~~~~~~~~~
335 //     Pointer GetPreferedPointer(const Point& rMousePos, const OutputDevice* pOut, sal_uInt16 nTol=0) const;
336 //     String  GetStatusText();
337 //
338 ///////////////////////////////////////////////////////////////////////////////////////////////// */
339 
340