xref: /aoo4110/main/svx/inc/svx/svdobj.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 _SVDOBJ_HXX
25 #define _SVDOBJ_HXX
26 
27 #include <memory>
28 #include <cppuhelper/weakref.hxx>
29 #include <vcl/mapmod.hxx>
30 #include <tools/weakbase.hxx>
31 #include <svl/lstner.hxx>
32 #include <vcl/timer.hxx>
33 #include <svx/svdsob.hxx>
34 #include <svx/svdtypes.hxx> // fuer SdrLayerID
35 #include <svx/svdglue.hxx> // Klebepunkte
36 #include <svx/xdash.hxx>
37 #include <svx/xpoly.hxx>
38 #include <svx/xenum.hxx>
39 #include <vcl/bitmapex.hxx>
40 #include <svx/sdrobjectuser.hxx>
41 #include "svx/svxdllapi.h"
42 #include "svx/shapeproperty.hxx"
43 #include <svl/poolitem.hxx>
44 
45 //************************************************************
46 //   Vorausdeklarationen
47 //************************************************************
48 
49 class SfxBroadcaster;
50 class Pointer;
51 class AutoTimer;
52 class OutlinerParaObject;
53 class SdrOutliner;
54 class SdrDragStat;
55 class SdrHdl;
56 class SdrHdlList;
57 class SdrItemPool;
58 class SdrModel;
59 class SdrObjList;
60 class SdrObject;
61 class SdrPage;
62 class SdrPageView;
63 class SdrView;
64 class SfxItemSet;
65 class SfxSetItem;
66 class SfxStyleSheet;
67 class SfxUndoAction;
68 class XFillAttrSetItem;
69 class XLineAttrSetItem;
70 class SfxItemPool;
71 class PolyPolygon;
72 class SfxPoolItem;
73 class SdrVirtObj;
74 class SdrDragView;
75 
76 namespace sdr
77 {
78 	namespace properties
79 	{
80 		class BaseProperties;
81 	} // end of namespace properties
82 } // end of namespace sdr
83 
84 // #110094#
85 namespace sdr
86 {
87 	namespace contact
88 	{
89 		class ViewContact;
90 	} // end of namespace contact
91 } // end of namespace sdr
92 
93 namespace svx
94 {
95     class PropertyChangeNotifier;
96 }
97 
98 //************************************************************
99 //   Defines
100 //************************************************************
101 
102 enum SdrObjKind {OBJ_NONE       = 0,  // Abstraktes Objekt (SdrObject)
103 				 OBJ_GRUP       = 1,  // Objektgruppe
104 				 OBJ_LINE       = 2,  // Strecke
105 				 OBJ_RECT       = 3,  // Rechteck ww. mit runden Ecken
106 				 OBJ_CIRC       = 4,  // Kreis, Ellipse
107 				 OBJ_SECT       = 5,  // Kreissektor
108 				 OBJ_CARC       = 6,  // Kreisbogen
109 				 OBJ_CCUT       = 7,  // Kreisabschnitt
110 				 OBJ_POLY       = 8,  // Polygon, PolyPolygon
111 				 OBJ_PLIN       = 9,  // PolyLine
112 				 OBJ_PATHLINE   =10,  // Offene Bezierkurve
113 				 OBJ_PATHFILL   =11,  // Geschlossene Bezierkurve
114 				 OBJ_FREELINE   =12,  // Offene Freihandlinie
115 				 OBJ_FREEFILL   =13,  // Geschlossene Freihandlinie
116 				 OBJ_SPLNLINE   =14,  // Natuerlicher kubischer Spline          (ni)
117 				 OBJ_SPLNFILL   =15,  // Periodischer kubischer Spline          (ni)
118 				 OBJ_TEXT       =16,  // Textobjekt
119 				 OBJ_TEXTEXT    =17,  // Texterweiterungsrahmen                 (ni)
120 				 OBJ_wegFITTEXT,      // FitToSize-Text (alle Zeilen gleich)
121 				 OBJ_wegFITALLTEXT,   // FitToSize-Text (Zeilenweise)           (ni)
122 				 OBJ_TITLETEXT  =20,  // Titeltext. Spezial-Textobjekt fuer StarDraw
123 				 OBJ_OUTLINETEXT=21,  // OutlineText. Spezial-Textobjekt fuer StarDraw
124 				 OBJ_GRAF       =22,  // Fremdgrafik - (StarView Graphic)
125 				 OBJ_OLE2       =23,  // OLE-Objekt
126 				 OBJ_EDGE       =24,  // Verbindungsobjekt fuer Konnektoren
127 				 OBJ_CAPTION    =25,  // Legendenobjekt
128 				 OBJ_PATHPOLY   =26,  // Polygon/PolyPolygon dargestellt durch SdrPathObj
129 				 OBJ_PATHPLIN   =27,  // Polyline dargestellt durch SdrPathObj
130 				 OBJ_PAGE       =28,  // Objekt, das eine SdrPage darstellt
131 				 OBJ_MEASURE    =29,  // Bemassungsobjekt
132 				 OBJ_DUMMY      =30,  // Dummyobjekt zum speichern von Luecken (zur anschliessenden Wiederherstellung der Surrogate)
133 				 OBJ_FRAME      =31,  // staendig aktives OLE (PlugIn-Frame oder sowas)
134 				 OBJ_UNO        =32,  // Universal Network Object im SvDraw-Obj eingepackt
135 				 OBJ_CUSTOMSHAPE=33,  // CustomShape
136 				 OBJ_MEDIA		=34,  // Media shape
137 				 OBJ_TABLE		=35,  // Table
138 				 OBJ_MAXI};
139 
140 enum SdrUserCallType {SDRUSERCALL_MOVEONLY,       	// Nur verschoben, Groesse unveraendert
141 					  SDRUSERCALL_RESIZE,         	// Groesse und evtl. auch Pos veraendert
142 					  SDRUSERCALL_CHGATTR,  		// Attribute veraendert. Moeglicherweise neue Groesse wg. Linienbreite
143 					  SDRUSERCALL_DELETE,   		// Obj gibt es gleich nicht mehr. Schon keine Attr mehr.
144 					  SDRUSERCALL_COPY,     		// Zuweisungsoperator gerufen. Kann alles geaendert sein
145 					  SDRUSERCALL_INSERTED, 		// In eine Objektliste (z.B. Page) eingefuegt
146 					  SDRUSERCALL_REMOVED,  		// Aus der Objektliste entfernt
147 					  SDRUSERCALL_CHILD_MOVEONLY, 	// Ein Child einer Gruppe hat sich veraendert
148 					  SDRUSERCALL_CHILD_RESIZE,   	// Ein Child einer Gruppe hat sich veraendert
149 					  SDRUSERCALL_CHILD_CHGATTR,  	// Ein Child einer Gruppe hat sich veraendert
150 					  SDRUSERCALL_CHILD_DELETE,   	// Ein Child einer Gruppe hat sich veraendert
151 					  SDRUSERCALL_CHILD_COPY,     	// Ein Child einer Gruppe hat sich veraendert
152 					  SDRUSERCALL_CHILD_INSERTED, 	// Ein Child einer Gruppe hat sich veraendert
153 					  SDRUSERCALL_CHILD_REMOVED}; 	// Ein Child einer Gruppe hat sich veraendert
154 
155 /* nur voruebergehend, weil sonst MUSS-Aenderung */
156 // #define nLayerID nLayerId
157 
158 //************************************************************
159 //   Hilfsklasse SdrObjUserCall
160 //************************************************************
161 
162 class SVX_DLLPUBLIC SdrObjUserCall
163 {
164 public:
165 	TYPEINFO();
166 	virtual ~SdrObjUserCall();
167 	virtual void Changed(const SdrObject& rObj, SdrUserCallType eType, const Rectangle& rOldBoundRect);
168 };
169 
170 //************************************************************
171 //   Hilfsklasse SdrObjMacroHitRec
172 //************************************************************
173 
174 class SdrObjMacroHitRec
175 {
176 public:
177 	Point						aPos;
178 	Point						aDownPos;
179 	OutputDevice*				pOut;
180 	const SetOfByte*			pVisiLayer;
181 	const SdrPageView*			pPageView;
182 	sal_uInt16						nTol;
183 	FASTBOOL					bDown;
184 
185 public:
SdrObjMacroHitRec()186 	SdrObjMacroHitRec()
187 	:	pOut(NULL),
188 		pVisiLayer(NULL),
189 		pPageView(NULL),
190 		nTol(0),
191 		bDown(sal_False)
192 	{}
193 };
194 
195 //************************************************************
196 //   Hilfsklasse SdrObjUserData
197 //
198 // Anwenderdaten an einem Zeichenobjekt, z.B. applikationsspezifische Daten.
199 // Jedes Zeichenobjekt kann beliebig viele dieser Records haben (SV-Liste).
200 // Wer hier Daten halten will, muss sich ableiten und auch an der Factory
201 // einen entsprechenden Link setzen.
202 //
203 //************************************************************
204 
205 class SVX_DLLPUBLIC SdrObjUserData
206 {
207 protected:
208 	sal_uInt32						nInventor;
209 	sal_uInt16						nIdentifier;
210 	sal_uInt16						nVersion;
211 
212 private:
213 	SVX_DLLPRIVATE void operator=(const SdrObjUserData& rData);        // nicht implementiert
214 	SVX_DLLPRIVATE sal_Bool operator==(const SdrObjUserData& rData) const; // nicht implementiert
215 	SVX_DLLPRIVATE sal_Bool operator!=(const SdrObjUserData& rData) const; // nicht implementiert
216 
217 public:
218 	TYPEINFO();
219 
SdrObjUserData(sal_uInt32 nInv,sal_uInt16 nId,sal_uInt16 nVer)220 	SdrObjUserData(sal_uInt32 nInv, sal_uInt16 nId, sal_uInt16 nVer)
221 	:	nInventor(nInv),
222 		nIdentifier(nId),
223 		nVersion(nVer)
224 	{}
SdrObjUserData(const SdrObjUserData & rData)225 	SdrObjUserData(const SdrObjUserData& rData)
226 	:	nInventor(rData.nInventor),
227 		nIdentifier(rData.nIdentifier),
228 		nVersion(rData.nVersion)
229 	{}
230 	virtual ~SdrObjUserData();
231 
232 	virtual SdrObjUserData* Clone(SdrObject* pObj1) const = 0; // #i71039# NULL -> 0
GetInventor() const233 	sal_uInt32  GetInventor() const { return nInventor; }
GetId() const234 	sal_uInt16  GetId() const { return nIdentifier; }
235 
236 	virtual FASTBOOL HasMacro (const SdrObject* pObj) const;
237 	virtual SdrObject* CheckMacroHit (const SdrObjMacroHitRec& rRec, const SdrObject* pObj) const;
238 	virtual Pointer GetMacroPointer (const SdrObjMacroHitRec& rRec, const SdrObject* pObj) const;
239 	virtual void PaintMacro (OutputDevice& rOut, const Rectangle& rDirtyRect, const SdrObjMacroHitRec& rRec, const SdrObject* pObj) const;
240 	virtual FASTBOOL DoMacro (const SdrObjMacroHitRec& rRec, SdrObject* pObj);
241 	virtual XubString GetMacroPopupComment(const SdrObjMacroHitRec& rRec, const SdrObject* pObj) const;
242 };
243 
244 //************************************************************
245 //   Hilfsklasse SdrObjUserDataList
246 //************************************************************
247 
248 class SdrObjUserDataList
249 {
250 	Container					aList;
251 
252 public:
SdrObjUserDataList()253 	SdrObjUserDataList()
254 	:	aList(1024,4,4)
255 	{}
~SdrObjUserDataList()256 	~SdrObjUserDataList() { Clear(); }
257 
258 	void Clear();
GetUserDataCount() const259 	sal_uInt16 GetUserDataCount() const { return sal_uInt16(aList.Count()); }
GetUserData(sal_uInt16 nNum) const260 	SdrObjUserData* GetUserData(sal_uInt16 nNum) const { return (SdrObjUserData*)aList.GetObject(nNum); }
InsertUserData(SdrObjUserData * pData,sal_uInt16 nPos=0xFFFF)261 	void InsertUserData(SdrObjUserData* pData, sal_uInt16 nPos=0xFFFF) { aList.Insert(pData,nPos); }
RemoveUserData(sal_uInt16 nNum)262 	SdrObjUserData* RemoveUserData(sal_uInt16 nNum) { return (SdrObjUserData*)aList.Remove(nNum);}
DeleteUserData(sal_uInt16 nNum)263 	void DeleteUserData(sal_uInt16 nNum) { delete RemoveUserData(nNum); }
264 };
265 
266 //************************************************************
267 //   Hilfsklasse SdrObjGeoData
268 //
269 // Alle geometrischen Daten eines beliebigen Objektes zur �bergabe an's Undo/Redo
270 //
271 //************************************************************
272 
273 class SVX_DLLPUBLIC SdrObjGeoData
274 {
275 public:
276 	Rectangle					aBoundRect;
277 	Point						aAnchor;
278 	SdrGluePointList*			pGPL;
279 	sal_Bool						bMovProt;
280 	sal_Bool						bSizProt;
281 	sal_Bool						bNoPrint;
282 	sal_Bool						bClosedObj;
283 	bool						mbVisible;
284 	SdrLayerID					mnLayerID;
285 
286 public:
287 	SdrObjGeoData();
288 	virtual ~SdrObjGeoData();
289 };
290 
291 //************************************************************
292 //   Hilfsklasse SdrObjPlusData
293 //
294 // Bitsack fuer DrawObjekte
295 //
296 //************************************************************
297 
298 class SdrObjPlusData
299 {
300 	friend class				SdrObject;
301 
302 public:
303 	SfxBroadcaster*				pBroadcast;    // Broadcaster, falls dieses Obj referenziert wird (bVirtObj=sal_True). Auch fuer Konnektoren etc.
304 	SdrObjUserDataList*			pUserDataList; // applikationsspeziefische Daten
305 	SdrGluePointList*			pGluePoints;   // Klebepunkte zum Ankleben von Objektverbindern
306 	AutoTimer*					pAutoTimer;
307 
308 	// #i68101#
309 	// object name, title and description
310 	String						aObjName;
311 	String						aObjTitle;
312 	String						aObjDescription;
313 
314 	// Name to be used by applications
315 	XubString					aHTMLName;
316 
317 public:
318 	TYPEINFO();
319 	SdrObjPlusData();
320 	virtual ~SdrObjPlusData();
321 	virtual SdrObjPlusData* Clone(SdrObject* pObj1) const;
322 };
323 
324 //************************************************************
325 //   Hilfsklasse SdrObjTransformInfoRec
326 //
327 // gibt Auskunft ueber verschiedene Eigenschaften eines ZObjects
328 //
329 //************************************************************
330 
331 class SdrObjTransformInfoRec
332 {
333 public:
334 	unsigned					bSelectAllowed : 1;     // sal_False=Obj kann nicht selektiert werden
335 	unsigned					bMoveAllowed : 1;       // sal_False=Obj kann nicht verschoben werden
336 	unsigned					bResizeFreeAllowed : 1; // sal_False=Obj kann nicht frei resized werden
337 	unsigned					bResizePropAllowed : 1; // sal_False=Obj kann nichtmal proportional resized werden
338 	unsigned					bRotateFreeAllowed : 1; // sal_False=Obj kann nicht frei gedreht werden
339 	unsigned					bRotate90Allowed : 1;   // sal_False=Obj kann nichtmal im 90deg Raster gedreht werden
340 	unsigned					bMirrorFreeAllowed : 1; // sal_False=Obj kann nicht frei gespiegelt werden
341 	unsigned					bMirror45Allowed : 1;   // sal_False=Obj kann nichtmal ueber Achse im 45deg Raster gespiegelt werden
342 	unsigned					bMirror90Allowed : 1;   // sal_False=Obj kann ebenfalls nicht ueber Achse im 90deg Raster gespiegelt werden
343 	unsigned					bTransparenceAllowed : 1; // sal_False=Obj does not have an interactive transparence control
344 	unsigned					bGradientAllowed : 1; // sal_False=Obj dooes not have an interactive gradient control
345 	unsigned					bShearAllowed : 1;      // sal_False=Obj kann nicht verzerrt werden
346 	unsigned					bEdgeRadiusAllowed : 1;
347 	unsigned					bNoOrthoDesired : 1;    // sal_True bei Rect; ... sal_False bei BMP,MTF;
348 	unsigned					bNoContortion : 1;      // sal_False=Kein verzerren (bei Crook) moeglich (nur sal_True bei PathObj und Gruppierten PathObjs)
349 	unsigned					bCanConvToPath : 1;     // sal_False=Keine Konvertierung in PathObj moeglich
350 	unsigned					bCanConvToPoly : 1;     // sal_False=Keine Konvertierung in PolyObj moeglich
351 	unsigned					bCanConvToContour : 1;     // sal_False=no conversion down to whole contour possible
352 	unsigned					bCanConvToPathLineToArea : 1; // sal_False=Keine Konvertierung in PathObj moeglich mit Wandlung von LineToArea
353 	unsigned					bCanConvToPolyLineToArea : 1; // sal_False=Keine Konvertierung in PolyObj moeglich mit Wandlung von LineToArea
354 
355 public:
SdrObjTransformInfoRec()356 	SdrObjTransformInfoRec()
357 	:	bSelectAllowed(sal_True),
358 		bMoveAllowed(sal_True),
359 		bResizeFreeAllowed(sal_True),
360 		bResizePropAllowed(sal_True),
361 		bRotateFreeAllowed(sal_True),
362 		bRotate90Allowed(sal_True),
363 		bMirrorFreeAllowed(sal_True),
364 		bMirror45Allowed(sal_True),
365 		bMirror90Allowed(sal_True),
366 		bTransparenceAllowed(sal_True),
367 		bGradientAllowed(sal_True),
368 		bShearAllowed(sal_True),
369 		bEdgeRadiusAllowed(sal_True),
370 		bNoOrthoDesired(sal_True),
371 		bNoContortion(sal_True),
372 		bCanConvToPath(sal_True),
373 		bCanConvToPoly(sal_True),
374 		bCanConvToContour(sal_False),
375 		bCanConvToPathLineToArea(sal_True),
376 		bCanConvToPolyLineToArea(sal_True)
377 	{}
378 };
379 
380 ////////////////////////////////////////////////////////////////////////////////////////////////////
381 // To make things more safe, allow users of the object to register at it. The users need to be derived
382 // from SdrObjectUser to get a call. The users do not need to call RemoveObjectUser() at the object
383 // when they get called from PageInDestruction().
384 class SdrObject;
385 
386 class SdrObjectUser
387 {
388 public:
389 	virtual void ObjectInDestruction(const SdrObject& rObject) = 0;
390 };
391 
392 // typedef for GetParentContacts()
393 typedef ::std::vector< SdrObjectUser* > ObjectUserVector;
394 
395 ////////////////////////////////////////////////////////////////////////////////////////////////////
396 ////////////////////////////////////////////////////////////////////////////////////////////////////
397 //
398 //   @@@@  @@@@@  @@@@@@ @@@@@  @@@@  @@@@@@
399 //  @@  @@ @@  @@     @@ @@    @@  @@   @@
400 //  @@  @@ @@  @@     @@ @@    @@       @@
401 //  @@  @@ @@@@@      @@ @@@@  @@       @@
402 //  @@  @@ @@  @@     @@ @@    @@       @@
403 //  @@  @@ @@  @@ @@  @@ @@    @@  @@   @@
404 //   @@@@  @@@@@   @@@@  @@@@@  @@@@    @@
405 //
406 // Abstraktes DrawObject
407 //
408 ////////////////////////////////////////////////////////////////////////////////////////////////////
409 
410 class SvxShape;
411 class SVX_DLLPUBLIC SdrObject: public SfxListener, public tools::WeakBase< SdrObject >
412 {
413 private:
414 	// ObjectUser section
415 	sdr::ObjectUserVector											maObjectUsers;
416 
417 public:
418 	void AddObjectUser(sdr::ObjectUser& rNewUser);
419 	void RemoveObjectUser(sdr::ObjectUser& rOldUser);
420 
421 	// BaseProperties section
422 private:
423 	sdr::properties::BaseProperties*								mpProperties;
424 protected:
425 	virtual sdr::properties::BaseProperties* CreateObjectSpecificProperties();
426 public:
427 	virtual sdr::properties::BaseProperties& GetProperties() const;
428 
429 	///////////////////////////////////////////////////////////////////////////////
430 	// #110094# DrawContact section
431 private:
432 	sdr::contact::ViewContact*										mpViewContact;
433 protected:
434 	virtual sdr::contact::ViewContact* CreateObjectSpecificViewContact();
435 public:
436 	sdr::contact::ViewContact& GetViewContact() const;
437 
438 	// DrawContact support: Methods for handling Object changes
439 	void ActionChanged() const;
440 
441 private:
442 	friend class				SdrObjListIter;
443 	friend class				SdrVirtObj;
444 	friend class				SdrRectObj;
445 
446 protected:
447 	Rectangle					aOutRect;     // umschliessendes Rechteck fuer Paint (inkl. LineWdt, ...)
448 	Point						aAnchor;      // Ankerposition (Writer)
449 	SdrObjList*					pObjList;     // Liste, in dem das Obj eingefuegt ist.
450 	SdrPage*					pPage;
451 	SdrModel*					pModel;
452 	SdrObjUserCall*				pUserCall;
453 	SdrObjPlusData*				pPlusData;    // Broadcaster, UserData, Konnektoren, ... (Das ist der Bitsack)
454 
455 	sal_uInt32					nOrdNum;      // Rangnummer des Obj in der Liste
456 
457     /** Position in the navigation order.  SAL_MAX_UINT32 when not used.
458     */
459     sal_uInt32                  mnNavigationPosition;
460 	SdrLayerID					mnLayerID;
461 
462 	// Objekt zeigt nur auf ein Anderes
463 	unsigned					bVirtObj : 1;
464 	unsigned					bSnapRectDirty : 1;
465 	unsigned					bNetLock : 1;   // ni
466 	unsigned					bInserted : 1;  // nur wenn sal_True gibt's RepaintBroadcast & SetModify
467 	unsigned					bGrouped : 1;   // Member eines GroupObjektes?
468 
469 	// Die folgende Flags werden gestreamt
470 	unsigned					bMovProt : 1; // If true, the position is protected
471 	unsigned					bSizProt : 1; // If true, the size is protected
472 	unsigned					bNoPrint : 1; // If true, the object is not printed.
473 	unsigned					mbVisible : 1; // If false, the object is not visible on screen (but maybe on printer, depending on bNoprint
474 	// Wenn bEmptyPresObj sal_True ist, handelt es sich um ein
475 	// Praesentationsobjekt, dem noch kein Inhalt zugewiesen
476 	// wurde. Default ist das Flag auf FALSE. Die Verwaltung
477 	// uebernimmt die Applikation. Im Zuweisungsoperator sowie
478 	// beim Clone wird das Flag nicht mitkopiert!
479 	// Das Flag ist persistent.
480 	unsigned					bEmptyPresObj : 1;     // Leeres Praesentationsobjekt (Draw)
481 
482 	// sal_True=Objekt ist als Objekt der MasterPage nicht sichtbar
483 	unsigned					bNotVisibleAsMaster : 1;
484 
485 	// sal_True=Es handelt sich hierbei um ein geschlossenes Objekt, also nicht Linie oder Kreisbogen ...
486 	unsigned					bClosedObj : 1;
487 
488 	unsigned					bIsEdge : 1;
489 	unsigned					bIs3DObj : 1;
490 	unsigned					bMarkProt : 1;  // Markieren verboten. Persistent
491 	unsigned					bIsUnoObj : 1;
492 	unsigned					bNotMasterCachable : 1;
493 
494 	// #i25616#
495 	unsigned					mbLineIsOutsideGeometry : 1;
496 
497 	// #i25616#
498 	unsigned					mbSupportTextIndentingOnLineWidthChange : 1;
499 
500 	// on import of OLE object from MS documents the BLIP size might be retrieved,
501 	// in this case the following member is initialized as nonempty rectangle
502 	Rectangle					maBLIPSizeRectangle;
503 
504 	// global static ItemPool for not-yet-insetred items
505 private:
506 	static SdrItemPool*			mpGlobalItemPool;
507 public:
508 	static SdrItemPool& GetGlobalDrawObjectItemPool();
509 private:
510 	SVX_DLLPRIVATE static void FreeGlobalDrawObjectItemPool();
511 
512 protected:
513 	void ImpDeleteUserData();
514 	SdrObjUserData* ImpGetMacroUserData() const;
515 	Rectangle ImpDragCalcRect(const SdrDragStat& rDrag) const;
516 
517 	// Fuer GetDragComment
518 	void ImpTakeDescriptionStr(sal_uInt16 nStrCacheID, String& rStr, sal_uInt16 nVal=0) const;
519 
ImpForcePlusData()520 	void ImpForcePlusData() { if (pPlusData==NULL) pPlusData=NewPlusData(); }
521 
522 	String GetWinkStr(long nWink, FASTBOOL bNoDegChar=sal_False) const;
523 	String GetMetrStr(long nVal, MapUnit eWantMap=MAP_MM, FASTBOOL bNoUnitChars=sal_False) const;
524 
525 	// bNotMyself=sal_True bedeutet: Nur die ObjList auf Dirty setzen, nicht mich.
526 	// Wird z.B. benoetigt fuer NbcMove, denn da movt man SnapRect und aOutRect
527 	// i.d.R. gleich mit um die Neuberechnung zu sparen.
528 public:
529 	virtual void SetRectsDirty(sal_Bool bNotMyself = sal_False);
530 protected:
531 
532 	// ueberladen, wenn man sich von SdrObjPlusData abgeleitet hat:
533 	virtual SdrObjPlusData* NewPlusData() const;
534 
535 protected:
536 	// Diese 3 Methoden muss ein abgeleitetes Objekt ueberladen, wenn es eigene
537 	// geometrische Daten besitzt, die fuer den Undo-Fall gesichert werden
538 	// sollen. NewGeoData() erzeugt lediglich eine leere Instanz auf eine von
539 	// SdrObjGeoData abgeleitete Klasse.
540 	virtual SdrObjGeoData* NewGeoData() const;
541 	virtual void SaveGeoData(SdrObjGeoData& rGeo) const;
542 	virtual void RestGeoData(const SdrObjGeoData& rGeo);
543 
544 protected:
545 	virtual ~SdrObject();
546 
547 public:
548 	TYPEINFO();
549 	SdrObject();
550 
551     /** fres the SdrObject pointed to by the argument
552 
553         In case the object has an SvxShape, which has the ownership of the object, it
554         is actually *not* deleted.
555     */
556     static  void    Free( SdrObject*& _rpObject );
557 
558 	// This method is only for access from Property objects
559 	virtual void SetBoundRectDirty();
560 
561 	virtual void SetObjList(SdrObjList* pNewObjList);
GetObjList() const562 	SdrObjList* GetObjList() const { return pObjList; }
563 
564 	virtual void SetPage(SdrPage* pNewPage);
GetPage() const565 	SdrPage* GetPage() const { return pPage; }
566 
567 	virtual void SetModel(SdrModel* pNewModel);
GetModel() const568 	SdrModel* GetModel() const { return pModel; }
569 	SdrItemPool* GetObjectItemPool() const;
570 
571 	void AddListener(SfxListener& rListener);
572 	void RemoveListener(SfxListener& rListener);
GetBroadcaster() const573 	const SfxBroadcaster* GetBroadcaster() const { return pPlusData!=NULL ? pPlusData->pBroadcast : NULL; }
574 
575 	virtual void AddReference(SdrVirtObj& rVrtObj);
576 	virtual void DelReference(SdrVirtObj& rVrtObj);
577 	virtual sal_uInt32 GetObjInventor() const;
578 	virtual sal_uInt16 GetObjIdentifier() const;
579 	virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const;
580 
581 	// Layer interface
582 	virtual SdrLayerID GetLayer() const;
583 	virtual void NbcSetLayer(SdrLayerID nLayer);
584 	virtual void SetLayer(SdrLayerID nLayer);
585 	// renaming GetLayerSet -> getMergedHierarchyLayerSet to make clear what happens here. rSet needs to be empty.
586 	virtual void getMergedHierarchyLayerSet(SetOfByte& rSet) const;
587 
588 	// UserCall interface
SetUserCall(SdrObjUserCall * pUser)589 	void SetUserCall(SdrObjUserCall* pUser) { pUserCall=pUser; }
GetUserCall() const590 	SdrObjUserCall* GetUserCall() const { return pUserCall; }
591 	void SendUserCall(SdrUserCallType eUserCall, const Rectangle& rBoundRect) const;
592 
593 	// Ein solcher Referenzpunkt ist z.B. der Punkt eines Symbols, der
594 	// der beim Einfuegen des Symbols auf das Raster gefangen werden soll
595 	// oder der Fixpunkt eines Bildes innerhalb eines Animationsobjektes.
596 	virtual FASTBOOL HasRefPoint() const;
597 	virtual Point GetRefPoint() const;
598 	virtual void SetRefPoint(const Point& rPnt);
599 
600 	// #i68101#
601 	// An object may have a user-set Name (Get/SetName()), e.g SdrGrafObj, SdrObjGroup
602 	// or SdrOle2Obj.
603 	// It may also have a Title and a Description for accessibility purposes.
604 	void SetName(const String& rStr);
605 	String GetName() const;
606 	void SetTitle(const String& rStr);
607 	String GetTitle() const;
608 	void SetDescription(const String& rStr);
609 	String GetDescription() const;
610 
611 	// support for HTMLName
612 	void SetHTMLName(const String& rStr);
613 	String GetHTMLName() const;
614 
615 	// Fuer Gruppenobjekte
IsGroupObject() const616 	sal_Bool IsGroupObject() const { return GetSubList()!=NULL; }
617 	virtual SdrObjList* GetSubList() const;
618 	SdrObject* GetUpGroup() const;
619 
620 	// Ueber die Objekt-Ordnungsnummer kann man feststellen, ob ein Objekt vor
621 	// oder hinter einem anderen liegt. Objekte mit kleinen Ordnungsnummern werden
622 	// zuerst gezeichnet, Objekte mit grossen Ordnungsnummern zuletzt.
623 	// Wird die Reihenfolge der Objekte in der Liste veraendert, so wird ein
624 	// Dirty-Flag gesetzt (an der Page). Beim naechsten SdrObject::GetOrdNum()
625 	// werden die Ordnungsnummer aller Objekte der Liste neu bestimmt.
626 	sal_uInt32 GetOrdNum() const;
627 
628 	// Diese Methode sollte nur verwendet werden, wenn man ganz  genau weiss,
629 	// was man macht:
GetOrdNumDirect() const630 	sal_uInt32 GetOrdNumDirect() const { return nOrdNum; }
631 
632 	// Das Setzen der Ordnungsnummer sollte nur vom Model bzw. von der Page
633 	// geschehen.
SetOrdNum(sal_uInt32 nNum)634 	void SetOrdNum(sal_uInt32 nNum) { nOrdNum=nNum; }
635 
636     /** Return the position in the navigation order for the called object.
637         Note that this method may update the navigation position of the
638         called and of other SdrObjects.  Therefore this method can not be
639         const.
640         @return
641             If no navigation position has been explicitly defined then the
642             result of GetOrdNum() is returned.
643     */
644     sal_uInt32 GetNavigationPosition (void);
645 
646     /** Set the position in the navigation position to the given value.
647         This method is typically used only by the model after a change to
648         the navigation order.
649         This method does not change the navigation position of other
650         objects.
651         Use SdrObjList::SetObjectNavigationPosition() instead.
652     */
653     void SetNavigationPosition (const sal_uInt32 nPosition);
654 
GetAutoTimer() const655 	const AutoTimer* GetAutoTimer() const { return pPlusData!=NULL ? pPlusData->pAutoTimer : NULL; }
GetAutoTimer()656 	AutoTimer* GetAutoTimer() { return pPlusData!=NULL ? pPlusData->pAutoTimer : NULL; }
657 	AutoTimer* ForceAutoTimer();
658 
659 	// #111111#
660 	// To make clearer that this method may trigger RecalcBoundRect and thus may be
661 	// expensive and somtimes problematic (inside a bigger object change You will get
662 	// non-useful BoundRects sometimes) i rename that method from GetBoundRect() to
663 	// GetCurrentBoundRect().
664 	virtual const Rectangle& GetCurrentBoundRect() const;
665 
666 	// #111111#
667 	// To have a possibility to get the last calculated BoundRect e.g for producing
668 	// the first rectangle for repaints (old and new need to be used) without forcing
669 	// a RecalcBoundRect (which may be problematical and expensive sometimes) i add here
670 	// a new method for accessing the last BoundRect.
671 	virtual const Rectangle& GetLastBoundRect() const;
672 
673 	virtual void RecalcBoundRect();
674 
675 	void BroadcastObjectChange() const;
676 
677 	// Modified-Flag am Model setzen
678 	virtual void SetChanged();
679 
680 	// Tooling for painting a single object to a OutputDevice. This will be needed as long
681 	// as not all painting is changed to use DrawContact objects.
682 	sal_Bool SingleObjectPainter(OutputDevice& rOut) const;
683 	sal_Bool LineGeometryUsageIsNecessary() const;
684 
685 	// Clone() soll eine komplette Kopie des Objektes erzeugen.
686 	virtual SdrObject* Clone() const;
687 	virtual void operator=(const SdrObject& rObj);
688 
689 	// TakeObjName...() ist fuer die Anzeige in der UI, z.B. "3 Rahmen selektiert".
690 	virtual void TakeObjNameSingul(String& rName) const;
691 	virtual void TakeObjNamePlural(String& rName) const;
692 
693 	// Das Xor-Polygon wird von der View zu Draggen des Objektes benoetigt.
694 	// Alle Polygone innerhalb des PolyPolygon werden als PolyLine interpretiert.
695 	// Moechte man ein geschlossenes Polygon, so muss man es explizit schliessen.
696 	virtual basegfx::B2DPolyPolygon TakeXorPoly() const;
697 
698 	// Die Kontur fuer TextToContour
699 	virtual basegfx::B2DPolyPolygon TakeContour() const;
700 
701 	// Ueber GetHdlCount gibt ein Objekt die Anzahl seiner Handles preis.
702 	// Im Normalfall werden dies 8 sein, bei einer Strecke 2. Bei Polygonobjekten
703 	// (Polygon,Spline,Bezier) kann die Handleanzahl wesentlich groesser werden.
704 	// Polygonobjekten wird ausserdem die Moeglichkeit eingeraeumt einen Punkt
705 	// eines selektierten Objekts zu selektieren. Das Handle dieses Punktes wird
706 	// dann durch einen Satz neuer Handles ausgetauscht (PlusHdl). Bei einem
707 	// Polygon wird das wohl ein einfacher Selektionshandle sein, bei einer
708 	// Bezierkurve dagegen koennen das schon bis zu 3 Handles werden (inkl Gewichte).
709 	// GetHdl() und GetPlusHdl() muessen Handleinstanzen mit new erzeugen!
710 	// Ein Objekt, das bei HasSpacialDrag() sal_True liefert muss diese Methoden
711 	// zur Verfuegung stellen (inkl. FillHdlList).
712 	virtual sal_uInt32 GetHdlCount() const;
713 	virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const;
714 	virtual sal_uInt32 GetPlusHdlCount(const SdrHdl& rHdl) const;
715 	virtual SdrHdl* GetPlusHdl(const SdrHdl& rHdl, sal_uInt32 nPlNum) const;
716 	virtual void AddToHdlList(SdrHdlList& rHdlList) const;
717 
718 	// Die Standardtransformationen (Move,Resize,Rotate,Mirror,Shear) werden von der
719 	// View uebernommen (TakeXorPoly(),...).
720 	// Objektspeziefisches draggen wie z.B. Eckenradius bei Rechtecken,
721 	// Stuetzstellen bei Splines, Gewichte bei Bezierkurven und Pointer von
722 	// Labelobjekten muss vom Objekt selbst gehandled werden. Um das Model
723 	// Statusfrei zu halten werden die Statusdaten an der View gehalten und dem
724 	// Objekt dann uebergeben. EndDrag liefrt im Normalfall sal_True fuer Erfolg.
725 	// sal_False kann zurueckgegeben werden, wenn das Dragging das Objekt nicht
726 	// veraendert hat, wobei dir evtl. Tatsache das die Maus nicht bewegt wurde
727 	// bereits von der View abgefangen wird.
728 	virtual bool hasSpecialDrag() const;
729 	virtual bool beginSpecialDrag(SdrDragStat& rDrag) const;
730 	virtual bool applySpecialDrag(SdrDragStat& rDrag);
731 	virtual String getSpecialDragComment(const SdrDragStat& rDrag) const;
732 	virtual basegfx::B2DPolyPolygon getSpecialDragPoly(const SdrDragStat& rDrag) const;
733 
734     // FullDrag support. This is for standard interactions and for SdrObjOwn
735     // support. If supportsFullDrag() returns true, getFullDragClone has to
736     // return a cloned SdrObject (who's ownership it loses) at which modifications
737     // like Move(), Scale(), etc or applySpecialDrag() will be executed. That
738     // object will be visualized on overlay for full drag, but should not be
739     // part of the model, thus not changing anything since it's only a temporary
740     // helper object for interaction
741 	virtual bool supportsFullDrag() const;
742 	virtual SdrObject* getFullDragClone() const;
743 
744     // Jedes Objekt muss in der Lage sein sich selbst interaktiv zu erzeugen.
745 	// Beim MausDown wird zunaechst ein neues Objekt erzeugt und dann seine
746 	// BegCreate()-Methode gerufen. Bei jedem MausMode wird dann MovCreate
747 	// gerufen. BrkCreate() bedeutet, dass der User die interaktive Objekt-
748 	// erzeugung abgebrochen hat. EndCreate() wird gerufen beim MouseUp-Event.
749 	// Liefert EndCreate() ein sal_True, so ist die Objekterzeugung abgeschlossen;
750 	// das Objekt wird in die entsprechende Liste eingefuegt. Andernfalls
751 	// (EndCreate()==sal_False) gehe ich davon aus, dass weitere Punkte zur
752 	// Objekterzeugung notwendig sind (Polygon,...). Der Parameter eCmd
753 	// enthaelt die Anzahl der Mausklicks (so die App diese durchreicht).
754 	// BckCreate() -> Letztes EndCreate() rueckgaengig machen (z.B. letzten
755 	// Polygonpunkt wieder loeschen).
756 	// RetrunCode: sal_True=Weiter gehts, sal_False=Create dadurch abgebrochen.
757 	virtual FASTBOOL BegCreate(SdrDragStat& rStat);
758 	virtual FASTBOOL MovCreate(SdrDragStat& rStat); // sal_True=Xor muss repainted werden
759 	virtual FASTBOOL EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd);
760 	virtual FASTBOOL BckCreate(SdrDragStat& rStat);
761 	virtual void BrkCreate(SdrDragStat& rStat);
762 
763 	// damit holt man sich den Pointer, der das Createn dieses Objekts symbolisiert
764 	virtual Pointer GetCreatePointer() const;
765 
766 	// Polygon das waehrend des Erzeugens aufgezogen wird
767 	virtual basegfx::B2DPolyPolygon TakeCreatePoly(const SdrDragStat& rDrag) const;
768 
769 	// Die Methoden Move, Resize, Rotate, Mirror, Shear, SetSnapRect und
770 	// SetLogicRect rufen jeweils die entsprechenden Nbc-Methoden, versenden einen
771 	// Repaint-Broadcast und setzen den Modified-Status am Model. Abgeleitete
772 	// Objekte sollten i.d.R. nur die Nbc-Methoden ueberladen.
773 	// Nbc bedeutet: 'NoBroadcast'.
774 	virtual void NbcMove  (const Size& rSiz);
775 	virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact);
776 	virtual void NbcRotate(const Point& rRef, long nWink, double sn, double cs);
777 	virtual void NbcMirror(const Point& rRef1, const Point& rRef2);
778 	virtual void NbcShear (const Point& rRef, long nWink, double tn, FASTBOOL bVShear);
779 
780 	virtual void Move  (const Size& rSiz);
781 	virtual void Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact);
782 	virtual void Rotate(const Point& rRef, long nWink, double sn, double cs);
783 	virtual void Mirror(const Point& rRef1, const Point& rRef2);
784 	virtual void Shear (const Point& rRef, long nWink, double tn, FASTBOOL bVShear);
785 
786 	// Die relative Position eines Zeichenobjektes ist die Entfernung der
787 	// linken oberen Eche des logisch umschliessenden Rechtecks (SnapRect)
788 	// zum Anker.
789 	virtual void NbcSetRelativePos(const Point& rPnt);
790 	virtual void SetRelativePos(const Point& rPnt);
791 	virtual Point GetRelativePos() const;
ImpSetAnchorPos(const Point & rPnt)792 	void ImpSetAnchorPos(const Point& rPnt) { aAnchor=rPnt; }
793 	virtual void NbcSetAnchorPos(const Point& rPnt);
794 	virtual void SetAnchorPos(const Point& rPnt);
795 	virtual const Point& GetAnchorPos() const;
796 
797 	// Snap wird nicht auf dem BoundRect ausgefuehrt, sondern nach Moeglichkeit auf
798 	// logischen Koordinaten (also ohne Beruecksichtigung von Strichstaerke, ... ).
799 	// SetSnapRect() versucht das Objekt so hinzusizen, dass es in das uebergebene
800 	// Rect passt (ohne Strichstaerke, ...)
801 	virtual void RecalcSnapRect();
802 	virtual const Rectangle& GetSnapRect() const;
803 	virtual void SetSnapRect(const Rectangle& rRect);
804 	virtual void NbcSetSnapRect(const Rectangle& rRect);
805 
806 	// Logic Rect: Beim Rect z.B. ohne Beruecksichtigung des Drehwinkels, Shear, ...
807 	virtual const Rectangle& GetLogicRect() const;
808 	virtual void SetLogicRect(const Rectangle& rRect);
809 	virtual void NbcSetLogicRect(const Rectangle& rRect);
810 
811 	/** the defaul is to set the logic rect to the given rectangle rMaxRect. If the shape
812 		has an intrinsic aspect ratio it may set the logic rect so the aspect
813 		ratio is kept but still inside the rectangle rMaxRect.
814 
815 		If bShrinkOnly is set to true, the size of the current logic rect will not
816 		be changed if it is smaller than the given rectangle rMaxRect. */
817 	virtual void AdjustToMaxRect( const Rectangle& rMaxRect, bool bShrinkOnly = false );
818 
819 	// Drehwinkel und Shear
820 	virtual long GetRotateAngle() const;
821 	virtual long GetShearAngle(FASTBOOL bVertical=sal_False) const;
822 
823 	// Zum Fangen von/auf ausgezeichneten Punkten eines Obj (Polygonpunkte,
824 	// Kreismittelpunkt, ...)
825 	virtual sal_uInt32 GetSnapPointCount() const;
826 	virtual Point GetSnapPoint(sal_uInt32 i) const;
827 
828 	// Fuer Objekte, bei denen jeder einzelne Punkt verschoben werden kann,
829 	// z.B. Polygone, Polylines, Linien, ... . Bei diesen Objekten werden
830 	// Punkte selektiert (ggf. Mehrfachselektion), geloescht, eingefuegt,
831 	// als Mehrfachselektion verschoben und gedreht, ...
832 	// Nur solche Objekte koennen PlusHandles haben (z.B. die Gewichte an den
833 	// Bezierkurven.
834 	virtual sal_Bool IsPolyObj() const;
835 	virtual sal_uInt32 GetPointCount() const;
836 	virtual Point GetPoint(sal_uInt32 i) const;
837 	void SetPoint(const Point& rPnt, sal_uInt32 i);
838 	virtual void NbcSetPoint(const Point& rPnt, sal_uInt32 i);
839 
840 	// Alle geometrischen Daten holen fuer's Undo/Redo
841 	virtual SdrObjGeoData* GetGeoData() const;
842 	virtual void SetGeoData(const SdrObjGeoData& rGeo);
843 
844 	// ItemSet access
845 	const SfxItemSet& GetMergedItemSet() const;
846 	void SetMergedItem(const SfxPoolItem& rItem);
847 	void ClearMergedItem(const sal_uInt16 nWhich = 0);
848 	void SetMergedItemSet(const SfxItemSet& rSet, sal_Bool bClearAllItems = sal_False);
849 	const SfxPoolItem& GetMergedItem(const sal_uInt16 nWhich) const;
850 
851 	// internal versions
852 protected:
853 	const SfxItemSet& GetObjectItemSet() const;
854 	void SetObjectItem(const SfxPoolItem& rItem);
855 	void ClearObjectItem(const sal_uInt16 nWhich = 0);
856 	void SetObjectItemSet(const SfxItemSet& rSet);
857 	const SfxPoolItem& GetObjectItem(const sal_uInt16 nWhich) const;
858 
859     // get SfxMapUnit the object is using
860     SfxMapUnit GetObjectMapUnit() const;
861 
862 public:
863 	// syntactical sugar for ItemSet accesses
864 	void SetMergedItemSetAndBroadcast(const SfxItemSet& rSet, sal_Bool bClearAllItems = sal_False);
865 
866 	// NotPersistAttr fuer Layer, ObjName, geometrische Transformationen, ...
867 	void TakeNotPersistAttr(SfxItemSet& rAttr, FASTBOOL bMerge) const;
868 	void ApplyNotPersistAttr(const SfxItemSet& rAttr);
869 	void NbcApplyNotPersistAttr(const SfxItemSet& rAttr);
870 
871 	// bDontRemoveHardAttr=FALSE: alle in der Vorlage gesetzten Attribute werden am
872 	// Zeichenobjekt auf Default gesetzt; TRUE: alle harten Attribute bleiben erhalten.
873 	void SetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr);
874 	virtual void NbcSetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr);
875 	SfxStyleSheet* GetStyleSheet() const;
876 
877 	// TextEdit
878 	virtual FASTBOOL HasTextEdit() const;
879 
880 	// Return==TRUE: TextEditMode gestartet
881 	virtual sal_Bool BegTextEdit(SdrOutliner& rOutl);
882 	virtual void EndTextEdit(SdrOutliner& rOutl);
883 
884 	// Text wird im Format des Outliners gehalten
885 	// SetOutlinerParaObject: Eigentumsuebereignung von *pTextObject!
886 	virtual void SetOutlinerParaObject(OutlinerParaObject* pTextObject);
887 	virtual void NbcSetOutlinerParaObject(OutlinerParaObject* pTextObject);
888 	virtual OutlinerParaObject* GetOutlinerParaObject() const;
889 	virtual void NbcReformatText();
890 	virtual void ReformatText();
891 
892 	void BurnInStyleSheetAttributes();
893 
894 	// Macrofaehigkeit, z.B. ein Rechteck als PushButton.
895 	virtual FASTBOOL HasMacro() const;
896 	virtual SdrObject* CheckMacroHit (const SdrObjMacroHitRec& rRec) const;
897 	virtual Pointer GetMacroPointer (const SdrObjMacroHitRec& rRec) const;
898 	virtual void PaintMacro (OutputDevice& rOut, const Rectangle& rDirtyRect, const SdrObjMacroHitRec& rRec) const;
899 	virtual FASTBOOL DoMacro (const SdrObjMacroHitRec& rRec);
900 	virtual XubString GetMacroPopupComment(const SdrObjMacroHitRec& rRec) const;
IsMacroHit(const SdrObjMacroHitRec & rRec) const901 	sal_Bool IsMacroHit(const SdrObjMacroHitRec& rRec) const { return CheckMacroHit(rRec)!=NULL; }
902 
903 	// Konnektoren. (siehe auch Dokumentation in SvdoEdge.HXX, SdrEdgeObj
904 	//               sowie SvdGlue.HXX und SvdGlEV.HXX)
905 	// Es gibt Knoten und Kanten. Eine Kante kann theoretisch auch Knoten
906 	// sein, das ist jedoch in dieser Version noch nicht implementiert.
907 	// Ein Knoten hat eine Anzahl von Klebepunkten, wo Kanten angeklebt
908 	// werden koennen.
909 	// Eine Kante kann
910 	// - ohne Verbindungen sein
911 	// - an einem Ende auf der Wiese stehen und am anderen Ende an
912 	//   genau einem Knoten gebunden sein
913 	// - an beiden Enden mit jeweils genau einem Knoten verbunden sein.
914 	// Die Kante ist Listener bei seinen bis zu 2 Knoten.
915 	// Wird der Knoten verschoben oder Resized, folgen alle angebundenen
916 	// Kanten. Ebenso bei SetGluePoint()... am Knoten.
917 	// Beim Verschieben/Resizen der Kante wird dagegen die Verbindung
918 	// geloesst.
919 	// Objekt ist ein Knoten?
920 	virtual FASTBOOL IsNode() const;
921 
922 	// Automatische Klebepunkte:
923 	// je 4 Scheitelpunkt- und Eckpositionen muss ein Knotenobjekt liefern
924 	// i.d.R. 0=oben, 1=rechts, 2=unten, 3=links
925 	virtual SdrGluePoint GetVertexGluePoint(sal_uInt16 nNum) const;
926 
927 	// i.d.R. 0=linksoben, 1=rechtsoben, 2=rechtsunten, 3=linksunten
928 	virtual SdrGluePoint GetCornerGluePoint(sal_uInt16 nNum) const;
929 
930 	// Liste aller Klebepunkte. Kann NULL sein.
931 	virtual const SdrGluePointList* GetGluePointList() const;
932 	//virtual SdrGluePointList* GetGluePointList();
933 
934 	// Nach veraendern der GluePointList muss man am Obj SendRepaintBroadcast rufen!
935 	virtual SdrGluePointList* ForceGluePointList();
936 
937 	// Temporaer zu setzen fuer Transformationen am Bezugsobjekt
938 	void SetGlueReallyAbsolute(FASTBOOL bOn);
939 	void NbcRotateGluePoints(const Point& rRef, long nWink, double sn, double cs);
940 	void NbcMirrorGluePoints(const Point& rRef1, const Point& rRef2);
941 	void NbcShearGluePoints (const Point& rRef, long nWink, double tn, FASTBOOL bVShear);
942 
943 	// Objekt ist eine Kante?
944 	virtual FASTBOOL IsEdge() const;
945 
946 	// bTail1=TRUE: Linienanfang, sonst LinienEnde
947 	// pObj=NULL: Disconnect
948 	virtual void ConnectToNode(FASTBOOL bTail1, SdrObject* pObj);
949 	virtual void DisconnectFromNode(FASTBOOL bTail1);
950 	virtual SdrObject* GetConnectedNode(FASTBOOL bTail1) const;
951 
952     /** sets the writing mode of the object's context
953 
954         Objects which itself do not support different writing modes will ignore this call.
955 
956         Objects which support different writing modes, but have an own, explicit writing mode set,
957         will also ignore this call.
958 
959         Objects which support different writing modes, and whose own mode is set to css.text.WritingMode2.CONTEXT,
960         will use the given writing mode to calculate their "effective writing mode".
961 
962         The behaviour of this method is undefined if you pass css.text.WritingMode2.CONTEXT.
963 
964         @param _nContextWritingMode
965             the effective writing mode of the context of the object
966     */
967     virtual void    SetContextWritingMode( const sal_Int16 _nContextWritingMode );
968 
969 	// Wenn ein Objekt in der Lage ist, sich in ein Polygon oder in eine
970 	// Bezierkurve (oder beides) zu verwandeln, dann sollten die folgenden
971 	// Methoden ueberladen werden.
972 	// Z.B. Ein RectObj mit Strichstaerke 10, SOLID_PEN in Polygon wandeln:
973 	// Im Modus bLineToArea=sal_False soll ein PolyObj mit 4 Stuetzstellen,
974 	// Strichstaerke 10 und SOLiD_PEN erzeugt werden.
975 	// Im Modus bLineToArea=sal_True dagegen soll das generierte Obj immer ein
976 	// LinienAttribut NULL_PEN haben, und die Linie (auch Linienmuster) selbst
977 	// durch Polygonflaechen emuliert werden, die dadurch anschliessend vom
978 	// Anwender manipuliert werden koennen. Das RectObj kann sich somit also
979 	// nur korrekt konvertieren, wenn es als Flaechenattribut NULL_BRUSH
980 	// besitzt. Es muesste in diesem Fall dann:
981 	// - SOLID_BRUSH mit der Farbe des gesetzten Pen setzen
982 	// - NULL_PEN setzen
983 	// - PolyPolygon mit 2 Polygonen zu je 4 Stuetzstellen generieren.
984 	// Der Returnwert ist jeweils ein SdrObject*, da als Rueckgabe zur Not
985 	// auch Gruppenobjekte erlaubt sind (z.B. fuer SdrTextObj).
986 	// Bei der Konvertierung von TextObj nach PathObj wird es wohl so sein,
987 	// dass beide Modi (bLineToArea=sal_True/sal_False) identisch sind.
988 	// Defaulted sind diese Methoden auf "Ich kann das nicht" (FALSE/NULL).
989 	virtual SdrObject* DoConvertToPolyObj(sal_Bool bBezier, bool bAddText) const;
990 	SdrObject* ConvertToPolyObj(sal_Bool bBezier, sal_Bool bLineToArea) const;
991 
992 	// convert this path object to contour object; bForceLineDash converts even
993 	// when there is no filled new polygon created from line-to-polygon conversion,
994 	// specially used for XLINE_DASH and 3D conversion
995 	SdrObject* ConvertToContourObj(SdrObject* pRet, sal_Bool bForceLineDash = sal_False) const;
996 	SdrObject* ImpConvertToContourObj(SdrObject* pRet, sal_Bool bForceLineDash = sal_False) const;
997 
998 	// TRUE: Referenz auf ein Obj
IsVirtualObj() const999 	sal_Bool IsVirtualObj() const { return bVirtObj; }
1000 
1001 	// sal_True=Obj kann warsch. gefuellt werden; sal_False=Obj kann warsch. Linienenden haben.
1002 	// ungueltig, wenn es sich um ein GroupObj handelt.
IsClosedObj() const1003 	sal_Bool IsClosedObj() const { return bClosedObj; }
1004 
IsEdgeObj() const1005 	sal_Bool IsEdgeObj() const { return bIsEdge; }
Is3DObj() const1006 	sal_Bool Is3DObj() const { return bIs3DObj; }
IsUnoObj() const1007 	sal_Bool IsUnoObj() const { return bIsUnoObj; }
IsMasterCachable() const1008 	sal_Bool IsMasterCachable() const { return !bNotMasterCachable; }
ShareLock()1009 	sal_Bool ShareLock() { sal_Bool r=!bNetLock; bNetLock=sal_True; return r; }
ShareUnlock()1010 	void ShareUnlock() { bNetLock=sal_False; }
IsShareLock() const1011 	sal_Bool IsShareLock() const { return bNetLock; }
SetMarkProtect(sal_Bool bProt)1012 	void SetMarkProtect(sal_Bool bProt) { bMarkProt=bProt; }
IsMarkProtect() const1013 	sal_Bool IsMarkProtect() const { return bMarkProt; }
1014 	void SetInserted(sal_Bool bIns);
IsInserted() const1015 	sal_Bool IsInserted() const { return bInserted; }
SetGrouped(sal_Bool bGrp)1016 	void SetGrouped(sal_Bool bGrp) { bGrouped=bGrp; }
IsGrouped() const1017 	sal_Bool IsGrouped() const { return bGrouped; }
1018 	void SetMoveProtect(sal_Bool bProt);
IsMoveProtect() const1019 	sal_Bool IsMoveProtect() const { return bMovProt; }
1020 	void SetResizeProtect(sal_Bool bProt);
IsResizeProtect() const1021 	sal_Bool IsResizeProtect() const { return bSizProt; }
1022 	void SetPrintable(sal_Bool bPrn);
IsPrintable() const1023 	sal_Bool IsPrintable() const { return !bNoPrint; }
1024 	void SetVisible(sal_Bool bVisible);
IsVisible() const1025 	sal_Bool IsVisible() const { return mbVisible; }
SetEmptyPresObj(sal_Bool bEpt)1026 	void SetEmptyPresObj(sal_Bool bEpt) { bEmptyPresObj=bEpt; }
IsEmptyPresObj() const1027 	sal_Bool IsEmptyPresObj() const { return bEmptyPresObj; }
SetNotVisibleAsMaster(sal_Bool bFlg)1028 	void SetNotVisibleAsMaster(sal_Bool bFlg) { bNotVisibleAsMaster=bFlg; }
IsNotVisibleAsMaster() const1029 	sal_Bool IsNotVisibleAsMaster() const { return bNotVisibleAsMaster; }
1030 
1031 	// #i25616#
LineIsOutsideGeometry() const1032 	sal_Bool LineIsOutsideGeometry() const { return mbLineIsOutsideGeometry; }
1033 
1034 	// #i25616#
DoesSupportTextIndentingOnLineWidthChange() const1035 	sal_Bool DoesSupportTextIndentingOnLineWidthChange() const { return mbSupportTextIndentingOnLineWidthChange; }
1036 
1037 	// applikationsspeziefische Daten
1038 	sal_uInt16 GetUserDataCount() const;
1039 	SdrObjUserData* GetUserData(sal_uInt16 nNum) const;
1040 
1041 	// Insert uebernimmt den auf dem Heap angelegten Record in den Besitz
1042 	// des Zeichenobjekts
1043 	void InsertUserData(SdrObjUserData* pData, sal_uInt16 nPos=0xFFFF);
1044 
1045 	// Delete entfernt den Record aus der Liste und ruft
1046 	// ein delete (FreeMem+Dtor).
1047 	void DeleteUserData(sal_uInt16 nNum);
1048 
1049 	// ItemPool fuer dieses Objekt wechseln
1050 	void MigrateItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool, SdrModel* pNewModel = 0L);
1051 
1052 	////////////////////////////////////////////////////////////////////////////////////////////////////
1053 	// access to the UNO representation of the shape
1054 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > getUnoShape();
getWeakUnoShape() const1055 	::com::sun::star::uno::WeakReference< ::com::sun::star::uno::XInterface > getWeakUnoShape() const { return maWeakUnoShape; }
1056 
1057 	static SdrObject* getSdrObjectFromXShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xInt );
1058 
1059 	// helper struct for granting access exclusive to SvxShape
1060 	struct GrantXShapeAccess
1061 	{
1062 		friend class SvxShape;
1063 	private:
GrantXShapeAccessSdrObject::GrantXShapeAccess1064 		GrantXShapeAccess() { }
1065 	};
1066 
1067 	// setting the UNO representation is allowed for the UNO representation itself only!
setUnoShape(const::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> & _rxUnoShape,GrantXShapeAccess)1068 	void setUnoShape(
1069 		    const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxUnoShape,
1070 		    GrantXShapeAccess /*aGrant*/
1071 	    )
1072     {
1073         impl_setUnoShape( _rxUnoShape );
1074     }
1075 
1076     /** retrieves the instance responsible for notifying changes in the properties of the shape associated with
1077         the SdrObject
1078 
1079         @precond
1080             There already exists an SvxShape instance associated with the SdrObject
1081         @throws ::com::sun::star::uno::RuntimeException
1082             if there does nt yet exists an SvxShape instance associated with the SdrObject.
1083     */
1084     ::svx::PropertyChangeNotifier&
1085         getShapePropertyChangeNotifier();
1086 
1087     /** notifies a change in the given property, to all applicable listeners registered at the associated SvxShape
1088 
1089         This method is equivalent to calling getShapePropertyChangeNotifier().notifyPropertyChange( _eProperty ),
1090         exception that it is allowed to be called when there does not yet exist an associated SvxShape - in which
1091         case the method will silently return without doing anything.
1092     */
1093     void    notifyShapePropertyChange( const ::svx::ShapeProperty _eProperty ) const;
1094 
1095 	////////////////////////////////////////////////////////////////////////////////////////////////////
1096 	//
1097 	// transformation interface for StarOfficeAPI. This implements support for
1098 	// homogen 3x3 matrices containing the transformation of the SdrObject. At the
1099 	// moment it contains a shearX, rotation and translation, but for setting all linear
1100 	// transforms like Scale, ShearX, ShearY, Rotate and Translate are supported.
1101 	//
1102 	// gets base transformation and rectangle of object. If it's an SdrPathObj it fills the PolyPolygon
1103 	// with the base geometry and returns TRUE. Otherwise it returns FALSE.
1104 	virtual sal_Bool TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B2DPolyPolygon& rPolyPolygon) const;
1105 
1106 	// sets the base geometry of the object using infos contained in the homogen 3x3 matrix.
1107 	// If it's an SdrPathObj it will use the provided geometry information. The Polygon has
1108 	// to use (0,0) as upper left and will be scaled to the given size in the matrix.
1109 	virtual void TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, const basegfx::B2DPolyPolygon& rPolyPolygon);
1110 
1111 	sal_Bool IsTransparent( sal_Bool bCheckForAlphaChannel = sal_False ) const;
1112 
1113 	// #116168#
1114 	// Give info if object is in destruction
1115 	sal_Bool IsInDestruction() const;
1116 
1117 	// return if fill is != XFILL_NONE
1118 	bool HasFillStyle() const;
1119 	bool HasLineStyle() const;
1120 
1121 	// on import of OLE object from MS documents the BLIP size might be retrieved,
1122 	// the following methods are used to control it;
1123 	// usually this data makes no sence after the import is finished, since the object
1124 	// might be resized
1125 	Rectangle GetBLIPSizeRectangle() const;
1126 	void SetBLIPSizeRectangle( const Rectangle& aRect );
1127 
1128     // #121917#
1129     virtual bool HasText() const;
1130 
1131 protected:
1132     void    impl_setUnoShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxUnoShape );
1133 
1134 private:
1135 	/** only for internal use!
1136 	*/
1137 	SvxShape* getSvxShape();
1138 
1139 	/** do not use directly, always use getSvxShape() if you have to! */
1140 	SvxShape*   mpSvxShape;
1141 	::com::sun::star::uno::WeakReference< ::com::sun::star::uno::XInterface >
1142                 maWeakUnoShape;
1143 };
1144 
1145 //************************************************************
1146 //   SdrDummyObj
1147 //
1148 // Wer sich eigene Objekte schafft muss einen Link in der Klasse
1149 // SdrObjFactory setzen. Der Handler hat folgendes aussehen:
1150 //    void Hdl(SdrObjFactory*)
1151 // Er muss sich aus der uebergebenen Instanz die Werte nInventor und
1152 // nIdentifier ansehen und entsprechend mit new eine Zeichenobjektinstanz
1153 // erzeugen. Einen Zeiger auf diese Instanz hat er in der Membervariablen
1154 // pNewObj zu hinterlassen.
1155 //
1156 //************************************************************
1157 
1158 class SVX_DLLPUBLIC SdrObjFactory
1159 {
1160 public:
1161 	sal_uInt32						nInventor;
1162 	sal_uInt16						nIdentifier;
1163 
1164 	// fuer MakeNewObj():
1165 	SdrPage*					pPage;
1166 	SdrModel*					pModel;
1167 	SdrObject*					pNewObj;
1168 
1169 	// fuer MakeNewObjUserData():
1170 	SdrObject*					pObj;
1171 	SdrObjUserData*				pNewData;
1172 
1173 private:
1174 	SVX_DLLPRIVATE SdrObjFactory(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pNewPage, SdrModel* pNewModel);
1175 	SVX_DLLPRIVATE SdrObjFactory(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrObject* pObj1);
1176 
1177 public:
1178 	static SdrObject* MakeNewObject(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pPage, SdrModel* pModel=NULL);
1179 	static void InsertMakeObjectHdl(const Link& rLink);
1180 	static void RemoveMakeObjectHdl(const Link& rLink);
1181 	static SdrObjUserData* MakeNewObjUserData(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrObject* pObj);
1182 	static void InsertMakeUserDataHdl(const Link& rLink);
1183 	static void RemoveMakeUserDataHdl(const Link& rLink);
1184 };
1185 
1186 typedef tools::WeakReference< SdrObject > SdrObjectWeakRef;
1187 
1188 #endif //_SVDOBJ_HXX
1189 
1190