xref: /aoo41x/main/svx/inc/svx/svdedtv.hxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef _SVDEDTV_HXX
29 #define _SVDEDTV_HXX
30 
31 #include <svx/svdmrkv.hxx>
32 #include <svx/xpoly.hxx>
33 #include <svx/svdmodel.hxx>
34 #include "svx/svxdllapi.h"
35 
36 //************************************************************
37 //   Vorausdeklarationen
38 //************************************************************
39 
40 class SfxUndoAction;
41 class SdrUndoAction;
42 class SdrUndoGroup;
43 class SfxStyleSheet;
44 class SdrLayer;
45 class SvdProgressInfo;
46 
47 //************************************************************
48 //   Defines
49 //************************************************************
50 
51 enum SdrHorAlign  {
52 	SDRHALIGN_NONE,
53 	SDRHALIGN_LEFT,
54 	SDRHALIGN_RIGHT,
55 	SDRHALIGN_CENTER
56 };
57 
58 enum SdrVertAlign {
59 	SDRVALIGN_NONE,
60 	SDRVALIGN_TOP,
61 	SDRVALIGN_BOTTOM,
62 	SDRVALIGN_CENTER
63 };
64 
65 enum SdrMergeMode {
66 	SDR_MERGE_MERGE,
67 	SDR_MERGE_SUBSTRACT,
68 	SDR_MERGE_INTERSECT
69 };
70 
71 // Optionen fuer InsertObject()
72 #define SDRINSERT_DONTMARK    0x0001 /* Obj wird nicht markiert (aktuelle Markierung bleibt bestehen) */
73 #define SDRINSERT_ADDMARK     0x0002 /* Das Obj wird zu einer ggf. bereits bestehenden Selektion hinzumarkiert */
74 #define SDRINSERT_SETDEFATTR  0x0004 /* Die aktuellen Attribute (+StyleSheet) werden dem Obj zugewiesen */
75 #define SDRINSERT_SETDEFLAYER 0x0008 /* Der aktuelle Layer wird dem Obj zugewiesen */
76 #define SDRINSERT_NOBROADCAST 0x0010 /* Einfuegen mit NbcInsertObject() fuer SolidDragging */
77 
78 ////////////////////////////////////////////////////////////////////////////////////////////////////
79 ////////////////////////////////////////////////////////////////////////////////////////////////////
80 //
81 //  @@@@@ @@@@@  @@ @@@@@@  @@ @@ @@ @@@@@ @@   @@
82 //  @@    @@  @@ @@   @@    @@ @@ @@ @@    @@   @@
83 //  @@    @@  @@ @@   @@    @@ @@ @@ @@    @@ @ @@
84 //  @@@@  @@  @@ @@   @@    @@@@@ @@ @@@@  @@@@@@@
85 //  @@    @@  @@ @@   @@     @@@  @@ @@    @@@@@@@
86 //  @@    @@  @@ @@   @@     @@@  @@ @@    @@@ @@@
87 //  @@@@@ @@@@@  @@   @@      @   @@ @@@@@ @@   @@
88 //
89 ////////////////////////////////////////////////////////////////////////////////////////////////////
90 ////////////////////////////////////////////////////////////////////////////////////////////////////
91 
92 class SVX_DLLPUBLIC SdrEditView: public SdrMarkView
93 {
94 	friend class				SdrPageView;
95 	friend class				SdrDragDistort;
96 	friend class				SdrDragCrook;
97 
98 protected:
99 
100 	// Die Transformationsnachfragen, etc. etwas cachen
101 	unsigned					bPossibilitiesDirty : 1;
102 	unsigned					bReadOnly : 1;
103 	unsigned					bGroupPossible : 1;
104 	unsigned					bUnGroupPossible : 1;
105 	unsigned					bGrpEnterPossible : 1;
106 	unsigned					bDeletePossible : 1;
107 	unsigned					bToTopPossible : 1;
108 	unsigned					bToBtmPossible : 1;
109 	unsigned					bReverseOrderPossible : 1;
110 	unsigned					bImportMtfPossible : 1;
111 	unsigned					bCombinePossible : 1;
112 	unsigned					bDismantlePossible : 1;
113 	unsigned					bCombineNoPolyPolyPossible : 1;
114 	unsigned					bDismantleMakeLinesPossible : 1;
115 	unsigned					bOrthoDesiredOnMarked : 1;
116 	unsigned					bMoreThanOneNotMovable : 1;   // Es ist mehr als ein Objekt nicht verschiebbar
117 	unsigned					bOneOrMoreMovable : 1;        // Wenigstens 1 Obj verschiebbar
118 	unsigned					bMoreThanOneNoMovRot : 1;     // Es ist mehr als ein Objekt nicht verschieb- und drehbar (Crook)
119 	unsigned					bContortionPossible : 1;      // Alles Polygone (ggf. gruppiert)
120 	unsigned					bAllPolys : 1;                // Alles Polygone (nicht gruppiert)
121 	unsigned					bOneOrMorePolys : 1;          // Mindestens 1 Polygon (nicht gruppiert)
122 	unsigned					bMoveAllowed : 1;
123 	unsigned					bResizeFreeAllowed : 1;
124 	unsigned					bResizePropAllowed : 1;
125 	unsigned					bRotateFreeAllowed : 1;
126 	unsigned					bRotate90Allowed : 1;
127 	unsigned					bMirrorFreeAllowed : 1;
128 	unsigned					bMirror45Allowed : 1;
129 	unsigned					bMirror90Allowed : 1;
130 	unsigned					bShearAllowed : 1;
131 	unsigned					bEdgeRadiusAllowed : 1;
132 	unsigned					bTransparenceAllowed : 1;
133 	unsigned					bGradientAllowed : 1;
134 	unsigned					bCanConvToPath : 1;
135 	unsigned					bCanConvToPoly : 1;
136 	unsigned					bCanConvToContour : 1;
137 	unsigned					bCanConvToPathLineToArea : 1;
138 	unsigned					bCanConvToPolyLineToArea : 1;
139 	unsigned					bMoveProtect : 1;
140 	unsigned					bResizeProtect : 1;
141 	// Z-Order von virtuellen Objekten zusammenhalten (Writer)
142 	unsigned					bBundleVirtObj : 1;
143 
144 private:
145 	SVX_DLLPRIVATE void ImpClearVars();
146 	SVX_DLLPRIVATE void ImpResetPossibilityFlags();
147 
148 protected:
149 	void ImpBroadcastEdgesOfMarkedNodes();
150 
151 	// Konvertierung der markierten Objekte in Poly bzw. Bezier.
152 	void ImpConvertTo(sal_Bool bPath, sal_Bool bLineToArea);
153 
154 	// Konvertiert ein Obj, wirft bei Erfolg das alte as seiner Liste und
155 	// fuegt das neue an dessen Position ein. Inkl Undo. Es wird weder ein
156 	// MarkEntry noch ein ModelChgBroadcast generiert.
157 	SdrObject* ImpConvertOneObj(SdrObject* pObj, sal_Bool bPath, sal_Bool bLineToArea);
158 
159 	// Setzen der beiden Flags bToTopPossible und bToBtmPossible.
160 	// bToTopPossibleDirty und bToBtmPossibleDirty werden dabei gleichzeitig
161 	// zurueckgesetzt.
162 	void ImpCheckToTopBtmPossible();
163 
164 	// fuer den Writer werden virtuelle Objekte buendig zusammengehalten (Z-Order)
165 	void ImpBundleVirtObjOfMarkList();
166 
167 	// fuer CombineMarkedObjects und DismantleMarkedObjects
168 	void ImpCopyAttributes(const SdrObject* pSource, SdrObject* pDest) const;
169 
170 	// fuer CombineMarkedObjects
171 	sal_Bool ImpCanConvertForCombine1(const SdrObject* pObj) const;
172 	sal_Bool ImpCanConvertForCombine(const SdrObject* pObj) const;
173 	basegfx::B2DPolyPolygon ImpGetPolyPolygon1(const SdrObject* pObj, sal_Bool bCombine) const;
174 	basegfx::B2DPolyPolygon ImpGetPolyPolygon(const SdrObject* pObj, sal_Bool bCombine) const;
175 	basegfx::B2DPolygon ImpCombineToSinglePolygon(const basegfx::B2DPolyPolygon& rPolyPolygon) const;
176 
177 	// fuer DismantleMarkedObjects
178 	sal_Bool ImpCanDismantle(const basegfx::B2DPolyPolygon& rPpolyPpolygon, sal_Bool bMakeLines) const;
179 	sal_Bool ImpCanDismantle(const SdrObject* pObj, sal_Bool bMakeLines) const;
180 	void ImpDismantleOneObject(const SdrObject* pObj, SdrObjList& rOL, sal_uIntPtr& rPos, SdrPageView* pPV, sal_Bool bMakeLines);
181 	void ImpCrookObj(SdrObject* pO, const Point& rRef, const Point& rRad, SdrCrookMode eMode,
182 		sal_Bool bVertical, sal_Bool bNoContortion, sal_Bool bRotate, const Rectangle& rMarkRect);
183 	void ImpDistortObj(SdrObject* pO, const Rectangle& rRef, const XPolygon& rDistortedRect, sal_Bool bNoContortion);
184 	sal_Bool ImpDelLayerCheck(SdrObjList* pOL, SdrLayerID nDelID) const;
185 	void ImpDelLayerDelObjs(SdrObjList* pOL, SdrLayerID nDelID);
186 
187 	// Entfernt alle Obj der MarkList aus ihren ObjLists inkl Undo.
188 	// Die Eintraege in rMark bleiben erhalten.
189 	void DeleteMarkedList(const SdrMarkList& rMark); // DeleteMarked -> DeleteMarkedList
190 
191 	// Die Transformationsnachfragen etwas cachen
192 	//void ImpCheckMarkTransform() const; veraltet
193 	// Checken, was man so mit den markierten Objekten alles machen kann
194 	virtual void CheckPossibilities();
195 	void ForcePossibilities() const { if (bPossibilitiesDirty || bSomeObjChgdFlag) ((SdrEditView*)this)->CheckPossibilities(); }
196 
197 protected:
198 	// #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
199 	SdrEditView(SdrModel* pModel1, OutputDevice* pOut = 0L);
200 	virtual ~SdrEditView();
201 
202 public:
203 	// Jeder Aufruf einer undofaehigen Methode an der View generiert eine
204 	// UndoAction. Moechte man mehrere
205 	// Methodenaufrufe zu einer UndoAction zusammenfassen, so kann man diese
206 	// mit BegUndo() / EndUndo() klammern (beliebig tief). Als Kommentar der
207 	// UndoAction wird der des ersten BegUndo(String) aller Klammerungen
208 	// verwendet. NotifyNewUndoAction() wird in diesem Fall erst beim letzten
209 	// EndUndo() gerufen. NotifyNewUndoAction() wird nicht gerufen bei einer
210 	// leeren Klammerung.
211 	void BegUndo()                       { pMod->BegUndo();         } // Undo-Klammerung auf
212 	void BegUndo(const String& rComment) { pMod->BegUndo(rComment); } // Undo-Klammerung auf
213 	void BegUndo(const String& rComment, const String& rObjDescr, SdrRepeatFunc eFunc=SDRREPFUNC_OBJ_NONE) { pMod->BegUndo(rComment,rObjDescr,eFunc); } // Undo-Klammerung auf
214 	void BegUndo(SdrUndoGroup* pUndoGrp) { pMod->BegUndo(pUndoGrp); } // Undo-Klammerung auf
215 	void EndUndo();                                                   // Undo-Klammerung zu (inkl BroadcastEdges)
216 	void AddUndo(SdrUndoAction* pUndo)   { pMod->AddUndo(pUndo);    } // Action hinzufuegen
217 	// nur nach dem 1. BegUndo oder vor dem letzten EndUndo:
218 	void SetUndoComment(const String& rComment) { pMod->SetUndoComment(rComment); }
219 	void SetUndoComment(const String& rComment, const String& rObjDescr) { pMod->SetUndoComment(rComment,rObjDescr); }
220 	bool IsUndoEnabled() const;
221 
222 	std::vector< SdrUndoAction* > CreateConnectorUndo( SdrObject& rO );
223 	void AddUndoActions( std::vector< SdrUndoAction* >& );
224 
225 	// Layerverwaltung. Mit Undo.
226 	SdrLayer* InsertNewLayer(const String& rName, sal_uInt16 nPos=0xFFFF);
227 	// Loeschen eines Layer inkl. aller darauf befindlichen Objekte
228 	void      DeleteLayer(const String& rName);
229 	// Verschieben eines Layer (Layerreihenfolge aendern)
230 	void      MoveLayer(const String& rName, sal_uInt16 nNewPos);
231 
232 	// Markierte Objekte die ausserhalb ihrer Page liegen
233 	// werden ggf. einer anderen Page zugewiesen
234 	// z.Zt. noch ohne Undo!!!
235 	void ForceMarkedObjToAnotherPage();
236 	void ForceMarkedToAnotherPage()   { ForceMarkedObjToAnotherPage(); }
237 
238 	sal_Bool IsReadOnly() const { ForcePossibilities(); return bReadOnly; }
239 
240 	// Loeschen aller markierten Objekte
241 	void DeleteMarkedObj();
242 	sal_Bool IsDeleteMarkedObjPossible() const { ForcePossibilities(); return bDeletePossible; }
243 
244 	// Logisch- umschliessendes Rect aller markierten Objekte setzen.
245 	// Das das wirklich geschieht ist nicht garantiert, denn eine
246 	// waagerechte Linie hat z.B. immer eine Hoehe von 0.
247 	void SetMarkedObjRect(const Rectangle& rRect, sal_Bool bCopy=sal_False);
248 	void MoveMarkedObj(const Size& rSiz, bool bCopy=false);
249 	void ResizeMarkedObj(const Point& rRef, const Fraction& xFact, const Fraction& yFact, bool bCopy=false);
250 	long GetMarkedObjRotate() const;
251 	void RotateMarkedObj(const Point& rRef, long nWink, bool bCopy=false);
252 	void MirrorMarkedObj(const Point& rRef1, const Point& rRef2, bool bCopy=false);
253 	void MirrorMarkedObjHorizontal(sal_Bool bCopy=sal_False);
254 	void MirrorMarkedObjVertical(sal_Bool bCopy=sal_False);
255 	long GetMarkedObjShear() const;
256 	void ShearMarkedObj(const Point& rRef, long nWink, bool bVShear=false, bool bCopy=false);
257 	void CrookMarkedObj(const Point& rRef, const Point& rRad, SdrCrookMode eMode, bool bVertical=false, bool bNoContortion=false, bool bCopy=false);
258 	void DistortMarkedObj(const Rectangle& rRef, const XPolygon& rDistortedRect, bool bNoContortion=false, bool bCopy=false);
259 
260 	// Markierte Objekte kopieren und anstelle der alten markieren
261 	void CopyMarkedObj();
262 	void SetAllMarkedRect(const Rectangle& rRect, sal_Bool bCopy=sal_False) { SetMarkedObjRect(rRect,bCopy); }
263 	void MoveAllMarked(const Size& rSiz, sal_Bool bCopy=sal_False) { MoveMarkedObj   (rSiz,bCopy); }
264 	void ResizeAllMarked(const Point& rRef, const Fraction& xFact, const Fraction& yFact, sal_Bool bCopy=sal_False) { ResizeMarkedObj (rRef,xFact,yFact,bCopy); }
265 	long GetAllMarkedRotate() const { return GetMarkedObjRotate(); }
266 	void RotateAllMarked(const Point& rRef, long nWink, sal_Bool bCopy=sal_False) { RotateMarkedObj(rRef,nWink,bCopy); }
267 	void MirrorAllMarked(const Point& rRef1, const Point& rRef2, sal_Bool bCopy=sal_False) { MirrorMarkedObj(rRef1,rRef2,bCopy); }
268 	void MirrorAllMarkedHorizontal(sal_Bool bCopy=sal_False) { MirrorMarkedObjHorizontal(bCopy); }
269 	void MirrorAllMarkedVertical(sal_Bool bCopy=sal_False) { MirrorMarkedObjVertical(bCopy); }
270 	long GetAllMarkedShear() const { return GetMarkedObjShear(); }
271 	void ShearAllMarked(const Point& rRef, long nWink, sal_Bool bVShear=sal_False, sal_Bool bCopy=sal_False) { ShearMarkedObj(rRef,nWink,bVShear,bCopy); }
272 	void CrookAllMarked(const Point& rRef, const Point& rRad, SdrCrookMode eMode, sal_Bool bVertical=sal_False, sal_Bool bNoContortion=sal_False, sal_Bool bCopy=sal_False) { CrookMarkedObj(rRef,rRad,eMode,bVertical,bNoContortion,bCopy); }
273 	void CopyMarked() { CopyMarkedObj(); }
274 	sal_Bool IsMoveAllowed() const { ForcePossibilities(); return bMoveAllowed && !bMoveProtect; }
275 	sal_Bool IsResizeAllowed(sal_Bool bProp=sal_False) const;
276 	sal_Bool IsRotateAllowed(sal_Bool b90Deg=sal_False) const;
277 	sal_Bool IsMirrorAllowed(sal_Bool b45Deg=sal_False, sal_Bool b90Deg=sal_False) const;
278 	sal_Bool IsTransparenceAllowed() const;
279 	sal_Bool IsGradientAllowed() const;
280 	sal_Bool IsShearAllowed() const;
281 	sal_Bool IsEdgeRadiusAllowed() const;
282 	sal_Bool IsCrookAllowed(sal_Bool bNoContortion=sal_False) const;
283 	sal_Bool IsDistortAllowed(sal_Bool bNoContortion=sal_False) const;
284 
285 	// Vereinigen mehrerer Objekte zu einem PolyPolygon:
286 	// - Rechtecke/Kreise/Text... werden implizit gewandelt.
287 	// - Polylines werden automatisch geschlossen.
288 	// - Die Attribute und der Layer werden vom Ersten der markierten Objekte
289 	//   uebernommen (also vom untersten der Z-Order).
290 	// - Gruppenobjekte werden miteinbezogen, wenn alle! Memberobjekte der
291 	//   Gruppe wandelbar sind. Beinhaltet eine Gruppe also beispielsweise
292 	//   eine Bitmap oder ein OLE-Objekt, wird die gesamte Gruppe nicht
293 	//   beruecksichtigt.
294 	// bNoPolyPoly=TRUE: Alles wird zu einem einzigen Polygon zusammengefasst
295 	void CombineMarkedObjects(sal_Bool bNoPolyPoly = sal_True);
296 
297 	// for combining multiple polygons, with direct support of the modes
298 	// SID_POLY_MERGE, SID_POLY_SUBSTRACT, SID_POLY_INTERSECT
299 	void MergeMarkedObjects(SdrMergeMode eMode);
300 
301 	// for distribution dialog function
302 	void DistributeMarkedObjects();
303 
304 	// Markierte Polypolygonobjekte in Polygone zerlegen
305 	// Gruppenobjekte werden durchsucht und zerlegt, wenn es sich bei allen
306 	// Memberobjekten um PathObjs handelt.
307 	// bMakeLines=TRUE: alle Polygone werden in einzelne Linien bzw.
308 	//                  Beziersegmente zerlegt
309 	void DismantleMarkedObjects(sal_Bool bMakeLines=sal_False);
310 	sal_Bool IsCombinePossible(sal_Bool bNoPolyPoly=sal_False) const;
311 	sal_Bool IsDismantlePossible(sal_Bool bMakeLines=sal_False) const;
312 
313 	// Ein neues bereits fertig konstruiertes Obj einfuegen. Das Obj gehoert
314 	// anschliessend dem Model. Nach dem Einfuegen wird das neue Objekt
315 	// markiert (wenn dies nicht via nOptions unterbunden wird).
316 	// U.U. wird das Obj jedoch nicht eingefuegt, sondern deleted, naemlich
317 	// wenn der Ziel-Layer gesperrt oder nicht sichtbar ist. In diesem Fall
318 	// returniert die Methode mit FALSE.
319 	// Die Methode generiert u.a. auch eine Undo-Action.
320 	sal_Bool InsertObjectAtView(SdrObject* pObj, SdrPageView& rPV, sal_uIntPtr nOptions=0);
321 
322 	// Ein Zeichenobjekt durch ein neues ersetzen. *pNewObj gehoert
323 	// anschliessend mir, *pOldObj wandert ins Undo.
324 	// Sollte in jedem Fall mit einer Undo-Klammerung versehen werden, z.B.:
325 	// aStr+=" ersetzen";
326 	// BegUndo(aStr);
327 	// ReplaceObject(...);
328 	// ...
329 	// EndUndo();
330 	void ReplaceObjectAtView(SdrObject* pOldObj, SdrPageView& rPV, SdrObject* pNewObj, sal_Bool bMark=sal_True);
331 
332 	void SetNotPersistAttrToMarked(const SfxItemSet& rAttr, sal_Bool bReplaceAll);
333 	void MergeNotPersistAttrFromMarked(SfxItemSet& rAttr, sal_Bool bOnlyHardAttr) const;
334 	void MergeAttrFromMarked(SfxItemSet& rAttr, sal_Bool bOnlyHardAttr) const;
335 	SfxItemSet GetAttrFromMarked(sal_Bool bOnlyHardAttr) const;
336 	void SetAttrToMarked(const SfxItemSet& rAttr, sal_Bool bReplaceAll);
337 
338 	// Geometrische Attribute (Position, Groesse, Drehwinkel)
339 	// Bei der Position wird ein evtl. gesetzter PageOrigin beruecksichtigt.
340 	SfxItemSet GetGeoAttrFromMarked() const;
341 	void SetGeoAttrToMarked(const SfxItemSet& rAttr);
342 
343 	// Returnt NULL wenn:
344 	// - Nix markiert,
345 	// - kein StyleSheet an den markierten Objekten gesetzt
346 	// - Bei Mehrfachselektion die markierten Objekte auf unterschiedliche
347 	//   StyleSheets verweisen.
348 	SfxStyleSheet* GetStyleSheetFromMarked() const;
349 
350 	// z.Zt. noch ohne Undo :(
351 	void SetStyleSheetToMarked(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr);
352 
353 	/* new interface src537 */
354 	sal_Bool GetAttributes(SfxItemSet& rTargetSet, sal_Bool bOnlyHardAttr) const;
355 
356 	sal_Bool SetAttributes(const SfxItemSet& rSet, sal_Bool bReplaceAll);
357 	SfxStyleSheet* GetStyleSheet() const; // SfxStyleSheet* GetStyleSheet(sal_Bool& rOk) const;
358 	sal_Bool SetStyleSheet(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr);
359 
360 	// Alle markierten Objekte zu einer Gruppe zusammenfassen.
361 	// Anschliessend wird die neue Gruppe markiert. Bei einer
362 	// seitenuebergreifenden Markierung wird eine Gruppe je Seite erzeugt.
363 	// Alle erzeugten Gruppen sind anschliessend markiert.
364 	// Ueber pUserGrp kann ein eigenes Gruppenobjekt vorgegeben werden. Dieses
365 	// wird  jedoch nicht direkt verwendet, sondern via Clone kopiert.
366 	// Wird NULL uebergeben, macht sich die Methode SdrObjGroup-Instanzen.
367 	void GroupMarked(const SdrObject* pUserGrp=NULL);
368 
369 	// Alle markierten Objektgruppen werden aufgeloesst (1 Level).
370 	// Anschliessend sind statt der Gruppenobjekte alle ehemaligen
371 	// Memberobjekte der aufgeloesten Gruppen markiert. Waren zum auch Objekte
372 	// markiert, die keine Gruppenobjekte sind, so bleiben diese weiterhin
373 	// zusaetzlich markiert.
374 	void UnGroupMarked();
375 
376 	sal_Bool IsGroupPossible() const { ForcePossibilities(); return bGroupPossible; }
377 	sal_Bool IsUnGroupPossible() const { ForcePossibilities(); return bUnGroupPossible; }
378 	sal_Bool IsGroupEnterPossible() const { ForcePossibilities(); return bGrpEnterPossible; }
379 
380 	// Markierte Objekte in Polygone/Bezierkurven verwandeln. Die sal_Bool-
381 	// Funktionen returnen sal_True, wenn wenigstens eins der markierten
382 	// Objekte gewandelt werden kann. Memberobjekte von Gruppenobjekten
383 	// werden ebenfalls gewandelt. Naehere Beschreibung siehe SdrObj.HXX.
384 	sal_Bool IsConvertToPathObjPossible(sal_Bool bLineToArea) const { ForcePossibilities(); return sal_Bool(bLineToArea ? bCanConvToPathLineToArea : bCanConvToPath); }
385 	sal_Bool IsConvertToPolyObjPossible(sal_Bool bLineToArea) const { ForcePossibilities(); return sal_Bool(bLineToArea ? bCanConvToPolyLineToArea : bCanConvToPoly); }
386 	sal_Bool IsConvertToContourPossible() const { ForcePossibilities(); return bCanConvToContour; }
387 	void ConvertMarkedToPathObj(sal_Bool bLineToArea);
388 	void ConvertMarkedToPolyObj(sal_Bool bLineToArea);
389 
390 	// Alle markierten Objekte untereinander ausrichten. Normalerweise werden
391 	// das SnapRect der Obj verwendet. Ist bBoundRects=sal_True, werden stattdessen
392 	// die BoundRects ausgerichtet.
393 	void AlignMarkedObjects(SdrHorAlign eHor, SdrVertAlign eVert, sal_Bool bBoundRects=sal_False);
394 	sal_Bool IsAlignPossible() const;
395 
396 	// Markierte Objekte etwas nach "oben" holen
397 	void MovMarkedToTop();
398 
399 	// Markierte Objekte etwas nach "unten" holen
400 	void MovMarkedToBtm();
401 
402 	// Markierte Objekte ganz nach "oben" stellen
403 	void PutMarkedToTop();
404 
405 	// Markierte Objekte ganz nach "unten" stellen
406 	void PutMarkedToBtm();
407 
408 	// Markierte direkt vor das uebergebene Objekt stellen
409 	// NULL -> wie PutMarkedToTop();
410 	void PutMarkedInFrontOfObj(const SdrObject* pRefObj);
411 
412 	// Markierte direkt hinter das uebergebene Objekt stellen
413 	// NULL -> wie PutMarkedToBtm();
414 	void PutMarkedBehindObj(const SdrObject* pRefObj);
415 
416 	// Z-Order der markierten Objekte vertauschen
417 	void ReverseOrderOfMarked();
418 
419 	// Feststellen, ob nach vorn/hinten stellen moeglich ist
420 	// GetMaxToTop/BtmObj() wird von diesen Methoden nur begrenzt
421 	// beruecksichtigt, d.h. es kann vorkommen dass IsToTopPossible()
422 	// sal_True liefert, MovMarkedToTop() jedoch nichts aendert (z.B. bei
423 	// Mehrfachselektion), weil eine von der abgeleiteten View ueber
424 	// GetMaxToTopObj() auferlegte Restriktion dies verhindert.
425 	sal_Bool IsToTopPossible() const { ForcePossibilities(); return bToTopPossible; }
426 	sal_Bool IsToBtmPossible() const { ForcePossibilities(); return bToBtmPossible; }
427 	sal_Bool IsReverseOrderPossible() const { ForcePossibilities(); return bReverseOrderPossible; }
428 
429 	// Ueber diese Methoden stellt die View fest, wie weit ein Objekt
430 	// nach vorn bzw. nach hinten gestellt werden darf (Z-Order). Das
431 	// zurueckgegebene Objekt wird dann nicht "ueberholt". Bei Rueckgabe
432 	// von NULL (Defaultverhalten) bestehen keine Restriktionen.
433 	virtual SdrObject* GetMaxToTopObj(SdrObject* pObj) const;
434 	virtual SdrObject* GetMaxToBtmObj(SdrObject* pObj) const;
435 
436 	// Folgende Methode wird gerufen, wenn z.B. durch ToTop, ToBtm, ... die
437 	// Reihenfolgen der Objekte geaendert wurde. Der Aufruf erfolgt dann nach
438 	// jedem SdrObjList::SetObjectOrdNum(nOldPos,nNewPos);
439 	virtual void ObjOrderChanged(SdrObject* pObj, sal_uIntPtr nOldPos, sal_uIntPtr nNewPos);
440 
441 	// Falls ein oder mehrere Objekte des Types SdrGrafObj oder SdrOle2Obj
442 	// markiert sind und diese in der Lage sind ein StarView-Metafile zu
443 	// liefern, konvertiert diese Methode das Metafile in Drawingobjekte.
444 	// Die SdrGrafObjs/SdrOle2Objs werden dann durch die neue Objekte ersetzt.
445 	void DoImportMarkedMtf(SvdProgressInfo *pProgrInfo=NULL);
446 	sal_Bool IsImportMtfPossible() const { ForcePossibilities(); return bImportMtfPossible; }
447 
448 	// Wird der Modus VirtualObjectBundling eingeschaltet, werden beim
449 	// ToTop/ToBtm virtuelle Objekte die dasselbe Objekt referenzieren
450 	// in ihrer Z-Order buendig zusammengehalten (Writer).
451 	// Defaulteinstellung ist sal_False=ausgeschaltet.
452 	void SetVirtualObjectBundling(sal_Bool bOn) { bBundleVirtObj=bOn; }
453 	sal_Bool IsVirtualObjectBundling() const { return bBundleVirtObj; }
454 
455 	// von der SdrMarkView ueberladen fuer den internen gebrauch
456 	virtual void MarkListHasChanged();
457 	virtual void ModelHasChanged();
458 };
459 
460 #endif //_SVDEDTV_HXX
461 
462