summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Le Grand <alg@apache.org>2013-11-19 16:47:11 +0000
committerArmin Le Grand <alg@apache.org>2013-11-19 16:47:11 +0000
commit98d1a4e5542940f7d6c39252c4987da84e4fd95f (patch)
tree283a6bf8c70e836d2bff478a65d983de7676f0b5
parent3e7d04fab78e5cc0aabd545283acc0dfe60ef86e (diff)
More connector refinements
-rw-r--r--sd/source/ui/func/fupoor.cxx4
-rw-r--r--svx/inc/svx/sdr/properties/connectorproperties.hxx3
-rw-r--r--svx/inc/svx/svdoedge.hxx54
-rw-r--r--svx/source/sdr/properties/connectorproperties.cxx20
-rw-r--r--svx/source/svdraw/svdoedge.cxx284
5 files changed, 246 insertions, 119 deletions
diff --git a/sd/source/ui/func/fupoor.cxx b/sd/source/ui/func/fupoor.cxx
index 02389d66652b..1295485a0285 100644
--- a/sd/source/ui/func/fupoor.cxx
+++ b/sd/source/ui/func/fupoor.cxx
@@ -737,8 +737,8 @@ bool FuPoor::KeyInput(const KeyEvent& rKEvt)
mpWindow->GetInverseViewTransformation() *
basegfx::B2DVector(mpView->GetMarkHdlSizePixel(), mpView->GetMarkHdlSizePixel()));
- aDist.setX(std::min(100.0, aDist.getX()));
- aDist.setY(std::min(100.0, aDist.getY()));
+ aDist.setX(std::max(100.0, aDist.getX()));
+ aDist.setY(std::max(100.0, aDist.getY()));
aMove *= aDist;
}
diff --git a/svx/inc/svx/sdr/properties/connectorproperties.hxx b/svx/inc/svx/sdr/properties/connectorproperties.hxx
index 9b4b48a0bca6..4b2564527e19 100644
--- a/svx/inc/svx/sdr/properties/connectorproperties.hxx
+++ b/svx/inc/svx/sdr/properties/connectorproperties.hxx
@@ -56,6 +56,9 @@ namespace sdr
// set a new StyleSheet and broadcast
virtual void SetStyleSheet(SfxStyleSheet* pNewStyleSheet, bool bDontRemoveHardAttr);
+
+ // This is the notifyer from SfxListener
+ virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint);
};
} // end of namespace properties
} // end of namespace sdr
diff --git a/svx/inc/svx/svdoedge.hxx b/svx/inc/svx/svdoedge.hxx
index 2bf31cedafb1..0f8a1a01d32f 100644
--- a/svx/inc/svx/svdoedge.hxx
+++ b/svx/inc/svx/svdoedge.hxx
@@ -32,6 +32,7 @@
namespace sdr { namespace properties { class ConnectorProperties; }}
class SdrObjConnection;
class SdrEdgeInfoRec;
+
enum SdrEdgeLineCode
{
OBJ1LINE2,
@@ -42,24 +43,6 @@ enum SdrEdgeLineCode
};
////////////////////////////////////////////////////////////////////////////////////////////////////
-// SdrEdgeObjGeoData
-
-class SdrEdgeObjGeoData : public SdrObjGeoData
-{
-public:
- SdrObjConnection* mpCon1; // Verbindungszustand des Linienanfangs
- SdrObjConnection* mpCon2; // Verbindungszustand des Linienendes
- basegfx::B2DPolygon maEdgeTrack;
- SdrEdgeInfoRec* mpEdgeInfo;
-
- /// bitfield
- bool mbEdgeTrackUserDefined : 1;
-
- SdrEdgeObjGeoData();
- virtual ~SdrEdgeObjGeoData();
-};
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
// SdrEdgeObj
class SVX_DLLPUBLIC SdrEdgeObj : public SdrTextObj
@@ -83,21 +66,23 @@ private:
SdrEdgeInfoRec* mpEdgeInfo;
/// bitfield
+ /// defines if this edge was set from external and thus is defined by
+ /// user; this mode is used for compatibility with other file formats.
+ /// This state is not editable; any change on geometry data will reset
+ /// this flag
bool mbEdgeTrackUserDefined : 1;
- // #109007#
// Bool to allow supporession of default connects at object
// inside test (HitTest) and object center test (see FindConnector())
bool mbSuppressDefaultConnect : 1;
- // #110649#
// Flag value for avoiding death loops when calculating BoundRects
// from circularly connected connectors. A coloring algorythm is used
// here. When the GetCurrentBoundRect() calculation of a SdrEdgeObj
// is running, the flag is set, else it is always sal_False.
unsigned mbBoundRectCalculationRunning : 1;
- // #123048# need to remember if layouting was suppressed before to get
+ // need to remember if layouting was suppressed before to get
// to a correct state for first real layouting
unsigned mbSuppressed : 1;
@@ -134,14 +119,11 @@ protected:
virtual void copyDataFromSdrObject(const SdrObject& rSource);
public:
- // check if rCandidate is a listener (one of the SdrObjConnections) and
- // if yes, return the owner of the SdrObjConnection
+ // check if rCandidate is a listener (in one of the SdrObjConnections) and
+ // if yes, return the owner of the SdrObjConnection and thus the SdrEdgeObj
+ // which is connected to the given listener (which probably is a SdrObject)
static SdrEdgeObj* checkIfUsesListener(SfxListener& rCandidate);
- // called from SdrObjConnection child when a SFX_HINT_DATACHANGED is detected
- // from a connected SdrObject
- void StyleSheetChanged();
-
// #109007# Interface to default connect suppression
void SetSuppressDefaultConnect(sal_Bool bNew) { mbSuppressDefaultConnect = bNew; }
sal_Bool GetSuppressDefaultConnect() const { return mbSuppressDefaultConnect; }
@@ -152,6 +134,9 @@ public:
/// create a copy, evtl. with a different target model (if given)
virtual SdrObject* CloneSdrObject(SdrModel* pTargetModel = 0) const;
+ // react on model/page change
+ virtual void handlePageChange(SdrPage* pOldPage, SdrPage* pNewPage);
+
virtual bool IsClosedObj() const;
SdrEdgeObj(SdrModel& rSdrModel);
@@ -159,15 +144,15 @@ public:
virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const;
virtual sal_uInt16 GetObjIdentifier() const;
- void SetEdgeTrackDirty(); // { mbEdgeTrackDirty = true; }
+ void SetEdgeTrackDirty();
- // bTail=true: Linienanfang, sonst LinienEnde
- // pObj=NULL -> Disconnect
+ // bTail = true: connector start, else connector end
+ // no SdrObject given: disconnect
void ConnectToSdrObject(bool bTail, SdrObject* pObj = 0);
SdrObject* GetSdrObjectConnection(bool bTail) const;
bool CheckSdrObjectConnection(bool bTail) const;
- /// interface to hold a user-defined EdgeTrack
+ /// interface to hold a user-defined EdgeTrack (see mbEdgeTrackUserDefined)
void SetEdgeTrackPath( const basegfx::B2DPolygon& rPoly );
basegfx::B2DPolygon GetEdgeTrackPath() const;
@@ -193,19 +178,24 @@ public:
// FullDrag support
virtual SdrObject* getFullDragClone() const;
+ // creation support
virtual bool BegCreate(SdrDragStat& rStat);
virtual bool MovCreate(SdrDragStat& rStat);
virtual bool EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd);
virtual bool BckCreate(SdrDragStat& rStat);
-
virtual void BrkCreate(SdrDragStat& rStat);
virtual basegfx::B2DPolyPolygon TakeCreatePoly(const SdrDragStat& rDrag) const;
+
+ // convert to polygon support
virtual SdrObject* DoConvertToPolygonObject(bool bBezier, bool bAddText) const;
+ // snap point support
virtual sal_uInt32 GetSnapPointCount() const;
virtual basegfx::B2DPoint GetSnapPoint(sal_uInt32 i) const;
+
virtual bool IsPolygonObject() const;
+ // GeoData (Undo/Redo) support
virtual SdrObjGeoData* NewGeoData() const;
virtual void SaveGeoData(SdrObjGeoData& rGeo) const;
virtual void RestGeoData(const SdrObjGeoData& rGeo);
diff --git a/svx/source/sdr/properties/connectorproperties.cxx b/svx/source/sdr/properties/connectorproperties.cxx
index 4955d8d749be..6b1302879851 100644
--- a/svx/source/sdr/properties/connectorproperties.cxx
+++ b/svx/source/sdr/properties/connectorproperties.cxx
@@ -19,8 +19,6 @@
*
*************************************************************/
-
-
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svx.hxx"
#include <svx/sdr/properties/connectorproperties.hxx>
@@ -29,6 +27,7 @@
#include <svx/svddef.hxx>
#include <editeng/eeitem.hxx>
#include <svx/svdoedge.hxx>
+#include <svl/smplhint.hxx>
//////////////////////////////////////////////////////////////////////////////
@@ -96,6 +95,23 @@ namespace sdr
// local changes
rObj.ImpSetAttrToEdgeInfo();
}
+
+ void ConnectorProperties::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
+ {
+ // call parent
+ TextProperties::Notify(rBC, rHint);
+
+ // local changes (could need more checks, but is not expensive)
+ const SfxSimpleHint* pSimple = dynamic_cast< const SfxSimpleHint* >(&rHint);
+
+ if(pSimple && SFX_HINT_DATACHANGED == pSimple->GetId())
+ {
+ // style sheet change, copy evtl. changed style items to EdgeInfo
+ SdrEdgeObj& rObj = (SdrEdgeObj&)GetSdrObject();
+
+ rObj.ImpSetAttrToEdgeInfo();
+ }
+ }
} // end of namespace properties
} // end of namespace sdr
diff --git a/svx/source/svdraw/svdoedge.cxx b/svx/source/svdraw/svdoedge.cxx
index f901dc6af28a..5089c1e3a079 100644
--- a/svx/source/svdraw/svdoedge.cxx
+++ b/svx/source/svdraw/svdoedge.cxx
@@ -70,9 +70,11 @@ private:
sal_uInt32 mnConnectorId; // Connector ID
/// bitfield
+ /// when set, connector will find best connection itself
bool mbBestConnection : 1;
- bool mbBestVertex : 1;
- bool mbAutoVertex : 1; // connected to automatic gluepoint
+
+ // connected to automatic gluepoint (AutoGluePoint)
+ bool mbAutoVertex : 1;
protected:
// object notifies; e.g. connected SDrObjects changed
@@ -97,16 +99,23 @@ public:
/// assignment operator; will not copy mpOwner
SdrObjConnection& operator=(const SdrObjConnection&);
+ /// called when page access of owner changes (owner gets removed/
+ /// inserted, e.g deleted but put to undo stack)
+ void ownerPageChange();
+
// get a copy of the GluePoint referenced; returns true if
// a GluePoint is referenced and when it got copied to rGP
bool TakeGluePoint(sdr::glue::GluePoint& rGP) const;
+ // allow SdrEdgeObj to adapt position in two cases: user defined
+ // EdgeTrack or result of BestConnection being available
+ void adaptBestConnectionPosition(const basegfx::B2DPoint& rPosition);
+
// data write access
void SetPosition(const basegfx::B2DPoint& rPosition);
void SetConnectedSdrObject(SdrObject* pConnectedSdrObject);
void SetConnectorID(sal_uInt32 nNew);
void setBestConnection(bool bNew) { mbBestConnection = bNew; }
- void setBestVertex(bool bNew) { mbBestVertex = bNew; }
void setAutoVertex(bool bNew) { mbAutoVertex = bNew; }
// data read access
@@ -115,7 +124,6 @@ public:
SdrObject* GetConnectedSdrObject() const { return mpConnectedSdrObject; }
sal_uInt32 GetConnectorId() const { return mnConnectorId; };
bool IsBestConnection() const { return mbBestConnection; };
- bool IsBestVertex() const { return mbBestVertex; };
bool IsAutoVertex() const { return mbAutoVertex; };
};
@@ -132,7 +140,7 @@ void SdrObjConnection::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
{
const SdrHintKind eSdrHintKind(pBase->GetSdrHintKind());
- // on object delete and/or object removed from page, break linkage
+ // object listening to is delete and/or removed from page, break linkage
if(HINT_SDROBJECTDYING == eSdrHintKind || HINT_OBJREMOVED == eSdrHintKind)
{
EndListening(*mpConnectedSdrObject);
@@ -145,14 +153,6 @@ void SdrObjConnection::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
checkPositionFromObject();
}
}
-
- const SfxSimpleHint* pSimple = dynamic_cast< const SfxSimpleHint* >(&rHint);
-
- if(pSimple && SFX_HINT_DATACHANGED == pSimple->GetId())
- {
- // StyleSheet change on listened object, get the evtl. changed parameters for connectors
- mpOwner->StyleSheetChanged();
- }
}
}
@@ -217,7 +217,6 @@ SdrObjConnection::SdrObjConnection(SdrEdgeObj* pOwner)
mpConnectedSdrObject(0),
mnConnectorId(0),
mbBestConnection(true),
- mbBestVertex(true),
mbAutoVertex(false)
{
SetConnectedSdrObject(mpConnectedSdrObject);
@@ -230,7 +229,6 @@ SdrObjConnection::SdrObjConnection(const SdrObjConnection& rSource)
mpConnectedSdrObject(rSource.mpConnectedSdrObject),
mnConnectorId(rSource.mnConnectorId),
mbBestConnection(rSource.mbBestConnection),
- mbBestVertex(rSource.mbBestVertex),
mbAutoVertex(rSource.mbAutoVertex)
{
}
@@ -254,10 +252,9 @@ SdrObjConnection& SdrObjConnection::operator=(const SdrObjConnection& rSource)
mpConnectedSdrObject = rSource.mpConnectedSdrObject;
mnConnectorId = rSource.mnConnectorId;
mbBestConnection = rSource.mbBestConnection;
- mbBestVertex = rSource.mbBestVertex;
mbAutoVertex = rSource.mbAutoVertex;
- if(mpOwner && mpConnectedSdrObject)
+ if(mpOwner && mpConnectedSdrObject && mpOwner->getSdrPageFromSdrObject())
{
StartListening(*mpConnectedSdrObject);
}
@@ -266,6 +263,18 @@ SdrObjConnection& SdrObjConnection::operator=(const SdrObjConnection& rSource)
return *this;
}
+void SdrObjConnection::adaptBestConnectionPosition(const basegfx::B2DPoint& rPosition)
+{
+ if(IsBestConnection() || (mpOwner && mpOwner->mbEdgeTrackUserDefined))
+ {
+ maPosition = rPosition;
+ }
+ else
+ {
+ OSL_ENSURE(false, "SdrObjConnection::adaptBestConnectionPosition only allowed for BestConnection or UserDefined (!)");
+ }
+}
+
void SdrObjConnection::SetPosition(const basegfx::B2DPoint& rPosition)
{
basegfx::B2DPoint aNewPosition(rPosition);
@@ -297,7 +306,7 @@ void SdrObjConnection::SetConnectedSdrObject(SdrObject* pConnectedSdrObject)
mpConnectedSdrObject = pConnectedSdrObject;
- if(mpOwner && mpConnectedSdrObject)
+ if(mpOwner && mpConnectedSdrObject && mpOwner->getSdrPageFromSdrObject())
{
StartListening(*mpConnectedSdrObject);
}
@@ -315,6 +324,21 @@ void SdrObjConnection::SetConnectorID(sal_uInt32 nNew)
}
}
+void SdrObjConnection::ownerPageChange()
+{
+ if(mpOwner && mpConnectedSdrObject)
+ {
+ if(mpOwner->getSdrPageFromSdrObject())
+ {
+ StartListening(*mpConnectedSdrObject);
+ }
+ else
+ {
+ EndListening(*mpConnectedSdrObject);
+ }
+ }
+}
+
bool SdrObjConnection::TakeGluePoint(sdr::glue::GluePoint& rGP) const
{
if(mpConnectedSdrObject)
@@ -388,6 +412,9 @@ public:
long ImpGetLineVersatz(SdrEdgeLineCode eLineCode, sal_uInt32 nPointCount) const;
void ImpResetUserDistances() { aObj1Line2 = aObj1Line3 = aObj2Line2 = aObj2Line3 = aMiddleLine = basegfx::B2DPoint(); }
bool ImpUsesUserDistances() const;
+
+ bool operator==(const SdrEdgeInfoRec& rCompare) const;
+ bool operator!=(const SdrEdgeInfoRec& rCompare) const { return !operator==(rCompare); }
};
basegfx::B2DPoint& SdrEdgeInfoRec::ImpGetLineVersatzPoint(SdrEdgeLineCode eLineCode)
@@ -473,16 +500,45 @@ bool SdrEdgeInfoRec::ImpUsesUserDistances() const
return false;
}
+bool SdrEdgeInfoRec::operator==(const SdrEdgeInfoRec& rCompare) const
+{
+ return aObj1Line2.equal(rCompare.aObj1Line2)
+ && aObj1Line3.equal(rCompare.aObj1Line3)
+ && aObj2Line2.equal(rCompare.aObj2Line2)
+ && aObj2Line3.equal(rCompare.aObj2Line3)
+ && aMiddleLine.equal(rCompare.aMiddleLine)
+ && nAngle1 == rCompare.nAngle1
+ && nAngle2 == rCompare.nAngle2
+ && nObj1Lines == rCompare.nObj1Lines
+ && nObj2Lines == rCompare.nObj2Lines
+ && nMiddleLine == rCompare.nMiddleLine
+ && cOrthoForm == rCompare.cOrthoForm;
+}
+
////////////////////////////////////////////////////////////////////////////////////////////////////
-SdrEdgeObjGeoData::SdrEdgeObjGeoData()
-: mpCon1(new SdrObjConnection(0)),
- mpCon2(new SdrObjConnection(0)),
- maEdgeTrack(),
- mpEdgeInfo(new SdrEdgeInfoRec()),
- mbEdgeTrackUserDefined(false)
+class SdrEdgeObjGeoData : public SdrObjGeoData
{
-}
+public:
+ SdrObjConnection* mpCon1; // Verbindungszustand des Linienanfangs
+ SdrObjConnection* mpCon2; // Verbindungszustand des Linienendes
+ basegfx::B2DPolygon maEdgeTrack;
+ SdrEdgeInfoRec* mpEdgeInfo;
+
+ /// bitfield
+ bool mbEdgeTrackUserDefined : 1;
+
+ SdrEdgeObjGeoData()
+ : mpCon1(new SdrObjConnection(0)),
+ mpCon2(new SdrObjConnection(0)),
+ maEdgeTrack(),
+ mpEdgeInfo(new SdrEdgeInfoRec()),
+ mbEdgeTrackUserDefined(false)
+ {
+ }
+
+ virtual ~SdrEdgeObjGeoData();
+};
SdrEdgeObjGeoData::~SdrEdgeObjGeoData()
{
@@ -778,11 +834,11 @@ namespace
}
}
}
- #ifdef DBG_UTIL
+#ifdef DBG_UTIL
if (aXP.GetPointCount()>4) {
DBG_ERROR("SdrEdgeObj::impOldCalcObjToCenter(): Polygon hat mehr als 4 Punkte!");
}
- #endif
+#endif
return aXP;
}
@@ -1597,6 +1653,19 @@ SdrObject* SdrEdgeObj::CloneSdrObject(SdrModel* pTargetModel) const
return pClone;
}
+void SdrEdgeObj::handlePageChange(SdrPage* pOldPage, SdrPage* pNewPage)
+{
+ if(pOldPage != pNewPage)
+ {
+ // call parent
+ SdrTextObj::handlePageChange(pOldPage, pNewPage);
+
+ // check broadcasters; when we are not inserted we do not need broadcasters
+ mpCon1->ownerPageChange();
+ mpCon2->ownerPageChange();
+ }
+}
+
bool SdrEdgeObj::IsClosedObj() const
{
return false;
@@ -1842,51 +1911,60 @@ bool SdrEdgeObj::CheckSdrObjectConnection(bool bTail) const
if(!pConnectedNode)
{
+ // not connected to any object -> no valid connection
return false;
}
+ const SdrObjConnection& rCon(bTail ? *mpCon1 : *mpCon2);
const sdr::glue::GluePointProvider& rProvider = pConnectedNode->GetGluePointProvider();
- if(rProvider.hasUserGluePoints())
+ if(rCon.IsBestConnection() && (rProvider.hasUserGluePoints() || rProvider.getAutoGluePointCount()))
{
- const sdr::glue::GluePointVector aGluePointVector(rProvider.getUserGluePointVector());
- const sal_uInt32 nConAnz(aGluePointVector.size());
- const sal_uInt32 nGesAnz(nConAnz + rProvider.getAutoGluePointCount());
- const SdrObjConnection& rCon(bTail ? *mpCon1 : *mpCon2);
- const basegfx::B2DPoint aCurrentPosition(rCon.GetPosition());
+ // best connection is always valid when there are any GluePoints
+ return true;
+ }
+
+ const basegfx::B2DPoint aCurrentPosition(rCon.GetPosition());
+
+ if(rCon.IsAutoVertex())
+ {
+ // AutoGluePoints
+ const sal_uInt32 nConAnz(rProvider.getAutoGluePointCount());
- for(sal_uInt32 i(0); i < nGesAnz; i++)
+ for(sal_uInt32 i(0); i < nConAnz; i++)
{
- if(i < nConAnz)
+ const sdr::glue::GluePoint aPt(rProvider.getAutoGluePointByIndex(i));
+ const basegfx::B2DPoint aGluePos(pConnectedNode->getSdrObjectTransformation() * aPt.getUnitPosition());
+
+ if(aCurrentPosition.equal(aGluePos))
{
- // UserDefined or CustomShape
- const sdr::glue::GluePoint* pCandidate = aGluePointVector[i];
+ return true;
+ }
+ }
+ }
+ else
+ {
+ // User-Defined (or CustomShape) GluePoints
+ const sdr::glue::GluePointVector aGluePointVector(rProvider.getUserGluePointVector());
+ const sal_uInt32 nConAnz(aGluePointVector.size());
- if(pCandidate)
- {
- const basegfx::B2DPoint aGluePos(pConnectedNode->getSdrObjectTransformation() * pCandidate->getUnitPosition());
+ for(sal_uInt32 i(0); i < nConAnz; i++)
+ {
+ const sdr::glue::GluePoint* pCandidate = aGluePointVector[i];
- if(aCurrentPosition.equal(aGluePos))
- {
- return true;
- }
- }
- else
- {
- OSL_ENSURE(false, "Got sdr::glue::PointVector with emty entries (!)");
- }
- }
- else //if (i<nConAnz+4)
+ if(pCandidate)
{
- // Vertex
- const sdr::glue::GluePoint aPt(rProvider.getAutoGluePointByIndex(i - nConAnz));
- const basegfx::B2DPoint aGluePos(pConnectedNode->getSdrObjectTransformation() * aPt.getUnitPosition());
+ const basegfx::B2DPoint aGluePos(pConnectedNode->getSdrObjectTransformation() * pCandidate->getUnitPosition());
if(aCurrentPosition.equal(aGluePos))
{
return true;
}
}
+ else
+ {
+ OSL_ENSURE(false, "Got sdr::glue::PointVector with emty entries (!)");
+ }
}
}
@@ -1953,12 +2031,47 @@ void SdrEdgeObj::ImpRecalcEdgeTrack()
// SdrEdgeObj BoundRect calculations
mbBoundRectCalculationRunning = true;
+ // remember current SdrEdgeInfoRec and new polygon
+ const SdrEdgeInfoRec aPreserved(*mpEdgeInfo);
+ const basegfx::B2DPolygon aNew(ImpCalcEdgeTrack(*mpCon1, *mpCon2, mpEdgeInfo, 0, 0));
+ bool bBroadcastChange(false);
+
+ if(aNew != maEdgeTrack)
+ {
+ maEdgeTrack = aNew;
+
+ // if connections are in 'BestConnection' mode, update their oposition to the
+ // computed one, just to make sure when that data is fetched from the connection
+ // itself that it is correct
+ if(maEdgeTrack.count())
+ {
+ const basegfx::B2DPoint aStart(maEdgeTrack.getB2DPoint(0));
+ const basegfx::B2DPoint aEnd(maEdgeTrack.getB2DPoint(maEdgeTrack.count() - 1));
+
+ if(mpCon1->IsBestConnection())
+ {
+ mpCon1->adaptBestConnectionPosition(aStart);
+ }
+
+ if(mpCon2->IsBestConnection())
+ {
+ mpCon2->adaptBestConnectionPosition(aEnd);
+ }
+ }
+
+ bBroadcastChange = true;
+ }
+
+ if(aPreserved != *mpEdgeInfo)
+ {
+ ImpSetEdgeInfoToAttr();
+ bBroadcastChange = true;
+ }
+
+ if(bBroadcastChange)
{
// use local scope to trigger locally
const SdrObjectChangeBroadcaster aSdrObjectChangeBroadcaster(*this);
-
- maEdgeTrack = ImpCalcEdgeTrack(*mpCon1, *mpCon2, mpEdgeInfo, 0, 0);
- ImpSetEdgeInfoToAttr(); // Die Werte aus mpEdgeInfo in den Pool kopieren
}
// #110649#
@@ -1984,7 +2097,7 @@ basegfx::B2DPolygon SdrEdgeObj::ImpCalcEdgeTrack(
basegfx::B2DRange aBoundRange2;
basegfx::B2DRange aBewareRange1;
basegfx::B2DRange aBewareRange2;
- const const SdrPage* pOwningPage = getSdrPageFromSdrObject();
+ const SdrPage* pOwningPage = getSdrPageFromSdrObject();
const bool bCon1(rCon1.GetConnectedSdrObject() && (!pOwningPage || rCon1.GetConnectedSdrObject()->getSdrPageFromSdrObject() == pOwningPage));
const bool bCon2(rCon2.GetConnectedSdrObject() && (!pOwningPage || rCon2.GetConnectedSdrObject()->getSdrPageFromSdrObject() == pOwningPage));
const SfxItemSet& rSet = GetObjectItemSet();
@@ -2051,8 +2164,8 @@ basegfx::B2DPolygon SdrEdgeObj::ImpCalcEdgeTrack(
sal_uInt32 nBestQual=0xFFFFFFFF;
SdrEdgeInfoRec aBestInfo;
- const bool bAuto1(bCon1 && rCon1.IsBestVertex());
- const bool bAuto2(bCon2 && rCon2.IsBestVertex());
+ const bool bAuto1(bCon1 && rCon1.IsBestConnection());
+ const bool bAuto2(bCon2 && rCon2.IsBestConnection());
if(bAuto1)
{
@@ -2203,16 +2316,6 @@ basegfx::B2DPolygon SdrEdgeObj::ImpCalcEdgeTrack(
return aRetval;
}
-void SdrEdgeObj::StyleSheetChanged()
-{
- if(mpCon1->GetConnectedSdrObject() || mpCon2->GetConnectedSdrObject())
- {
- ImpSetAttrToEdgeInfo();
- SetEdgeTrackDirty();
- SetChanged();
- }
-}
-
void SdrEdgeObj::TakeObjNameSingul(XubString& rName) const
{
rName=ImpGetResStr(STR_ObjNameSingulEDGE);
@@ -2245,10 +2348,10 @@ void SdrEdgeObj::SetEdgeTrackPath(const basegfx::B2DPolygon& rPoly)
mbEdgeTrackUserDefined = true;
mpCon1->SetConnectedSdrObject(0);
- mpCon1->SetPosition(maEdgeTrack.getB2DPoint(0));
+ mpCon1->adaptBestConnectionPosition(maEdgeTrack.getB2DPoint(0));
mpCon2->SetConnectedSdrObject(0);
- mpCon2->SetPosition(maEdgeTrack.getB2DPoint(maEdgeTrack.count() - 1));
+ mpCon2->adaptBestConnectionPosition(maEdgeTrack.getB2DPoint(maEdgeTrack.count() - 1));
}
else
{
@@ -2345,7 +2448,7 @@ SdrHdl* SdrEdgeObj::impOldGetHdl(SdrHdlList& rHdlList, sal_uInt32 nHdlNum) const
{
pHdl = new ImpEdgeHdl(rHdlList, *this, HDL_POLY, mpCon1->GetPosition());
- if(mpCon1->GetConnectedSdrObject() && mpCon1->IsBestVertex())
+ if(mpCon1->GetConnectedSdrObject() && mpCon1->IsBestConnection())
{
pHdl->Set1PixMore(true);
}
@@ -2354,7 +2457,7 @@ SdrHdl* SdrEdgeObj::impOldGetHdl(SdrHdlList& rHdlList, sal_uInt32 nHdlNum) const
{
pHdl = new ImpEdgeHdl(rHdlList, *this, HDL_POLY, mpCon2->GetPosition());
- if(mpCon2->GetConnectedSdrObject() && mpCon2->IsBestVertex())
+ if(mpCon2->GetConnectedSdrObject() && mpCon2->IsBestConnection())
{
pHdl->Set1PixMore(true);
}
@@ -2527,7 +2630,6 @@ bool SdrEdgeObj::applySpecialDrag(SdrDragStat& rDragStat)
rDraggedOne.SetPosition(rDragStat.GetNow());
rDraggedOne.SetConnectorID(nID);
rDraggedOne.setBestConnection(bBest);
- rDraggedOne.setBestVertex(bBest);
rDraggedOne.setAutoVertex(bAuto);
rDraggedOne.SetConnectedSdrObject(pNewContact);
@@ -2573,6 +2675,10 @@ bool SdrEdgeObj::applySpecialDrag(SdrDragStat& rDragStat)
// hide connect marker helper again when original gets changed.
// This happens at the end of the interaction
rDragStat.GetSdrViewFromSdrDragStat().HideConnectMarker();
+
+ // modified is needed at the end of interaction, too
+ SetEdgeTrackDirty();
+ SetChanged();
}
return true;
@@ -2639,12 +2745,12 @@ basegfx::B2DPolygon SdrEdgeObj::CreateConnectorOverlay(
basegfx::B2DPoint aPt1(mpCon1->GetPosition());
basegfx::B2DPoint aPt2(mpCon2->GetPosition());
- if(mpCon1->GetConnectedSdrObject() && (mpCon1->IsBestConnection() || mpCon1->IsBestVertex()))
+ if(mpCon1->GetConnectedSdrObject() && mpCon1->IsBestConnection())
{
aPt1 = mpCon1->GetConnectedSdrObject()->getSdrObjectTransformation() * basegfx::B2DPoint(0.5, 0.5);
}
- if(mpCon2->GetConnectedSdrObject() && (mpCon2->IsBestConnection() || mpCon2->IsBestVertex()))
+ if(mpCon2->GetConnectedSdrObject() && mpCon2->IsBestConnection())
{
aPt2 = mpCon2->GetConnectedSdrObject()->getSdrObjectTransformation() * basegfx::B2DPoint(0.5, 0.5);
}
@@ -2686,7 +2792,13 @@ bool SdrEdgeObj::BegCreate(SdrDragStat& rDragStat)
bool bBest(false);
bool bAuto(false);
- mpCon1->SetConnectedSdrObject(rSdrView.FindConnector(rDragStat.GetStart(), nID, bBest, bAuto, this));
+ // look for new connection
+ SdrObject* pNewContact = rSdrView.FindConnector(rDragStat.GetStart(), nID, bBest, bAuto, this);
+
+ mpCon1->SetConnectorID(nID);
+ mpCon1->setBestConnection(bBest);
+ mpCon1->setAutoVertex(bAuto);
+ mpCon1->SetConnectedSdrObject(pNewContact);
}
return true;
@@ -2707,8 +2819,15 @@ bool SdrEdgeObj::MovCreate(SdrDragStat& rDragStat)
bool bBest(false);
bool bAuto(false);
- mpCon2->SetConnectedSdrObject(rSdrView.FindConnector(rDragStat.GetNow(), nID, bBest, bAuto, this));
- rDragStat.GetSdrViewFromSdrDragStat().SetConnectMarker(mpCon2->GetConnectedSdrObject());
+ // look for new connection
+ SdrObject* pNewContact = rSdrView.FindConnector(rDragStat.GetNow(), nID, bBest, bAuto, this);
+
+ mpCon2->SetConnectorID(nID);
+ mpCon2->setBestConnection(bBest);
+ mpCon2->setAutoVertex(bAuto);
+ mpCon2->SetConnectedSdrObject(pNewContact);
+
+ rDragStat.GetSdrViewFromSdrDragStat().SetConnectMarker(pNewContact);
}
return true;
@@ -2788,10 +2907,10 @@ void SdrEdgeObj::setSdrObjectTransformation(const basegfx::B2DHomMatrix& rTransf
maEdgeTrack.transform(aCompleteTransform);
mpCon1->SetConnectedSdrObject(0);
- mpCon1->SetPosition(maEdgeTrack.getB2DPoint(0));
+ mpCon1->adaptBestConnectionPosition(maEdgeTrack.getB2DPoint(0));
mpCon2->SetConnectedSdrObject(0);
- mpCon2->SetPosition(maEdgeTrack.getB2DPoint(maEdgeTrack.count() - 1));
+ mpCon2->adaptBestConnectionPosition(maEdgeTrack.getB2DPoint(maEdgeTrack.count() - 1));
}
else
{
@@ -2967,7 +3086,6 @@ void SdrEdgeObj::setGluePointIndex(bool bTail, sal_Int32 nIndex /* = -1 */ )
rConn1.SetConnectorID(nIndex);
rConn1.setBestConnection(nIndex < 0);
- rConn1.setBestVertex(nIndex < 0);
rConn1.setAutoVertex(nIndex >= 0 && nIndex <= 3);
}