Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #ifndef _SVDOEDGE_HXX
30 : : #define _SVDOEDGE_HXX
31 : :
32 : : #include <svx/svdotext.hxx>
33 : : #include <svx/svdglue.hxx>
34 : : #include "svx/svxdllapi.h"
35 : :
36 : : //************************************************************
37 : : // Vorausdeklarationen
38 : : //************************************************************
39 : :
40 : : class SdrDragMethod;
41 : : class SdrPageView;
42 : :
43 : : namespace sdr { namespace properties {
44 : : class ConnectorProperties;
45 : : }}
46 : :
47 : : //************************************************************
48 : : // Hilfsklasse SdrObjConnection
49 : : //************************************************************
50 : :
51 : : class SdrObjConnection
52 : : {
53 : : friend class SdrEdgeObj;
54 : : friend class ImpEdgeHdl;
55 : : friend class SdrCreateView;
56 : :
57 : : protected:
58 : : Point aObjOfs; // Wird beim Draggen eines Knotens gesetzt
59 : : SdrObject* pObj; // Referenziertes Objekt
60 : : long nXDist; // Hor. Objektabstand wenn bXDistOvr=TRUE
61 : : long nYDist; // Vert. Objektabstand wenn bYDistOvr=TRUE
62 : : sal_uInt16 nConId; // Konnektornummer
63 : :
64 : : // bitfield
65 : : unsigned bBestConn : 1; // sal_True= es wird der guenstigste Konnektor gesucht
66 : : unsigned bBestVertex : 1; // sal_True= es wird der guenstigste Scheitelpunkt zum konnekten gesucht
67 : : unsigned bXDistOvr : 1; // sal_True= Hor. Objektabstand wurde gedragt (Overwrite)
68 : : unsigned bYDistOvr : 1; // sal_True= Vert. Objektabstand wurde gedragt (Overwrite)
69 : : unsigned bAutoVertex : 1; // AutoConnector am Scheitelpunkt nCon
70 : : unsigned bAutoCorner : 1; // AutoConnector am Eckpunkt nCon
71 : :
72 : : public:
73 : : SdrObjConnection() { ResetVars(); }
74 : : SVX_DLLPUBLIC ~SdrObjConnection();
75 : :
76 : : void ResetVars();
77 : : bool TakeGluePoint(SdrGluePoint& rGP, bool bSetAbsolutePos) const;
78 : :
79 : : inline void SetBestConnection( sal_Bool rB ) { bBestConn = rB; };
80 : : inline void SetBestVertex( sal_Bool rB ) { bBestVertex = rB; };
81 : : inline void SetAutoVertex( sal_Bool rB ) { bAutoVertex = rB; };
82 : 0 : inline void SetConnectorId( sal_uInt16 nId ) { nConId = nId; };
83 : :
84 : : inline sal_Bool IsBestConnection() const { return bBestConn; };
85 : : inline sal_Bool IsBestVertex() const { return bBestVertex; };
86 : : inline sal_Bool IsAutoVertex() const { return bAutoVertex; };
87 : 0 : inline sal_uInt16 GetConnectorId() const { return nConId; };
88 : 0 : inline SdrObject* GetObject() const { return pObj; }
89 : : };
90 : :
91 : : //************************************************************
92 : : // Hilfsklasse SdrEdgeInfoRec
93 : : //************************************************************
94 : :
95 : : enum SdrEdgeLineCode {OBJ1LINE2,OBJ1LINE3,OBJ2LINE2,OBJ2LINE3,MIDDLELINE};
96 : :
97 : : class SdrEdgeInfoRec
98 : : {
99 : : public:
100 : : // Die 5 Distanzen werden beim draggen bzw. per SetAttr gesetzt und von
101 : : // ImpCalcEdgeTrack ausgewertet. Per Get/SetAttr/Get/SetStyleSh werden
102 : : // jedoch nur 0-3 longs transportiert.
103 : : Point aObj1Line2;
104 : : Point aObj1Line3;
105 : : Point aObj2Line2;
106 : : Point aObj2Line3;
107 : : Point aMiddleLine;
108 : :
109 : : // Nachfolgende Werte werden von ImpCalcEdgeTrack gesetzt
110 : : long nAngle1; // Austrittswinkel am Obj1
111 : : long nAngle2; // Austrittswinkel am Obj2
112 : : sal_uInt16 nObj1Lines; // 1..3
113 : : sal_uInt16 nObj2Lines; // 1..3
114 : : sal_uInt16 nMiddleLine; // 0xFFFF=keine, sonst Punktnummer des Linienbeginns
115 : : char cOrthoForm; // Form des Ortho-Verbindes, z.B. 'Z','U',I','L','S',...
116 : :
117 : : public:
118 : : SdrEdgeInfoRec()
119 : : : nAngle1(0),
120 : : nAngle2(0),
121 : : nObj1Lines(0),
122 : : nObj2Lines(0),
123 : : nMiddleLine(0xFFFF),
124 : : cOrthoForm(0)
125 : : {}
126 : :
127 : : Point& ImpGetLineVersatzPoint(SdrEdgeLineCode eLineCode);
128 : : const Point& ImpGetLineVersatzPoint(SdrEdgeLineCode eLineCode) const { return ((SdrEdgeInfoRec*)this)->ImpGetLineVersatzPoint(eLineCode); }
129 : : sal_uInt16 ImpGetPolyIdx(SdrEdgeLineCode eLineCode, const XPolygon& rXP) const;
130 : : bool ImpIsHorzLine(SdrEdgeLineCode eLineCode, const XPolygon& rXP) const;
131 : : void ImpSetLineVersatz(SdrEdgeLineCode eLineCode, const XPolygon& rXP, long nVal);
132 : : long ImpGetLineVersatz(SdrEdgeLineCode eLineCode, const XPolygon& rXP) const;
133 : : };
134 : :
135 : : //************************************************************
136 : : // Hilfsklasse SdrEdgeObjGeoData
137 : : //************************************************************
138 : :
139 : : class SdrEdgeObjGeoData : public SdrTextObjGeoData
140 : : {
141 : : public:
142 : : SdrObjConnection aCon1; // Verbindungszustand des Linienanfangs
143 : : SdrObjConnection aCon2; // Verbindungszustand des Linienendes
144 : : XPolygon* pEdgeTrack;
145 : : sal_Bool bEdgeTrackDirty;// sal_True=Verbindungsverlauf muss neu berechnet werden.
146 : : sal_Bool bEdgeTrackUserDefined;
147 : : SdrEdgeInfoRec aEdgeInfo;
148 : :
149 : : public:
150 : : SdrEdgeObjGeoData();
151 : : virtual ~SdrEdgeObjGeoData();
152 : : };
153 : :
154 : : //************************************************************
155 : : // Hilfsklasse SdrEdgeObj
156 : : //************************************************************
157 : :
158 : : class SVX_DLLPUBLIC SdrEdgeObj : public SdrTextObj
159 : : {
160 : : private:
161 : : // to allow sdr::properties::ConnectorProperties access to ImpSetAttrToEdgeInfo()
162 : : friend class sdr::properties::ConnectorProperties;
163 : :
164 : : friend class SdrCreateView;
165 : : friend class ImpEdgeHdl;
166 : :
167 : : protected:
168 : : virtual sdr::contact::ViewContact* CreateObjectSpecificViewContact();
169 : : virtual sdr::properties::BaseProperties* CreateObjectSpecificProperties();
170 : :
171 : : SdrObjConnection aCon1; // Verbindungszustand des Linienanfangs
172 : : SdrObjConnection aCon2; // Verbindungszustand des Linienendes
173 : :
174 : : XPolygon* pEdgeTrack;
175 : : sal_uInt16 nNotifyingCount; // Verrieglung
176 : : SdrEdgeInfoRec aEdgeInfo;
177 : :
178 : : // bitfield
179 : : unsigned bEdgeTrackDirty : 1; // sal_True=Verbindungsverlauf muss neu berechnet werden.
180 : : unsigned bEdgeTrackUserDefined : 1;
181 : :
182 : : // #109007#
183 : : // Bool to allow supporession of default connects at object
184 : : // inside test (HitTest) and object center test (see ImpFindConnector())
185 : : unsigned mbSuppressDefaultConnect : 1;
186 : :
187 : : // #110649#
188 : : // Flag value for avoiding death loops when calculating BoundRects
189 : : // from circularly connected connectors. A coloring algorythm is used
190 : : // here. When the GetCurrentBoundRect() calculation of a SdrEdgeObj
191 : : // is running, the flag is set, else it is always sal_False.
192 : : unsigned mbBoundRectCalculationRunning : 1;
193 : :
194 : : public:
195 : : // #109007#
196 : : // Interface to default connect suppression
197 : 0 : void SetSuppressDefaultConnect(sal_Bool bNew) { mbSuppressDefaultConnect = bNew; }
198 : 0 : sal_Bool GetSuppressDefaultConnect() const { return mbSuppressDefaultConnect; }
199 : :
200 : : // #110649#
201 : : sal_Bool IsBoundRectCalculationRunning() const { return mbBoundRectCalculationRunning; }
202 : :
203 : : protected:
204 : : virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint);
205 : :
206 : : XPolygon ImpCalcObjToCenter(const Point& rStPt, long nEscAngle, const Rectangle& rRect, const Point& rCenter) const;
207 : : void ImpRecalcEdgeTrack(); // Neuberechnung des Verbindungsverlaufs
208 : : XPolygon ImpCalcEdgeTrack(const XPolygon& rTrack0, SdrObjConnection& rCon1, SdrObjConnection& rCon2, SdrEdgeInfoRec* pInfo) const;
209 : : XPolygon ImpCalcEdgeTrack(const Point& rPt1, long nAngle1, const Rectangle& rBoundRect1, const Rectangle& rBewareRect1,
210 : : const Point& rPt2, long nAngle2, const Rectangle& rBoundRect2, const Rectangle& rBewareRect2,
211 : : sal_uIntPtr* pnQuality, SdrEdgeInfoRec* pInfo) const;
212 : : static bool ImpFindConnector(const Point& rPt, const SdrPageView& rPV, SdrObjConnection& rCon, const SdrEdgeObj* pThis, OutputDevice* pOut=NULL);
213 : : sal_uInt16 ImpCalcEscAngle(SdrObject* pObj, const Point& aPt2) const;
214 : : void ImpSetTailPoint(bool bTail1, const Point& rPt);
215 : : void ImpUndirtyEdgeTrack(); // eventuelle Neuberechnung des Verbindungsverlaufs
216 : : void ImpDirtyEdgeTrack(); // invalidate connector path, so it will be recalculated next time
217 : : void ImpSetAttrToEdgeInfo(); // Werte vom Pool nach aEdgeInfo kopieren
218 : : void ImpSetEdgeInfoToAttr(); // Werte vom aEdgeInfo in den Pool kopieren
219 : :
220 : : public:
221 : : TYPEINFO();
222 : :
223 : : SdrEdgeObj();
224 : : virtual ~SdrEdgeObj();
225 : :
226 [ # # ]: 0 : SdrObjConnection& GetConnection(bool bTail1) { return *(bTail1 ? &aCon1 : &aCon2); }
227 : : virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const;
228 : : virtual sal_uInt16 GetObjIdentifier() const;
229 : : virtual const Rectangle& GetCurrentBoundRect() const;
230 : : virtual const Rectangle& GetSnapRect() const;
231 : : virtual bool IsNode() const;
232 : : virtual SdrGluePoint GetVertexGluePoint(sal_uInt16 nNum) const;
233 : : virtual SdrGluePoint GetCornerGluePoint(sal_uInt16 nNum) const;
234 : : virtual const SdrGluePointList* GetGluePointList() const;
235 : : virtual SdrGluePointList* ForceGluePointList();
236 : : virtual bool IsEdge() const;
237 : :
238 : : // bTail1=TRUE: Linienanfang, sonst LinienEnde
239 : : // pObj=NULL: Disconnect
240 : : void SetEdgeTrackDirty() { bEdgeTrackDirty=sal_True; }
241 : : void ConnectToNode(bool bTail1, SdrObject* pObj);
242 : : void DisconnectFromNode(bool bTail1);
243 : : SdrObject* GetConnectedNode(bool bTail1) const;
244 : : const SdrObjConnection& GetConnection(bool bTail1) const { return *(bTail1 ? &aCon1 : &aCon2); }
245 : : bool CheckNodeConnection(bool bTail1) const;
246 : :
247 : : virtual void RecalcSnapRect();
248 : : virtual void TakeUnrotatedSnapRect(Rectangle& rRect) const;
249 : : virtual SdrEdgeObj* Clone() const;
250 : : SdrEdgeObj& operator=(const SdrEdgeObj& rObj);
251 : : virtual void TakeObjNameSingul(String& rName) const;
252 : : virtual void TakeObjNamePlural(String& rName) const;
253 : :
254 : : void SetEdgeTrackPath( const basegfx::B2DPolyPolygon& rPoly );
255 : : basegfx::B2DPolyPolygon GetEdgeTrackPath() const;
256 : :
257 : : virtual basegfx::B2DPolyPolygon TakeXorPoly() const;
258 : : virtual sal_uInt32 GetHdlCount() const;
259 : : virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const;
260 : :
261 : : // special drag methods
262 : : virtual bool hasSpecialDrag() const;
263 : : virtual bool beginSpecialDrag(SdrDragStat& rDrag) const;
264 : : virtual bool applySpecialDrag(SdrDragStat& rDrag);
265 : : virtual String getSpecialDragComment(const SdrDragStat& rDrag) const;
266 : :
267 : : // FullDrag support
268 : : virtual SdrObject* getFullDragClone() const;
269 : :
270 : : virtual void NbcSetSnapRect(const Rectangle& rRect);
271 : : virtual void NbcMove(const Size& aSize);
272 : : virtual void NbcResize(const Point& rRefPnt, const Fraction& aXFact, const Fraction& aYFact);
273 : :
274 : : // #102344# Added missing implementation
275 : : virtual void NbcSetAnchorPos(const Point& rPnt);
276 : :
277 : : virtual bool BegCreate(SdrDragStat& rStat);
278 : : virtual bool MovCreate(SdrDragStat& rStat);
279 : : virtual bool EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd);
280 : : virtual bool BckCreate(SdrDragStat& rStat);
281 : : virtual void BrkCreate(SdrDragStat& rStat);
282 : : virtual basegfx::B2DPolyPolygon TakeCreatePoly(const SdrDragStat& rDrag) const;
283 : : virtual Pointer GetCreatePointer() const;
284 : : virtual SdrObject* DoConvertToPolyObj(sal_Bool bBezier) const;
285 : :
286 : : virtual sal_uInt32 GetSnapPointCount() const;
287 : : virtual Point GetSnapPoint(sal_uInt32 i) const;
288 : : virtual sal_Bool IsPolyObj() const;
289 : : virtual sal_uInt32 GetPointCount() const;
290 : : virtual Point GetPoint(sal_uInt32 i) const;
291 : : virtual void NbcSetPoint(const Point& rPnt, sal_uInt32 i);
292 : :
293 : : virtual SdrObjGeoData* NewGeoData() const;
294 : : virtual void SaveGeoData(SdrObjGeoData& rGeo) const;
295 : : virtual void RestGeoData(const SdrObjGeoData& rGeo);
296 : :
297 : : /** updates edges that are connected to the edges of this object
298 : : as if the connected objects send a repaint broadcast
299 : : #103122#
300 : : */
301 : : void Reformat();
302 : :
303 : : // helper methods for the StarOffice api
304 : : Point GetTailPoint( sal_Bool bTail ) const;
305 : : void SetTailPoint( sal_Bool bTail, const Point& rPt );
306 : : void setGluePointIndex( sal_Bool bTail, sal_Int32 nId = -1 );
307 : : sal_Int32 getGluePointIndex( sal_Bool bTail );
308 : :
309 : : virtual sal_Bool TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B2DPolyPolygon& rPolyPolygon) const;
310 : : virtual void TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, const basegfx::B2DPolyPolygon& rPolyPolygon);
311 : :
312 : : // for geometry access
313 : : ::basegfx::B2DPolygon getEdgeTrack() const;
314 : :
315 : : // helper method for SdrDragMethod::AddConnectorOverlays. Adds a overlay polygon for
316 : : // this connector to rResult.
317 : : basegfx::B2DPolygon ImplAddConnectorOverlay(SdrDragMethod& rDragMethod, bool bTail1, bool bTail2, bool bDetail) const;
318 : : };
319 : :
320 : : ////////////////////////////////////////////////////////////////////////////////////////////////////
321 : : //
322 : : // Zur Bestimmung der Verlaufslinie werden folgende Item-Parameter des SdrItemPool verwendet:
323 : : //
324 : : // sal_uInt16 EdgeFlowAngle Default 9000 (=90.00 Deg), min 0, max 9000
325 : : // Verlauffreiheitswinkel.
326 : : // Der Winkel, in dem die Verbindungslinie verlaufen darf.
327 : : //
328 : : // sal_uInt16 EdgeEscAngle Default 9000 (=90.00 Deg), min 0, max 9000
329 : : // Objektaustrittswinkel.
330 : : // Der Winkel, in dem die Verbindungslinie aus dem Objekt austreten darf.
331 : : //
332 : : // sal_Bool EdgeEscAsRay Default FALSE
333 : : // sal_True= die Verbindungslinie tritt aus dem Obj Strahlenfoermig aus.
334 : : // Also Winkelvorgabe durch die Strecke ObjMitte/Konnektor.
335 : : //
336 : : // sal_Bool EdgeEscUseObjAngle Default FALSE
337 : : // Objektdrehwinkelberuecksichtigung.
338 : : // sal_True= Bei der Bestimmung des Objektaustrittswinkels wird der
339 : : // Drehwinkel des Objekts als Offset beruecksichtigt.
340 : : //
341 : : // sal_uIntPtr EdgeFlowDefDist Default 0, min 0, max ?
342 : : // Das ist der Default-Mindestabstand der bei der Berechnung der
343 : : // Verbindungslinie zu den angedockten Objekten in logischen Einheiten.
344 : : // Dieser Abstand wird innerhalb des Objektes "ueberschrieben", sobald
345 : : // der User an den Linien draggd. Beim Andocken an ein neues Objekt wird
346 : : // dann jedoch wieder dieser Default verwendet.
347 : : //
348 : : //
349 : : // Allgemeines zu Konnektoren:
350 : : //
351 : : // Es gibt Knoten und Kantenobjekte. Zwei Knoten koennen durch eine Kante
352 : : // miteinander verbunden werden. Ist eine Kante nur an einem Ende an einen
353 : : // Knoten geklebt, ist das andere Ende auf einer absoluten Position im Doc
354 : : // fixiert. Ebenso ist es natuerlich auch moeglich, dass eine Kante an beiden
355 : : // Enden "frei", also nicht mit einem Knotenobjekt verbunden ist.
356 : : //
357 : : // Ein Kantenobjekt kann theoretisch auch gleichzeitig Knotenobjekt sein. In
358 : : // der ersten Version wird das jedoch noch nicht realisiert werden.
359 : : //
360 : : // Eine Verbindung zwischen Knoten und Kante kann hergestellt werden durch:
361 : : // - Interaktives erzeugen eines neuen Kantenobjekts an der SdrView wobei
362 : : // Anfangs- bzw. Endpunkt der Kante auf ein Konnektor (Klebestelle) eines
363 : : // bereits vorhandenen Knotenobjekts gelegt wird.
364 : : // - Interaktives draggen des Anfangs- bzw. Endpunkts eines bestehenden
365 : : // Kantenobjekts an der SdrView auf ein Konnektor (Klebestelle) eines
366 : : // bereits vorhandenen Knotenobjekts.
367 : : // - Undo/Redo
368 : : // Verschieben von Knotenobjekten stellt keine Verbindungen her. Ebenso auch
369 : : // nicht das direkte Verschieben von Kantenendpunkten am SdrModel...
370 : : // Verbindungen koennen auch hergestellt werden, wenn die Konnektoren an der
371 : : // View nicht sichtbar geschaltet sind.
372 : : //
373 : : // Eine vorhandene Verbindung zwischen Knoten und Kante bleibt erhalten bei:
374 : : // - Draggen (Move/Resize/Rotate/...) des Knotenobjekts
375 : : // - Verschieben einer Konnektorposition im Knotemobjekt
376 : : // - gleichzeitiges Draggen (Move/Resize/Rotate/...) von Knoten und Kante
377 : : //
378 : : // Eine Verbindung zwischen Knoten und Kante kann geloesst werden durch:
379 : : // - Loeschen eines der Objekte
380 : : // - Draggen des Kantenobjekts ohne gleichzeitiges Draggen des Knotens
381 : : // - Loeschen des Konnektors am Knotenobjekt
382 : : // - Undo/Redo/Repeat
383 : : // Beim Draggen muss die Aufforderung zum loesen der Verbindung von ausserhalb
384 : : // des Models befohlen werden (z.B. von der SdrView). SdrEdgeObj::Move() loesst
385 : : // die Verbindung nicht selbsttaetig.
386 : : //
387 : : // Jedes Knotenobjekt kann Konnektoren, sog. Klebestellen besitzen. Das sind die
388 : : // geometrischen Punkte, an denen das verbindende Kantenobjekt bei hergestellter
389 : : // Verbindung endet. Defaultmaessig hat jedes Objekt keine Konnektoren. Trotzdem
390 : : // kann man bei bestimmten View-Einstellungen eine Kante andocken, da dann z.B.
391 : : // an den 4 Scheitelpunkten des Knotenobjekts bei Bedarf automatisch Konnektoren
392 : : // generiert werden. Jedes Objekt liefert dafuer 2x4 sog. Default-Konnektorposi-
393 : : // tionen, 4 an den Scheitelpunkten und 4 an den Eckpositionen. Im Normalfall
394 : : // liegen diese an den 8 Handlepositionen; Ausnahmen bilden hier Ellipsen,
395 : : // Parallelogramme, ... . Darueberhinaus koennen auch an jedem Knotenobjekt
396 : : // anwenderspeziefische Konnektoren gesetzt werden.
397 : : //
398 : : // Dann gibt es noch die Moeglichkeit, ein Kante an einem Objekt mit dem
399 : : // Attribut "bUseBestConnector" anzudocken. Es wird dann aus dem Angebot der
400 : : // Konnektoren des Objekts oder/und der Scheitelpunkte, jeweils die fuer den
401 : : // Verlauf der Verbindungslinie guenstigste Konnektorposition verwendet. Der
402 : : // Anwender vergibt dieses Attribut, indem er den Knoten in seiner Mitte
403 : : // andockt (siehe z.B. Visio).
404 : : // 09-06-1996: bUseBestConnector verwendet nur Scheitelpunktklebepunkte.
405 : : //
406 : : // Und hier noch etwas Begriffsdefinition:
407 : : // Verbinder : Eben das Verbinderobjekt (Kantenobjekt)
408 : : // Knoten : Ein beliebiges Objekt, an dem ein Verbinder drangeklebt
409 : : // werden kann, z.B. ein Rechteck, ...
410 : : // Klebepunkt: Der Punkt, an dem der Verbinder an das Knotenobjekt
411 : : // geklebt wird. Hierbei gibt es:
412 : : // Scheitelpunktklebepunkte: Jedes Knotenobjekt hat diese
413 : : // Klebepunkte von Natur aus. Moeglicherweise gibt es
414 : : // im Draw bereits die Option "Automatisch ankleben an
415 : : // Objektscheitelpunkte" (default an)
416 : : // Eckpunktklebepunkte: Auch diese Klebepunkte sind den
417 : : // Objekten von mir bereits mitgegeben. Wie die oben
418 : : // erwaehnten gibt es fuer diese moeglicherweise
419 : : // bereits auch eine Option im Draw. (default aus)
420 : : // Scheitelpunktklebepunkte und Eckpunktklebepunkte sind
421 : : // im Gegensatz zu Visio nicht optisch sichtbar; sie
422 : : // sind eben einfach da (wenn Option eingeschaltet).
423 : : // Benutzerdefinierte Klebepunkte: Gibt es an jedem
424 : : // Knotenobjekt beliebig viele. Per Option koennen sie
425 : : // sichtbar geschaltet werden (beim editieren immer
426 : : // sichtbar). Zur Zeit sind die jedoch noch nicht ganz
427 : : // fertigimplementiert.
428 : : // Automatische Klebepunktwahl: Wird der Verbinder so an
429 : : // das Knotenobjekt gedockt, dass der schwarke Rahmen
430 : : // das gesamte Objekt umfasst, so versucht der
431 : : // Verbinder von den 4 Scheitelpunktklebepunkten (und
432 : : // zwar nur von denen) den guenstigsten herauszufinden.
433 : : //
434 : : //////////////////////////////////////////////////////////////////////////////////////////////////
435 : :
436 : : #endif //_SVDOEDGE_HXX
437 : :
438 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|