xref: /trunk/main/svx/inc/svx/svdobj.hxx (revision b117abe8)
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> // for SdrLayerID
35 #include <svx/svdglue.hxx> // gluepoints
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); // not implemented
214 	SVX_DLLPRIVATE sal_Bool operator==(const SdrObjUserData& rData) const; // not implemented
215 	SVX_DLLPRIVATE sal_Bool operator!=(const SdrObjUserData& rData) const; // not implemented
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 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; // applikationsspezifische 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 does 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 // Abstraktes DrawObject
399 //
400 ////////////////////////////////////////////////////////////////////////////////////////////////////
401 
402 class SvxShape;
403 class SVX_DLLPUBLIC SdrObject: public SfxListener, public tools::WeakBase< SdrObject >
404 {
405 private:
406 	// ObjectUser section
407 	sdr::ObjectUserVector											maObjectUsers;
408 
409 public:
410 	void AddObjectUser(sdr::ObjectUser& rNewUser);
411 	void RemoveObjectUser(sdr::ObjectUser& rOldUser);
412 
413 	// BaseProperties section
414 private:
415 	sdr::properties::BaseProperties*								mpProperties;
416 protected:
417 	virtual sdr::properties::BaseProperties* CreateObjectSpecificProperties();
418 public:
419 	virtual sdr::properties::BaseProperties& GetProperties() const;
420 
421 	///////////////////////////////////////////////////////////////////////////////
422 	// #110094# DrawContact section
423 private:
424 	sdr::contact::ViewContact*										mpViewContact;
425 protected:
426 	virtual sdr::contact::ViewContact* CreateObjectSpecificViewContact();
427 public:
428 	sdr::contact::ViewContact& GetViewContact() const;
429 
430 	// DrawContact support: Methods for handling Object changes
431 	void ActionChanged() const;
432 
433 private:
434 	friend class				SdrObjListIter;
435 	friend class				SdrVirtObj;
436 	friend class				SdrRectObj;
437 
438 protected:
439 	Rectangle					aOutRect;     // umschliessendes Rechteck fuer Paint (inkl. LineWdt, ...)
440 	Point						aAnchor;      // Ankerposition (Writer)
441 	SdrObjList*					pObjList;     // Liste, in dem das Obj eingefuegt ist.
442 	SdrPage*					pPage;
443 	SdrModel*					pModel;
444 	SdrObjUserCall*				pUserCall;
445 	SdrObjPlusData*				pPlusData;    // Broadcaster, UserData, Konnektoren, ... (Das ist der Bitsack)
446 
447 	sal_uInt32					nOrdNum;      // Rangnummer des Obj in der Liste
448 
449 	/** Position in the navigation order.  SAL_MAX_UINT32 when not used.
450 	*/
451 	sal_uInt32					mnNavigationPosition;
452 	SdrLayerID					mnLayerID;
453 
454 	// Objekt zeigt nur auf ein Anderes
455 	unsigned					bVirtObj : 1;
456 	unsigned					bSnapRectDirty : 1;
457 	unsigned					bNetLock : 1;   // ni
458 	unsigned					bInserted : 1;  // nur wenn sal_True gibt es RepaintBroadcast & SetModify
459 	unsigned					bGrouped : 1;   // Member eines GroupObjektes?
460 
461 	// Die folgende Flags werden gestreamt
462 	unsigned					bMovProt : 1; // If true, the position is protected
463 	unsigned					bSizProt : 1; // If true, the size is protected
464 	unsigned					bNoPrint : 1; // If true, the object is not printed.
465 	unsigned					mbVisible : 1; // If false, the object is not visible on screen (but maybe on printer, depending on bNoprint
466 	// Wenn bEmptyPresObj sal_True ist, handelt es sich um ein
467 	// Praesentationsobjekt, dem noch kein Inhalt zugewiesen
468 	// wurde. Default ist das Flag auf FALSE. Die Verwaltung
469 	// uebernimmt die Applikation. Im Zuweisungsoperator sowie
470 	// beim Clone wird das Flag nicht mitkopiert!
471 	// Das Flag ist persistent.
472 	unsigned					bEmptyPresObj : 1; // Leeres Praesentationsobjekt (Draw)
473 
474 	// sal_True=Objekt ist als Objekt der MasterPage nicht sichtbar
475 	unsigned					bNotVisibleAsMaster : 1;
476 
477 	// sal_True=Es handelt sich hierbei um ein geschlossenes Objekt, also nicht Linie oder Kreisbogen ...
478 	unsigned					bClosedObj : 1;
479 
480 	unsigned					bIsEdge : 1;
481 	unsigned					bIs3DObj : 1;
482 	unsigned					bMarkProt : 1; // Markieren verboten. Persistent
483 	unsigned					bIsUnoObj : 1;
484 	unsigned					bNotMasterCachable : 1;
485 
486 	// #i25616#
487 	unsigned					mbLineIsOutsideGeometry : 1;
488 
489 	// #i25616#
490 	unsigned					mbSupportTextIndentingOnLineWidthChange : 1;
491 
492 	// on import of OLE object from MS documents the BLIP size might be retrieved,
493 	// in this case the following member is initialized as nonempty rectangle
494 	Rectangle					maBLIPSizeRectangle;
495 
496 	// global static ItemPool for not-yet-inserted items
497 private:
498 	static SdrItemPool*			mpGlobalItemPool;
499 public:
500 	static SdrItemPool& GetGlobalDrawObjectItemPool();
501 private:
502 	SVX_DLLPRIVATE static void FreeGlobalDrawObjectItemPool();
503 
504 protected:
505 	void ImpDeleteUserData();
506 	SdrObjUserData* ImpGetMacroUserData() const;
507 	Rectangle ImpDragCalcRect(const SdrDragStat& rDrag) const;
508 
509 	// Fuer GetDragComment
510 	void ImpTakeDescriptionStr(sal_uInt16 nStrCacheID, String& rStr, sal_uInt16 nVal=0) const;
511 
ImpForcePlusData()512 	void ImpForcePlusData() { if (pPlusData==NULL) pPlusData=NewPlusData(); }
513 
514 	String GetWinkStr(long nWink, FASTBOOL bNoDegChar=sal_False) const;
515 	String GetMetrStr(long nVal, MapUnit eWantMap=MAP_MM, FASTBOOL bNoUnitChars=sal_False) const;
516 
517 	// bNotMyself=sal_True bedeutet: Nur die ObjList auf Dirty setzen, nicht mich.
518 	// Wird z.B. benoetigt fuer NbcMove, denn da moved man SnapRect und aOutRect
519 	// i.d.R. gleich mit um die Neuberechnung zu sparen.
520 public:
521 	virtual void SetRectsDirty(sal_Bool bNotMyself = sal_False);
522 protected:
523 
524 	// ueberladen, wenn man sich von SdrObjPlusData abgeleitet hat:
525 	virtual SdrObjPlusData* NewPlusData() const;
526 
527 protected:
528 	// Diese 3 Methoden muss ein abgeleitetes Objekt ueberladen, wenn es eigene
529 	// geometrische Daten besitzt, die fuer den Undo-Fall gesichert werden
530 	// sollen. NewGeoData() erzeugt lediglich eine leere Instanz auf eine von
531 	// SdrObjGeoData abgeleitete Klasse.
532 	virtual SdrObjGeoData* NewGeoData() const;
533 	virtual void SaveGeoData(SdrObjGeoData& rGeo) const;
534 	virtual void RestGeoData(const SdrObjGeoData& rGeo);
535 
536 protected:
537 	virtual ~SdrObject();
538 
539 public:
540 	TYPEINFO();
541 	SdrObject();
542 
543     /** frees the SdrObject pointed to by the argument
544 
545         In case the object has an SvxShape, which has the ownership of the object, it
546         is actually *not* deleted.
547     */
548     static  void    Free( SdrObject*& _rpObject );
549 
550 	// This method is only for access from Property objects
551 	virtual void SetBoundRectDirty();
552 
553 	virtual void SetObjList(SdrObjList* pNewObjList);
GetObjList() const554 	SdrObjList* GetObjList() const { return pObjList; }
555 
556 	virtual void SetPage(SdrPage* pNewPage);
GetPage() const557 	SdrPage* GetPage() const { return pPage; }
558 
559 	virtual void SetModel(SdrModel* pNewModel);
GetModel() const560 	SdrModel* GetModel() const { return pModel; }
561 	SdrItemPool* GetObjectItemPool() const;
562 
563 	void AddListener(SfxListener& rListener);
564 	void RemoveListener(SfxListener& rListener);
GetBroadcaster() const565 	const SfxBroadcaster* GetBroadcaster() const { return pPlusData!=NULL ? pPlusData->pBroadcast : NULL; }
566 
567 	virtual void AddReference(SdrVirtObj& rVrtObj);
568 	virtual void DelReference(SdrVirtObj& rVrtObj);
569 	virtual sal_uInt32 GetObjInventor() const;
570 	virtual sal_uInt16 GetObjIdentifier() const;
571 	virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const;
572 
573 	// Layer interface
574 	virtual SdrLayerID GetLayer() const;
575 	virtual void NbcSetLayer(SdrLayerID nLayer);
576 	virtual void SetLayer(SdrLayerID nLayer);
577 	// renaming GetLayerSet -> getMergedHierarchyLayerSet to make clear what happens here. rSet needs to be empty.
578 	virtual void getMergedHierarchyLayerSet(SetOfByte& rSet) const;
579 
580 	// UserCall interface
SetUserCall(SdrObjUserCall * pUser)581 	void SetUserCall(SdrObjUserCall* pUser) { pUserCall=pUser; }
GetUserCall() const582 	SdrObjUserCall* GetUserCall() const { return pUserCall; }
583 	void SendUserCall(SdrUserCallType eUserCall, const Rectangle& rBoundRect) const;
584 
585 	// Ein solcher Referenzpunkt ist z.B. der Punkt eines Symbols, der
586 	// der beim Einfuegen des Symbols auf das Raster gefangen werden soll
587 	// oder der Fixpunkt eines Bildes innerhalb eines Animationsobjektes.
588 	virtual FASTBOOL HasRefPoint() const;
589 	virtual Point GetRefPoint() const;
590 	virtual void SetRefPoint(const Point& rPnt);
591 
592 	// #i68101#
593 	// An object may have a user-set Name (Get/SetName()), e.g SdrGrafObj, SdrObjGroup
594 	// or SdrOle2Obj.
595 	// It may also have a Title and a Description for accessibility purposes.
596 	void SetName(const String& rStr);
597 	String GetName() const;
598 	void SetTitle(const String& rStr);
599 	String GetTitle() const;
600 	void SetDescription(const String& rStr);
601 	String GetDescription() const;
602 
603 	// support for HTMLName
604 	void SetHTMLName(const String& rStr);
605 	String GetHTMLName() const;
606 
607 	// Fuer Gruppenobjekte
IsGroupObject() const608 	sal_Bool IsGroupObject() const { return GetSubList()!=NULL; }
609 	virtual SdrObjList* GetSubList() const;
610 	SdrObject* GetUpGroup() const;
611 
612 	// Ueber die Objekt-Ordnungsnummer kann man feststellen, ob ein Objekt vor
613 	// oder hinter einem anderen liegt. Objekte mit kleinen Ordnungsnummern werden
614 	// zuerst gezeichnet, Objekte mit grossen Ordnungsnummern zuletzt.
615 	// Wird die Reihenfolge der Objekte in der Liste veraendert, so wird ein
616 	// Dirty-Flag gesetzt (an der Page). Beim naechsten SdrObject::GetOrdNum()
617 	// werden die Ordnungsnummer aller Objekte der Liste neu bestimmt.
618 	sal_uInt32 GetOrdNum() const;
619 
620 	// Diese Methode sollte nur verwendet werden, wenn man ganz genau weiss,
621 	// was man macht:
GetOrdNumDirect() const622 	sal_uInt32 GetOrdNumDirect() const { return nOrdNum; }
623 
624 	// Das Setzen der Ordnungsnummer sollte nur vom Model bzw. von der Page
625 	// geschehen.
SetOrdNum(sal_uInt32 nNum)626 	void SetOrdNum(sal_uInt32 nNum) { nOrdNum=nNum; }
627 
628     /** Return the position in the navigation order for the called object.
629         Note that this method may update the navigation position of the
630         called and of other SdrObjects. Therefore this method can not be
631         const.
632         @return
633             If no navigation position has been explicitly defined then the
634             result of GetOrdNum() is returned.
635     */
636 	sal_uInt32 GetNavigationPosition (void);
637 
638     /** Set the position in the navigation position to the given value.
639         This method is typically used only by the model after a change to
640         the navigation order.
641         This method does not change the navigation position of other
642         objects.
643         Use SdrObjList::SetObjectNavigationPosition() instead.
644     */
645 	void SetNavigationPosition (const sal_uInt32 nPosition);
646 
GetAutoTimer() const647 	const AutoTimer* GetAutoTimer() const { return pPlusData!=NULL ? pPlusData->pAutoTimer : NULL; }
GetAutoTimer()648 	AutoTimer* GetAutoTimer() { return pPlusData!=NULL ? pPlusData->pAutoTimer : NULL; }
649 	AutoTimer* ForceAutoTimer();
650 
651 	// #111111#
652 	// To make clearer that this method may trigger RecalcBoundRect and thus may be
653 	// expensive and sometimes problematic (inside a bigger object change You will get
654 	// non-useful BoundRects sometimes) i rename that method from GetBoundRect() to
655 	// GetCurrentBoundRect().
656 	virtual const Rectangle& GetCurrentBoundRect() const;
657 
658 	// #111111#
659 	// To have a possibility to get the last calculated BoundRect e.g for producing
660 	// the first rectangle for repaints (old and new need to be used) without forcing
661 	// a RecalcBoundRect (which may be problematical and expensive sometimes) i add here
662 	// a new method for accessing the last BoundRect.
663 	virtual const Rectangle& GetLastBoundRect() const;
664 
665 	virtual void RecalcBoundRect();
666 
667 	void BroadcastObjectChange() const;
668 
669 	// Modified-Flag am Model setzen
670 	virtual void SetChanged();
671 
672 	// Tooling for painting a single object to a OutputDevice. This will be needed as long
673 	// as not all painting is changed to use DrawContact objects.
674 	sal_Bool SingleObjectPainter(OutputDevice& rOut) const;
675 	sal_Bool LineGeometryUsageIsNecessary() const;
676 
677 	// Clone() soll eine komplette Kopie des Objektes erzeugen.
678 	virtual SdrObject* Clone() const;
679 	virtual void operator=(const SdrObject& rObj);
680 
681 	// TakeObjName...() ist fuer die Anzeige in der UI, z.B. "3 Rahmen selektiert".
682 	virtual void TakeObjNameSingul(String& rName) const;
683 	virtual void TakeObjNamePlural(String& rName) const;
684 
685 	// Das Xor-Polygon wird von der View zu Draggen des Objektes benoetigt.
686 	// Alle Polygone innerhalb des PolyPolygon werden als PolyLine interpretiert.
687 	// Moechte man ein geschlossenes Polygon, so muss man es explizit schliessen.
688 	virtual basegfx::B2DPolyPolygon TakeXorPoly() const;
689 
690 	// Die Kontur fuer TextToContour
691 	virtual basegfx::B2DPolyPolygon TakeContour() const;
692 
693 	// Ueber GetHdlCount gibt ein Objekt die Anzahl seiner Handles preis.
694 	// Im Normalfall werden dies 8 sein, bei einer Strecke 2. Bei Polygonobjekten
695 	// (Polygon, Spline, Bezier) kann die Handleanzahl wesentlich groesser werden.
696 	// Polygonobjekten wird ausserdem die Moeglichkeit eingeraeumt einen Punkt
697 	// eines selektierten Objekts zu selektieren. Das Handle dieses Punktes wird
698 	// dann durch einen Satz neuer Handles ausgetauscht (PlusHdl). Bei einem
699 	// Polygon wird das wohl ein einfacher Selektionshandle sein, bei einer
700 	// Bezierkurve dagegen koennen das schon bis zu 3 Handles werden (inkl Gewichte).
701 	// GetHdl() und GetPlusHdl() muessen Handleinstanzen mit new erzeugen!
702 	// Ein Objekt, das bei HasSpacialDrag() sal_True liefert muss diese Methoden
703 	// zur Verfuegung stellen (inkl. FillHdlList).
704 	virtual sal_uInt32 GetHdlCount() const;
705 	virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const;
706 	virtual sal_uInt32 GetPlusHdlCount(const SdrHdl& rHdl) const;
707 	virtual SdrHdl* GetPlusHdl(const SdrHdl& rHdl, sal_uInt32 nPlNum) const;
708 	virtual void AddToHdlList(SdrHdlList& rHdlList) const;
709 
710 	// Die Standardtransformationen (Move,Resize,Rotate,Mirror,Shear) werden von der
711 	// View uebernommen (TakeXorPoly(),...).
712 	// Objektspezifisches draggen wie z.B. Eckenradius bei Rechtecken,
713 	// Stuetzstellen bei Splines, Gewichte bei Bezierkurven und Pointer von
714 	// Labelobjekten muss vom Objekt selbst gehandled werden. Um das Model
715 	// Statusfrei zu halten werden die Statusdaten an der View gehalten und dem
716 	// Objekt dann uebergeben. EndDrag liefert im Normalfall sal_True fuer Erfolg.
717 	// sal_False kann zurueckgegeben werden, wenn das Dragging das Objekt nicht
718 	// veraendert hat, wobei die evtl. Tatsache, dass die Maus nicht bewegt wurde
719 	// bereits von der View abgefangen wird.
720 	virtual bool hasSpecialDrag() const;
721 	virtual bool beginSpecialDrag(SdrDragStat& rDrag) const;
722 	virtual bool applySpecialDrag(SdrDragStat& rDrag);
723 	virtual String getSpecialDragComment(const SdrDragStat& rDrag) const;
724 	virtual basegfx::B2DPolyPolygon getSpecialDragPoly(const SdrDragStat& rDrag) const;
725 
726     // FullDrag support. This is for standard interactions and for SdrObjOwn
727     // support. If supportsFullDrag() returns true, getFullDragClone has to
728     // return a cloned SdrObject (who's ownership it loses) at which modifications
729     // like Move(), Scale(), etc or applySpecialDrag() will be executed. That
730     // object will be visualized on overlay for full drag, but should not be
731     // part of the model, thus not changing anything since it's only a temporary
732     // helper object for interaction
733 	virtual bool supportsFullDrag() const;
734 	virtual SdrObject* getFullDragClone() const;
735 
736     // Jedes Objekt muss in der Lage sein sich selbst interaktiv zu erzeugen.
737 	// Beim MausDown wird zunaechst ein neues Objekt erzeugt und dann seine
738 	// BegCreate()-Methode gerufen. Bei jedem MausMode wird dann MovCreate
739 	// gerufen. BrkCreate() bedeutet, dass der User die interaktive Objekt-
740 	// erzeugung abgebrochen hat. EndCreate() wird gerufen beim MouseUp-Event.
741 	// Liefert EndCreate() ein sal_True, so ist die Objekterzeugung abgeschlossen;
742 	// das Objekt wird in die entsprechende Liste eingefuegt. Andernfalls
743 	// (EndCreate()==sal_False) gehe ich davon aus, dass weitere Punkte zur
744 	// Objekterzeugung notwendig sind (Polygon,...). Der Parameter eCmd
745 	// enthaelt die Anzahl der Mausklicks (so die App diese durchreicht).
746 	// BckCreate() -> Letztes EndCreate() rueckgaengig machen (z.B. letzten
747 	// Polygonpunkt wieder loeschen).
748 	// ReturnCode: sal_True=Weiter geht's, sal_False=Create dadurch abgebrochen.
749 	virtual FASTBOOL BegCreate(SdrDragStat& rStat);
750 	virtual FASTBOOL MovCreate(SdrDragStat& rStat); // sal_True=Xor muss repainted werden
751 	virtual FASTBOOL EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd);
752 	virtual FASTBOOL BckCreate(SdrDragStat& rStat);
753 	virtual void BrkCreate(SdrDragStat& rStat);
754 
755 	// damit holt man sich den Pointer, der das Createn dieses Objekts symbolisiert
756 	virtual Pointer GetCreatePointer() const;
757 
758 	// Polygon das waehrend des Erzeugens aufgezogen wird
759 	virtual basegfx::B2DPolyPolygon TakeCreatePoly(const SdrDragStat& rDrag) const;
760 
761 	// Die Methoden Move, Resize, Rotate, Mirror, Shear, SetSnapRect und
762 	// SetLogicRect rufen jeweils die entsprechenden Nbc-Methoden, versenden einen
763 	// Repaint-Broadcast und setzen den Modified-Status am Model. Abgeleitete
764 	// Objekte sollten i.d.R. nur die Nbc-Methoden ueberladen.
765 	// Nbc bedeutet: 'NoBroadcast'.
766 	virtual void NbcMove  (const Size& rSiz);
767 	virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact);
768 	virtual void NbcRotate(const Point& rRef, long nWink, double sn, double cs);
769 	virtual void NbcMirror(const Point& rRef1, const Point& rRef2);
770 	virtual void NbcShear (const Point& rRef, long nWink, double tn, FASTBOOL bVShear);
771 
772 	virtual void Move  (const Size& rSiz);
773 	virtual void Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact);
774 	virtual void Rotate(const Point& rRef, long nWink, double sn, double cs);
775 	virtual void Mirror(const Point& rRef1, const Point& rRef2);
776 	virtual void Shear (const Point& rRef, long nWink, double tn, FASTBOOL bVShear);
777 
778 	// Die relative Position eines Zeichenobjektes ist die Entfernung der
779 	// linken oberen Ecke des logisch umschliessenden Rechtecks (SnapRect)
780 	// zum Anker.
781 	virtual void NbcSetRelativePos(const Point& rPnt);
782 	virtual void SetRelativePos(const Point& rPnt);
783 	virtual Point GetRelativePos() const;
ImpSetAnchorPos(const Point & rPnt)784 	void ImpSetAnchorPos(const Point& rPnt) { aAnchor=rPnt; }
785 	virtual void NbcSetAnchorPos(const Point& rPnt);
786 	virtual void SetAnchorPos(const Point& rPnt);
787 	virtual const Point& GetAnchorPos() const;
788 
789 	// Snap wird nicht auf dem BoundRect ausgefuehrt, sondern nach Moeglichkeit auf
790 	// logischen Koordinaten (also ohne Beruecksichtigung von Strichstaerke, ... ).
791 	// SetSnapRect() versucht das Objekt so hinzusizen, dass es in das uebergebene
792 	// Rect passt (ohne Strichstaerke, ...)
793 	virtual void RecalcSnapRect();
794 	virtual const Rectangle& GetSnapRect() const;
795 	virtual void SetSnapRect(const Rectangle& rRect);
796 	virtual void NbcSetSnapRect(const Rectangle& rRect);
797 
798 	// Logic Rect: Beim Rect z.B. ohne Beruecksichtigung des Drehwinkels, Shear, ...
799 	virtual const Rectangle& GetLogicRect() const;
800 	virtual void SetLogicRect(const Rectangle& rRect);
801 	virtual void NbcSetLogicRect(const Rectangle& rRect);
802 
803 	/** the default is to set the logic rect to the given rectangle rMaxRect. If the shape
804 		has an intrinsic aspect ratio it may set the logic rect so the aspect
805 		ratio is kept but still inside the rectangle rMaxRect.
806 
807 		If bShrinkOnly is set to true, the size of the current logic rect will not
808 		be changed if it is smaller than the given rectangle rMaxRect. */
809 	virtual void AdjustToMaxRect( const Rectangle& rMaxRect, bool bShrinkOnly = false );
810 
811 	// Drehwinkel und Shear
812 	virtual long GetRotateAngle() const;
813 	virtual long GetShearAngle(FASTBOOL bVertical=sal_False) const;
814 
815 	// Zum Fangen von/auf ausgezeichneten Punkten eines Obj (Polygonpunkte,
816 	// Kreismittelpunkt, ...)
817 	virtual sal_uInt32 GetSnapPointCount() const;
818 	virtual Point GetSnapPoint(sal_uInt32 i) const;
819 
820 	// Fuer Objekte, bei denen jeder einzelne Punkt verschoben werden kann,
821 	// z.B. Polygone, Polylines, Linien, ... . Bei diesen Objekten werden
822 	// Punkte selektiert (ggf. Mehrfachselektion), geloescht, eingefuegt,
823 	// als Mehrfachselektion verschoben und gedreht, ...
824 	// Nur solche Objekte koennen PlusHandles haben (z.B. die Gewichte an den
825 	// Bezierkurven.
826 	virtual sal_Bool IsPolyObj() const;
827 	virtual sal_uInt32 GetPointCount() const;
828 	virtual Point GetPoint(sal_uInt32 i) const;
829 	void SetPoint(const Point& rPnt, sal_uInt32 i);
830 	virtual void NbcSetPoint(const Point& rPnt, sal_uInt32 i);
831 
832 	// Alle geometrischen Daten holen fuer's Undo/Redo
833 	virtual SdrObjGeoData* GetGeoData() const;
834 	virtual void SetGeoData(const SdrObjGeoData& rGeo);
835 
836 	// ItemSet access
837 	const SfxItemSet& GetMergedItemSet() const;
838 	void SetMergedItem(const SfxPoolItem& rItem);
839 	void ClearMergedItem(const sal_uInt16 nWhich = 0);
840 	void SetMergedItemSet(const SfxItemSet& rSet, sal_Bool bClearAllItems = sal_False);
841 	const SfxPoolItem& GetMergedItem(const sal_uInt16 nWhich) const;
842 
843 	// internal versions
844 protected:
845 	const SfxItemSet& GetObjectItemSet() const;
846 	void SetObjectItem(const SfxPoolItem& rItem);
847 	void ClearObjectItem(const sal_uInt16 nWhich = 0);
848 	void SetObjectItemSet(const SfxItemSet& rSet);
849 	const SfxPoolItem& GetObjectItem(const sal_uInt16 nWhich) const;
850 
851 	// get SfxMapUnit the object is using
852 	SfxMapUnit GetObjectMapUnit() const;
853 
854 public:
855 	// syntactical sugar for ItemSet accesses
856 	void SetMergedItemSetAndBroadcast(const SfxItemSet& rSet, sal_Bool bClearAllItems = sal_False);
857 
858 	// NotPersistAttr fuer Layer, ObjName, geometrische Transformationen, ...
859 	void TakeNotPersistAttr(SfxItemSet& rAttr, FASTBOOL bMerge) const;
860 	void ApplyNotPersistAttr(const SfxItemSet& rAttr);
861 	void NbcApplyNotPersistAttr(const SfxItemSet& rAttr);
862 
863 	// bDontRemoveHardAttr=FALSE: alle in der Vorlage gesetzten Attribute werden am
864 	// Zeichenobjekt auf Default gesetzt; TRUE: alle harten Attribute bleiben erhalten.
865 	void SetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr);
866 	virtual void NbcSetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr);
867 	SfxStyleSheet* GetStyleSheet() const;
868 
869 	// TextEdit
870 	virtual FASTBOOL HasTextEdit() const;
871 
872 	// Return==TRUE: TextEditMode gestartet
873 	virtual sal_Bool BegTextEdit(SdrOutliner& rOutl);
874 	virtual void EndTextEdit(SdrOutliner& rOutl);
875 
876 	// Text wird im Format des Outliners gehalten
877 	// SetOutlinerParaObject: Eigentumsuebereignung von *pTextObject!
878 	virtual void SetOutlinerParaObject(OutlinerParaObject* pTextObject);
879 	virtual void NbcSetOutlinerParaObject(OutlinerParaObject* pTextObject);
880 	virtual OutlinerParaObject* GetOutlinerParaObject() const;
881 	virtual void NbcReformatText();
882 	virtual void ReformatText();
883 
884 	void BurnInStyleSheetAttributes();
885 
886 	// Macrofaehigkeit, z.B. ein Rechteck als PushButton.
887 	virtual FASTBOOL HasMacro() const;
888 	virtual SdrObject* CheckMacroHit (const SdrObjMacroHitRec& rRec) const;
889 	virtual Pointer GetMacroPointer (const SdrObjMacroHitRec& rRec) const;
890 	virtual void PaintMacro (OutputDevice& rOut, const Rectangle& rDirtyRect, const SdrObjMacroHitRec& rRec) const;
891 	virtual FASTBOOL DoMacro (const SdrObjMacroHitRec& rRec);
892 	virtual XubString GetMacroPopupComment(const SdrObjMacroHitRec& rRec) const;
IsMacroHit(const SdrObjMacroHitRec & rRec) const893 	sal_Bool IsMacroHit(const SdrObjMacroHitRec& rRec) const { return CheckMacroHit(rRec)!=NULL; }
894 
895 	// Konnektoren. (siehe auch Dokumentation in SvdoEdge.HXX, SdrEdgeObj
896 	//               sowie SvdGlue.HXX und SvdGlEV.HXX)
897 	// Es gibt Knoten und Kanten. Eine Kante kann theoretisch auch Knoten
898 	// sein, das ist jedoch in dieser Version noch nicht implementiert.
899 	// Ein Knoten hat eine Anzahl von Klebepunkten, wo Kanten angeklebt
900 	// werden koennen.
901 	// Eine Kante kann
902 	// - ohne Verbindungen sein
903 	// - an einem Ende auf der Wiese stehen und am anderen Ende an
904 	//   genau einem Knoten gebunden sein
905 	// - an beiden Enden mit jeweils genau einem Knoten verbunden sein.
906 	// Die Kante ist Listener bei seinen bis zu 2 Knoten.
907 	// Wird der Knoten verschoben oder Resized, folgen alle angebundenen
908 	// Kanten. Ebenso bei SetGluePoint()... am Knoten.
909 	// Beim Verschieben/Resizen der Kante wird dagegen die Verbindung
910 	// geloesst.
911 	// Objekt ist ein Knoten?
912 	virtual FASTBOOL IsNode() const;
913 
914 	// Automatische Klebepunkte:
915 	// je 4 Scheitelpunkt- und Eckpositionen muss ein Knotenobjekt liefern
916 	// i.d.R. 0=oben, 1=rechts, 2=unten, 3=links
917 	virtual SdrGluePoint GetVertexGluePoint(sal_uInt16 nNum) const;
918 
919 	// i.d.R. 0=linksoben, 1=rechtsoben, 2=rechtsunten, 3=linksunten
920 	virtual SdrGluePoint GetCornerGluePoint(sal_uInt16 nNum) const;
921 
922 	// Liste aller Klebepunkte. Kann NULL sein.
923 	virtual const SdrGluePointList* GetGluePointList() const;
924 	//virtual SdrGluePointList* GetGluePointList();
925 
926 	// Nach veraendern der GluePointList muss man am Obj SendRepaintBroadcast rufen!
927 	virtual SdrGluePointList* ForceGluePointList();
928 
929 	// Temporaer zu setzen fuer Transformationen am Bezugsobjekt
930 	void SetGlueReallyAbsolute(FASTBOOL bOn);
931 	void NbcRotateGluePoints(const Point& rRef, long nWink, double sn, double cs);
932 	void NbcMirrorGluePoints(const Point& rRef1, const Point& rRef2);
933 	void NbcShearGluePoints (const Point& rRef, long nWink, double tn, FASTBOOL bVShear);
934 
935 	// Objekt ist eine Kante?
936 	virtual FASTBOOL IsEdge() const;
937 
938 	// bTail1=TRUE: Linienanfang, sonst LinienEnde
939 	// pObj=NULL: Disconnect
940 	virtual void ConnectToNode(FASTBOOL bTail1, SdrObject* pObj);
941 	virtual void DisconnectFromNode(FASTBOOL bTail1);
942 	virtual SdrObject* GetConnectedNode(FASTBOOL bTail1) const;
943 
944     /** sets the writing mode of the object's context
945 
946         Objects which itself do not support different writing modes will ignore this call.
947 
948         Objects which support different writing modes, but have an own, explicit writing mode set,
949         will also ignore this call.
950 
951         Objects which support different writing modes, and whose own mode is set to css.text.WritingMode2.CONTEXT,
952         will use the given writing mode to calculate their "effective writing mode".
953 
954         The behavior of this method is undefined if you pass css.text.WritingMode2.CONTEXT.
955 
956         @param _nContextWritingMode
957             the effective writing mode of the context of the object
958     */
959     virtual void    SetContextWritingMode( const sal_Int16 _nContextWritingMode );
960 
961 	// Wenn ein Objekt in der Lage ist, sich in ein Polygon oder in eine
962 	// Bezierkurve (oder beides) zu verwandeln, dann sollten die folgenden
963 	// Methoden ueberladen werden.
964 	// Z.B. Ein RectObj mit Strichstaerke 10, SOLID_PEN in Polygon wandeln:
965 	// Im Modus bLineToArea=sal_False soll ein PolyObj mit 4 Stuetzstellen,
966 	// Strichstaerke 10 und SOLiD_PEN erzeugt werden.
967 	// Im Modus bLineToArea=sal_True dagegen soll das generierte Obj immer ein
968 	// LinienAttribut NULL_PEN haben, und die Linie (auch Linienmuster) selbst
969 	// durch Polygonflaechen emuliert werden, die dadurch anschliessend vom
970 	// Anwender manipuliert werden koennen. Das RectObj kann sich somit also
971 	// nur korrekt konvertieren, wenn es als Flaechenattribut NULL_BRUSH
972 	// besitzt. Es muesste in diesem Fall dann:
973 	// - SOLID_BRUSH mit der Farbe des gesetzten Pen setzen
974 	// - NULL_PEN setzen
975 	// - PolyPolygon mit 2 Polygonen zu je 4 Stuetzstellen generieren.
976 	// Der Returnwert ist jeweils ein SdrObject*, da als Rueckgabe zur Not
977 	// auch Gruppenobjekte erlaubt sind (z.B. fuer SdrTextObj).
978 	// Bei der Konvertierung von TextObj nach PathObj wird es wohl so sein,
979 	// dass beide Modi (bLineToArea=sal_True/sal_False) identisch sind.
980 	// Defaulted sind diese Methoden auf "Ich kann das nicht" (FALSE/NULL).
981 	virtual SdrObject* DoConvertToPolyObj(sal_Bool bBezier, bool bAddText) const;
982 	SdrObject* ConvertToPolyObj(sal_Bool bBezier, sal_Bool bLineToArea) const;
983 
984 	// convert this path object to contour object; bForceLineDash converts even
985 	// when there is no filled new polygon created from line-to-polygon conversion,
986 	// specially used for XLINE_DASH and 3D conversion
987 	SdrObject* ConvertToContourObj(SdrObject* pRet, sal_Bool bForceLineDash = sal_False) const;
988 	SdrObject* ImpConvertToContourObj(SdrObject* pRet, sal_Bool bForceLineDash = sal_False) const;
989 
990 	// TRUE: Referenz auf ein Obj
IsVirtualObj() const991 	sal_Bool IsVirtualObj() const { return bVirtObj; }
992 
993 	// sal_True=Obj kann warsch. gefuellt werden; sal_False=Obj kann warsch. Linienenden haben.
994 	// ungueltig, wenn es sich um ein GroupObj handelt.
IsClosedObj() const995 	sal_Bool IsClosedObj() const { return bClosedObj; }
996 
IsEdgeObj() const997 	sal_Bool IsEdgeObj() const { return bIsEdge; }
Is3DObj() const998 	sal_Bool Is3DObj() const { return bIs3DObj; }
IsUnoObj() const999 	sal_Bool IsUnoObj() const { return bIsUnoObj; }
IsMasterCachable() const1000 	sal_Bool IsMasterCachable() const { return !bNotMasterCachable; }
ShareLock()1001 	sal_Bool ShareLock() { sal_Bool r=!bNetLock; bNetLock=sal_True; return r; }
ShareUnlock()1002 	void ShareUnlock() { bNetLock=sal_False; }
IsShareLock() const1003 	sal_Bool IsShareLock() const { return bNetLock; }
SetMarkProtect(sal_Bool bProt)1004 	void SetMarkProtect(sal_Bool bProt) { bMarkProt=bProt; }
IsMarkProtect() const1005 	sal_Bool IsMarkProtect() const { return bMarkProt; }
1006 	void SetInserted(sal_Bool bIns);
IsInserted() const1007 	sal_Bool IsInserted() const { return bInserted; }
SetGrouped(sal_Bool bGrp)1008 	void SetGrouped(sal_Bool bGrp) { bGrouped=bGrp; }
IsGrouped() const1009 	sal_Bool IsGrouped() const { return bGrouped; }
1010 	void SetMoveProtect(sal_Bool bProt);
IsMoveProtect() const1011 	sal_Bool IsMoveProtect() const { return bMovProt; }
1012 	void SetResizeProtect(sal_Bool bProt);
IsResizeProtect() const1013 	sal_Bool IsResizeProtect() const { return bSizProt; }
1014 	void SetPrintable(sal_Bool bPrn);
IsPrintable() const1015 	sal_Bool IsPrintable() const { return !bNoPrint; }
1016 	void SetVisible(sal_Bool bVisible);
IsVisible() const1017 	sal_Bool IsVisible() const { return mbVisible; }
SetEmptyPresObj(sal_Bool bEpt)1018 	void SetEmptyPresObj(sal_Bool bEpt) { bEmptyPresObj=bEpt; }
IsEmptyPresObj() const1019 	sal_Bool IsEmptyPresObj() const { return bEmptyPresObj; }
SetNotVisibleAsMaster(sal_Bool bFlg)1020 	void SetNotVisibleAsMaster(sal_Bool bFlg) { bNotVisibleAsMaster=bFlg; }
IsNotVisibleAsMaster() const1021 	sal_Bool IsNotVisibleAsMaster() const { return bNotVisibleAsMaster; }
1022 
1023 	// #i25616#
LineIsOutsideGeometry() const1024 	sal_Bool LineIsOutsideGeometry() const { return mbLineIsOutsideGeometry; }
1025 
1026 	// #i25616#
DoesSupportTextIndentingOnLineWidthChange() const1027 	sal_Bool DoesSupportTextIndentingOnLineWidthChange() const { return mbSupportTextIndentingOnLineWidthChange; }
1028 
1029 	// applikationsspeziefische Daten
1030 	sal_uInt16 GetUserDataCount() const;
1031 	SdrObjUserData* GetUserData(sal_uInt16 nNum) const;
1032 
1033 	// Insert uebernimmt den auf dem Heap angelegten Record in den Besitz
1034 	// des Zeichenobjekts
1035 	void InsertUserData(SdrObjUserData* pData, sal_uInt16 nPos=0xFFFF);
1036 
1037 	// Delete entfernt den Record aus der Liste und ruft
1038 	// ein delete (FreeMem+Dtor).
1039 	void DeleteUserData(sal_uInt16 nNum);
1040 
1041 	// ItemPool fuer dieses Objekt wechseln
1042 	void MigrateItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool, SdrModel* pNewModel = 0L);
1043 
1044 	////////////////////////////////////////////////////////////////////////////////////////////////////
1045 	// access to the UNO representation of the shape
1046 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > getUnoShape();
getWeakUnoShape() const1047 	::com::sun::star::uno::WeakReference< ::com::sun::star::uno::XInterface > getWeakUnoShape() const { return maWeakUnoShape; }
1048 
1049 	static SdrObject* getSdrObjectFromXShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xInt );
1050 
1051 	// helper struct for granting access exclusive to SvxShape
1052 	struct GrantXShapeAccess
1053 	{
1054 		friend class SvxShape;
1055 	private:
GrantXShapeAccessSdrObject::GrantXShapeAccess1056 		GrantXShapeAccess() { }
1057 	};
1058 
1059 	// 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)1060 	void setUnoShape(
1061 			const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxUnoShape,
1062 			GrantXShapeAccess /*aGrant*/
1063 		)
1064 	{
1065 		impl_setUnoShape( _rxUnoShape );
1066 	}
1067 
1068     /** retrieves the instance responsible for notifying changes in the properties of the shape associated with
1069         the SdrObject
1070 
1071         @precond
1072             There already exists an SvxShape instance associated with the SdrObject
1073         @throws ::com::sun::star::uno::RuntimeException
1074             if there does nt yet exists an SvxShape instance associated with the SdrObject.
1075     */
1076     ::svx::PropertyChangeNotifier&
1077         getShapePropertyChangeNotifier();
1078 
1079     /** notifies a change in the given property, to all applicable listeners registered at the associated SvxShape
1080 
1081         This method is equivalent to calling getShapePropertyChangeNotifier().notifyPropertyChange( _eProperty ),
1082         exception that it is allowed to be called when there does not yet exist an associated SvxShape - in which
1083         case the method will silently return without doing anything.
1084     */
1085     void    notifyShapePropertyChange( const ::svx::ShapeProperty _eProperty ) const;
1086 
1087 	////////////////////////////////////////////////////////////////////////////////////////////////////
1088 	//
1089 	// transformation interface for StarOfficeAPI. This implements support for
1090 	// homogen 3x3 matrices containing the transformation of the SdrObject. At the
1091 	// moment it contains a shearX, rotation and translation, but for setting all linear
1092 	// transforms like Scale, ShearX, ShearY, Rotate and Translate are supported.
1093 	//
1094 	// gets base transformation and rectangle of object. If it's an SdrPathObj it fills the PolyPolygon
1095 	// with the base geometry and returns TRUE. Otherwise it returns FALSE.
1096 	virtual sal_Bool TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B2DPolyPolygon& rPolyPolygon) const;
1097 
1098 	// sets the base geometry of the object using infos contained in the homogen 3x3 matrix.
1099 	// If it's an SdrPathObj it will use the provided geometry information. The Polygon has
1100 	// to use (0,0) as upper left and will be scaled to the given size in the matrix.
1101 	virtual void TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, const basegfx::B2DPolyPolygon& rPolyPolygon);
1102 
1103 	sal_Bool IsTransparent( sal_Bool bCheckForAlphaChannel = sal_False ) const;
1104 
1105 	// #116168#
1106 	// Give info if object is in destruction
1107 	sal_Bool IsInDestruction() const;
1108 
1109 	// return if fill is != XFILL_NONE
1110 	bool HasFillStyle() const;
1111 	bool HasLineStyle() const;
1112 
1113 	// on import of OLE object from MS documents the BLIP size might be retrieved,
1114 	// the following methods are used to control it;
1115 	// usually this data makes no sense after the import is finished, since the object
1116 	// might be resized
1117 	Rectangle GetBLIPSizeRectangle() const;
1118 	void SetBLIPSizeRectangle( const Rectangle& aRect );
1119 
1120 	// #121917#
1121 	virtual bool HasText() const;
1122 
1123 protected:
1124 	void    impl_setUnoShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxUnoShape );
1125 
1126 private:
1127 	/** only for internal use!
1128 	*/
1129 	SvxShape* getSvxShape();
1130 
1131 	/** do not use directly, always use getSvxShape() if you have to! */
1132 	SvxShape*   mpSvxShape;
1133 	::com::sun::star::uno::WeakReference< ::com::sun::star::uno::XInterface >
1134                 maWeakUnoShape;
1135 };
1136 
1137 //************************************************************
1138 // SdrDummyObj
1139 //
1140 // Wer sich eigene Objekte schafft muss einen Link in der Klasse
1141 // SdrObjFactory setzen. Der Handler hat folgendes aussehen:
1142 //    void Hdl(SdrObjFactory*)
1143 // Er muss sich aus der uebergebenen Instanz die Werte nInventor und
1144 // nIdentifier ansehen und entsprechend mit new eine Zeichenobjektinstanz
1145 // erzeugen. Einen Zeiger auf diese Instanz hat er in der Membervariablen
1146 // pNewObj zu hinterlassen.
1147 //
1148 //************************************************************
1149 
1150 class SVX_DLLPUBLIC SdrObjFactory
1151 {
1152 public:
1153 	sal_uInt32						nInventor;
1154 	sal_uInt16						nIdentifier;
1155 
1156 	// for MakeNewObj():
1157 	SdrPage*					pPage;
1158 	SdrModel*					pModel;
1159 	SdrObject*					pNewObj;
1160 
1161 	// for MakeNewObjUserData():
1162 	SdrObject*					pObj;
1163 	SdrObjUserData*				pNewData;
1164 
1165 private:
1166 	SVX_DLLPRIVATE SdrObjFactory(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pNewPage, SdrModel* pNewModel);
1167 	SVX_DLLPRIVATE SdrObjFactory(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrObject* pObj1);
1168 
1169 public:
1170 	static SdrObject* MakeNewObject(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pPage, SdrModel* pModel=NULL);
1171 	static void InsertMakeObjectHdl(const Link& rLink);
1172 	static void RemoveMakeObjectHdl(const Link& rLink);
1173 	static SdrObjUserData* MakeNewObjUserData(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrObject* pObj);
1174 	static void InsertMakeUserDataHdl(const Link& rLink);
1175 	static void RemoveMakeUserDataHdl(const Link& rLink);
1176 };
1177 
1178 typedef tools::WeakReference< SdrObject > SdrObjectWeakRef;
1179 
1180 #endif //_SVDOBJ_HXX
1181 
1182 /* vim: set noet sw=4 ts=4: */
1183