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