summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Le Grand <alg@apache.org>2013-11-18 17:20:49 +0000
committerArmin Le Grand <alg@apache.org>2013-11-18 17:20:49 +0000
commit3e7d04fab78e5cc0aabd545283acc0dfe60ef86e (patch)
tree7bb3e09502b466686c2b28d3a09eb9b756c108a9
parente9a2d5e2889fe43565fcf453fa9db3875187d20b (diff)
Continued connector and gluepoint cleanup, further reworks
-rw-r--r--filter/source/msfilter/eschesdo.cxx30
-rw-r--r--filter/source/msfilter/msdffimp.cxx6
-rw-r--r--sc/source/core/data/drwlayer.cxx2
-rw-r--r--sc/source/filter/excel/xiescher.cxx2
-rw-r--r--sc/source/ui/drawfunc/fuconarc.cxx4
-rw-r--r--sc/source/ui/drawfunc/fuconpol.cxx102
-rw-r--r--sc/source/ui/drawfunc/fuconrec.cxx14
-rw-r--r--sc/source/ui/drawfunc/fudraw.cxx3
-rw-r--r--sd/source/core/sdpage.cxx4
-rw-r--r--sd/source/filter/eppt/eppt.hxx3
-rw-r--r--sd/source/filter/eppt/epptso.cxx1
-rw-r--r--sd/source/ui/animations/motionpathtag.cxx5
-rw-r--r--sd/source/ui/annotations/annotationtag.cxx4
-rw-r--r--sd/source/ui/app/sdxfer.cxx2
-rw-r--r--sd/source/ui/dlg/sdpreslt.cxx45
-rw-r--r--sd/source/ui/func/fucon3d.cxx6
-rw-r--r--sd/source/ui/func/fuconarc.cxx3
-rw-r--r--sd/source/ui/func/fuconbez.cxx144
-rw-r--r--sd/source/ui/func/fuconcs.cxx7
-rw-r--r--sd/source/ui/func/fuconrec.cxx15
-rw-r--r--sd/source/ui/func/fuconstr.cxx14
-rw-r--r--sd/source/ui/func/fuconuno.cxx3
-rw-r--r--sd/source/ui/func/fudraw.cxx9
-rw-r--r--sd/source/ui/func/fuediglu.cxx20
-rw-r--r--sd/source/ui/func/fuformatpaintbrush.cxx8
-rw-r--r--sd/source/ui/func/fuinsert.cxx10
-rw-r--r--sd/source/ui/func/fupoor.cxx10
-rw-r--r--sd/source/ui/func/fusel.cxx68
-rw-r--r--sd/source/ui/func/fusnapln.cxx3
-rw-r--r--sd/source/ui/func/futext.cxx24
-rw-r--r--sd/source/ui/func/fuzoom.cxx3
-rw-r--r--sd/source/ui/inc/fupoor.hxx1
-rw-r--r--sd/source/ui/inc/sdpreslt.hxx1
-rw-r--r--sd/source/ui/view/drviews2.cxx3
-rw-r--r--sd/source/ui/view/drviews3.cxx3
-rw-r--r--sd/source/ui/view/drviews4.cxx3
-rw-r--r--sd/source/ui/view/drviewsc.cxx1
-rw-r--r--sd/source/ui/view/sdview3.cxx36
-rw-r--r--svx/inc/svx/galleryitem.hxx2
-rw-r--r--svx/inc/svx/obj3d.hxx2
-rw-r--r--svx/inc/svx/svdcrtv.hxx3
-rw-r--r--svx/inc/svx/svdedtv.hxx1
-rw-r--r--svx/inc/svx/svdobj.hxx7
-rw-r--r--svx/inc/svx/svdoedge.hxx370
-rw-r--r--svx/inc/svx/svdograf.hxx2
-rw-r--r--svx/inc/svx/svdouno.hxx2
-rw-r--r--svx/inc/svx/svdview.hxx9
-rw-r--r--svx/source/dialog/connctrl.cxx26
-rw-r--r--svx/source/engine3d/obj3d.cxx8
-rw-r--r--svx/source/engine3d/scene3d.cxx3
-rw-r--r--svx/source/form/fmview.cxx2
-rw-r--r--svx/source/svdraw/clonelist.cxx8
-rw-r--r--svx/source/svdraw/svdcrtv.cxx18
-rw-r--r--svx/source/svdraw/svddrgmt.cxx19
-rw-r--r--svx/source/svdraw/svddrgv.cxx16
-rw-r--r--svx/source/svdraw/svdedtv.cxx42
-rw-r--r--svx/source/svdraw/svdedtv1.cxx49
-rw-r--r--svx/source/svdraw/svdedtv2.cxx11
-rw-r--r--svx/source/svdraw/svdhdl.cxx28
-rw-r--r--svx/source/svdraw/svdmodel.cxx36
-rw-r--r--svx/source/svdraw/svdmrkv.cxx3
-rw-r--r--svx/source/svdraw/svdobj.cxx74
-rw-r--r--svx/source/svdraw/svdoedge.cxx3441
-rw-r--r--svx/source/svdraw/svdograf.cxx8
-rw-r--r--svx/source/svdraw/svdotxtr.cxx15
-rw-r--r--svx/source/svdraw/svdouno.cxx8
-rw-r--r--svx/source/svdraw/svdpage.cxx8
-rw-r--r--svx/source/svdraw/svdview.cxx115
-rw-r--r--svx/source/unodraw/unoshap2.cxx8
-rw-r--r--svx/source/unodraw/unoshape.cxx24
-rw-r--r--sw/source/core/frmedt/feshview.cxx3
-rw-r--r--sw/source/core/text/txtfly.cxx2
-rw-r--r--sw/source/core/text/txtio.cxx4
-rw-r--r--sw/source/ui/uiview/viewdraw.cxx3
74 files changed, 2313 insertions, 2689 deletions
diff --git a/filter/source/msfilter/eschesdo.cxx b/filter/source/msfilter/eschesdo.cxx
index 44eff1e5b019..6d0b2cd70713 100644
--- a/filter/source/msfilter/eschesdo.cxx
+++ b/filter/source/msfilter/eschesdo.cxx
@@ -279,28 +279,15 @@ sal_uInt32 ImplEESdrWriter::ImplWriteShape( ImplEESdrObject& rObj,
break;
}
- // TTTT: Moved to below (at transformation)
- // rObj.SetAngle( rObj.ImplGetInt32PropertyValue( ::rtl::OUString::createFromAscii("RotateAngle") ));
-
if( ( rObj.ImplGetPropertyValue( ::rtl::OUString::createFromAscii("IsFontwork") ) &&
::cppu::any2bool( rObj.GetUsrAny() ) ) ||
rObj.GetType().EqualsAscii( "drawing.Measure" ) || rObj.GetType().EqualsAscii( "drawing.Caption" ) )
{
-/*
- if( rObj.ImplGetPropertyValue( ::rtl::OUString::createFromAscii("BoundRect") ) )
- {
- ::com::sun::star::awt::Rectangle aRect( *(::com::sun::star::awt::Rectangle*)rObj.GetUsrAny().getValue() );
- rObj.SetRange( ImplMapB2DPoint( Point( aRect.X, aRect.Y ) ),
- ImplMapB2DVector( Size( aRect.Width, aRect.Height ) ) );
- }
-*/
rObj.SetType( String( RTL_CONSTASCII_STRINGPARAM(
"drawing.dontknow" ),
RTL_TEXTENCODING_MS_1252 ));
}
- // TTTT: adapted to transformation
- // TTTT: Check mirroring exports for ALL shape types
basegfx::B2DRange aObjectRange(0.0, 0.0, 1.0, 1.0);
sal_uInt32 nMirrorFlags(0);
@@ -358,15 +345,13 @@ sal_uInt32 ImplEESdrWriter::ImplWriteShape( ImplEESdrObject& rObj,
if ( rObj.GetType().EqualsAscii( "drawing.Custom" ) )
{
mpEscherEx->OpenContainer( ESCHER_SpContainer );
- // TTTT: remove when checked sal_uInt32 nMirrorFlags;
-
rtl::OUString sCustomShapeType;
- MSO_SPT eShapeType = aPropOpt.GetCustomShapeType( rObj.GetShapeRef(), /*nMirrorFlags, */sCustomShapeType );
+ MSO_SPT eShapeType = aPropOpt.GetCustomShapeType( rObj.GetShapeRef(), sCustomShapeType );
if ( sCustomShapeType.equalsAscii( "col-502ad400" ) || sCustomShapeType.equalsAscii( "col-60da8460" ) )
{
ADD_SHAPE(
ESCHER_ShpInst_PictureFrame,
- 0xa00 ); // TTTT: no mirroring, metafile export version
+ 0xa00 ); // no mirroring, metafile export version
if ( aPropOpt.CreateGraphicProperties( rObj.mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "MetaFile" ) ), false ) )
{
aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
@@ -604,13 +589,6 @@ sal_uInt32 ImplEESdrWriter::ImplWriteShape( ImplEESdrObject& rObj,
mpEscherEx->OpenContainer( ESCHER_SpContainer );
- // TTTT: Mirroring alraedy done above
- //sal_uInt32 nFlags = 0xa00; // Flags: Connector | HasSpt
- //if( aNewRect.Height < 0 )
- // nFlags |= 0x80; // Flags: VertMirror
- //if( aNewRect.Width < 0 )
- // nFlags |= 0x40; // Flags: HorzMirror
-
ADD_SHAPE(
ESCHER_ShpInst_Line,
nMirrorFlags ); // Flags: mirror
@@ -874,7 +852,6 @@ void ImplEESdrWriter::ImplWriteAdditionalText( ImplEESdrObject& rObj,
if ( mpHostAppData && mpHostAppData->DontWriteShape() )
break;
- // TTTT: adapted to transformation
basegfx::B2DRange aObjectRange(0.0, 0.0, 1.0, 1.0);
sal_uInt32 nMirrorFlags(0);
@@ -919,9 +896,6 @@ void ImplEESdrWriter::ImplWriteAdditionalText( ImplEESdrObject& rObj,
EscherPropertyContainer aPropOpt( mpEscherEx->GetGraphicProvider(), mpPicStrm, aObjectRange );
- // TTTT: Done above, see transformation
- // rObj.SetAngle( rObj.ImplGetInt32PropertyValue( ::rtl::OUString::createFromAscii("RotateAngle")));
-
sal_Int32 nAngle = rObj.GetAngle();
if( rObj.GetType().EqualsAscii( "drawing.Line" ))
{
diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx
index 913144270697..c9bb76029dd6 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -4660,8 +4660,8 @@ SdrObject* SvxMSDffManager::ImportShape( const DffRecordHeader& rHd, SvStream& r
// before clearing the GeometryItem we have to store the current Coordinates
const uno::Any* pAny = ((SdrCustomShapeGeometryItem&)aGeometryItem).GetPropertyValueByName( sPath, sCoordinates );
basegfx::B2DRange aPolyBoundRect;
-
basegfx::B2DPoint aStartPt(0.0, 0.0);
+
if ( pAny && ( *pAny >>= seqCoordinates ) && ( seqCoordinates.getLength() >= 4 ) )
{
sal_Int32 nPtNum, nNumElemVert = seqCoordinates.getLength();
@@ -4923,8 +4923,8 @@ SdrObject* SvxMSDffManager::ImportShape( const DffRecordHeader& rHd, SvStream& r
// Konnektoren
MSO_ConnectorStyle eConnectorStyle = (MSO_ConnectorStyle)GetPropertyValue( DFF_Prop_cxstyle, mso_cxstyleStraight );
- pSdrEdgeObj->ConnectToNode(sal_True, NULL);
- pSdrEdgeObj->ConnectToNode(sal_False, NULL);
+ pSdrEdgeObj->ConnectToSdrObject(true, NULL);
+ pSdrEdgeObj->ConnectToSdrObject(false, NULL);
Point aPoint1( basegfx::fround(aObjData.aBoundRect.getMinX()), basegfx::fround(aObjData.aBoundRect.getMinY()) );
Point aPoint2( basegfx::fround(aObjData.aBoundRect.getMaxX()), basegfx::fround(aObjData.aBoundRect.getMaxY()) );
diff --git a/sc/source/core/data/drwlayer.cxx b/sc/source/core/data/drwlayer.cxx
index 25c9c9fd03b5..f8773bff6fdb 100644
--- a/sc/source/core/data/drwlayer.cxx
+++ b/sc/source/core/data/drwlayer.cxx
@@ -945,7 +945,7 @@ void ScDrawLayer::MoveAreaTwips( SCTAB nTab, const Rectangle& rArea,
{
// hier nichts
}
- else if (pObject->IsSdrEdgeObj()) // Verbinder?
+ else if (dynamic_cast< SdrEdgeObj* >(pObject)) // Verbinder?
{
// hier auch nichts
//! nicht verbundene Enden wie bei Linien (s.u.) behandeln?
diff --git a/sc/source/filter/excel/xiescher.cxx b/sc/source/filter/excel/xiescher.cxx
index 701cbe24a3c1..325c671fe04c 100644
--- a/sc/source/filter/excel/xiescher.cxx
+++ b/sc/source/filter/excel/xiescher.cxx
@@ -3495,7 +3495,7 @@ SdrObject* XclImpDffConverter::ProcessObj( SvStream& rDffStrm, DffObjData& rDffO
*ppTopLevelObj = xDrawObj.get();
// #119010# connectors don't have to be area objects
- if(xSdrObj->IsSdrEdgeObj())
+ if(dynamic_cast< SdrEdgeObj* >(xSdrObj.get()))
xDrawObj->SetAreaObj( false );
/* Check for valid size for all objects. Needed to ignore lots of invisible
diff --git a/sc/source/ui/drawfunc/fuconarc.cxx b/sc/source/ui/drawfunc/fuconarc.cxx
index 723243813597..6b6b595a4d70 100644
--- a/sc/source/ui/drawfunc/fuconarc.cxx
+++ b/sc/source/ui/drawfunc/fuconarc.cxx
@@ -186,10 +186,6 @@ void FuConstArc::Deactivate()
// #98185# Create default drawing objects via keyboard
SdrObject* FuConstArc::CreateDefaultObject(const sal_uInt16 nID, const basegfx::B2DRange& rRange)
{
- // case SID_DRAW_ARC:
- // case SID_DRAW_PIE:
- // case SID_DRAW_CIRCLECUT:
-
SdrObject* pObj = SdrObjFactory::MakeNewObject(
pView->getSdrModelFromSdrView(),
pView->getSdrObjectCreationInfo());
diff --git a/sc/source/ui/drawfunc/fuconpol.cxx b/sc/source/ui/drawfunc/fuconpol.cxx
index 48696b56f357..3d861974400d 100644
--- a/sc/source/ui/drawfunc/fuconpol.cxx
+++ b/sc/source/ui/drawfunc/fuconpol.cxx
@@ -279,108 +279,6 @@ SdrObject* FuConstPolygon::CreateDefaultObject(const sal_uInt16 nID, const baseg
}
return pRetval;
-
- // TTTT
-// // case SID_DRAW_POLYGON:
-// // case SID_DRAW_POLYGON_NOFILL:
-// // case SID_DRAW_BEZIER_NOFILL:
-// // case SID_DRAW_FREELINE_NOFILL:
-//
-// SdrObject* pObj = SdrObjFactory::MakeNewObject(
-// pView->getSdrModelFromSdrView(),
-// pView->getSdrObjectCreationInfo());
-//
-// if(pObj)
-// {
-// SdrPathObj* pSdrPathObj = dynamic_cast< SdrPathObj* >(pObj);
-//
-// if(pSdrPathObj)
-// {
-// basegfx::B2DPolyPolygon aPoly;
-//
-// switch(nID)
-// {
-// case SID_DRAW_BEZIER_NOFILL:
-// {
-// basegfx::B2DPolygon aInnerPoly;
-//
-// aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX(), rRange.getMaxY()));
-//
-// const basegfx::B2DPoint aCenterBottom(rRange.getCenterX(), rRange.getMaxY());
-// aInnerPoly.appendBezierSegment(
-// aCenterBottom,
-// aCenterBottom,
-// rRange.getCenter());
-//
-// const basegfx::B2DPoint aCenterTop(rRange.getCenterX(), rRange.getMinY());
-// aInnerPoly.appendBezierSegment(
-// aCenterTop,
-// aCenterTop,
-// basegfx::B2DPoint(rRange.getMaxX(), rRange.getMinY()));
-//
-// aPoly.append(aInnerPoly);
-// break;
-// }
-// case SID_DRAW_FREELINE_NOFILL:
-// {
-// basegfx::B2DPolygon aInnerPoly;
-//
-// aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX(), rRange.getMaxY()));
-//
-// aInnerPoly.appendBezierSegment(
-// rRange.getMinimum(),
-// basegfx::B2DPoint(rRange.getCenterX(), rRange.getMinY()),
-// rRange.getCenter());
-//
-// aInnerPoly.appendBezierSegment(
-// basegfx::B2DPoint(rRange.getCenterX(), rRange.getMaxY()),
-// basegfx::B2DPoint(rRange.getMaxX(), rRange.getMaxY()),
-// basegfx::B2DPoint(rRange.getMaxX(), rRange.getMinY()));
-//
-// aPoly.append(aInnerPoly);
-// break;
-// }
-// case SID_DRAW_POLYGON:
-// case SID_DRAW_POLYGON_NOFILL:
-// {
-// basegfx::B2DPolygon aInnerPoly;
-// const double fWdt(rRange.getWidth());
-// const double fHgt(rRange.getHeight());
-//
-// aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX(), rRange.getMaxY()));
-// aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX() + fWdt * 0.3, rRange.getMinY() + fHgt * 0.7));
-// aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX(), rRange.getMinY() + fHgt * 0.15));
-// aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX() + fWdt * 0.65, rRange.getMinY()));
-// aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX() + fWdt, rRange.getMinY() + fHgt * 0.3));
-// aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX() + fWdt * 0.8, rRange.getMinY() + fHgt * 0.5));
-// aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX() + fWdt * 0.8, rRange.getMinY() + fHgt * 0.75));
-// aInnerPoly.append(basegfx::B2DPoint(rRange.getMaxY(), rRange.getMaxX()));
-//
-// if(SID_DRAW_POLYGON_NOFILL == nID)
-// {
-// aInnerPoly.append(basegfx::B2DPoint(rRange.getCenterX(), rRange.getMaxY()));
-// }
-// else
-// {
-// aInnerPoly.setClosed(true);
-// }
-//
-// aPoly.append(aInnerPoly);
-// break;
-// }
-// }
-//
-// pSdrPathObj->setB2DPolyPolygonInObjectCoordinates(aPoly);
-// }
-// else
-// {
-// DBG_ERROR("Object is NO path object");
-// }
-//
-// sdr::legacy::SetLogicRange(*pObj, rRange);
-// }
-//
-// return pObj;
}
// eof
diff --git a/sc/source/ui/drawfunc/fuconrec.cxx b/sc/source/ui/drawfunc/fuconrec.cxx
index eb71b9ccef76..f0e50bc7eb86 100644
--- a/sc/source/ui/drawfunc/fuconrec.cxx
+++ b/sc/source/ui/drawfunc/fuconrec.cxx
@@ -221,12 +221,6 @@ void FuConstRectangle::Deactivate()
// #98185# Create default drawing objects via keyboard
SdrObject* FuConstRectangle::CreateDefaultObject(const sal_uInt16 nID, const basegfx::B2DRange& rRange)
{
- // case SID_DRAW_LINE:
- // case SID_DRAW_RECT:
- // case SID_DRAW_ELLIPSE:
- // case SID_DRAW_CAPTION:
- // case SID_DRAW_CAPTION_VERTICAL:
-
SdrObject* pObj = SdrObjFactory::MakeNewObject(
pView->getSdrModelFromSdrView(),
pView->getSdrObjectCreationInfo());
@@ -242,14 +236,6 @@ SdrObject* FuConstRectangle::CreateDefaultObject(const sal_uInt16 nID, const bas
if(pSdrPathObj)
{
initializeDefaultSdrPathObjByObjectType(*pSdrPathObj, DefaultSdrPathObjType_Line, rRange, false);
- //pSdrPathObj->initializeDefaultSdrPathObjBySlotID(nID, rRange);
-
- // TTTT
- //const double fYMiddle((rRange.getMinY() + rRange.getMaxY()) * 0.5);
- //basegfx::B2DPolygon aPoly;
- //aPoly.append(basegfx::B2DPoint(rRange.getMinX(), fYMiddle));
- //aPoly.append(basegfx::B2DPoint(rRange.getMaxX(), fYMiddle));
- //pSdrPathObj->setB2DPolyPolygonInObjectCoordinates(basegfx::B2DPolyPolygon(aPoly));
}
else
{
diff --git a/sc/source/ui/drawfunc/fudraw.cxx b/sc/source/ui/drawfunc/fudraw.cxx
index 40f6c77f567f..4b4ad10a09e7 100644
--- a/sc/source/ui/drawfunc/fudraw.cxx
+++ b/sc/source/ui/drawfunc/fudraw.cxx
@@ -699,9 +699,6 @@ sal_Bool __EXPORT FuDraw::KeyInput(const KeyEvent& rKEvt)
void FuDraw::SelectionHasChanged()
{
- // Not needed TTTT
- //const SdrHdlList& rHdlList = pView->GetHdlList();
- //((SdrHdlList&)rHdlList).ResetFocusHdl();
}
/*************************************************************************
diff --git a/sd/source/core/sdpage.cxx b/sd/source/core/sdpage.cxx
index d981b7a0b974..25655a510ba0 100644
--- a/sd/source/core/sdpage.cxx
+++ b/sd/source/core/sdpage.cxx
@@ -1960,7 +1960,7 @@ void SdPage::ScaleObjects(const basegfx::B2DVector& rNewPageSize, double fLeft,
// #88084# remember aTopLeft as original TopLeft
const basegfx::B2DPoint aTopLeft(pObj->getObjectRange(0).getMinimum());
- if (!pObj->IsSdrEdgeObj())
+ if (!dynamic_cast< SdrEdgeObj* >(pObj))
{
/**************************************************************
* Objekt skalieren
@@ -2128,7 +2128,7 @@ void SdPage::ScaleObjects(const basegfx::B2DVector& rNewPageSize, double fLeft,
}
}
- if (mbScaleObjects && !pObj->IsSdrEdgeObj())
+ if (mbScaleObjects && !dynamic_cast< SdrEdgeObj* >(pObj))
{
// scale object position
const basegfx::B2DPoint aNewPos(
diff --git a/sd/source/filter/eppt/eppt.hxx b/sd/source/filter/eppt/eppt.hxx
index 2c25e6be5180..f07929fcbf18 100644
--- a/sd/source/filter/eppt/eppt.hxx
+++ b/sd/source/filter/eppt/eppt.hxx
@@ -710,10 +710,7 @@ class PPTWriter : public GroupTable, public PropValue, public PPTExBulletProvide
// the object range, split in pos and scale to keep the evtl. negative size (mirroring)
basegfx::B2DRange maObjectRange;
basegfx::tools::B2DHomMatrixBufferedOnDemandDecompose maObjTrans;
-// basegfx::B2DRange maObjectRange; // TTTT mirrored needed here ?!?
sal_uInt32 mnMirrorFlags;
-// bool mbMirroredX;
-// bool mbMirroredY;
double mfObjectRotation;
ByteString mType;
diff --git a/sd/source/filter/eppt/epptso.cxx b/sd/source/filter/eppt/epptso.cxx
index 36d8615d98f6..15993f98dedd 100644
--- a/sd/source/filter/eppt/epptso.cxx
+++ b/sd/source/filter/eppt/epptso.cxx
@@ -4499,7 +4499,6 @@ void PPTWriter::ImplWritePage( const PHLayout& rLayout, EscherSolverContainer& a
if ( mType == "drawing.Custom" )
{
mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
- // TTTT: not needed here sal_uInt32 nMirrorFlags;
rtl::OUString sCustomShapeType;
MSO_SPT eShapeType = aPropOpt.GetCustomShapeType( mXShape, /*nMirrorFlags, */sCustomShapeType );
if ( sCustomShapeType.equalsAscii( "col-502ad400" ) || sCustomShapeType.equalsAscii( "col-60da8460" ) )
diff --git a/sd/source/ui/animations/motionpathtag.cxx b/sd/source/ui/animations/motionpathtag.cxx
index bcd12aa42e65..b2b23fb4c7a9 100644
--- a/sd/source/ui/animations/motionpathtag.cxx
+++ b/sd/source/ui/animations/motionpathtag.cxx
@@ -75,7 +75,6 @@ namespace sd
{
const sal_uInt32 SMART_TAG_HDL_NUM = SAL_MAX_UINT32;
-static const int DRGPIX = 2; // Drag MinMove in Pixel
// --------------------------------------------------------------------
@@ -458,7 +457,6 @@ void MotionPathTag::MovePath( double fDX, double fDY )
if(mpPathObj)
{
mpPathObj->setSdrObjectTransformation(basegfx::tools::createTranslateB2DHomMatrix(fDX, fDY) * mpPathObj->getSdrObjectTransformation());
- // sdr::legacy::MoveSdrObject(*mpPathObj, Size( nDX, nDY ) );
mrView.RecreateAllMarkHandles(); // TTTT: Neded?
}
}
@@ -581,8 +579,7 @@ bool MotionPathTag::MouseButtonDown( const MouseEvent& rMEvt, SmartHdl& rHdl )
pDragMethod = new PathDragResize( mrView, xTag, aDragPoly );
}
- const double fTolerance(basegfx::B2DVector(pOut->GetInverseViewTransformation() * basegfx::B2DVector(DRGPIX, 0.0)).getLength());
- mrView.BegDragObj(aMDPos, pHdl, fTolerance, pDragMethod );
+ mrView.BegDragObj(aMDPos, pHdl, mrView.getMinMovLog(), pDragMethod );
}
return true;
}
diff --git a/sd/source/ui/annotations/annotationtag.cxx b/sd/source/ui/annotations/annotationtag.cxx
index 30a5d4c41749..c4610a07d100 100644
--- a/sd/source/ui/annotations/annotationtag.cxx
+++ b/sd/source/ui/annotations/annotationtag.cxx
@@ -64,7 +64,6 @@ namespace sd
{
const sal_uInt32 SMART_TAG_HDL_NUM = SAL_MAX_UINT32;
-static const int DRGPIX = 2; // Drag MinMove in Pixel
// --------------------------------------------------------------------
@@ -727,8 +726,7 @@ IMPL_LINK(AnnotationTag, WindowEventHandler, VclWindowEvent*, pEvent)
rtl::Reference< AnnotationTag > xTag( this );
SdrDragMethod* pDragMethod = new AnnotationDragMove( mrView, xTag );
- const double fTolerance(basegfx::B2DVector(pWindow->GetInverseViewTransformation() * basegfx::B2DVector(DRGPIX, 0.0)).getLength());
- mrView.BegDragObj(maMouseDownPos, pHdl, fTolerance, pDragMethod );
+ mrView.BegDragObj(maMouseDownPos, pHdl, mrView.getMinMovLog(), pDragMethod );
}
}
break;
diff --git a/sd/source/ui/app/sdxfer.cxx b/sd/source/ui/app/sdxfer.cxx
index 36dd05fe7f86..211b7a68ad41 100644
--- a/sd/source/ui/app/sdxfer.cxx
+++ b/sd/source/ui/app/sdxfer.cxx
@@ -277,7 +277,7 @@ void SdTransferable::CreateObjectReplacement( SdrObject* pObj )
if( pInfo )
mpImageMap = new ImageMap( pInfo->GetImageMap() );
- mbIsUnoObj = pObj && pObj->IsSdrUnoObj();
+ mbIsUnoObj = dynamic_cast< SdrUnoObj* >(pObj);
}
}
diff --git a/sd/source/ui/dlg/sdpreslt.cxx b/sd/source/ui/dlg/sdpreslt.cxx
index 3233fac026bf..416cbf6cda59 100644
--- a/sd/source/ui/dlg/sdpreslt.cxx
+++ b/sd/source/ui/dlg/sdpreslt.cxx
@@ -73,8 +73,6 @@ SdPresLayoutDlg::SdPresLayoutDlg(
{
FreeResource();
- //mpLayoutNames = new List;
-
maVS.SetDoubleClickHdl(LINK(this, SdPresLayoutDlg, ClickLayoutHdl));
maBtnLoad.SetClickHdl(LINK(this, SdPresLayoutDlg, ClickLoadHdl));
@@ -89,14 +87,6 @@ SdPresLayoutDlg::SdPresLayoutDlg(
SdPresLayoutDlg::~SdPresLayoutDlg()
{
- //String* pName = (String*)mpLayoutNames->First();
- //while (pName)
- //{
- // delete pName;
- // pName = (String*)mpLayoutNames->Next();
- //}
- //
- //delete mpLayoutNames;
}
/*************************************************************************
@@ -132,8 +122,9 @@ void SdPresLayoutDlg::Reset()
for( nName = 0; nName < mnLayoutCount; nName++ )
{
if(maLayoutNames[nName] == maName)
- //if (*((String*)mpLayoutNames->GetObject(nName)) == maName)
+ {
break;
+ }
}
DBG_ASSERT(nName < mnLayoutCount, "Layout nicht gefunden");
@@ -159,12 +150,10 @@ void SdPresLayoutDlg::GetAttr(SfxItemSet& rOutAttrs)
{
aLayoutName = maName;
aLayoutName.Append( DOCUMENT_TOKEN );
- //aLayoutName.Append( *(String*)mpLayoutNames->GetObject( nId - 1 ) );
aLayoutName.Append(maLayoutNames[nId - 1]);
}
else
{
- //aLayoutName = *(String*)mpLayoutNames->GetObject( nId - 1 );
aLayoutName = maLayoutNames[nId - 1];
if( aLayoutName == maStrNone )
aLayoutName.Erase(); // so wird "- keine -" codiert (s.u.)
@@ -203,10 +192,8 @@ void SdPresLayoutDlg::FillValueSet()
String aLayoutName(pMaster->GetLayoutName());
aLayoutName.Erase( aLayoutName.SearchAscii( SD_LT_SEPARATOR ) );
maLayoutNames.push_back(aLayoutName);
- //mpLayoutNames->Insert(new String(aLayoutName), LIST_APPEND);
Bitmap aBitmap(mpDocSh->GetPagePreviewBitmap(pMaster, 90));
- //maVS.InsertItem(mpLayoutNames->Count(), aBitmap, aLayoutName);
maVS.InsertItem(maLayoutNames.size(), aBitmap, aLayoutName);
}
}
@@ -278,10 +265,7 @@ IMPL_LINK(SdPresLayoutDlg, ClickLoadHdl, void *, EMPTYARG)
if( !bCancel )
{
// Pruefen, ob Vorlage schon vorhanden
- // TTTT: check if this works and if yes, cleanup mpLayoutNames
-
bool bExists = false;
- //String* pName = (String*)mpLayoutNames->First();
String aCompareStr( maName );
if( maName.Len() == 0 )
aCompareStr = maStrNone;
@@ -298,18 +282,6 @@ IMPL_LINK(SdPresLayoutDlg, ClickLoadHdl, void *, EMPTYARG)
}
}
- //while( pName && !bExists )
- //{
- // if( aCompareStr == *pName )
- // {
- // bExists = true;
- // // Vorlage selektieren
- // sal_uInt16 nId = (sal_uInt16) mpLayoutNames->GetCurPos() + 1;
- // maVS.SelectItem( nId );
- // }
- // pName = (String*)mpLayoutNames->Next();
- //}
-
if( !bExists )
{
// Dokument laden um Preview-Bitmap zu ermitteln (wenn Vorlage ausgewaehlt)
@@ -322,13 +294,6 @@ IMPL_LINK(SdPresLayoutDlg, ClickLoadHdl, void *, EMPTYARG)
if (pTemplDoc)
{
::sd::DrawDocShell* pTemplDocSh= pTemplDoc->GetDocSh();
-
-/* SdPage* pMaster = pTemplDoc->GetMasterSdPage( 0, PK_STANDARD );
- mpLayoutNames->Insert( new String( maName ), LIST_APPEND );
-
- Bitmap aBitmap( pTemplDocSh->GetPagePreviewBitmap( pMaster, 90 ) );
- maVS.InsertItem( (sal_uInt16) mpLayoutNames->Count(), aBitmap, maName);
-*/
sal_uInt32 nCount = pTemplDoc->GetMasterPageCount();
for (sal_uInt32 nLayout = 0; nLayout < nCount; nLayout++)
@@ -338,11 +303,9 @@ IMPL_LINK(SdPresLayoutDlg, ClickLoadHdl, void *, EMPTYARG)
{
String aLayoutName(pMaster->GetLayoutName());
aLayoutName.Erase( aLayoutName.SearchAscii( SD_LT_SEPARATOR ) );
- //mpLayoutNames->Insert(new String(aLayoutName), LIST_APPEND);
maLayoutNames.push_back(aLayoutName);
Bitmap aBitmap(pTemplDocSh->GetPagePreviewBitmap(pMaster, 90));
- //maVS.InsertItem(mpLayoutNames->Count(), aBitmap, aLayoutName);
maVS.InsertItem(maLayoutNames.size(), aBitmap, aLayoutName);
}
}
@@ -357,17 +320,13 @@ IMPL_LINK(SdPresLayoutDlg, ClickLoadHdl, void *, EMPTYARG)
else
{
// leeres Layout
- //mpLayoutNames->Insert( new String( maStrNone ), LIST_APPEND );
maLayoutNames.push_back(maStrNone);
- //maVS.InsertItem( (sal_uInt16) mpLayoutNames->Count(),
- // Bitmap( SdResId( BMP_FOIL_NONE ) ), maStrNone );
maVS.InsertItem(maLayoutNames.size(), Bitmap( SdResId( BMP_FOIL_NONE ) ), maStrNone );
}
if (!bCancel)
{
// Vorlage selektieren
- //maVS.SelectItem( (sal_uInt16) mpLayoutNames->Count() );
maVS.SelectItem(static_cast< sal_uInt16 >(maLayoutNames.size()));
}
}
diff --git a/sd/source/ui/func/fucon3d.cxx b/sd/source/ui/func/fucon3d.cxx
index ef4a247a963d..cb1400c96fe7 100644
--- a/sd/source/ui/func/fucon3d.cxx
+++ b/sd/source/ui/func/fucon3d.cxx
@@ -363,12 +363,8 @@ bool FuConstruct3dObject::MouseButtonDown(const MouseEvent& rMEvt)
{
const basegfx::B2DPoint aPixelPos(rMEvt.GetPosPixel().X(), rMEvt.GetPosPixel().Y());
const basegfx::B2DPoint aLogicPos(mpWindow->GetInverseViewTransformation() * aPixelPos);
-
mpWindow->CaptureMouse();
- sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
-
E3dCompoundObject* p3DObj = NULL;
-
WaitObject aWait( (Window*)mpViewShell->GetActiveWindow() );
// #97016#
@@ -377,7 +373,7 @@ bool FuConstruct3dObject::MouseButtonDown(const MouseEvent& rMEvt)
// #97016#
ImpPrepareBasic3DShape(p3DObj, pScene);
- bReturn = mpView->BegCreatePreparedObject(aLogicPos, nDrgLog, pScene);
+ bReturn = mpView->BegCreatePreparedObject(aLogicPos, mpView->getMinMovLog(), pScene);
SdrObject* pObj = mpView->GetCreateObj();
diff --git a/sd/source/ui/func/fuconarc.cxx b/sd/source/ui/func/fuconarc.cxx
index 8fb5ac05e996..486b31e32df6 100644
--- a/sd/source/ui/func/fuconarc.cxx
+++ b/sd/source/ui/func/fuconarc.cxx
@@ -133,8 +133,7 @@ bool FuConstructArc::MouseButtonDown( const MouseEvent& rMEvt )
const basegfx::B2DPoint aLogicPos(mpWindow->GetInverseViewTransformation() * aPixelPos);
mpWindow->CaptureMouse();
- const double fTolerance(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(DRGPIX, 0.0)).getLength());
- mpView->BegCreateObj(aLogicPos, fTolerance);
+ mpView->BegCreateObj(aLogicPos, mpView->getMinMovLog());
SdrObject* pObj = mpView->GetCreateObj();
diff --git a/sd/source/ui/func/fuconbez.cxx b/sd/source/ui/func/fuconbez.cxx
index ca6d051edd2c..93112e16d7a3 100644
--- a/sd/source/ui/func/fuconbez.cxx
+++ b/sd/source/ui/func/fuconbez.cxx
@@ -380,15 +380,6 @@ void FuConstructBezierPolygon::SetEditMode(sal_uInt16 nMode)
// #97016#
SdrObject* FuConstructBezierPolygon::CreateDefaultObject(const sal_uInt16 nID, const basegfx::B2DRange& rRange)
{
- // case SID_DRAW_POLYGON:
- // case SID_DRAW_POLYGON_NOFILL:
- // case SID_DRAW_XPOLYGON:
- // case SID_DRAW_XPOLYGON_NOFILL:
- // case SID_DRAW_FREELINE:
- // case SID_DRAW_FREELINE_NOFILL:
- // case SID_DRAW_BEZIER_FILL: // BASIC
- // case SID_DRAW_BEZIER_NOFILL: // BASIC
-
SdrPathObj* pObj = dynamic_cast< SdrPathObj* >(
SdrObjFactory::MakeNewObject(
mpView->getSdrModelFromSdrView(),
@@ -439,141 +430,6 @@ SdrObject* FuConstructBezierPolygon::CreateDefaultObject(const sal_uInt16 nID, c
}
return pObj;
-
- // TTTT
- //{
- // SdrPathObj* pSdrPathObj = dynamic_cast< SdrPathObj* >(pObj);
- //
- // if(pSdrPathObj)
- // {
- // basegfx::B2DPolyPolygon aPoly;
- //
- // switch(nID)
- // {
- // case SID_DRAW_BEZIER_FILL:
- // {
- // const double fWdt(rRange.getWidth() * 0.5);
- // const double fHgt(rRange.getHeight() * 0.5);
- // const basegfx::B2DPolygon aInnerPoly(basegfx::tools::createPolygonFromEllipse(rRange.getCenter(), fWdt, fHgt));
- //
- // aPoly.append(aInnerPoly);
- // break;
- // }
- // case SID_DRAW_BEZIER_NOFILL:
- // {
- // basegfx::B2DPolygon aInnerPoly;
- //
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX(), rRange.getMaxY()));
- //
- // const basegfx::B2DPoint aCenterBottom(rRange.getCenterX(), rRange.getMaxY());
- // aInnerPoly.appendBezierSegment(
- // aCenterBottom,
- // aCenterBottom,
- // rRange.getCenter());
- //
- // const basegfx::B2DPoint aCenterTop(rRange.getCenterX(), rRange.getMinY());
- // aInnerPoly.appendBezierSegment(
- // aCenterTop,
- // aCenterTop,
- // basegfx::B2DPoint(rRange.getMaxX(), rRange.getMinY()));
- //
- // aPoly.append(aInnerPoly);
- // break;
- // }
- // case SID_DRAW_FREELINE:
- // case SID_DRAW_FREELINE_NOFILL:
- // {
- // basegfx::B2DPolygon aInnerPoly;
- //
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX(), rRange.getMaxY()));
- //
- // aInnerPoly.appendBezierSegment(
- // rRange.getMinimum(),
- // basegfx::B2DPoint(rRange.getCenterX(), rRange.getMinY()),
- // rRange.getCenter());
- //
- // aInnerPoly.appendBezierSegment(
- // basegfx::B2DPoint(rRange.getCenterX(), rRange.getMaxY()),
- // rRange.getMaximum(),
- // basegfx::B2DPoint(rRange.getMaxX(), rRange.getMinY()));
- //
- // if(SID_DRAW_FREELINE == nID)
- // {
- // aInnerPoly.append(rRange.getMaximum());
- // }
- // else
- // {
- // aInnerPoly.setClosed(true);
- // }
- //
- // aPoly.append(aInnerPoly);
- // break;
- // }
- // case SID_DRAW_XPOLYGON:
- // case SID_DRAW_XPOLYGON_NOFILL:
- // {
- // basegfx::B2DPolygon aInnerPoly;
- //
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX(), rRange.getMaxY()));
- // aInnerPoly.append(rRange.getMinimum());
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getCenterX(), rRange.getMinY()));
- // aInnerPoly.append(rRange.getCenter());
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getMaxX(), rRange.getCenterY()));
- // aInnerPoly.append(rRange.getMaximum());
- //
- // if(SID_DRAW_XPOLYGON_NOFILL == nID)
- // {
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getCenterX(), rRange.getMaxY()));
- // }
- // else
- // {
- // aInnerPoly.setClosed(true);
- // }
- //
- // aPoly.append(aInnerPoly);
- // break;
- // }
- // case SID_DRAW_POLYGON:
- // case SID_DRAW_POLYGON_NOFILL:
- // {
- // basegfx::B2DPolygon aInnerPoly;
- // const double fWdt(rRange.getWidth());
- // const double fHgt(rRange.getHeight());
- //
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX(), rRange.getMaxY()));
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX() + fWdt * 0.3, rRange.getMinY() + fHgt * 0.7));
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX(), rRange.getMinY() + fHgt * 0.15));
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX() + fWdt * 0.65, rRange.getMinY()));
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX() + fWdt, rRange.getMinY() + fHgt * 0.3));
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX() + fWdt * 0.8, rRange.getMinY() + fHgt * 0.5));
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getMinX() + fWdt * 0.8, rRange.getMinY() + fHgt * 0.75));
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getMaxY(), rRange.getMaxX()));
- //
- // if(SID_DRAW_POLYGON_NOFILL == nID)
- // {
- // aInnerPoly.append(basegfx::B2DPoint(rRange.getCenterX(), rRange.getMaxY()));
- // }
- // else
- // {
- // aInnerPoly.setClosed(true);
- // }
- //
- // aPoly.append(aInnerPoly);
- // break;
- // }
- // }
- //
- // pSdrPathObj->setB2DPolyPolygonInObjectCoordinates(aPoly);
- // }
- // else
- // {
- // DBG_ERROR("Object is NO path object");
- // }
- //
- // sdr::legacy::SetLogicRange(*pObj, rRange);
- //}
- //
- //return pObj;
}
} // end of namespace sd
diff --git a/sd/source/ui/func/fuconcs.cxx b/sd/source/ui/func/fuconcs.cxx
index 124046e3718b..911548481e81 100644
--- a/sd/source/ui/func/fuconcs.cxx
+++ b/sd/source/ui/func/fuconcs.cxx
@@ -125,13 +125,10 @@ bool FuConstructCustomShape::MouseButtonDown(const MouseEvent& rMEvt)
{
const basegfx::B2DPoint aPixelPos(rMEvt.GetPosPixel().X(), rMEvt.GetPosPixel().Y());
const basegfx::B2DPoint aLogicPos(mpWindow->GetInverseViewTransformation() * aPixelPos);
-
mpWindow->CaptureMouse();
- sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
-
- mpView->BegCreateObj(aLogicPos, nDrgLog);
-
+ mpView->BegCreateObj(aLogicPos, mpView->getMinMovLog());
SdrObject* pObj = mpView->GetCreateObj();
+
if ( pObj )
{
SetAttributes( pObj );
diff --git a/sd/source/ui/func/fuconrec.cxx b/sd/source/ui/func/fuconrec.cxx
index f848b11481ba..80e11f1e796c 100644
--- a/sd/source/ui/func/fuconrec.cxx
+++ b/sd/source/ui/func/fuconrec.cxx
@@ -202,22 +202,20 @@ bool FuConstructRectangle::MouseButtonDown(const MouseEvent& rMEvt)
{
const basegfx::B2DPoint aPixelPos(rMEvt.GetPosPixel().X(), rMEvt.GetPosPixel().Y());
const basegfx::B2DPoint aLogicPos(mpWindow->GetInverseViewTransformation() * aPixelPos);
-
mpWindow->CaptureMouse();
- sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
if(OBJ_CAPTION == mpView->getSdrObjectCreationInfo().getIdent())
{
bReturn = mpView->BegCreateCaptionObj(
aLogicPos,
basegfx::B2DVector(846.0, 846.0), // (4x2)cm
- nDrgLog);
+ mpView->getMinMovLog());
}
else
{
mpView->BegCreateObj(
aLogicPos,
- nDrgLog);
+ mpView->getMinMovLog());
}
SdrObject* pObj = mpView->GetCreateObj();
@@ -850,15 +848,6 @@ SdrObject* FuConstructRectangle::CreateDefaultObject(const sal_uInt16 nID, const
if(pSdrPathObj)
{
initializeDefaultSdrPathObjByObjectType(*pSdrPathObj, DefaultSdrPathObjType_Line, rRange, false);
- //pSdrPathObj->initializeDefaultSdrPathObjBySlotID(nID, aRange);
-
- // TTTT
- //const double fYMiddle((aRange.getMinY() + aRange.getMaxY()) * 0.5);
- //
- //::basegfx::B2DPolygon aB2DPolygon;
- //aB2DPolygon.append(::basegfx::B2DPoint(aStart.getX(), fYMiddle));
- //aB2DPolygon.append(::basegfx::B2DPoint(aEnd.getX(), fYMiddle));
- //pSdrPathObj->setB2DPolyPolygonInObjectCoordinates(::basegfx::B2DPolyPolygon(aB2DPolygon));
}
else
{
diff --git a/sd/source/ui/func/fuconstr.cxx b/sd/source/ui/func/fuconstr.cxx
index 239e12aa2d5f..6a9d9990386d 100644
--- a/sd/source/ui/func/fuconstr.cxx
+++ b/sd/source/ui/func/fuconstr.cxx
@@ -98,8 +98,7 @@ bool FuConstruct::MouseButtonDown(const MouseEvent& rMEvt)
const basegfx::B2DPoint aPixelPos(rMEvt.GetPosPixel().X(), rMEvt.GetPosPixel().Y());
aMDPos = mpWindow->GetInverseViewTransformation() * aPixelPos;
- // TTTT: evtl. unify fHitLog/fDrgLog/fHitTol at SdrView?
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
+ const double fHitLog(mpView->getHitTolLog());
if (rMEvt.IsLeft() && mpView->IsExtendedMouseEventDispatcherEnabled())
{
@@ -109,8 +108,7 @@ bool FuConstruct::MouseButtonDown(const MouseEvent& rMEvt)
if ( pHdl != NULL || mpView->IsMarkedObjHit(aMDPos, fHitLog) )
{
- const double fTolerance(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(DRGPIX, 0.0)).getLength());
- mpView->BegDragObj(aMDPos, pHdl, fTolerance);
+ mpView->BegDragObj(aMDPos, pHdl, mpView->getMinMovLog());
bReturn = true;
}
else if ( mpView->areSdrObjectsSelected() )
@@ -199,7 +197,6 @@ bool FuConstruct::MouseButtonUp(const MouseEvent& rMEvt)
if ( mpView && !mpView->IsAction() )
{
mpWindow->ReleaseMouse();
- sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
if ( !mpView->areSdrObjectsSelected() )
{
@@ -207,16 +204,15 @@ bool FuConstruct::MouseButtonUp(const MouseEvent& rMEvt)
if (!mpView->PickObj(aPnt, mpView->getHitTolLog(), pObj))
{
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
- mpView->MarkObj(aPnt, fHitLog);
+ mpView->MarkObj(aPnt, mpView->getHitTolLog());
}
mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
}
else if (rMEvt.IsLeft() && !rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() &&
!bSelectionChanged &&
- fabs(aPnt.getX() - aMDPos.getX()) < nDrgLog &&
- fabs(aPnt.getY() - aMDPos.getY()) < nDrgLog)
+ fabs(aPnt.getX() - aMDPos.getX()) < mpView->getMinMovLog() &&
+ fabs(aPnt.getY() - aMDPos.getY()) < mpView->getMinMovLog())
{
/**************************************************************
* Toggle zw. Selektion und Rotation
diff --git a/sd/source/ui/func/fuconuno.cxx b/sd/source/ui/func/fuconuno.cxx
index 301a0d98ab61..ade46dcd6204 100644
--- a/sd/source/ui/func/fuconuno.cxx
+++ b/sd/source/ui/func/fuconuno.cxx
@@ -106,8 +106,7 @@ bool FuConstructUnoControl::MouseButtonDown(const MouseEvent& rMEvt)
const basegfx::B2DPoint aLogicPos(mpWindow->GetInverseViewTransformation() * aPixelPos);
mpWindow->CaptureMouse();
- const double fTolerance(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(DRGPIX, 0.0)).getLength());
- mpView->BegCreateObj(aLogicPos, fTolerance);
+ mpView->BegCreateObj(aLogicPos, mpView->getMinMovLog());
bReturn = true;
}
return bReturn;
diff --git a/sd/source/ui/func/fudraw.cxx b/sd/source/ui/func/fudraw.cxx
index 82ab8ebafdb5..56b10cf8e707 100644
--- a/sd/source/ui/func/fudraw.cxx
+++ b/sd/source/ui/func/fudraw.cxx
@@ -204,12 +204,10 @@ bool FuDraw::MouseButtonDown(const MouseEvent& rMEvt)
mpView->SetResizeAtCenter(bCenter);
}
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
-
// #76572# look only for HelpLines when they are visible (!)
bool bHelpLine(false);
if(mpView->IsHlplVisible())
- bHelpLine = mpView->PickHelpLine(aMDPos, fHitLog, nHelpLine);
+ bHelpLine = mpView->PickHelpLine(aMDPos, mpView->getHitTolLog(), nHelpLine);
bool bHitHdl = (mpView->PickHandle(aMDPos) != NULL);
if ( bHelpLine
@@ -730,7 +728,7 @@ bool FuDraw::SetPointer(SdrObject* pObj, const basegfx::B2DPoint& rPos)
if (bAnimationInfo || bImageMapInfo)
{
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
+ const double fHitLog(mpView->getHitTolLog());
const double f2HitLog(fHitLog * 2.0);
const basegfx::B2DPoint aHitPosR(rPos.getX() + f2HitLog, rPos.getY());
const basegfx::B2DPoint aHitPosL(rPos.getX() - f2HitLog, rPos.getY());
@@ -846,8 +844,7 @@ void FuDraw::DoubleClick(const MouseEvent& rMEvt)
{
// hit group -> select subobject
mpView->UnmarkAllObj();
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
- mpView->MarkObj(aMDPos, fHitLog, rMEvt.IsShift(), true);
+ mpView->MarkObj(aMDPos, mpView->getHitTolLog(), rMEvt.IsShift(), true);
}
}
}
diff --git a/sd/source/ui/func/fuediglu.cxx b/sd/source/ui/func/fuediglu.cxx
index ca055c872264..5bf8dd9eb21a 100644
--- a/sd/source/ui/func/fuediglu.cxx
+++ b/sd/source/ui/func/fuediglu.cxx
@@ -117,8 +117,6 @@ bool FuEditGluePoints::MouseButtonDown(const MouseEvent& rMEvt)
if (rMEvt.IsLeft())
{
bReturn = true;
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
- const double fDrgLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(DRGPIX, 0.0)).getLength());
mpWindow->CaptureMouse();
SdrViewEvent aVEvt;
@@ -140,7 +138,7 @@ bool FuEditGluePoints::MouseButtonDown(const MouseEvent& rMEvt)
if (pHdl)
{
// Handle draggen
- mpView->BegDragObj(aMDPos, aVEvt.mpHdl, fDrgLog);
+ mpView->BegDragObj(aMDPos, aVEvt.mpHdl, mpView->getMinMovLog());
}
}
else if (eHit == SDRHIT_MARKEDOBJECT && mpView->IsInsGluePointMode())
@@ -165,7 +163,7 @@ bool FuEditGluePoints::MouseButtonDown(const MouseEvent& rMEvt)
/******************************************************************
* Objekt verschieben
******************************************************************/
- mpView->BegDragObj(aMDPos, NULL, fDrgLog);
+ mpView->BegDragObj(aMDPos, NULL, mpView->getMinMovLog());
}
else if (eHit == SDRHIT_GLUEPOINT)
{
@@ -180,7 +178,7 @@ bool FuEditGluePoints::MouseButtonDown(const MouseEvent& rMEvt)
if (pHdl)
{
- mpView->BegDragObj(aMDPos, pHdl, fDrgLog);
+ mpView->BegDragObj(aMDPos, pHdl, mpView->getMinMovLog());
}
}
else
@@ -199,11 +197,11 @@ bool FuEditGluePoints::MouseButtonDown(const MouseEvent& rMEvt)
{
if (rMEvt.IsMod2())
{
- bMarked = mpView->MarkNextObj(aMDPos, fHitLog, rMEvt.IsShift());
+ bMarked = mpView->MarkNextObj(aMDPos, mpView->getHitTolLog(), rMEvt.IsShift());
}
else
{
- bMarked = mpView->MarkObj(aMDPos, fHitLog, rMEvt.IsShift());
+ bMarked = mpView->MarkObj(aMDPos, mpView->getHitTolLog(), rMEvt.IsShift());
}
}
@@ -211,7 +209,7 @@ bool FuEditGluePoints::MouseButtonDown(const MouseEvent& rMEvt)
(!rMEvt.IsShift() || eHit == SDRHIT_MARKEDOBJECT))
{
// Objekt verschieben
- mpView->BegDragObj(aMDPos, aVEvt.mpHdl, fDrgLog);
+ mpView->BegDragObj(aMDPos, aVEvt.mpHdl, mpView->getMinMovLog());
}
else if (mpView->areSdrObjectsSelected())
{
@@ -283,12 +281,10 @@ bool FuEditGluePoints::MouseButtonUp(const MouseEvent& rMEvt)
}
FuDraw::MouseButtonUp(rMEvt);
-
- sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
Point aPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() );
- if (fabs(aMDPos.getX() - aPos.getX()) < nDrgLog &&
- fabs(aMDPos.getY() - aPos.getY()) < nDrgLog &&
+ if (fabs(aMDPos.getX() - aPos.getX()) < mpView->getMinMovLog() &&
+ fabs(aMDPos.getY() - aPos.getY()) < mpView->getMinMovLog() &&
!rMEvt.IsShift() && !rMEvt.IsMod2())
{
SdrViewEvent aVEvt;
diff --git a/sd/source/ui/func/fuformatpaintbrush.cxx b/sd/source/ui/func/fuformatpaintbrush.cxx
index 0c54d078bac9..9b15c5e87c75 100644
--- a/sd/source/ui/func/fuformatpaintbrush.cxx
+++ b/sd/source/ui/func/fuformatpaintbrush.cxx
@@ -105,13 +105,12 @@ bool FuFormatPaintBrush::MouseButtonDown(const MouseEvent& rMEvt)
{
SdrViewEvent aVEvt;
SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
if( (eHit == SDRHIT_TEXTEDIT) || (eHit == SDRHIT_TEXTEDITOBJ && ( mpViewShell->GetFrameView()->IsQuickEdit() || dynamic_cast< sdr::table::SdrTableObj* >( aVEvt.mpObj ) != NULL ) ))
{
SdrObject* pPickObj=0;
const basegfx::B2DPoint aPnt(mpWindow->GetInverseViewTransformation() * basegfx::B2DPoint(rMEvt.GetPosPixel().X(), rMEvt.GetPosPixel().Y()));
- mpView->PickObj( aPnt, fHitLog, pPickObj, SDRSEARCH_PICKMARKABLE);
+ mpView->PickObj( aPnt, mpView->getHitTolLog(), pPickObj, SDRSEARCH_PICKMARKABLE);
if( pPickObj && !pPickObj->IsEmptyPresObj() )
{
@@ -150,7 +149,7 @@ bool FuFormatPaintBrush::MouseButtonDown(const MouseEvent& rMEvt)
const basegfx::B2DPoint aPixelPos(rMEvt.GetPosPixel().X(), rMEvt.GetPosPixel().Y());
const basegfx::B2DPoint aLogicPos(mpWindow->GetInverseViewTransformation() * aPixelPos);
- mpView->MarkObj(aLogicPos, fHitLog, bToggle, false);
+ mpView->MarkObj(aLogicPos, mpView->getHitTolLog(), bToggle, false);
return true;
}
@@ -170,10 +169,9 @@ bool FuFormatPaintBrush::MouseMove(const MouseEvent& rMEvt)
}
else
{
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
SdrObject* pObj=0;
const basegfx::B2DPoint aPnt(mpWindow->GetInverseViewTransformation() * basegfx::B2DPoint(rMEvt.GetPosPixel().X(), rMEvt.GetPosPixel().Y()));
- bool bOverMarkableObject = mpView->PickObj( aPnt, fHitLog, pObj, SDRSEARCH_PICKMARKABLE);
+ bool bOverMarkableObject = mpView->PickObj( aPnt, mpView->getHitTolLog(), pObj, SDRSEARCH_PICKMARKABLE);
if(bOverMarkableObject && pObj && HasContentForThisType(*pObj) )
mpWindow->SetPointer(Pointer(POINTER_FILL));
diff --git a/sd/source/ui/func/fuinsert.cxx b/sd/source/ui/func/fuinsert.cxx
index 80e5a76c3416..20d0fffa6c0f 100644
--- a/sd/source/ui/func/fuinsert.cxx
+++ b/sd/source/ui/func/fuinsert.cxx
@@ -119,11 +119,6 @@ FunctionReference FuInsertGraphic::Create( ViewShell* pViewSh, ::sd::Window* pWi
return xFunc;
}
-// TTTT needed? Check!
-//#ifdef _MSC_VER
-//#pragma optimize ( "", off )
-//#endif
-
void FuInsertGraphic::DoExecute( SfxRequest& )
{
SvxOpenGraphicDialog aDlg(SdResId(STR_INSERTGRAPHIC));
@@ -169,11 +164,6 @@ void FuInsertGraphic::DoExecute( SfxRequest& )
}
}
-// TTTT needed? Check!
-//#ifdef _MSC_VER
-//#pragma optimize ( "", on )
-//#endif
-
/*************************************************************************
|*
|* FuInsertClipboard::Konstruktor
diff --git a/sd/source/ui/func/fupoor.cxx b/sd/source/ui/func/fupoor.cxx
index 0a17dbb97ea4..02389d66652b 100644
--- a/sd/source/ui/func/fupoor.cxx
+++ b/sd/source/ui/func/fupoor.cxx
@@ -707,7 +707,7 @@ bool FuPoor::KeyInput(const KeyEvent& rKEvt)
{
if(0 == pHdl->GetPointNum())
{
- if(pEdgeObj->GetConnection(true).GetObject())
+ if(pEdgeObj->GetSdrObjectConnection(true))
{
bIsMoveOfConnectedHandle = true;
}
@@ -715,7 +715,7 @@ bool FuPoor::KeyInput(const KeyEvent& rKEvt)
if(1 == pHdl->GetPointNum())
{
- if(pEdgeObj->GetConnection(false).GetObject())
+ if(pEdgeObj->GetSdrObjectConnection(false))
{
bIsMoveOfConnectedHandle = true;
}
@@ -933,9 +933,6 @@ bool FuPoor::MouseMove(const MouseEvent& )
void FuPoor::SelectionHasChanged()
{
- // Not needed TTTT
- // const SdrHdlList& rHdlList = mpView->GetHdlList();
- // ((SdrHdlList&)rHdlList).ResetFocusHdl();
}
/*************************************************************************
@@ -990,10 +987,9 @@ IMPL_LINK( FuPoor, DragHdl, Timer *, EMPTYARG )
{
if( mpView )
{
- sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
SdrHdl* pHdl = mpView->PickHandle(aMDPos);
- if ( pHdl==NULL && mpView->IsMarkedObjHit(aMDPos, nHitLog)
+ if ( pHdl==NULL && mpView->IsMarkedObjHit(aMDPos, mpView->getHitTolLog())
&& !mpView->IsPresObjSelected(false, true) )
{
mpWindow->ReleaseMouse();
diff --git a/sd/source/ui/func/fusel.cxx b/sd/source/ui/func/fusel.cxx
index 6b22c69631d1..9c5da26e695c 100644
--- a/sd/source/ui/func/fusel.cxx
+++ b/sd/source/ui/func/fusel.cxx
@@ -170,9 +170,6 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
return true;
}
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
- const double fDrgLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(DRGPIX, 0.0)).getLength());
-
// The following code is executed for right clicks as well as for left
// clicks in order to modify the selection for the right button as a
// preparation for the context menu. The functions BegMarkObject() and
@@ -223,7 +220,7 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
if(!bTextEdit
&& !mpDocSh->IsReadOnly()
- && ((mpView->IsMarkedObjHit(aMDPos, fHitLog) && !rMEvt.IsShift() && !rMEvt.IsMod2()) || pHdl != NULL)
+ && ((mpView->IsMarkedObjHit(aMDPos, mpView->getHitTolLog()) && !rMEvt.IsShift() && !rMEvt.IsMod2()) || pHdl != NULL)
&& (rMEvt.GetClicks() != 2)
)
{
@@ -246,14 +243,14 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
}
if ( ! rMEvt.IsRight())
- mpView->BegDragObj(aMDPos, pHdl, fDrgLog);
+ mpView->BegDragObj(aMDPos, pHdl, mpView->getMinMovLog());
bReturn = true;
}
else
{
if (!rMEvt.IsMod2() && mpView->PickObj(aMDPos, mpView->getHitTolLog(), pObj, SDRSEARCH_PICKMACRO))
{
- mpView->BegMacroObj(aMDPos, fHitLog, pObj, mpWindow);
+ mpView->BegMacroObj(aMDPos, mpView->getHitTolLog(), pObj, mpWindow);
bReturn = true;
}
else if ( bTextEdit )
@@ -387,7 +384,7 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
{
if ( rMEvt.IsMod2() )
{
- bMarked = mpView->MarkNextObj(aMDPos, fHitLog, rMEvt.IsShift() );
+ bMarked = mpView->MarkNextObj(aMDPos, mpView->getHitTolLog(), rMEvt.IsShift() );
}
else
{
@@ -399,7 +396,7 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
bToggle = true;
}
- bMarked = mpView->MarkObj(aMDPos, fHitLog, bToggle, false);
+ bMarked = mpView->MarkObj(aMDPos, mpView->getHitTolLog(), bToggle, false);
}
}
@@ -407,7 +404,7 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
{
if ( !bReadOnly &&
bMarked &&
- (!rMEvt.IsShift() || mpView->IsMarkedObjHit(aMDPos, fHitLog)))
+ (!rMEvt.IsShift() || mpView->IsMarkedObjHit(aMDPos, mpView->getHitTolLog())))
{
/**********************************************************
* Objekt verschieben
@@ -416,7 +413,7 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
pHdl=mpView->PickHandle(aMDPos);
if ( ! rMEvt.IsRight())
- mpView->BegDragObj(aMDPos, pHdl, fDrgLog);
+ mpView->BegDragObj(aMDPos, pHdl, mpView->getMinMovLog());
}
else
{
@@ -454,7 +451,7 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
* Handle draggen
******************************************************************/
if ( ! rMEvt.IsRight())
- mpView->BegDragObj(aMDPos, aVEvt.mpHdl, fDrgLog);
+ mpView->BegDragObj(aMDPos, aVEvt.mpHdl, mpView->getMinMovLog());
}
else if (eHit == SDRHIT_MARKEDOBJECT && nEditMode == SID_BEZIER_INSERT)
{
@@ -484,7 +481,7 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
* Objekt verschieben
******************************************************************/
if ( ! rMEvt.IsRight())
- mpView->BegDragObj(aMDPos, NULL, fDrgLog);
+ mpView->BegDragObj(aMDPos, NULL, mpView->getMinMovLog());
}
else if (eHit == SDRHIT_HANDLE)
{
@@ -536,7 +533,7 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
if(pHdl)
{
- mpView->BegDragObj(aMDPos, pHdl, fDrgLog);
+ mpView->BegDragObj(aMDPos, pHdl, mpView->getMinMovLog());
}
else
{
@@ -552,7 +549,7 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
pHdl = mpView->PickHandle(aMDPos);
if(pHdl)
if ( ! rMEvt.IsRight())
- mpView->BegDragObj(aMDPos, pHdl, fDrgLog);
+ mpView->BegDragObj(aMDPos, pHdl, mpView->getMinMovLog());
}
}
else
@@ -571,11 +568,11 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
{
if (rMEvt.IsMod2())
{
- bMarked = mpView->MarkNextObj(aMDPos, fHitLog, rMEvt.IsShift());
+ bMarked = mpView->MarkNextObj(aMDPos, mpView->getHitTolLog(), rMEvt.IsShift());
}
else
{
- bMarked = mpView->MarkObj(aMDPos, fHitLog, rMEvt.IsShift(), false);
+ bMarked = mpView->MarkObj(aMDPos, mpView->getHitTolLog(), rMEvt.IsShift(), false);
}
}
@@ -584,7 +581,7 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
{
// Objekt verschieben
if ( ! rMEvt.IsRight())
- mpView->BegDragObj(aMDPos, aVEvt.mpHdl, fDrgLog);
+ mpView->BegDragObj(aMDPos, aVEvt.mpHdl, mpView->getMinMovLog());
}
else if (mpView->areSdrObjectsSelected())
{
@@ -703,9 +700,6 @@ bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt)
// force trigger selection change to get bSelectionChanged
// set in FuSelection::SelectionHasChanged() call eventually
// mpView->forceSelectionChange(); TTTT: Should be done in HasMarkablePoints
-
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
- const double fDrgLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(DRGPIX, 0.0)).getLength());
const basegfx::B2DPoint aPixelPos(rMEvt.GetPosPixel().X(), rMEvt.GetPosPixel().Y());
const basegfx::B2DPoint aLogicPos(mpWindow->GetInverseViewTransformation() * aPixelPos);
@@ -732,8 +726,8 @@ bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt)
if (!rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() &&
!bSelectionChanged &&
- fabs(aLogicPos.getX() - aMDPos.getX()) < fDrgLog &&
- fabs(aLogicPos.getY() - aMDPos.getY()) < fDrgLog)
+ fabs(aLogicPos.getX() - aMDPos.getX()) < mpView->getMinMovLog() &&
+ fabs(aLogicPos.getY() - aMDPos.getY()) < mpView->getMinMovLog())
{
/**************************************************************
* Toggle zw. Selektion und Rotation
@@ -799,11 +793,11 @@ bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt)
}
else if (rMEvt.IsMod1()
&& !rMEvt.IsMod2()
- && fabs(aLogicPos.getX() - aMDPos.getX()) < fDrgLog
- && fabs(aLogicPos.getY() - aMDPos.getY()) < fDrgLog)
+ && fabs(aLogicPos.getX() - aMDPos.getX()) < mpView->getMinMovLog()
+ && fabs(aLogicPos.getY() - aMDPos.getY()) < mpView->getMinMovLog())
{
// Gruppe betreten
- mpView->MarkObj(aLogicPos, fHitLog, rMEvt.IsShift(), rMEvt.IsMod1());
+ mpView->MarkObj(aLogicPos, mpView->getHitTolLog(), rMEvt.IsShift(), rMEvt.IsMod1());
}
if (mpView->IsAction() )
@@ -916,8 +910,8 @@ bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt)
mpView->EndAction();
const basegfx::B2DVector aDelta(aMDPos - aLogicPos);
- if(fabs(aDelta.getX()) < fDrgLog
- && fabs(aDelta.getY()) < fDrgLog
+ if(fabs(aDelta.getX()) < mpView->getMinMovLog()
+ && fabs(aDelta.getY()) < mpView->getMinMovLog()
&& !rMEvt.IsShift()
&& !rMEvt.IsMod2())
{
@@ -933,11 +927,11 @@ bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt)
}
}
else if (!rMEvt.IsShift() && rMEvt.IsMod1() && !rMEvt.IsMod2() &&
- fabs(aLogicPos.getX() - aMDPos.getX()) < fDrgLog &&
- fabs(aLogicPos.getY() - aMDPos.getY()) < fDrgLog)
+ fabs(aLogicPos.getX() - aMDPos.getX()) < mpView->getMinMovLog() &&
+ fabs(aLogicPos.getY() - aMDPos.getY()) < mpView->getMinMovLog())
{
// Gruppe betreten
- mpView->MarkObj(aLogicPos, fHitLog, false, rMEvt.IsMod1());
+ mpView->MarkObj(aLogicPos, mpView->getHitTolLog(), false, rMEvt.IsMod1());
}
@@ -1212,8 +1206,7 @@ bool FuSelection::AnimateObj(SdrObject* pObj, const basegfx::B2DPoint& rPos)
bool bAnimated(false);
const bool bClosed(pObj->IsClosedObj());
const bool bFilled(bClosed? pObj->HasFillStyle() : false);
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
- double f2HitLog(fHitLog * 2);
+ double f2HitLog(mpView->getHitTolLog() * 2);
const basegfx::B2DPoint aHitPosR(rPos.getX() + f2HitLog, rPos.getY());
const basegfx::B2DPoint aHitPosL(rPos.getX() - f2HitLog, rPos.getY());
@@ -1222,10 +1215,10 @@ bool FuSelection::AnimateObj(SdrObject* pObj, const basegfx::B2DPoint& rPos)
if ( !bClosed ||
!bFilled ||
- (SdrObjectPrimitiveHit(*pObj, aHitPosR, fHitLog, *mpView, false, 0) &&
- SdrObjectPrimitiveHit(*pObj, aHitPosL, fHitLog, *mpView, false, 0) &&
- SdrObjectPrimitiveHit(*pObj, aHitPosT, fHitLog, *mpView, false, 0) &&
- SdrObjectPrimitiveHit(*pObj, aHitPosB, fHitLog, *mpView, false, 0) ) )
+ (SdrObjectPrimitiveHit(*pObj, aHitPosR, mpView->getHitTolLog(), *mpView, false, 0) &&
+ SdrObjectPrimitiveHit(*pObj, aHitPosL, mpView->getHitTolLog(), *mpView, false, 0) &&
+ SdrObjectPrimitiveHit(*pObj, aHitPosT, mpView->getHitTolLog(), *mpView, false, 0) &&
+ SdrObjectPrimitiveHit(*pObj, aHitPosB, mpView->getHitTolLog(), *mpView, false, 0) ) )
{
if ( mpDoc->GetIMapInfo( pObj ) )
{
@@ -1502,9 +1495,8 @@ bool FuSelection::cancel()
SdrObject* FuSelection::pickObject (const basegfx::B2DPoint& rTestPoint)
{
SdrObject* pObject = 0;
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
- mpView->PickObj(rTestPoint, fHitLog, pObject, SDRSEARCH_PICKMARKABLE);
+ mpView->PickObj(rTestPoint, mpView->getHitTolLog(), pObject, SDRSEARCH_PICKMARKABLE);
return pObject;
}
diff --git a/sd/source/ui/func/fusnapln.cxx b/sd/source/ui/func/fusnapln.cxx
index d6f12fe70a72..25c554d09a8c 100644
--- a/sd/source/ui/func/fusnapln.cxx
+++ b/sd/source/ui/func/fusnapln.cxx
@@ -99,8 +99,7 @@ void FuSnapLine::DoExecute( SfxRequest& rReq )
if(basegfx::fTools::moreOrEqual(aLinePos.getX(), 0.0))
{
aLinePos = mpWindow->GetInverseViewTransformation() * aLinePos;
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
- bLineExist = mpView->PickHelpLine(aLinePos, fHitLog, nHelpLine);
+ bLineExist = mpView->PickHelpLine(aLinePos, mpView->getHitTolLog(), nHelpLine);
if(bLineExist)
{
diff --git a/sd/source/ui/func/futext.cxx b/sd/source/ui/func/futext.cxx
index 81b8b06fd33a..a939a7400efb 100644
--- a/sd/source/ui/func/futext.cxx
+++ b/sd/source/ui/func/futext.cxx
@@ -319,13 +319,10 @@ bool FuText::MouseButtonDown(const MouseEvent& rMEvt)
if (bMacro && mpView->PickObj(aMDPos, mpView->getHitTolLog(), pObj, SDRSEARCH_PICKMACRO))
{
// Makro
- const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength());
- mpView->BegMacroObj(aMDPos, fHitLog, pObj, mpWindow);
+ mpView->BegMacroObj(aMDPos, mpView->getHitTolLog(), pObj, mpWindow);
}
else
{
- const double fTolerance(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(DRGPIX, 0.0)).getLength());
-
if (eHit != SDRHIT_HANDLE)
{
// Selektion aufheben
@@ -444,7 +441,7 @@ bool FuText::MouseButtonDown(const MouseEvent& rMEvt)
eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
if( (eHit == SDRHIT_HANDLE) || (eHit == SDRHIT_MARKEDOBJECT) )
{
- mpView->BegDragObj(aMDPos, aVEvt.mpHdl, fTolerance);
+ mpView->BegDragObj(aMDPos, aVEvt.mpHdl, mpView->getMinMovLog());
}
}
bReturn = true;
@@ -458,7 +455,7 @@ bool FuText::MouseButtonDown(const MouseEvent& rMEvt)
**********************************************************/
mpView->setSdrObjectCreationInfo(SdrObjectCreationInfo(static_cast< sal_uInt16 >(OBJ_TEXT)));
mpView->SetViewEditMode(SDREDITMODE_CREATE);
- mpView->BegCreateObj(aMDPos, fTolerance);
+ mpView->BegCreateObj(aMDPos, mpView->getMinMovLog());
}
else
{
@@ -670,7 +667,6 @@ bool FuText::MouseButtonUp(const MouseEvent& rMEvt)
return (true); // Event von der SdrView ausgewertet
bool bEmptyTextObj = false;
- const double fTolerance(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(DRGPIX, 0.0)).getLength());
if (mxTextObj.is())
{
@@ -706,8 +702,8 @@ bool FuText::MouseButtonUp(const MouseEvent& rMEvt)
if ( mpView->IsRotateAllowed() && mpViewShell->GetFrameView()->IsClickChangeRotation() && (rMEvt.GetClicks() != 2) &&
!rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() && !rMEvt.IsRight() &&
- fabs(aLogicPos.getX() - aMDPos.getX()) < fTolerance &&
- fabs(aLogicPos.getY() - aMDPos.getY()) < fTolerance)
+ fabs(aLogicPos.getX() - aMDPos.getX()) < mpView->getMinMovLog() &&
+ fabs(aLogicPos.getY() - aMDPos.getY()) < mpView->getMinMovLog())
{
// toggle to rotation mode
mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_OBJECT_ROTATE, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
@@ -794,8 +790,8 @@ bool FuText::MouseButtonUp(const MouseEvent& rMEvt)
mpWindow->ReleaseMouse();
if ( mpView && !mpView->areSdrObjectsSelected() &&
- fabs(aMDPos.getX() - aLogicPos.getX()) < fTolerance &&
- fabs(aMDPos.getY() - aLogicPos.getY()) < fTolerance &&
+ fabs(aMDPos.getX() - aLogicPos.getX()) < mpView->getMinMovLog() &&
+ fabs(aMDPos.getY() - aLogicPos.getY()) < mpView->getMinMovLog() &&
!rMEvt.IsShift() && !rMEvt.IsMod2() )
{
SdrViewEvent aVEvt;
@@ -819,15 +815,15 @@ bool FuText::MouseButtonUp(const MouseEvent& rMEvt)
**********************************************************************/
mpView->setSdrObjectCreationInfo(SdrObjectCreationInfo(static_cast< sal_uInt16 >(OBJ_TEXT)));
mpView->SetViewEditMode(SDREDITMODE_CREATE);
- mpView->BegCreateObj(aMDPos, fTolerance);
+ mpView->BegCreateObj(aMDPos, mpView->getMinMovLog());
bool bSnapEnabled = mpView->IsSnapEnabled();
if (bSnapEnabled)
mpView->SetSnapEnabled(false);
- aLogicPos.setX(aLogicPos.getX() + fTolerance + fTolerance);
- aLogicPos.setY(aLogicPos.getY() + fTolerance + fTolerance);
+ aLogicPos.setX(aLogicPos.getX() + (mpView->getMinMovLog() * 2.0));
+ aLogicPos.setY(aLogicPos.getY() + (mpView->getMinMovLog() * 2.0));
mpView->MovAction(aLogicPos);
mxTextObj.reset( dynamic_cast< SdrTextObj* >( mpView->GetCreateObj() ) );
diff --git a/sd/source/ui/func/fuzoom.cxx b/sd/source/ui/func/fuzoom.cxx
index 081c4c00ba8e..df7c58987096 100644
--- a/sd/source/ui/func/fuzoom.cxx
+++ b/sd/source/ui/func/fuzoom.cxx
@@ -195,9 +195,8 @@ bool FuZoom::MouseButtonUp(const MouseEvent& rMEvt)
{
// Zoom
const basegfx::B2DVector aZoomSizePixel(mpWindow->GetInverseViewTransformation() * maZoomRange.getRange());
- const double fTol(DRGPIX + DRGPIX);
- if ( aZoomSizePixel.getX() < fTol && aZoomSizePixel.getY() < fTol )
+ if ( aZoomSizePixel.getX() < mpView->getMinMovLog() && aZoomSizePixel.getY() < mpView->getMinMovLog() )
{
// Klick auf der Stelle: Zoomfaktor verdoppeln
const basegfx::B2DPoint aPos(mpWindow->GetInverseViewTransformation() * aPosPix);
diff --git a/sd/source/ui/inc/fupoor.hxx b/sd/source/ui/inc/fupoor.hxx
index 2687071379fa..44519c43339d 100644
--- a/sd/source/ui/inc/fupoor.hxx
+++ b/sd/source/ui/inc/fupoor.hxx
@@ -58,7 +58,6 @@ class FuPoor : public SimpleReferenceComponent
{
public:
static const int HITPIX = 2; // Hit-Toleranz in Pixel
- static const int DRGPIX = 2; // Drag MinMove in Pixel
virtual void DoExecute( SfxRequest& rReq );
diff --git a/sd/source/ui/inc/sdpreslt.hxx b/sd/source/ui/inc/sdpreslt.hxx
index 08a7d5db797d..2fc2f7abace4 100644
--- a/sd/source/ui/inc/sdpreslt.hxx
+++ b/sd/source/ui/inc/sdpreslt.hxx
@@ -72,7 +72,6 @@ private:
const SfxItemSet& mrOutAttrs;
std::vector< String > maLayoutNames;
- // List* mpLayoutNames;
String maName; // Layoutname oder Dateiname
sal_uInt32 mnLayoutCount; // Anzahl, der im Dokument vorhandenen MasterPages
diff --git a/sd/source/ui/view/drviews2.cxx b/sd/source/ui/view/drviews2.cxx
index 964f2de57b5e..0a63c00c494f 100644
--- a/sd/source/ui/view/drviews2.cxx
+++ b/sd/source/ui/view/drviews2.cxx
@@ -808,11 +808,10 @@ void DrawViewShell::FuTemporary(SfxRequest& rReq)
case SID_DELETE_SNAPITEM:
{
const basegfx::B2DPoint aMPos(GetActiveWindow()->GetInverseViewTransformation() * maMousePos);
- const double fHitLog(basegfx::B2DVector(GetActiveWindow()->GetInverseViewTransformation() * basegfx::B2DVector(FuPoor::HITPIX, 0.0)).getLength());
sal_uInt32 nHelpLine;
mbMousePosFreezed = false;
- if( mpDrawView->PickHelpLine( aMPos, fHitLog, nHelpLine) )
+ if( mpDrawView->PickHelpLine( aMPos, mpView->getHitTolLog(), nHelpLine) )
{
if(mpDrawView->GetSdrPageView())
{
diff --git a/sd/source/ui/view/drviews3.cxx b/sd/source/ui/view/drviews3.cxx
index 55bcd4c43649..3f79f00dea0a 100644
--- a/sd/source/ui/view/drviews3.cxx
+++ b/sd/source/ui/view/drviews3.cxx
@@ -987,10 +987,9 @@ void DrawViewShell::ExecStatusBar(SfxRequest& rReq)
void DrawViewShell::GetSnapItemState( SfxItemSet &rSet )
{
const basegfx::B2DPoint aMPos(GetActiveWindow()->GetInverseViewTransformation() * maMousePos);
- const double fHitLog(basegfx::B2DVector(GetActiveWindow()->GetInverseViewTransformation() * basegfx::B2DVector(FuPoor::HITPIX, 0.0)).getLength());
sal_uInt32 nHelpLine;
- if ( mpDrawView->PickHelpLine(aMPos, fHitLog, nHelpLine) )
+ if ( mpDrawView->PickHelpLine(aMPos, mpView->getHitTolLog(), nHelpLine) )
{
if(mpDrawView->GetSdrPageView())
{
diff --git a/sd/source/ui/view/drviews4.cxx b/sd/source/ui/view/drviews4.cxx
index 3ca68b3880e2..ecbbf4377073 100644
--- a/sd/source/ui/view/drviews4.cxx
+++ b/sd/source/ui/view/drviews4.cxx
@@ -529,7 +529,6 @@ void DrawViewShell::Command(const CommandEvent& rCEvt, ::sd::Window* pWin)
// Ist ein Fangobjekt unter dem Mauszeiger?
basegfx::B2DPoint aMPos(pWin->GetInverseViewTransformation() * maMousePos);
- const double fHitLog(basegfx::B2DVector(GetActiveWindow()->GetInverseViewTransformation() * basegfx::B2DVector(FuPoor::HITPIX, 0.0)).getLength());
sal_uInt32 nHelpLine;
// fuer Klebepunkt
SdrObject* pObj = NULL;
@@ -542,7 +541,7 @@ void DrawViewShell::Command(const CommandEvent& rCEvt, ::sd::Window* pWin)
//pFldItem = pOLV->GetFieldUnderMousePointer();
// Hilfslinie
- if ( mpDrawView->PickHelpLine( aMPos, fHitLog, nHelpLine) )
+ if ( mpDrawView->PickHelpLine( aMPos, mpView->getHitTolLog(), nHelpLine) )
{
if(mpDrawView->GetSdrPageView())
{
diff --git a/sd/source/ui/view/drviewsc.cxx b/sd/source/ui/view/drviewsc.cxx
index c7ebd3a2c315..7aee8c9e207d 100644
--- a/sd/source/ui/view/drviewsc.cxx
+++ b/sd/source/ui/view/drviewsc.cxx
@@ -472,7 +472,6 @@ void DrawViewShell::FuTemp03(SfxRequest& rReq)
case SID_FLIP_HORIZONTAL:
{
mpDrawView->MirrorMarkedObjHorizontal();
- // mpDrawView->MirrorAllMarkedHorizontal(); TTTT: Which one?
Cancel();
rReq.Done ();
}
diff --git a/sd/source/ui/view/sdview3.cxx b/sd/source/ui/view/sdview3.cxx
index 48aa1a9241fd..a1ad1e794950 100644
--- a/sd/source/ui/view/sdview3.cxx
+++ b/sd/source/ui/view/sdview3.cxx
@@ -517,8 +517,10 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper,
pRem->pClone = pObj;
aConnectorContainer.Insert(pRem, CONTAINER_APPEND);
- if(pObj->IsSdrEdgeObj())
+ if(dynamic_cast< SdrEdgeObj* >(pObj))
+ {
nConnectorCount++;
+ }
}
// #83525# try to re-establish connections at clones
@@ -533,16 +535,16 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper,
if(pOrigEdge && pCloneEdge)
{
// test first connection
- SdrObjConnection& rConn0 = pOrigEdge->GetConnection(false);
- SdrObject* pConnObj = rConn0.GetObject();
+ SdrObject* pConnObj = pOrigEdge->GetSdrObjectConnection(false);
+
if(pConnObj)
{
SdrObject* pConnClone = ImpGetClone(aConnectorContainer, pConnObj);
if(pConnClone)
{
// if dest obj was cloned, too, re-establish connection
- pCloneEdge->ConnectToNode(false, pConnClone);
- pCloneEdge->GetConnection(false).SetConnectorId(rConn0.GetConnectorId());
+ pCloneEdge->ConnectToSdrObject(false, pConnClone);
+ pCloneEdge->SetConnectorId(false, pOrigEdge->GetConnectorId(false));
}
else
{
@@ -551,7 +553,7 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper,
if(rProvider.hasUserGluePoints())
{
- const sdr::glue::GluePoint* pCandidate = rProvider.findUserGluePointByID(rConn0.GetConnectorId());
+ const sdr::glue::GluePoint* pCandidate = rProvider.findUserGluePointByID(pOrigEdge->GetConnectorId(false));
if(pCandidate)
{
@@ -564,16 +566,16 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper,
}
// test second connection
- SdrObjConnection& rConn1 = pOrigEdge->GetConnection(true);
- pConnObj = rConn1.GetObject();
+ pConnObj = pOrigEdge->GetSdrObjectConnection(true);
+
if(pConnObj)
{
SdrObject* pConnClone = ImpGetClone(aConnectorContainer, pConnObj);
if(pConnClone)
{
// if dest obj was cloned, too, re-establish connection
- pCloneEdge->ConnectToNode(true, pConnClone);
- pCloneEdge->GetConnection(true).SetConnectorId(rConn1.GetConnectorId());
+ pCloneEdge->ConnectToSdrObject(true, pConnClone);
+ pCloneEdge->SetConnectorId(true, pOrigEdge->GetConnectorId(true));
}
else
{
@@ -582,7 +584,7 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper,
if(rProvider.hasUserGluePoints())
{
- const sdr::glue::GluePoint* pCandidate = rProvider.findUserGluePointByID(rConn1.GetConnectorId());
+ const sdr::glue::GluePoint* pCandidate = rProvider.findUserGluePointByID(pOrigEdge->GetConnectorId(true));
if(pCandidate)
{
@@ -1350,9 +1352,7 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper,
String aName( rColItem.GetName() );
SfxItemSet aSet( mpDoc->GetItemPool() );
const bool bClosed(pPickObj->IsClosedObj());
- ::sd::Window* pWin = mpViewSh->GetActiveWindow();
- const double fHitLog(basegfx::B2DVector(pWin->GetInverseViewTransformation() * basegfx::B2DVector(FuPoor::HITPIX, 0.0)).getLength());
- double f2HitLog(fHitLog * 2);
+ double f2HitLog(getHitTolLog() * 2);
const basegfx::B2DPoint aHitPosR(rPos.getX() + f2HitLog, rPos.getY());
const basegfx::B2DPoint aHitPosL(rPos.getX() - f2HitLog, rPos.getY());
@@ -1360,10 +1360,10 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper,
const basegfx::B2DPoint aHitPosB(rPos.getX(), rPos.getY() - f2HitLog);
if( bClosed &&
- SdrObjectPrimitiveHit(*pPickObj, aHitPosR, fHitLog, *this, false, 0) &&
- SdrObjectPrimitiveHit(*pPickObj, aHitPosL, fHitLog, *this, false, 0) &&
- SdrObjectPrimitiveHit(*pPickObj, aHitPosT, fHitLog, *this, false, 0) &&
- SdrObjectPrimitiveHit(*pPickObj, aHitPosB, fHitLog, *this, false, 0) )
+ SdrObjectPrimitiveHit(*pPickObj, aHitPosR, getHitTolLog(), *this, false, 0) &&
+ SdrObjectPrimitiveHit(*pPickObj, aHitPosL, getHitTolLog(), *this, false, 0) &&
+ SdrObjectPrimitiveHit(*pPickObj, aHitPosT, getHitTolLog(), *this, false, 0) &&
+ SdrObjectPrimitiveHit(*pPickObj, aHitPosB, getHitTolLog(), *this, false, 0) )
{
// area fill
if(eFill == XFILL_SOLID )
diff --git a/svx/inc/svx/galleryitem.hxx b/svx/inc/svx/galleryitem.hxx
index 9221165640f9..1dea8659c673 100644
--- a/svx/inc/svx/galleryitem.hxx
+++ b/svx/inc/svx/galleryitem.hxx
@@ -40,8 +40,6 @@
#define SVXGALLERYITEM_PARAMS 6
#define SVXGALLERYITEM_ARGNAME "GalleryItem"
-//DBG_NAMEEX_VISIBILITY( SvxGalleryItem, SVX_DLLPUBLIC ) // TTTT
-
class SVX_DLLPUBLIC SvxGalleryItem : public SfxPoolItem
{
sal_Int8 m_nType;
diff --git a/svx/inc/svx/obj3d.hxx b/svx/inc/svx/obj3d.hxx
index 04fc44f05680..99c3ad20579f 100644
--- a/svx/inc/svx/obj3d.hxx
+++ b/svx/inc/svx/obj3d.hxx
@@ -111,7 +111,7 @@ public:
virtual SdrObject* CloneSdrObject(SdrModel* pTargetModel = 0) const;
virtual bool IsClosedObj() const;
- virtual bool IsE3dObject() const;
+// virtual bool IsE3dObject() const;
virtual void SetBoundVolInvalid();
virtual void SetTransformChanged();
virtual void StructureChanged();
diff --git a/svx/inc/svx/svdcrtv.hxx b/svx/inc/svx/svdcrtv.hxx
index 826770cb5c08..34592c065815 100644
--- a/svx/inc/svx/svdcrtv.hxx
+++ b/svx/inc/svx/svdcrtv.hxx
@@ -31,7 +31,6 @@
////////////////////////////////////////////////////////////////////////////////////////////////////
// predefines
-class SdrObjConnection;
class ImplConnectMarkerOverlay;
class ImpSdrCreateViewExtraData;
@@ -154,7 +153,7 @@ public:
sal_uInt16 GetFreeHandMinDistPix() const { return mnFreeHandMinDistPix; }
void SetFreeHandMinDistPix(sal_uInt16 nVal) { if(mnFreeHandMinDistPix != nVal) mnFreeHandMinDistPix = nVal; }
- void SetConnectMarker(const SdrObjConnection& rCon);
+ void SetConnectMarker(const SdrObject* pTargetObject);
void HideConnectMarker();
// Attribute des ggf. gerade in der Erzeugung befindlichen Objekts
diff --git a/svx/inc/svx/svdedtv.hxx b/svx/inc/svx/svdedtv.hxx
index 772e1b6dc5ac..f446398af1c9 100644
--- a/svx/inc/svx/svdedtv.hxx
+++ b/svx/inc/svx/svdedtv.hxx
@@ -219,7 +219,6 @@ public:
void SetMarkedObjSnapRange(const basegfx::B2DRange& rRange, bool bCopy = false);
void MoveMarkedObj(const basegfx::B2DVector& rOffset, bool bCopy = false);
void ResizeMarkedObj(const basegfx::B2DPoint& rRefPoint, const basegfx::B2DTuple& rScale, bool bCopy = false);
- // TTTT: Needed? void ResizeMultMarkedObj(const Point& rRef, const Fraction& xFact, const Fraction& yFact, const bool bCopy, const bool bWdh, const bool bHgt);
double GetMarkedObjRotate() const;
void RotateMarkedObj(const basegfx::B2DPoint& rRefPoint, double fAngle, bool bCopy = false);
void MirrorMarkedObj(const basegfx::B2DPoint& rRefPoint1, const basegfx::B2DPoint& rRefPoint2, bool bCopy = false);
diff --git a/svx/inc/svx/svdobj.hxx b/svx/inc/svx/svdobj.hxx
index 94877b8256c6..5fecf89c5d21 100644
--- a/svx/inc/svx/svdobj.hxx
+++ b/svx/inc/svx/svdobj.hxx
@@ -750,10 +750,9 @@ public:
// true=Obj kann warsch. gefuellt werden; false=Obj kann warsch. Linienenden haben.
// ungueltig, wenn es sich um ein GroupObj handelt.
- virtual bool IsSdrEdgeObj() const;
- virtual bool IsE3dObject() const;
- virtual bool IsSdrUnoObj() const;
- virtual bool IsSdrGrafObj() const;
+// virtual bool IsE3dObject() const;
+// virtual bool IsSdrUnoObj() const;
+// virtual bool IsSdrGrafObj() const;
virtual bool DoesSupportTextIndentingOnLineWidthChange() const;
// void SetObjectInserted(bool bNew);
diff --git a/svx/inc/svx/svdoedge.hxx b/svx/inc/svx/svdoedge.hxx
index 1d6fd3fc3e97..2bf31cedafb1 100644
--- a/svx/inc/svx/svdoedge.hxx
+++ b/svx/inc/svx/svdoedge.hxx
@@ -19,8 +19,6 @@
*
*************************************************************/
-
-
#ifndef _SVDOEDGE_HXX
#define _SVDOEDGE_HXX
@@ -28,140 +26,63 @@
#include <svx/svxdllapi.h>
#include <basegfx/polygon/b2dpolygon.hxx>
-//************************************************************
-// Vorausdeklarationen
-//************************************************************
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// predefines
-class SdrDragMethod;
-class SdrView;
namespace sdr { namespace properties { class ConnectorProperties; }}
-
-//************************************************************
-// Hilfsklasse SdrObjConnection
-//************************************************************
-
-class SdrObjConnection
+class SdrObjConnection;
+class SdrEdgeInfoRec;
+enum SdrEdgeLineCode
{
-private:
- friend class SdrEdgeObj;
- friend class ImpEdgeHdl;
- friend class SdrCreateView;
-
-protected:
- SdrObject* mpConnectedSdrObject; // Referenziertes Objekt
- sal_uInt16 mnConnectorId; // Konnektornummer
-
- // bitfield
- bool mbBestConnection : 1; // true= es wird der guenstigste Konnektor gesucht
- bool mbBestVertex : 1; // true= es wird der guenstigste Scheitelpunkt zum konnekten gesucht
- bool mbAutoVertex : 1; // AutoConnector am Scheitelpunkt nCon
-
-public:
- SVX_DLLPUBLIC ~SdrObjConnection();
- SdrObjConnection() { ResetVars(); }
-
- void ResetVars();
- bool TakeGluePoint(sdr::glue::GluePoint& rGP) const;
-
- inline void SetBestConnection( bool rB ) { mbBestConnection = rB; };
- inline void SetBestVertex( bool rB ) { mbBestVertex = rB; };
- inline void SetAutoVertex( bool rB ) { mbAutoVertex = rB; };
- inline void SetConnectorId( sal_uInt16 nId ) { mnConnectorId = nId; };
-
- inline bool IsBestConnection() const { return mbBestConnection; };
- inline bool IsBestVertex() const { return mbBestVertex; };
- inline bool IsAutoVertex() const { return mbAutoVertex; };
- inline sal_uInt16 GetConnectorId() const { return mnConnectorId; };
- inline SdrObject* GetObject() const { return mpConnectedSdrObject; }
+ OBJ1LINE2,
+ OBJ1LINE3,
+ OBJ2LINE2,
+ OBJ2LINE3,
+ MIDDLELINE
};
-//************************************************************
-// Hilfsklasse SdrEdgeInfoRec
-//************************************************************
-
-enum SdrEdgeLineCode {OBJ1LINE2,OBJ1LINE3,OBJ2LINE2,OBJ2LINE3,MIDDLELINE};
-
-class SdrEdgeInfoRec
-{
-public:
- // Die 5 Distanzen werden beim draggen bzw. per SetAttr gesetzt und von
- // ImpCalcEdgeTrack ausgewertet. Per Get/SetAttr/Get/SetStyleSh werden
- // jedoch nur 0-3 longs transportiert.
- basegfx::B2DPoint aObj1Line2;
- basegfx::B2DPoint aObj1Line3;
- basegfx::B2DPoint aObj2Line2;
- basegfx::B2DPoint aObj2Line3;
- basegfx::B2DPoint aMiddleLine;
-
- // Nachfolgende Werte werden von ImpCalcEdgeTrack gesetzt
- long nAngle1; // Austrittswinkel am Obj1
- long nAngle2; // Austrittswinkel am Obj2
- sal_uInt16 nObj1Lines; // 1..3
- sal_uInt16 nObj2Lines; // 1..3
- sal_uInt16 nMiddleLine; // 0xFFFF=keine, sonst Punktnummer des Linienbeginns
- char cOrthoForm; // Form des Ortho-Verbindes, z.B. 'Z','U',I','L','S',...
-
- SdrEdgeInfoRec()
- : nAngle1(0),
- nAngle2(0),
- nObj1Lines(0),
- nObj2Lines(0),
- nMiddleLine(0xFFFF),
- cOrthoForm(0)
- {}
-
- basegfx::B2DPoint& ImpGetLineVersatzPoint(SdrEdgeLineCode eLineCode);
- const basegfx::B2DPoint& ImpGetLineVersatzPoint(SdrEdgeLineCode eLineCode) const { return const_cast< SdrEdgeInfoRec* >(this)->ImpGetLineVersatzPoint(eLineCode); }
- sal_uInt32 ImpGetPolyIdx(SdrEdgeLineCode eLineCode, sal_uInt32 nPointCount) const;
- bool ImpIsHorzLine(SdrEdgeLineCode eLineCode, sal_uInt32 nPointCount) const;
- void ImpSetLineVersatz(SdrEdgeLineCode eLineCode, sal_uInt32 nPointCount, long nVal);
- long ImpGetLineVersatz(SdrEdgeLineCode eLineCode, sal_uInt32 nPointCount) const;
-};
-
-//************************************************************
-// Hilfsklasse SdrEdgeObjGeoData
-//************************************************************
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// SdrEdgeObjGeoData
class SdrEdgeObjGeoData : public SdrObjGeoData
{
public:
- SdrObjConnection maCon1; // Verbindungszustand des Linienanfangs
- SdrObjConnection maCon2; // Verbindungszustand des Linienendes
+ SdrObjConnection* mpCon1; // Verbindungszustand des Linienanfangs
+ SdrObjConnection* mpCon2; // Verbindungszustand des Linienendes
basegfx::B2DPolygon maEdgeTrack;
- bool mbEdgeTrackDirty;// true=Verbindungsverlauf muss neu berechnet werden.
- bool mbEdgeTrackUserDefined;
- SdrEdgeInfoRec maEdgeInfo;
+ SdrEdgeInfoRec* mpEdgeInfo;
+
+ /// bitfield
+ bool mbEdgeTrackUserDefined : 1;
SdrEdgeObjGeoData();
virtual ~SdrEdgeObjGeoData();
};
-//************************************************************
-// Hilfsklasse SdrEdgeObj
-//************************************************************
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// SdrEdgeObj
class SVX_DLLPUBLIC SdrEdgeObj : public SdrTextObj
{
private:
// to allow sdr::properties::ConnectorProperties access to ImpSetAttrToEdgeInfo()
friend class sdr::properties::ConnectorProperties;
+ friend class SdrCreateView;
+ friend class SdrObjConnection;
- friend class SdrCreateView;
- friend class ImpEdgeHdl;
-
-protected:
- virtual sdr::properties::BaseProperties* CreateObjectSpecificProperties();
- virtual sdr::contact::ViewContact* CreateObjectSpecificViewContact();
- virtual sdr::glue::GluePointProvider* CreateObjectSpecificGluePointProvider();
-
- SdrObjConnection maCon1; // Verbindungszustand des Linienanfangs
- SdrObjConnection maCon2; // Verbindungszustand des Linienendes
+ // geometric definition; one for start and one for end
+ SdrObjConnection* mpCon1;
+ SdrObjConnection* mpCon2;
+ // created geometry; dependent from EdgeTrackUserDefined it can be
+ // recreated on the fly or *is* the geometry already
basegfx::B2DPolygon maEdgeTrack;
- SdrEdgeInfoRec maEdgeInfo;
- // bitfield
- bool mbEdgeTrackDirty : 1; // true=Verbindungsverlauf muss neu berechnet werden.
+ // additionally definitions for shaping; these are buffered ItemContent,
+ // transfer is done in ImpSetAttrToEdgeInfo and ImpSetEdgeInfoToAttr
+ SdrEdgeInfoRec* mpEdgeInfo;
+
+ /// bitfield
bool mbEdgeTrackUserDefined : 1;
// #109007#
@@ -180,35 +101,32 @@ protected:
// to a correct state for first real layouting
unsigned mbSuppressed : 1;
-public:
- // #109007#
- // Interface to default connect suppression
- void SetSuppressDefaultConnect(sal_Bool bNew) { mbSuppressDefaultConnect = bNew; }
- sal_Bool GetSuppressDefaultConnect() const { return mbSuppressDefaultConnect; }
-
- // #110649#
- sal_Bool IsBoundRectCalculationRunning() const { return mbBoundRectCalculationRunning; }
+ /// internal post processing when one of the positions the geometry
+ /// is based on changes; this is only to be called from the object
+ /// connectons or internally. It will correct the local transformation
+ /// and do needed refreshes
+ void geometryChange();
-protected:
- virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint);
-
- void ImpRecalcEdgeTrack(); // Neuberechnung des Verbindungsverlaufs
+ /// helper to recalculate the EdgeTrack based on given information
basegfx::B2DPolygon ImpCalcEdgeTrack(
SdrObjConnection& rCon1,
SdrObjConnection& rCon2,
- SdrEdgeInfoRec* pInfo) const;
- static void FindConnector(
- const basegfx::B2DPoint& rPt,
- const SdrView& rSdrView,
- SdrObjConnection& rCon,
- const SdrEdgeObj* pThis,
- OutputDevice* pOut = 0);
- sal_uInt16 ImpCalcEscAngle(SdrObject* pObj, const basegfx::B2DPoint& aPt2) const;
- void ImpSetTailPoint(bool bTail1, const basegfx::B2DPoint& rPt);
- void ImpUndirtyEdgeTrack(); // eventuelle Neuberechnung des Verbindungsverlaufs
- void ImpDirtyEdgeTrack(); // invalidate connector path, so it will be recalculated next time
- void ImpSetAttrToEdgeInfo(); // Werte vom Pool nach aEdgeInfo kopieren
- void ImpSetEdgeInfoToAttr(); // Werte vom aEdgeInfo in den Pool kopieren
+ SdrEdgeInfoRec* pInfo,
+ const basegfx::B2DHomMatrix* pTransA,
+ const basegfx::B2DHomMatrix* pTransB) const;
+
+ // recalculate EdgeTrack and put to maEdgeTrack
+ void ImpRecalcEdgeTrack();
+
+ // push/pull of data between ItemSet representation and SdrEdgeInfoRec
+ void ImpSetAttrToEdgeInfo();
+ void ImpSetEdgeInfoToAttr();
+
+protected:
+ // object specific handlers
+ virtual sdr::properties::BaseProperties* CreateObjectSpecificProperties();
+ virtual sdr::contact::ViewContact* CreateObjectSpecificViewContact();
+ virtual sdr::glue::GluePointProvider* CreateObjectSpecificGluePointProvider();
virtual ~SdrEdgeObj();
@@ -216,37 +134,55 @@ 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
+ 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; }
+
+ // #110649#
+ sal_Bool IsBoundRectCalculationRunning() const { return mbBoundRectCalculationRunning; }
+
/// create a copy, evtl. with a different target model (if given)
virtual SdrObject* CloneSdrObject(SdrModel* pTargetModel = 0) const;
- virtual bool IsSdrEdgeObj() const;
virtual bool IsClosedObj() const;
SdrEdgeObj(SdrModel& rSdrModel);
- SdrObjConnection& GetConnection(bool bTail1) { return *(bTail1 ? &maCon1 : &maCon2); }
virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const;
virtual sal_uInt16 GetObjIdentifier() const;
- // bTail1=true: Linienanfang, sonst LinienEnde
- // pObj=NULL: Disconnect
- void SetEdgeTrackDirty() { mbEdgeTrackDirty = true; }
- void ConnectToNode(bool bTail1, SdrObject* pObj);
- void DisconnectFromNode(bool bTail1);
- SdrObject* GetConnectedNode(bool bTail1) const;
- const SdrObjConnection& GetConnection(bool bTail1) const { return *(bTail1 ? &maCon1 : &maCon2); }
- bool CheckNodeConnection(bool bTail1) const;
+ void SetEdgeTrackDirty(); // { mbEdgeTrackDirty = true; }
- virtual void TakeObjNameSingul(String& rName) const;
- virtual void TakeObjNamePlural(String& rName) const;
+ // bTail=true: Linienanfang, sonst LinienEnde
+ // pObj=NULL -> 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
void SetEdgeTrackPath( const basegfx::B2DPolygon& rPoly );
basegfx::B2DPolygon GetEdgeTrackPath() const;
+ /// set/get connector ID (if needed)
+ void SetConnectorId(bool bTail, sal_uInt32 nId);
+ sal_uInt32 GetConnectorId(bool bTail) const;
+
+ virtual void TakeObjNameSingul(String& rName) const;
+ virtual void TakeObjNamePlural(String& rName) const;
+
virtual basegfx::B2DPolyPolygon TakeXorPoly() const;
sal_uInt32 impOldGetHdlCount() const;
SdrHdl* impOldGetHdl(SdrHdlList& rHdlList, sal_uInt32 nHdlNum) const;
virtual void AddToHdlList(SdrHdlList& rHdlList) const;
+ bool checkHorizontalDrag(SdrEdgeLineCode eCode, bool bObjHdlTwo) const;
// special drag methods
virtual bool hasSpecialDrag() const;
@@ -269,32 +205,24 @@ public:
virtual sal_uInt32 GetSnapPointCount() const;
virtual basegfx::B2DPoint GetSnapPoint(sal_uInt32 i) const;
virtual bool IsPolygonObject() const;
- virtual sal_uInt32 GetObjectPointCount() const;
- virtual basegfx::B2DPoint GetObjectPoint(sal_uInt32 i) const;
- virtual void SetObjectPoint(const basegfx::B2DPoint& rPnt, sal_uInt32 i);
virtual SdrObjGeoData* NewGeoData() const;
virtual void SaveGeoData(SdrObjGeoData& rGeo) const;
virtual void RestGeoData(const SdrObjGeoData& rGeo);
- /** updates edges that are connected to the edges of this object
- as if the connected objects send a repaint broadcast
- #103122#
- */
- void ReformatEdge();
-
// helper methods for the StarOffice api
basegfx::B2DPoint GetTailPoint( bool bTail ) const;
void SetTailPoint( bool bTail, const basegfx::B2DPoint& rPt );
void setGluePointIndex( bool bTail, sal_Int32 nId = -1 );
sal_Int32 getGluePointIndex( bool bTail );
- // for geometry access
-// ::basegfx::B2DPolygon getEdgeTrack() const;
-
- // helper method for SdrDragMethod::AddConnectorOverlays. Adds a overlay polygon for
- // this connector to rResult.
- basegfx::B2DPolygon ImplAddConnectorOverlay(SdrDragMethod& rDragMethod, bool bTail1, bool bTail2, bool bDetail) const;
+ // helper method for AddConnectorOverlays. Creates the needed overlay
+ // polygon for this connector based on internal data
+ basegfx::B2DPolygon CreateConnectorOverlay(
+ const basegfx::B2DHomMatrix& rCurrentTransformation,
+ bool bTail1,
+ bool bTail2,
+ bool bDetail) const;
// get/setSdrObjectTransformation
virtual const basegfx::B2DHomMatrix& getSdrObjectTransformation() const;
@@ -302,120 +230,8 @@ public:
};
////////////////////////////////////////////////////////////////////////////////////////////////////
-//
-// Zur Bestimmung der Verlaufslinie werden folgende Item-Parameter des SdrItemPool verwendet:
-//
-// sal_uInt16 EdgeFlowAngle Default 9000 (=90.00 Deg), min 0, max 9000
-// Verlauffreiheitswinkel.
-// Der Winkel, in dem die Verbindungslinie verlaufen darf.
-//
-// sal_uInt16 EdgeEscAngle Default 9000 (=90.00 Deg), min 0, max 9000
-// Objektaustrittswinkel.
-// Der Winkel, in dem die Verbindungslinie aus dem Objekt austreten darf.
-//
-// bool EdgeEscAsRay Default false
-// true= die Verbindungslinie tritt aus dem Obj Strahlenfoermig aus.
-// Also Winkelvorgabe durch die Strecke ObjMitte/Konnektor.
-//
-// bool EdgeEscUseObjAngle Default false
-// Objektdrehwinkelberuecksichtigung.
-// true= Bei der Bestimmung des Objektaustrittswinkels wird der
-// Drehwinkel des Objekts als Offset beruecksichtigt.
-//
-// sal_uInt32 EdgeFlowDefDist Default 0, min 0, max ?
-// Das ist der Default-Mindestabstand der bei der Berechnung der
-// Verbindungslinie zu den angedockten Objekten in logischen Einheiten.
-// Dieser Abstand wird innerhalb des Objektes "ueberschrieben", sobald
-// der User an den Linien draggd. Beim Andocken an ein neues Objekt wird
-// dann jedoch wieder dieser Default verwendet.
-//
-//
-// Allgemeines zu Konnektoren:
-//
-// Es gibt Knoten und Kantenobjekte. Zwei Knoten koennen durch eine Kante
-// miteinander verbunden werden. Ist eine Kante nur an einem Ende an einen
-// Knoten geklebt, ist das andere Ende auf einer absoluten Position im Doc
-// fixiert. Ebenso ist es natuerlich auch moeglich, dass eine Kante an beiden
-// Enden "frei", also nicht mit einem Knotenobjekt verbunden ist.
-//
-// Ein Kantenobjekt kann theoretisch auch gleichzeitig Knotenobjekt sein. In
-// der ersten Version wird das jedoch noch nicht realisiert werden.
-//
-// Eine Verbindung zwischen Knoten und Kante kann hergestellt werden durch:
-// - Interaktives erzeugen eines neuen Kantenobjekts an der SdrView wobei
-// Anfangs- bzw. Endpunkt der Kante auf ein Konnektor (Klebestelle) eines
-// bereits vorhandenen Knotenobjekts gelegt wird.
-// - Interaktives draggen des Anfangs- bzw. Endpunkts eines bestehenden
-// Kantenobjekts an der SdrView auf ein Konnektor (Klebestelle) eines
-// bereits vorhandenen Knotenobjekts.
-// - Undo/Redo
-// Verschieben von Knotenobjekten stellt keine Verbindungen her. Ebenso auch
-// nicht das direkte Verschieben von Kantenendpunkten am SdrModel...
-// Verbindungen koennen auch hergestellt werden, wenn die Konnektoren an der
-// View nicht sichtbar geschaltet sind.
-//
-// Eine vorhandene Verbindung zwischen Knoten und Kante bleibt erhalten bei:
-// - Draggen (Move/Resize/Rotate/...) des Knotenobjekts
-// - Verschieben einer Konnektorposition im Knotemobjekt
-// - gleichzeitiges Draggen (Move/Resize/Rotate/...) von Knoten und Kante
-//
-// Eine Verbindung zwischen Knoten und Kante kann geloesst werden durch:
-// - Loeschen eines der Objekte
-// - Draggen des Kantenobjekts ohne gleichzeitiges Draggen des Knotens
-// - Loeschen des Konnektors am Knotenobjekt
-// - Undo/Redo/Repeat
-// Beim Draggen muss die Aufforderung zum loesen der Verbindung von ausserhalb
-// des Models befohlen werden (z.B. von der SdrView). SdrEdgeObj::Move() loesst
-// die Verbindung nicht selbsttaetig.
-//
-// Jedes Knotenobjekt kann Konnektoren, sog. Klebestellen besitzen. Das sind die
-// geometrischen Punkte, an denen das verbindende Kantenobjekt bei hergestellter
-// Verbindung endet. Defaultmaessig hat jedes Objekt keine Konnektoren. Trotzdem
-// kann man bei bestimmten View-Einstellungen eine Kante andocken, da dann z.B.
-// an den 4 Scheitelpunkten des Knotenobjekts bei Bedarf automatisch Konnektoren
-// generiert werden. Jedes Objekt liefert dafuer 2x4 sog. Default-Konnektorposi-
-// tionen, 4 an den Scheitelpunkten und 4 an den Eckpositionen. Im Normalfall
-// liegen diese an den 8 Handlepositionen; Ausnahmen bilden hier Ellipsen,
-// Parallelogramme, ... . Darueberhinaus koennen auch an jedem Knotenobjekt
-// anwenderspeziefische Konnektoren gesetzt werden.
-//
-// Dann gibt es noch die Moeglichkeit, ein Kante an einem Objekt mit dem
-// Attribut "bUseBestConnector" anzudocken. Es wird dann aus dem Angebot der
-// Konnektoren des Objekts oder/und der Scheitelpunkte, jeweils die fuer den
-// Verlauf der Verbindungslinie guenstigste Konnektorposition verwendet. Der
-// Anwender vergibt dieses Attribut, indem er den Knoten in seiner Mitte
-// andockt (siehe z.B. Visio).
-// 09-06-1996: bUseBestConnector verwendet nur Scheitelpunktklebepunkte.
-//
-// Und hier noch etwas Begriffsdefinition:
-// Verbinder : Eben das Verbinderobjekt (Kantenobjekt)
-// Knoten : Ein beliebiges Objekt, an dem ein Verbinder drangeklebt
-// werden kann, z.B. ein Rechteck, ...
-// Klebepunkt: Der Punkt, an dem der Verbinder an das Knotenobjekt
-// geklebt wird. Hierbei gibt es:
-// Scheitelpunktklebepunkte: Jedes Knotenobjekt hat diese
-// Klebepunkte von Natur aus. Moeglicherweise gibt es
-// im Draw bereits die Option "Automatisch ankleben an
-// Objektscheitelpunkte" (default an)
-// Eckpunktklebepunkte: Auch diese Klebepunkte sind den
-// Objekten von mir bereits mitgegeben. Wie die oben
-// erwaehnten gibt es fuer diese moeglicherweise
-// bereits auch eine Option im Draw. (default aus)
-// Scheitelpunktklebepunkte und Eckpunktklebepunkte sind
-// im Gegensatz zu Visio nicht optisch sichtbar; sie
-// sind eben einfach da (wenn Option eingeschaltet).
-// Benutzerdefinierte Klebepunkte: Gibt es an jedem
-// Knotenobjekt beliebig viele. Per Option koennen sie
-// sichtbar geschaltet werden (beim editieren immer
-// sichtbar). Zur Zeit sind die jedoch noch nicht ganz
-// fertigimplementiert.
-// Automatische Klebepunktwahl: Wird der Verbinder so an
-// das Knotenobjekt gedockt, dass der schwarke Rahmen
-// das gesamte Objekt umfasst, so versucht der
-// Verbinder von den 4 Scheitelpunktklebepunkten (und
-// zwar nur von denen) den guenstigsten herauszufinden.
-//
-//////////////////////////////////////////////////////////////////////////////////////////////////
#endif //_SVDOEDGE_HXX
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// eof
diff --git a/svx/inc/svx/svdograf.hxx b/svx/inc/svx/svdograf.hxx
index f23147199a52..df650ad7dbbd 100644
--- a/svx/inc/svx/svdograf.hxx
+++ b/svx/inc/svx/svdograf.hxx
@@ -120,7 +120,7 @@ public:
const Graphic& rGrf,
const basegfx::B2DHomMatrix& rTransform = basegfx::B2DHomMatrix());
- virtual bool IsSdrGrafObj() const;
+// virtual bool IsSdrGrafObj() const;
virtual bool DoesSupportTextIndentingOnLineWidthChange() const;
void SetGraphicObject( const GraphicObject& rGrfObj );
diff --git a/svx/inc/svx/svdouno.hxx b/svx/inc/svx/svdouno.hxx
index c8afed82fd2b..17f9d1501bf5 100644
--- a/svx/inc/svx/svdouno.hxx
+++ b/svx/inc/svx/svdouno.hxx
@@ -88,7 +88,7 @@ public:
const ::com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >& rxSFac,
bool bOwnsModel = true);
- virtual bool IsSdrUnoObj() const;
+// virtual bool IsSdrUnoObj() const;
virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const;
virtual sal_uInt16 GetObjIdentifier() const;
virtual void SetLayer(SdrLayerID nLayer);
diff --git a/svx/inc/svx/svdview.hxx b/svx/inc/svx/svdview.hxx
index 3171967e94a1..4e390a4554e7 100644
--- a/svx/inc/svx/svdview.hxx
+++ b/svx/inc/svx/svdview.hxx
@@ -285,6 +285,15 @@ public:
virtual void onAccessibilityOptionsChanged();
void MoveHandleByVector(const SdrHdl& rHdl, const basegfx::B2DVector& rDistance, Window* pMakeVisibleWindow, SdrDragMethod* pOwnDragMethod);
+
+ /// find a SdrObject at position in rSource; evtl exclude a given SdrEdgeObj (pAvoidConnectioWith)
+ /// from that search. If no SdrObject connection is found, null is returned
+ SdrObject* FindConnector(
+ const basegfx::B2DPoint& rPosition,
+ sal_uInt32& o_rnID,
+ bool& o_rbBest,
+ bool& o_rbAuto,
+ const SdrEdgeObj* pAvoidConnectioWith);
};
////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/svx/source/dialog/connctrl.cxx b/svx/source/dialog/connctrl.cxx
index 05138e8076f2..b05b7d9b9165 100644
--- a/svx/source/dialog/connctrl.cxx
+++ b/svx/source/dialog/connctrl.cxx
@@ -79,35 +79,27 @@ void SvxXConnectionPreview::Construct()
{
DBG_ASSERT( pView, "Keine gueltige View Uebergeben!" );
- if(pView->areSdrObjectsSelected())
+ if(pView->areSdrObjectsSelected() && !pEdgeObj)
{
- bool bFound = false;
+ // get first edge from selection, clone it and it's connected objects
const SdrObjectVector aSelection(pView->getSelectedSdrObjectVectorFromSdrMarkView());
- for(sal_uInt32 i(0); i < aSelection.size() && !bFound; i++)
+ for(sal_uInt32 i(0); i < aSelection.size() && !pEdgeObj; i++)
{
const SdrEdgeObj* pTmpEdgeObj = dynamic_cast< const SdrEdgeObj* >(aSelection[i]);
if(pTmpEdgeObj)
{
- bFound = true;
- pEdgeObj = (SdrEdgeObj*) pTmpEdgeObj->CloneSdrObject();
-
- SdrObjConnection& rConn1 = (SdrObjConnection&)pEdgeObj->GetConnection(true);
- SdrObjConnection& rConn2 = (SdrObjConnection&)pEdgeObj->GetConnection(false);
-
- rConn1 = pTmpEdgeObj->GetConnection(true);
- rConn2 = pTmpEdgeObj->GetConnection(false);
-
- SdrObject* pTmpObj1 = pTmpEdgeObj->GetConnectedNode(true);
- SdrObject* pTmpObj2 = pTmpEdgeObj->GetConnectedNode(false);
+ pEdgeObj = static_cast< SdrEdgeObj* >(pTmpEdgeObj->CloneSdrObject());
+ SdrObject* pTmpObj1 = pTmpEdgeObj->GetSdrObjectConnection(true);
+ SdrObject* pTmpObj2 = pTmpEdgeObj->GetSdrObjectConnection(false);
if( pTmpObj1 )
{
SdrObject* pObj1 = pTmpObj1->CloneSdrObject();
maSdrObjectVector.push_back(pObj1);
- pEdgeObj->ConnectToNode(true, pObj1);
+ pEdgeObj->ConnectToSdrObject(true, pObj1);
}
if( pTmpObj2 )
@@ -115,7 +107,7 @@ void SvxXConnectionPreview::Construct()
SdrObject* pObj2 = pTmpObj2->CloneSdrObject();
maSdrObjectVector.push_back(pObj2);
- pEdgeObj->ConnectToNode(false, pObj2);
+ pEdgeObj->ConnectToSdrObject(false, pObj2);
}
maSdrObjectVector.push_back(pEdgeObj);
@@ -125,7 +117,9 @@ void SvxXConnectionPreview::Construct()
if( !pEdgeObj )
{
+ // no edge in selection, create default edge
pEdgeObj = new SdrEdgeObj(pView->getSdrModelFromSdrView());
+ maSdrObjectVector.push_back(pEdgeObj);
}
// Groesse anpassen
diff --git a/svx/source/engine3d/obj3d.cxx b/svx/source/engine3d/obj3d.cxx
index 5b8b1c78b92a..c8aa2b2ea421 100644
--- a/svx/source/engine3d/obj3d.cxx
+++ b/svx/source/engine3d/obj3d.cxx
@@ -169,10 +169,10 @@ SdrObject* E3dObject::CloneSdrObject(SdrModel* pTargetModel) const
|*
\************************************************************************/
-bool E3dObject::IsE3dObject() const
-{
- return true;
-}
+//bool E3dObject::IsE3dObject() const
+//{
+// return true;
+//}
void E3dObject::SetSelected(bool bNew)
{
diff --git a/svx/source/engine3d/scene3d.cxx b/svx/source/engine3d/scene3d.cxx
index 872c024aa326..5ae9ea981184 100644
--- a/svx/source/engine3d/scene3d.cxx
+++ b/svx/source/engine3d/scene3d.cxx
@@ -898,9 +898,6 @@ const basegfx::B2DHomMatrix& E3dScene::getSdrObjectTransformation() const
void E3dScene::setSdrObjectTransformation(const basegfx::B2DHomMatrix& rTransformation)
{
- // TTTT: SetGlueReallyAbsolute(TRUE);
- // NbcRotateGluePoints(rRef,nWink,sn,cs); // Rotiert die Klebepunkte (die haben noch Koordinaten relativ
- // SetGlueReallyAbsolute(FALSE); // ab jetzt sind sie wieder relativ zum SnapRect definiert
const E3dScene* pScene = GetScene();
if(pScene == this)
diff --git a/svx/source/form/fmview.cxx b/svx/source/form/fmview.cxx
index 3df38c94ed82..ef519163853f 100644
--- a/svx/source/form/fmview.cxx
+++ b/svx/source/form/fmview.cxx
@@ -298,7 +298,7 @@ void FmFormView::ChangeDesignMode(sal_Bool bDesign)
while( aIter.IsMore() )
{
SdrObject* pObj = aIter.Next();
- if (pObj && pObj->IsSdrUnoObj())
+ if(dynamic_cast< SdrUnoObj* >(pObj))
{
// For redraw just use ActionChanged()
pObj->ActionChanged();
diff --git a/svx/source/svdraw/clonelist.cxx b/svx/source/svdraw/clonelist.cxx
index 02b65316e56c..aed190aa4806 100644
--- a/svx/source/svdraw/clonelist.cxx
+++ b/svx/source/svdraw/clonelist.cxx
@@ -77,7 +77,7 @@ void CloneList::CopyConnections() const
if(pOriginalEdge && pCloneEdge)
{
- SdrObject* pOriginalNode1 = pOriginalEdge->GetConnectedNode(true);
+ SdrObject* pOriginalNode1 = pOriginalEdge->GetSdrObjectConnection(true);
if(pOriginalNode1)
{
@@ -88,13 +88,13 @@ void CloneList::CopyConnections() const
{
if(*aOriginal == pOriginalNode1)
{
- pCloneEdge->ConnectToNode(true, *aClone);
+ pCloneEdge->ConnectToSdrObject(true, *aClone);
break;
}
}
}
- SdrObject* pOriginalNode2 = pOriginalEdge->GetConnectedNode(false);
+ SdrObject* pOriginalNode2 = pOriginalEdge->GetSdrObjectConnection(false);
if(pOriginalNode2)
{
@@ -105,7 +105,7 @@ void CloneList::CopyConnections() const
{
if(*aOriginal == pOriginalNode2)
{
- pCloneEdge->ConnectToNode(false, *aClone);
+ pCloneEdge->ConnectToSdrObject(false, *aClone);
break;
}
}
diff --git a/svx/source/svdraw/svdcrtv.cxx b/svx/source/svdraw/svdcrtv.cxx
index e5cf5e3b8552..7f3a8e995cf4 100644
--- a/svx/source/svdraw/svdcrtv.cxx
+++ b/svx/source/svdraw/svdcrtv.cxx
@@ -62,13 +62,13 @@ class ImplConnectMarkerOverlay
const SdrObject& mrObject;
public:
- ImplConnectMarkerOverlay(const SdrCreateView& rView, SdrObject& rObject);
+ ImplConnectMarkerOverlay(const SdrCreateView& rView, const SdrObject& rObject);
~ImplConnectMarkerOverlay();
const SdrObject& GetTargetObject() const { return mrObject; }
};
-ImplConnectMarkerOverlay::ImplConnectMarkerOverlay(const SdrCreateView& rView, SdrObject& rObject)
+ImplConnectMarkerOverlay::ImplConnectMarkerOverlay(const SdrCreateView& rView, const SdrObject& rObject)
: mrObject(rObject)
{
basegfx::B2DPolyPolygon aB2DPolyPolygon(rObject.TakeXorPoly());
@@ -295,10 +295,8 @@ bool SdrCreateView::CheckEdgeMode()
}
}
-void SdrCreateView::SetConnectMarker(const SdrObjConnection& rCon)
+void SdrCreateView::SetConnectMarker(const SdrObject* pTargetObject)
{
- SdrObject* pTargetObject = rCon.GetObject();
-
if(pTargetObject)
{
// if target object changes, throw away overlay object to make room for changes
@@ -331,14 +329,18 @@ bool SdrCreateView::MouseMove(const MouseEvent& rMEvt, Window* pWin)
{
const basegfx::B2DPoint aLogic(pWin->GetInverseViewTransformation() * basegfx::B2DPoint(rMEvt.GetPosPixel().X(), rMEvt.GetPosPixel().Y()));
bool bMarkHit(PickHandle(aLogic) || IsMarkedObjHit(aLogic));
- SdrObjConnection aCon;
+ SdrObject* pConnectObjectCandidate = 0;
if(!bMarkHit)
{
- SdrEdgeObj::FindConnector(aLogic, *getAsSdrView(), aCon, 0, pWin);
+ sal_uInt32 nID(0);
+ bool bBest(false);
+ bool bAuto(false);
+
+ pConnectObjectCandidate = getAsSdrView()->FindConnector(aLogic, nID, bBest, bAuto, 0);
}
- SetConnectMarker(aCon);
+ SetConnectMarker(pConnectObjectCandidate);
}
}
diff --git a/svx/source/svdraw/svddrgmt.cxx b/svx/source/svdraw/svddrgmt.cxx
index 09f8062789fc..c39134944d81 100644
--- a/svx/source/svdraw/svddrgmt.cxx
+++ b/svx/source/svdraw/svddrgmt.cxx
@@ -721,7 +721,7 @@ void SdrDragMethod::CreateOverlayGeometry(sdr::overlay::OverlayManager& rOverlay
for(a = 0; a < aEdges.size(); a++)
{
SdrEdgeObj* pSdrEdgeObj = aEdges[a];
- SdrObject* pConnectedTo = pSdrEdgeObj->GetConnectedNode(true);
+ SdrObject* pConnectedTo = pSdrEdgeObj->GetSdrObjectConnection(true);
if(pConnectedTo)
{
@@ -729,11 +729,11 @@ void SdrDragMethod::CreateOverlayGeometry(sdr::overlay::OverlayManager& rOverlay
if(aEntry != aOriginalAndClones.end())
{
- pSdrEdgeObj->ConnectToNode(true, aEntry->second);
+ pSdrEdgeObj->ConnectToSdrObject(true, aEntry->second);
}
}
- pConnectedTo = pSdrEdgeObj->GetConnectedNode(false);
+ pConnectedTo = pSdrEdgeObj->GetSdrObjectConnection(false);
if(pConnectedTo)
{
@@ -741,7 +741,7 @@ void SdrDragMethod::CreateOverlayGeometry(sdr::overlay::OverlayManager& rOverlay
if(aEntry != aOriginalAndClones.end())
{
- pSdrEdgeObj->ConnectToNode(false, aEntry->second);
+ pSdrEdgeObj->ConnectToSdrObject(false, aEntry->second);
}
}
}
@@ -873,11 +873,16 @@ drawinglayer::primitive2d::Primitive2DSequence SdrDragMethod::AddConnectorOverla
for(sal_uInt32 a(0); a < aConnectedSdrEdgeObjs.size(); a++)
{
const SdrEdgeObj* pEdge = aConnectedSdrEdgeObjs[a];
- const SdrObject* pCon1(pEdge->GetConnectedNode(true));
- const SdrObject* pCon2(pEdge->GetConnectedNode(false));
+ const SdrObject* pCon1(pEdge->GetSdrObjectConnection(true));
+ const SdrObject* pCon2(pEdge->GetSdrObjectConnection(false));
const bool bCon1(pCon1 && getSdrView().isSdrObjectSelected(*pCon1));
const bool bCon2(pCon2 && getSdrView().isSdrObjectSelected(*pCon2));
- const basegfx::B2DPolygon aEdgePolygon(pEdge->ImplAddConnectorOverlay(*this, bCon1, bCon2, bDetail));
+ const basegfx::B2DPolygon aEdgePolygon(
+ pEdge->CreateConnectorOverlay(
+ getCurrentTransformation(),
+ bCon1,
+ bCon2,
+ bDetail));
if(aEdgePolygon.count())
{
diff --git a/svx/source/svdraw/svddrgv.cxx b/svx/source/svdraw/svddrgv.cxx
index 8e07afef0a54..7c17d1663ca3 100644
--- a/svx/source/svdraw/svddrgv.cxx
+++ b/svx/source/svdraw/svddrgv.cxx
@@ -525,10 +525,9 @@ bool SdrDragView::BegDragObj(const basegfx::B2DPoint& rPnt, const SdrHdl* pHdl,
}
else if(HDL_POLY == GetDragHdlKind())
{
- const SdrObject* pMarkedObject = getSelectedIfSingle();
- const bool bConnectorSelected(pMarkedObject && pMarkedObject->IsSdrEdgeObj());
+ const SdrEdgeObj* pMarkedObject = dynamic_cast< const SdrEdgeObj* >(getSelectedIfSingle());
- if(bConnectorSelected)
+ if(pMarkedObject)
{
// #i97784#
// fallback to old behaviour for connectors (see
@@ -816,16 +815,9 @@ bool SdrDragView::IsInsGluePointPossible() const
if(IsInsGluePointMode() && areSdrObjectsSelected())
{
- const SdrObject* pMarkedObject = getSelectedIfSingle();
+ const SdrEdgeObj* pMarkedObject = dynamic_cast< const SdrEdgeObj* >(getSelectedIfSingle());
- if(pMarkedObject)
- {
- if(!pMarkedObject->IsSdrEdgeObj())
- {
- bRetval = true;
- }
- }
- else
+ if(!pMarkedObject)
{
bRetval = true;
}
diff --git a/svx/source/svdraw/svdedtv.cxx b/svx/source/svdraw/svdedtv.cxx
index db54722a6909..6e634f3093be 100644
--- a/svx/source/svdraw/svdedtv.cxx
+++ b/svx/source/svdraw/svdedtv.cxx
@@ -367,10 +367,10 @@ void SdrEditView::ImpBroadcastEdgesOfMarkedNodes()
if(pEdge)
{
- SdrObject* pObj1 = pEdge->GetConnectedNode(false);
- SdrObject* pObj2 = pEdge->GetConnectedNode(true);
+ SdrObject* pObj1 = pEdge->GetSdrObjectConnection(false);
+ SdrObject* pObj2 = pEdge->GetSdrObjectConnection(true);
- if(pObj1 && !pEdge->CheckNodeConnection(false))
+ if(pObj1 && !pEdge->CheckSdrObjectConnection(false))
{
bool bContains(false);
@@ -390,11 +390,11 @@ void SdrEditView::ImpBroadcastEdgesOfMarkedNodes()
AddUndo( getSdrModelFromSdrView().GetSdrUndoFactory().CreateUndoGeoObject(*pEdge));
}
- pEdge->DisconnectFromNode(false);
+ pEdge->ConnectToSdrObject(false);
}
}
- if(pObj2 && !pEdge->CheckNodeConnection(true))
+ if(pObj2 && !pEdge->CheckSdrObjectConnection(true))
{
bool bContains(false);
@@ -414,23 +414,23 @@ void SdrEditView::ImpBroadcastEdgesOfMarkedNodes()
AddUndo( getSdrModelFromSdrView().GetSdrUndoFactory().CreateUndoGeoObject(*pEdge));
}
- pEdge->DisconnectFromNode(true);
+ pEdge->ConnectToSdrObject(true);
}
}
}
}
- /// get all SdrEdgeObj which are connected to a selected SdrObject and are selected themselves
- const ::std::vector< SdrEdgeObj* > aConnectedSdrEdgeObjs(getAllSdrEdgeObjConnectedToSdrObjectVector(aSelection, true));
-
- for(sal_uInt32 i(0); i < aConnectedSdrEdgeObjs.size(); i++)
- {
- SdrEdgeObj* pEdge = aConnectedSdrEdgeObjs[i];
-
- /// TTTT: is this needed or will this happen automatically...?
- pEdge->SetEdgeTrackDirty();
- }
- }
+ ///// get all SdrEdgeObj which are connected to a selected SdrObject and are selected themselves
+ //const ::std::vector< SdrEdgeObj* > aConnectedSdrEdgeObjs(getAllSdrEdgeObjConnectedToSdrObjectVector(aSelection, true));
+ //
+ //for(sal_uInt32 i(0); i < aConnectedSdrEdgeObjs.size(); i++)
+ //{
+ // SdrEdgeObj* pEdge = aConnectedSdrEdgeObjs[i];
+ //
+ // /// TTTT: is this needed or will this happen automatically...?
+ // pEdge->SetEdgeTrackDirty();
+ //}
+ } //
}
void SdrEditView::handleSelectionChange()
@@ -864,8 +864,8 @@ void SdrEditView::CheckPossibilities()
if(pEdge)
{
- SdrObject* pNode1 = pEdge->GetConnectedNode(true);
- SdrObject* pNode2 = pEdge->GetConnectedNode(false);
+ SdrObject* pNode1 = pEdge->GetSdrObjectConnection(true);
+ SdrObject* pNode2 = pEdge->GetSdrObjectConnection(false);
if(pNode1 || pNode2)
{
@@ -1169,11 +1169,11 @@ bool SdrEditView::InsertObjectAtView(SdrObject& rObj, sal_uInt32 nOptions)
return false;
}
- if(!rObj.IsE3dObject())
+ if(!dynamic_cast< E3dObject* >(&rObj))
{
SdrObject* pParent = GetSdrPageView()->GetCurrentObjectList()->getSdrObjectFromSdrObjList();
- if(pParent && pParent->IsE3dObject())
+ if(pParent && dynamic_cast< E3dObject* >(pParent))
{
OSL_ENSURE(false, "InsertObjectAtView non-3D to 3D parent (!)");
deleteSdrObjectSafe( &rObj );
diff --git a/svx/source/svdraw/svdedtv1.cxx b/svx/source/svdraw/svdedtv1.cxx
index 6ab7d6628e5b..d6dfc708c1e1 100644
--- a/svx/source/svdraw/svdedtv1.cxx
+++ b/svx/source/svdraw/svdedtv1.cxx
@@ -266,51 +266,6 @@ void SdrEditView::ResizeMarkedObj(const basegfx::B2DPoint& rRefPoint, const base
}
}
-// TTTT: Needed?
-//void SdrEditView::ResizeMultMarkedObj(const Point& rRef,
-// const Fraction& xFact,
-// const Fraction& yFact,
-// const bool bCopy,
-// const bool bWdh,
-// const bool bHgt)
-//{
-// const bool bUndo = IsUndoEnabled();
-// if( bUndo )
-// {
-// XubString aStr;
-// ImpTakeDescriptionStr(STR_EditResize,aStr);
-// if (bCopy)
-// aStr+=ImpGetResStr(STR_EditWithCopy);
-// BegUndo(aStr);
-// }
-//
-// if (bCopy)
-// CopyMarkedObj();
-//
-// sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
-// for (sal_uIntPtr nm=0; nm<nMarkAnz; nm++)
-// {
-// SdrMark* pM=GetSdrMarkByIndex(nm);
-// SdrObject* pO=pM->GetMarkedSdrObj();
-// if( bUndo )
-// {
-// std::vector< SdrUndoAction* > vConnectorUndoActions( CreateConnectorUndo( *pO ) );
-// AddUndoActions( vConnectorUndoActions );
-// AddUndo( GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pO));
-// }
-//
-// Fraction aFrac(1,1);
-// if (bWdh && bHgt)
-// pO->Resize(rRef, xFact, yFact);
-// else if (bWdh)
-// pO->Resize(rRef, xFact, aFrac);
-// else if (bHgt)
-// pO->Resize(rRef, aFrac, yFact);
-// }
-// if( bUndo )
-// EndUndo();
-//}
-
double SdrEditView::GetMarkedObjRotate() const
{
if(!areSdrObjectsSelected())
@@ -1446,7 +1401,9 @@ void SdrEditView::SetAttrToMarked(const SfxItemSet& rAttr, bool bReplaceAll)
if(bUndo)
{
- if(pObj->IsSdrEdgeObj())
+ const SdrEdgeObj* pSdrEdgeObj = dynamic_cast< const SdrEdgeObj* >(pObj);
+
+ if(pSdrEdgeObj)
{
bPossibleGeomChange = true;
}
diff --git a/svx/source/svdraw/svdedtv2.cxx b/svx/source/svdraw/svdedtv2.cxx
index 46d552814f4b..8d51eba6bfa7 100644
--- a/svx/source/svdraw/svdedtv2.cxx
+++ b/svx/source/svdraw/svdedtv2.cxx
@@ -50,6 +50,7 @@
#include <basegfx/polygon/b2dpolypolygoncutter.hxx>
#include <svx/svdlegacy.hxx>
#include <svx/svdview.hxx>
+#include <svx/obj3d.hxx>
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -705,7 +706,7 @@ void SdrEditView::ImpCopyAttributes(const SdrObject* pSource, SdrObject* pDest)
{
SdrObjList* pOL = pSource->getChildrenOfSdrObject();
- if(pOL && !pSource->IsE3dObject())
+ if(pOL && !dynamic_cast< const E3dObject* >(pSource))
{
// erstes Nichtgruppenobjekt aus der Gruppe holen
SdrObjListIter aIter(*pOL,IM_DEEPNOGROUPS);
@@ -752,7 +753,7 @@ bool SdrEditView::ImpCanConvertForCombine(const SdrObject* pObj) const
{
SdrObjList* pOL = pObj->getChildrenOfSdrObject();
- if(pOL && !pObj->IsE3dObject())
+ if(pOL && !dynamic_cast< const E3dObject* >(pObj))
{
SdrObjListIter aIter(*pOL, IM_DEEPNOGROUPS);
@@ -831,7 +832,7 @@ basegfx::B2DPolyPolygon SdrEditView::ImpGetPolyPolygon(const SdrObject* pObj, bo
{
SdrObjList* pOL = pObj->getChildrenOfSdrObject();
- if(pOL && !pObj->IsE3dObject())
+ if(pOL && !dynamic_cast< const E3dObject* >(pObj))
{
basegfx::B2DPolyPolygon aRetval;
SdrObjListIter aIter(*pOL, IM_DEEPNOGROUPS);
@@ -1888,7 +1889,7 @@ void SdrEditView::DismantleMarkedObjects(bool bMakeLines)
sal_uInt32 nPos(nPos0 + 1);
SdrObjList* pSubList = pObj->getChildrenOfSdrObject();
- if(pSubList && !pObj->IsE3dObject())
+ if(pSubList && !dynamic_cast< const E3dObject* >(pObj))
{
SdrObjListIter aIter(*pSubList,IM_DEEPNOGROUPS);
@@ -2298,7 +2299,7 @@ void SdrEditView::ImpConvertTo(bool bPath, bool bLineToArea)
nm--;
SdrObject* pObj = aSelection[nm];
- if(pObj->getChildrenOfSdrObject() && !pObj->IsE3dObject())
+ if(pObj->getChildrenOfSdrObject() && !dynamic_cast< const E3dObject* >(pObj))
{
SdrObject* pGrp=pObj;
SdrObjListIter aIter(*pGrp,IM_DEEPNOGROUPS);
diff --git a/svx/source/svdraw/svdhdl.cxx b/svx/source/svdraw/svdhdl.cxx
index 3720ad23fa03..47094e8065ab 100644
--- a/svx/source/svdraw/svdhdl.cxx
+++ b/svx/source/svdraw/svdhdl.cxx
@@ -1959,7 +1959,7 @@ void ImpEdgeHdl::CreateB2dIAObject(::sdr::overlay::OverlayManager& rOverlayManag
BitmapColorIndex eColIndex = LightCyan;
BitmapMarkerKind eKindOfMarker = Rect_7x7;
- if(pEdge->GetConnectedNode(mnObjHdlNum == 0))
+ if(pEdge->GetSdrObjectConnection(mnObjHdlNum == 0))
{
eColIndex = LightRed;
}
@@ -2000,7 +2000,14 @@ void ImpEdgeHdl::SetLineCode(SdrEdgeLineCode eCode)
Pointer ImpEdgeHdl::GetPointer() const
{
- if(!mpSdrHdlObject || !mpSdrHdlObject->IsSdrEdgeObj())
+ if(!mpSdrHdlObject)
+ {
+ return SdrHdl::GetPointer();
+ }
+
+ const SdrEdgeObj* pSdrEdgeObj = dynamic_cast< const SdrEdgeObj* >(mpSdrHdlObject);
+
+ if(!pSdrEdgeObj)
{
return SdrHdl::GetPointer();
}
@@ -2031,22 +2038,7 @@ bool ImpEdgeHdl::IsHorzDrag() const
return false;
}
- SdrEdgeKind eEdgeKind = ((SdrEdgeKindItem&)(pEdge->GetObjectItem(SDRATTR_EDGEKIND))).GetValue();
- const SdrEdgeInfoRec& rInfo = pEdge->maEdgeInfo;
-
- if(SDREDGE_ORTHOLINES == eEdgeKind || SDREDGE_BEZIER == eEdgeKind)
- {
- return !rInfo.ImpIsHorzLine(eLineCode, pEdge->maEdgeTrack.count());
- }
- else if(SDREDGE_THREELINES == eEdgeKind)
- {
- const sal_Int32 nWink((2 == mnObjHdlNum) ? rInfo.nAngle1 : rInfo.nAngle2);
-
- if(!nWink || 18000 == nWink)
- {
- return true;
- }
- }
+ return pEdge->checkHorizontalDrag(eLineCode, 2 == mnObjHdlNum);
}
return false;
diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx
index d8fb9d5ca9f3..3ef7268568cb 100644
--- a/svx/source/svdraw/svdmodel.cxx
+++ b/svx/source/svdraw/svdmodel.cxx
@@ -916,7 +916,8 @@ void SdrModel::ImpReformatAllEdgeObjects()
}
sal_uInt32 nAnz(GetMasterPageCount());
- sal_uInt32 nNum;
+ sal_uInt32 nNum(0);
+ std::vector< SdrEdgeObj* > aSdrEdgeObjVector;
for(nNum = 0; nNum < nAnz; nNum++)
{
@@ -928,7 +929,7 @@ void SdrModel::ImpReformatAllEdgeObjects()
if(pSdrEdgeObj)
{
- pSdrEdgeObj->ReformatEdge();
+ aSdrEdgeObjVector.push_back(pSdrEdgeObj);
}
}
}
@@ -945,10 +946,39 @@ void SdrModel::ImpReformatAllEdgeObjects()
if(pSdrEdgeObj)
{
- pSdrEdgeObj->ReformatEdge();
+ aSdrEdgeObjVector.push_back(pSdrEdgeObj);
}
}
}
+
+ nAnz = aSdrEdgeObjVector.size();
+
+ for(nNum = 0; nNum < nAnz; nNum++)
+ {
+ SdrEdgeObj* pSdrEdgeObj = aSdrEdgeObjVector[nNum];
+ SdrObject* pObjA = pSdrEdgeObj->GetSdrObjectConnection(true);
+ SdrObject* pObjB = pSdrEdgeObj->GetSdrObjectConnection(false);
+
+ // TTTT: check what happens; it might just be a ImpDirtyEdgeTrack()
+ // and ActionChanged() at SdrEdgeObj::Notify
+ if(pObjA || pObjB)
+ {
+ pSdrEdgeObj->SetEdgeTrackDirty();
+ pSdrEdgeObj->ActionChanged();
+ }
+
+ //if(pObjA)
+ //{
+ // SfxSimpleHint aHint(SFX_HINT_DATACHANGED);
+ // pSdrEdgeObj->Notify(*pObjA, aHint);
+ //}
+ //
+ //if(pObjB)
+ //{
+ // SfxSimpleHint aHint(SFX_HINT_DATACHANGED);
+ // pSdrEdgeObj->Notify(*pObjB, aHint);
+ //}
+ }
}
SvStream* SdrModel::GetDocumentStream(SdrDocumentStreamInfo& /*rStreamInfo*/) const
diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx
index 47774fb5635c..2a4651266c7e 100644
--- a/svx/source/svdraw/svdmrkv.cxx
+++ b/svx/source/svdraw/svdmrkv.cxx
@@ -53,6 +53,7 @@
#include <svx/svdlegacy.hxx>
#include <svx/svdocapt.hxx>
#include <svx/svdograf.hxx>
+#include <svx/svdouno.hxx>
////////////////////////////////////////////////////////////////////////////////////////////////////
// selection visualisation of Objects, Points and GluePoints
@@ -1514,7 +1515,7 @@ void SdrMarkView::SetViewEditMode(SdrViewEditMode eMode)
bool SdrMarkView::IsObjMarkable(const SdrObject& rObj) const
{
- if(rObj.IsMarkProtect() || (!IsDesignMode() && rObj.IsSdrUnoObj()))
+ if(rObj.IsMarkProtect() || (!IsDesignMode() && dynamic_cast< const SdrUnoObj* >(&rObj)))
{
// Objekt nicht selektierbar oder
// SdrUnoObj nicht im DesignMode
diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx
index a449ef4a8b53..dfb08520da84 100644
--- a/svx/source/svdraw/svdobj.cxx
+++ b/svx/source/svdraw/svdobj.cxx
@@ -2277,25 +2277,20 @@ SdrObject* SdrObject::ConvertToContourObj(SdrObject* pRet, bool bForceLineDash)
return pRet;
}
-bool SdrObject::IsSdrEdgeObj() const
-{
- return false;
-}
-
-bool SdrObject::IsE3dObject() const
-{
- return false;
-}
+//bool SdrObject::IsE3dObject() const
+//{
+// return false;
+//}
-bool SdrObject::IsSdrUnoObj() const
-{
- return false;
-}
+//bool SdrObject::IsSdrUnoObj() const
+//{
+// return false;
+//}
-bool SdrObject::IsSdrGrafObj() const
-{
- return false;
-}
+//bool SdrObject::IsSdrGrafObj() const
+//{
+// return false;
+//}
bool SdrObject::DoesSupportTextIndentingOnLineWidthChange() const
{
@@ -2510,18 +2505,6 @@ const basegfx::B2DHomMatrix& SdrObject::getSdrObjectTransformation() const
void SdrObject::setSdrObjectTransformation(const basegfx::B2DHomMatrix& rTransformation)
{
- // TTTT: Need to handle GluePoints, too. Check GluePoint transformation
- //SetGlueReallyAbsolute(true);
- //NbcShearGluePoints(rRef,nWink,tn,bVShear);
- //SetGlueReallyAbsolute(false);
-
- //if (GetGluePointList()!=NULL) {
- // sdr::glue::List* pGPL=GetGluePointList(true);
- // pGPL->SetReallyAbsolute(true,*this);
- // NbcShearGluePoints(rRef,nWink,tn,bVShear);
- // pGPL->SetReallyAbsolute(false,*this);
- //}
-
if(rTransformation != getSdrObjectTransformation())
{
basegfx::B2DVector aOldAbsoluteScale;
@@ -2603,20 +2586,43 @@ bool SdrObject::HasText() const
::std::vector< SdrEdgeObj* > SdrObject::getAllConnectedSdrEdgeObj() const
{
// travel over broadcaster/listener to access connected edges
- ::std::vector< SdrEdgeObj* > aRetval;
const sal_uInt16 nListenerCount(GetListenerCount());
+ std::set< SdrEdgeObj* > aSet;
for(sal_uInt16 nListener(0); nListener < nListenerCount; nListener++)
{
- SdrEdgeObj* pEdge = dynamic_cast< SdrEdgeObj* >(GetListener(nListener));
+ SfxListener* pCandidate = GetListener(nListener);
- if(pEdge)
+ if(pCandidate)
{
- aRetval.push_back(pEdge);
+ SdrEdgeObj* pEdgeCandidate = SdrEdgeObj::checkIfUsesListener(*pCandidate);
+
+ if(pEdgeCandidate)
+ {
+ if(aSet.find(pEdgeCandidate) == aSet.end())
+ {
+ aSet.insert(pEdgeCandidate);
+ }
+ }
}
}
- return aRetval;
+ return ::std::vector< SdrEdgeObj* >(aSet.begin(), aSet.end());
+
+ //::std::vector< SdrEdgeObj* > aRetval;
+ //const sal_uInt16 nListenerCount(GetListenerCount());
+ //
+ //for(sal_uInt16 nListener(0); nListener < nListenerCount; nListener++)
+ //{
+ // SdrEdgeObj* pEdge = dynamic_cast< SdrEdgeObj* >(GetListener(nListener));
+ //
+ // if(pEdge)
+ // {
+ // aRetval.push_back(pEdge);
+ // }
+ //}
+ //
+ //return aRetval;
}
//////////////////////////////////////////////////////////////////////////////
diff --git a/svx/source/svdraw/svdoedge.cxx b/svx/source/svdraw/svdoedge.cxx
index b375d9dfeeb6..f901dc6af28a 100644
--- a/svx/source/svdraw/svdoedge.cxx
+++ b/svx/source/svdraw/svdoedge.cxx
@@ -19,8 +19,6 @@
*
*************************************************************/
-
-
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svx.hxx"
@@ -59,23 +57,266 @@
#define SDRESC_HORZ (sdr::glue::GluePoint::ESCAPE_DIRECTION_LEFT|sdr::glue::GluePoint::ESCAPE_DIRECTION_RIGHT)
#define SDRESC_ALL (SDRESC_HORZ|SDRESC_VERT)
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// SdrObjConnection
+
+class SdrObjConnection : public SfxListener
+{
+private:
+ SdrEdgeObj* mpOwner; // connector this belongs to
+
+ basegfx::B2DPoint maPosition; // connector position
+ SdrObject* mpConnectedSdrObject; // referenced SdrOebjct
+ sal_uInt32 mnConnectorId; // Connector ID
+
+ /// bitfield
+ bool mbBestConnection : 1;
+ bool mbBestVertex : 1;
+ bool mbAutoVertex : 1; // connected to automatic gluepoint
+
+protected:
+ // object notifies; e.g. connected SDrObjects changed
+ virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint);
+
+ // if preconditions for positions change, calculate current and set, The
+ // position depends on the object connected to and the GluePointID, but also
+ // needs to be checked on object change
+ void checkPositionFromObject();
+ bool getPositionFromObject(basegfx::B2DPoint& rPosition);
+
+public:
+ // costruct with object connection, position is derived if
+ // pConnectedSdrObject and nConnectorId is given
+ SdrObjConnection(SdrEdgeObj* pOwner);
+
+ // copy constructor will ignore Owner, but copy SdrObject connection
+ SdrObjConnection(const SdrObjConnection&);
+
+ virtual ~SdrObjConnection();
+
+ /// assignment operator; will not copy mpOwner
+ SdrObjConnection& operator=(const SdrObjConnection&);
+
+ // 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;
+
+ // 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
+ SdrEdgeObj* getOwner() const { return mpOwner; }
+ const basegfx::B2DPoint& GetPosition() const { return maPosition; }
+ 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; };
+};
+
+
+void SdrObjConnection::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
+{
+ if(mpOwner)
+ {
+ if(mpConnectedSdrObject && mpConnectedSdrObject == &rBC)
+ {
+ const SdrBaseHint* pBase = dynamic_cast< const SdrBaseHint* >( &rHint);
+
+ if(pBase)
+ {
+ const SdrHintKind eSdrHintKind(pBase->GetSdrHintKind());
+
+ // on object delete and/or object removed from page, break linkage
+ if(HINT_SDROBJECTDYING == eSdrHintKind || HINT_OBJREMOVED == eSdrHintKind)
+ {
+ EndListening(*mpConnectedSdrObject);
+ mpConnectedSdrObject = 0;
+ }
+ }
+
+ if(mpConnectedSdrObject)
+ {
+ 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();
+ }
+ }
+}
+
+void SdrObjConnection::checkPositionFromObject()
+{
+ if(mpConnectedSdrObject)
+ {
+ basegfx::B2DPoint aNewPosition(maPosition);
+
+ if(getPositionFromObject(aNewPosition) && !maPosition.equal(aNewPosition))
+ {
+ maPosition = aNewPosition;
+
+ if(mpOwner)
+ {
+ mpOwner->geometryChange();
+ }
+ }
+ }
+}
+
+bool SdrObjConnection::getPositionFromObject(basegfx::B2DPoint& rPosition)
+{
+ if(mpConnectedSdrObject)
+ {
+ const sdr::glue::GluePointProvider& rProvider = mpConnectedSdrObject->GetGluePointProvider();
+ bool bFound(false);
+
+ if(mbAutoVertex)
+ {
+ rPosition = rProvider.getAutoGluePointByIndex(mnConnectorId).getUnitPosition();
+ bFound = true;
+ }
+ else
+ {
+ if(rProvider.hasUserGluePoints())
+ {
+ const sdr::glue::GluePoint* pCandidate = rProvider.findUserGluePointByID(mnConnectorId);
+
+ if(pCandidate)
+ {
+ rPosition = pCandidate->getUnitPosition();
+ bFound = true;
+ }
+ }
+ }
+
+ if(bFound)
+ {
+ rPosition = mpConnectedSdrObject->getSdrObjectTransformation() * rPosition;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+SdrObjConnection::SdrObjConnection(SdrEdgeObj* pOwner)
+: SfxListener(),
+ mpOwner(pOwner),
+ maPosition(0.0, 0.0),
+ mpConnectedSdrObject(0),
+ mnConnectorId(0),
+ mbBestConnection(true),
+ mbBestVertex(true),
+ mbAutoVertex(false)
+{
+ SetConnectedSdrObject(mpConnectedSdrObject);
+}
+
+SdrObjConnection::SdrObjConnection(const SdrObjConnection& rSource)
+: SfxListener(),
+ mpOwner(0), // ignore owner; this will make copy-constructed objects inactive
+ maPosition(rSource.maPosition),
+ mpConnectedSdrObject(rSource.mpConnectedSdrObject),
+ mnConnectorId(rSource.mnConnectorId),
+ mbBestConnection(rSource.mbBestConnection),
+ mbBestVertex(rSource.mbBestVertex),
+ mbAutoVertex(rSource.mbAutoVertex)
+{
+}
+
SdrObjConnection::~SdrObjConnection()
{
+ if(mpConnectedSdrObject)
+ {
+ EndListening(*mpConnectedSdrObject);
+ }
}
-void SdrObjConnection::ResetVars()
+SdrObjConnection& SdrObjConnection::operator=(const SdrObjConnection& rSource)
{
- mpConnectedSdrObject = 0;
- mnConnectorId = 0;
- mbBestConnection = true;
- mbBestVertex = true;
- mbAutoVertex = false;
+ if(mpConnectedSdrObject)
+ {
+ EndListening(*mpConnectedSdrObject);
+ }
+
+ maPosition = rSource.maPosition;
+ mpConnectedSdrObject = rSource.mpConnectedSdrObject;
+ mnConnectorId = rSource.mnConnectorId;
+ mbBestConnection = rSource.mbBestConnection;
+ mbBestVertex = rSource.mbBestVertex;
+ mbAutoVertex = rSource.mbAutoVertex;
+
+ if(mpOwner && mpConnectedSdrObject)
+ {
+ StartListening(*mpConnectedSdrObject);
+ }
+
+ checkPositionFromObject();
+ return *this;
}
-bool SdrObjConnection::TakeGluePoint(sdr::glue::GluePoint& rGP) const
+void SdrObjConnection::SetPosition(const basegfx::B2DPoint& rPosition)
+{
+ basegfx::B2DPoint aNewPosition(rPosition);
+
+ if(mpConnectedSdrObject)
+ {
+ getPositionFromObject(aNewPosition);
+ }
+
+ if(!aNewPosition.equal(maPosition))
+ {
+ maPosition = aNewPosition;
+
+ if(mpOwner)
+ {
+ mpOwner->geometryChange();
+ }
+ }
+}
+
+void SdrObjConnection::SetConnectedSdrObject(SdrObject* pConnectedSdrObject)
+{
+ if(pConnectedSdrObject != mpConnectedSdrObject)
+ {
+ if(mpConnectedSdrObject)
+ {
+ EndListening(*mpConnectedSdrObject);
+ }
+
+ mpConnectedSdrObject = pConnectedSdrObject;
+
+ if(mpOwner && mpConnectedSdrObject)
+ {
+ StartListening(*mpConnectedSdrObject);
+ }
+
+ checkPositionFromObject();
+ }
+}
+
+void SdrObjConnection::SetConnectorID(sal_uInt32 nNew)
{
- bool bRet(false);
+ if(nNew != mnConnectorId)
+ {
+ mnConnectorId = nNew;
+ checkPositionFromObject();
+ }
+}
+bool SdrObjConnection::TakeGluePoint(sdr::glue::GluePoint& rGP) const
+{
if(mpConnectedSdrObject)
{
// Ein Obj muss schon angedockt sein!
@@ -84,7 +325,8 @@ bool SdrObjConnection::TakeGluePoint(sdr::glue::GluePoint& rGP) const
if(mbAutoVertex)
{
rGP = rProvider.getAutoGluePointByIndex(mnConnectorId);
- bRet = true;
+
+ return true;
}
else
{
@@ -96,15 +338,58 @@ bool SdrObjConnection::TakeGluePoint(sdr::glue::GluePoint& rGP) const
if(pCandidate)
{
rGP = *pCandidate;
- bRet = true;
+
+ return true;
}
}
}
}
- return bRet;
+ return false;
}
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// SdrEdgeInfoRec
+
+class SdrEdgeInfoRec
+{
+public:
+ // Die 5 Distanzen werden beim draggen bzw. per SetAttr gesetzt und von
+ // ImpCalcEdgeTrack ausgewertet. Per Get/SetAttr/Get/SetStyleSh werden
+ // jedoch nur 0-3 longs transportiert.
+ basegfx::B2DPoint aObj1Line2;
+ basegfx::B2DPoint aObj1Line3;
+ basegfx::B2DPoint aObj2Line2;
+ basegfx::B2DPoint aObj2Line3;
+ basegfx::B2DPoint aMiddleLine;
+
+ // Nachfolgende Werte werden von ImpCalcEdgeTrack gesetzt
+ long nAngle1; // Austrittswinkel am Obj1
+ long nAngle2; // Austrittswinkel am Obj2
+ sal_uInt16 nObj1Lines; // 1..3
+ sal_uInt16 nObj2Lines; // 1..3
+ sal_uInt16 nMiddleLine; // 0xFFFF=keine, sonst Punktnummer des Linienbeginns
+ char cOrthoForm; // Form des Ortho-Verbindes, z.B. 'Z','U',I','L','S',...
+
+ SdrEdgeInfoRec()
+ : nAngle1(0),
+ nAngle2(0),
+ nObj1Lines(0),
+ nObj2Lines(0),
+ nMiddleLine(0xFFFF),
+ cOrthoForm(0)
+ {}
+
+ basegfx::B2DPoint& ImpGetLineVersatzPoint(SdrEdgeLineCode eLineCode);
+ const basegfx::B2DPoint& ImpGetLineVersatzPoint(SdrEdgeLineCode eLineCode) const { return const_cast< SdrEdgeInfoRec* >(this)->ImpGetLineVersatzPoint(eLineCode); }
+ sal_uInt32 ImpGetPolyIdx(SdrEdgeLineCode eLineCode, sal_uInt32 nPointCount) const;
+ bool ImpIsHorzLine(SdrEdgeLineCode eLineCode, sal_uInt32 nPointCount) const;
+ void ImpSetLineVersatz(SdrEdgeLineCode eLineCode, sal_uInt32 nPointCount, long nVal);
+ long ImpGetLineVersatz(SdrEdgeLineCode eLineCode, sal_uInt32 nPointCount) const;
+ void ImpResetUserDistances() { aObj1Line2 = aObj1Line3 = aObj2Line2 = aObj2Line3 = aMiddleLine = basegfx::B2DPoint(); }
+ bool ImpUsesUserDistances() const;
+};
+
basegfx::B2DPoint& SdrEdgeInfoRec::ImpGetLineVersatzPoint(SdrEdgeLineCode eLineCode)
{
switch (eLineCode)
@@ -178,20 +463,32 @@ long SdrEdgeInfoRec::ImpGetLineVersatz(SdrEdgeLineCode eLineCode, sal_uInt32 nPo
}
}
-//////////////////////////////////////////////////////////////////////////////
-// BaseProperties section
-
-sdr::properties::BaseProperties* SdrEdgeObj::CreateObjectSpecificProperties()
+bool SdrEdgeInfoRec::ImpUsesUserDistances() const
{
- return new sdr::properties::ConnectorProperties(*this);
+ if(!aObj1Line2.equal(basegfx::B2DPoint::getEmptyPoint())) return true;
+ if(!aObj1Line3.equal(basegfx::B2DPoint::getEmptyPoint())) return true;
+ if(!aObj2Line2.equal(basegfx::B2DPoint::getEmptyPoint())) return true;
+ if(!aObj2Line3.equal(basegfx::B2DPoint::getEmptyPoint())) return true;
+ if(!aMiddleLine.equal(basegfx::B2DPoint::getEmptyPoint())) return true;
+ return false;
}
-//////////////////////////////////////////////////////////////////////////////
-// DrawContact section
+////////////////////////////////////////////////////////////////////////////////////////////////////
-sdr::contact::ViewContact* SdrEdgeObj::CreateObjectSpecificViewContact()
+SdrEdgeObjGeoData::SdrEdgeObjGeoData()
+: mpCon1(new SdrObjConnection(0)),
+ mpCon2(new SdrObjConnection(0)),
+ maEdgeTrack(),
+ mpEdgeInfo(new SdrEdgeInfoRec()),
+ mbEdgeTrackUserDefined(false)
{
- return new sdr::contact::ViewContactOfSdrEdgeObj(*this);
+}
+
+SdrEdgeObjGeoData::~SdrEdgeObjGeoData()
+{
+ delete mpCon1;
+ delete mpCon2;
+ delete mpEdgeInfo;
}
//////////////////////////////////////////////////////////////////////////////
@@ -286,7 +583,7 @@ namespace sdr
{
case 2:
{
- if(!mpSource->GetConnectedNode(true))
+ if(!mpSource->GetSdrObjectConnection(true))
{
aOldPoint = aEdgeTrack.getB2DPoint(0);
}
@@ -294,7 +591,7 @@ namespace sdr
}
case 3:
{
- if(!mpSource->GetConnectedNode(false))
+ if(!mpSource->GetSdrObjectConnection(false))
{
aOldPoint = aEdgeTrack.getB2DPoint(nPntAnz - 1);
}
@@ -332,32 +629,915 @@ namespace sdr
} // end of namespace glue
} // end of namespace sdr
-sdr::glue::GluePointProvider* SdrEdgeObj::CreateObjectSpecificGluePointProvider()
+//////////////////////////////////////////////////////////////////////////////
+// old connector geometry stuff, still needed but isolated
+
+namespace
{
- return new sdr::glue::SdrEdgeObjGluePointProvider(*this);
+ sal_uInt16 impOldCalcEscAngle(const basegfx::B2DRange& aRange, const basegfx::B2DPoint& rPt)
+ {
+ const double dxl(rPt.getX() - aRange.getMinX());
+ const double dyo(rPt.getY() - aRange.getMinY());
+ const double dxr(aRange.getMaxX() - rPt.getX());
+ const double dyu(aRange.getMaxY() - rPt.getY());
+ const bool bxMitt(fabs(dxl - dxr) < 2.0);
+ const bool byMitt(fabs(dyo - dyu) < 2.0);
+
+ if(bxMitt && byMitt)
+ {
+ return SDRESC_ALL;
+ }
+
+ const double dx(std::min(dxl, dxr));
+ const double dy(std::min(dyo, dyu));
+ const bool bDiag(fabs(dx - dy) < 2.0);
+
+ if (bDiag)
+ {
+ sal_uInt16 nRet(0);
+
+ if(byMitt)
+ {
+ nRet |= SDRESC_VERT;
+ }
+
+ if(bxMitt)
+ {
+ nRet |= SDRESC_HORZ;
+ }
+
+ if(dxl < dxr)
+ {
+ if(dyo<dyu)
+ {
+ nRet |= sdr::glue::GluePoint::ESCAPE_DIRECTION_LEFT | sdr::glue::GluePoint::ESCAPE_DIRECTION_TOP;
+ }
+ else
+ {
+ nRet |= sdr::glue::GluePoint::ESCAPE_DIRECTION_LEFT | sdr::glue::GluePoint::ESCAPE_DIRECTION_BOTTOM;
+ }
+ }
+ else
+ {
+ if(dyo<dyu)
+ {
+ nRet |= sdr::glue::GluePoint::ESCAPE_DIRECTION_RIGHT | sdr::glue::GluePoint::ESCAPE_DIRECTION_TOP;
+ }
+ else
+ {
+ nRet|=sdr::glue::GluePoint::ESCAPE_DIRECTION_RIGHT | sdr::glue::GluePoint::ESCAPE_DIRECTION_BOTTOM;
+ }
+ }
+
+ return nRet;
+ }
+
+ if(dx < dy)
+ {
+ if(bxMitt)
+ {
+ return SDRESC_HORZ;
+ }
+ if(dxl<dxr)
+ {
+ return sdr::glue::GluePoint::ESCAPE_DIRECTION_LEFT;
+ }
+ else
+ {
+ return sdr::glue::GluePoint::ESCAPE_DIRECTION_RIGHT;
+ }
+ }
+ else
+ {
+ if(byMitt)
+ {
+ return SDRESC_VERT;
+ }
+ if(dyo<dyu)
+ {
+ return sdr::glue::GluePoint::ESCAPE_DIRECTION_TOP;
+ }
+ else
+ {
+ return sdr::glue::GluePoint::ESCAPE_DIRECTION_BOTTOM;
+ }
+ }
+ }
+
+ XPolygon impOldCalcObjToCenter(const Point& rStPt, long nEscAngle, const Rectangle& rRect, const Point& rMeeting)
+ {
+ XPolygon aXP;
+ aXP.Insert(XPOLY_APPEND,rStPt,XPOLY_NORMAL);
+ bool bRts=nEscAngle==0;
+ bool bObn=nEscAngle==9000;
+ bool bLks=nEscAngle==18000;
+ bool bUnt=nEscAngle==27000;
+
+ Point aP1(rStPt); // erstmal den Pflichtabstand
+ if (bLks) aP1.X()=rRect.Left();
+ if (bRts) aP1.X()=rRect.Right();
+ if (bObn) aP1.Y()=rRect.Top();
+ if (bUnt) aP1.Y()=rRect.Bottom();
+
+ bool bFinish=false;
+ if (!bFinish) {
+ Point aP2(aP1); // Und nun den Pflichtabstand ggf. bis auf Meetinghoehe erweitern
+ if (bLks && rMeeting.X()<=aP2.X()) aP2.X()=rMeeting.X();
+ if (bRts && rMeeting.X()>=aP2.X()) aP2.X()=rMeeting.X();
+ if (bObn && rMeeting.Y()<=aP2.Y()) aP2.Y()=rMeeting.Y();
+ if (bUnt && rMeeting.Y()>=aP2.Y()) aP2.Y()=rMeeting.Y();
+ aXP.Insert(XPOLY_APPEND,aP2,XPOLY_NORMAL);
+
+ Point aP3(aP2);
+ if ((bLks && rMeeting.X()>aP2.X()) || (bRts && rMeeting.X()<aP2.X())) { // Aussenrum
+ if (rMeeting.Y()<aP2.Y()) {
+ aP3.Y()=rRect.Top();
+ if (rMeeting.Y()<aP3.Y()) aP3.Y()=rMeeting.Y();
+ } else {
+ aP3.Y()=rRect.Bottom();
+ if (rMeeting.Y()>aP3.Y()) aP3.Y()=rMeeting.Y();
+ }
+ aXP.Insert(XPOLY_APPEND,aP3,XPOLY_NORMAL);
+ if (aP3.Y()!=rMeeting.Y()) {
+ aP3.X()=rMeeting.X();
+ aXP.Insert(XPOLY_APPEND,aP3,XPOLY_NORMAL);
+ }
+ }
+ if ((bObn && rMeeting.Y()>aP2.Y()) || (bUnt && rMeeting.Y()<aP2.Y())) { // Aussenrum
+ if (rMeeting.X()<aP2.X()) {
+ aP3.X()=rRect.Left();
+ if (rMeeting.X()<aP3.X()) aP3.X()=rMeeting.X();
+ } else {
+ aP3.X()=rRect.Right();
+ if (rMeeting.X()>aP3.X()) aP3.X()=rMeeting.X();
+ }
+ aXP.Insert(XPOLY_APPEND,aP3,XPOLY_NORMAL);
+ if (aP3.X()!=rMeeting.X()) {
+ aP3.Y()=rMeeting.Y();
+ aXP.Insert(XPOLY_APPEND,aP3,XPOLY_NORMAL);
+ }
+ }
+ }
+ #ifdef DBG_UTIL
+ if (aXP.GetPointCount()>4) {
+ DBG_ERROR("SdrEdgeObj::impOldCalcObjToCenter(): Polygon hat mehr als 4 Punkte!");
+ }
+ #endif
+ return aXP;
+ }
+
+ basegfx::B2DPolygon impOldCalcEdgeTrack(
+ const Point& rPt1, long nAngle1, const Rectangle& rBoundRect1, const Rectangle& rBewareRect1,
+ const Point& rPt2, long nAngle2, const Rectangle& rBoundRect2, const Rectangle& rBewareRect2,
+ SdrEdgeKind eKind,
+ sal_uInt32* pnQuality, SdrEdgeInfoRec* pInfo)
+ {
+ bool bRts1=nAngle1==0;
+ bool bObn1=nAngle1==9000;
+ bool bLks1=nAngle1==18000;
+ bool bUnt1=nAngle1==27000;
+ bool bHor1=bLks1 || bRts1;
+ bool bVer1=bObn1 || bUnt1;
+ bool bRts2=nAngle2==0;
+ bool bObn2=nAngle2==9000;
+ bool bLks2=nAngle2==18000;
+ bool bUnt2=nAngle2==27000;
+ bool bHor2=bLks2 || bRts2;
+ bool bVer2=bObn2 || bUnt2;
+ bool bInfo=pInfo!=NULL;
+ if (bInfo) {
+ pInfo->cOrthoForm=0;
+ pInfo->nAngle1=nAngle1;
+ pInfo->nAngle2=nAngle2;
+ pInfo->nObj1Lines=1;
+ pInfo->nObj2Lines=1;
+ pInfo->nMiddleLine=0xFFFF;
+ }
+ Point aPt1(rPt1);
+ Point aPt2(rPt2);
+ Rectangle aBoundRect1 (rBoundRect1 );
+ Rectangle aBoundRect2 (rBoundRect2 );
+ Rectangle aBewareRect1(rBewareRect1);
+ Rectangle aBewareRect2(rBewareRect2);
+ Point aMeeting((aPt1.X()+aPt2.X()+1)/2,(aPt1.Y()+aPt2.Y()+1)/2);
+ bool bMeetingXMid=true;
+ bool bMeetingYMid=true;
+ if (eKind==SDREDGE_ONELINE) {
+ XPolygon aXP(2);
+ aXP[0]=rPt1;
+ aXP[1]=rPt2;
+ if (pnQuality!=NULL) {
+ *pnQuality=Abs(rPt1.X()-rPt2.X())+Abs(rPt1.Y()-rPt2.Y());
+ }
+ return aXP.getB2DPolygon();
+ } else if (eKind==SDREDGE_THREELINES) {
+ XPolygon aXP(4);
+ aXP[0]=rPt1;
+ aXP[1]=rPt1;
+ aXP[2]=rPt2;
+ aXP[3]=rPt2;
+ if (bRts1) aXP[1].X()=aBewareRect1.Right(); //+=500;
+ if (bObn1) aXP[1].Y()=aBewareRect1.Top(); //-=500;
+ if (bLks1) aXP[1].X()=aBewareRect1.Left(); //-=500;
+ if (bUnt1) aXP[1].Y()=aBewareRect1.Bottom(); //+=500;
+ if (bRts2) aXP[2].X()=aBewareRect2.Right(); //+=500;
+ if (bObn2) aXP[2].Y()=aBewareRect2.Top(); //-=500;
+ if (bLks2) aXP[2].X()=aBewareRect2.Left(); //-=500;
+ if (bUnt2) aXP[2].Y()=aBewareRect2.Bottom(); //+=500;
+ if (pnQuality!=NULL) {
+ long nQ=Abs(aXP[1].X()-aXP[0].X())+Abs(aXP[1].Y()-aXP[0].Y());
+ nQ+=Abs(aXP[2].X()-aXP[1].X())+Abs(aXP[2].Y()-aXP[1].Y());
+ nQ+=Abs(aXP[3].X()-aXP[2].X())+Abs(aXP[3].Y()-aXP[2].Y());
+ *pnQuality=nQ;
+ }
+ if (bInfo) {
+ pInfo->nObj1Lines=2;
+ pInfo->nObj2Lines=2;
+ if (bHor1) {
+ aXP[1].X()+=pInfo->aObj1Line2.getX();
+ } else {
+ aXP[1].Y()+=pInfo->aObj1Line2.getY();
+ }
+ if (bHor2) {
+ aXP[2].X()+=pInfo->aObj2Line2.getX();
+ } else {
+ aXP[2].Y()+=pInfo->aObj2Line2.getY();
+ }
+ }
+ return aXP.getB2DPolygon();
+ }
+ sal_uInt16 nIntersections=0;
+ bool bForceMeeting=false; // Muss die Linie durch den MeetingPoint laufen?
+ {
+ Point aC1(aBewareRect1.Center());
+ Point aC2(aBewareRect2.Center());
+ if (aBewareRect1.Left()<=aBewareRect2.Right() && aBewareRect1.Right()>=aBewareRect2.Left()) {
+ // Ueberschneidung auf der X-Achse
+ long n1=Max(aBewareRect1.Left(),aBewareRect2.Left());
+ long n2=Min(aBewareRect1.Right(),aBewareRect2.Right());
+ aMeeting.X()=(n1+n2+1)/2;
+ } else {
+ // Ansonsten den Mittelpunkt des Freiraums
+ if (aC1.X()<aC2.X()) {
+ aMeeting.X()=(aBewareRect1.Right()+aBewareRect2.Left()+1)/2;
+ } else {
+ aMeeting.X()=(aBewareRect1.Left()+aBewareRect2.Right()+1)/2;
+ }
+ }
+ if (aBewareRect1.Top()<=aBewareRect2.Bottom() && aBewareRect1.Bottom()>=aBewareRect2.Top()) {
+ // Ueberschneidung auf der Y-Achse
+ long n1=Max(aBewareRect1.Top(),aBewareRect2.Top());
+ long n2=Min(aBewareRect1.Bottom(),aBewareRect2.Bottom());
+ aMeeting.Y()=(n1+n2+1)/2;
+ } else {
+ // Ansonsten den Mittelpunkt des Freiraums
+ if (aC1.Y()<aC2.Y()) {
+ aMeeting.Y()=(aBewareRect1.Bottom()+aBewareRect2.Top()+1)/2;
+ } else {
+ aMeeting.Y()=(aBewareRect1.Top()+aBewareRect2.Bottom()+1)/2;
+ }
+ }
+ // Im Prinzip gibt es 3 zu unterscheidene Faelle:
+ // 1. Beide in die selbe Richtung
+ // 2. Beide in genau entgegengesetzte Richtungen
+ // 3. Einer waagerecht und der andere senkrecht
+ long nXMin=Min(aBewareRect1.Left(),aBewareRect2.Left());
+ long nXMax=Max(aBewareRect1.Right(),aBewareRect2.Right());
+ long nYMin=Min(aBewareRect1.Top(),aBewareRect2.Top());
+ long nYMax=Max(aBewareRect1.Bottom(),aBewareRect2.Bottom());
+ //bool bBoundOverlap=aBoundRect1.Right()>aBoundRect2.Left() && aBoundRect1.Left()<aBoundRect2.Right() &&
+ // aBoundRect1.Bottom()>aBoundRect2.Top() && aBoundRect1.Top()<aBoundRect2.Bottom();
+ bool bBewareOverlap=aBewareRect1.Right()>aBewareRect2.Left() && aBewareRect1.Left()<aBewareRect2.Right() &&
+ aBewareRect1.Bottom()>aBewareRect2.Top() && aBewareRect1.Top()<aBewareRect2.Bottom();
+ unsigned nMainCase=3;
+ if (nAngle1==nAngle2) nMainCase=1;
+ else if ((bHor1 && bHor2) || (bVer1 && bVer2)) nMainCase=2;
+ if (nMainCase==1) { // Fall 1: Beide in eine Richtung moeglich.
+ if (bVer1) aMeeting.X()=(aPt1.X()+aPt2.X()+1)/2; // ist hier besser, als der
+ if (bHor1) aMeeting.Y()=(aPt1.Y()+aPt2.Y()+1)/2; // Mittelpunkt des Freiraums
+ // bX1Ok bedeutet, dass die Vertikale, die aus Obj1 austritt, keinen Konflikt mit Obj2 bildet, ...
+ bool bX1Ok=aPt1.X()<=aBewareRect2.Left() || aPt1.X()>=aBewareRect2.Right();
+ bool bX2Ok=aPt2.X()<=aBewareRect1.Left() || aPt2.X()>=aBewareRect1.Right();
+ bool bY1Ok=aPt1.Y()<=aBewareRect2.Top() || aPt1.Y()>=aBewareRect2.Bottom();
+ bool bY2Ok=aPt2.Y()<=aBewareRect1.Top() || aPt2.Y()>=aBewareRect1.Bottom();
+ if (bLks1 && (bY1Ok || aBewareRect1.Left()<aBewareRect2.Right()) && (bY2Ok || aBewareRect2.Left()<aBewareRect1.Right())) {
+ aMeeting.X()=nXMin;
+ bMeetingXMid=false;
+ }
+ if (bRts1 && (bY1Ok || aBewareRect1.Right()>aBewareRect2.Left()) && (bY2Ok || aBewareRect2.Right()>aBewareRect1.Left())) {
+ aMeeting.X()=nXMax;
+ bMeetingXMid=false;
+ }
+ if (bObn1 && (bX1Ok || aBewareRect1.Top()<aBewareRect2.Bottom()) && (bX2Ok || aBewareRect2.Top()<aBewareRect1.Bottom())) {
+ aMeeting.Y()=nYMin;
+ bMeetingYMid=false;
+ }
+ if (bUnt1 && (bX1Ok || aBewareRect1.Bottom()>aBewareRect2.Top()) && (bX2Ok || aBewareRect2.Bottom()>aBewareRect1.Top())) {
+ aMeeting.Y()=nYMax;
+ bMeetingYMid=false;
+ }
+ } else if (nMainCase==2) {
+ // Fall 2:
+ bForceMeeting=true;
+ if (bHor1) { // beide waagerecht
+ /* 9 Moeglichkeiten: */
+ /* 2.1 Gegenueber, Ueberschneidung */
+ /* nur auf der Y-Achse */
+ /* 2.2, 2.3 Gegenueber, vertikal versetzt. */
+ /* Ueberschneidung weder auf der */
+ /* X- noch auf der Y-Achse */
+ /* 2.4, 2.5 Untereinander, */
+ /* Ueberschneidung */
+ /* nur auf X-Achse */
+ /* 2.6, 2.7 Gegeneinander, vertikal versetzt. */
+ /* Ueberschneidung weder auf der */
+ /* X- noch auf der Y-Achse. */
+ /* 2.8 Gegeneinander. */
+ /* Ueberschneidung nur */
+ /* auf der Y-Achse. */
+ /* 2.9 Die BewareRects der Objekte ueberschneiden */
+ /* sich auf X- und Y-Achse. */
+ /* Die Faelle gelten entsprechend umgesetzt auch fuer */
+ /* senkrechte Linienaustritte. */
+ /* Die Faelle 2.1-2.7 werden mit dem Default-Meeting ausreichend*/
+ /* gut behandelt. Spezielle MeetingPoints werden hier also nur */
+ /* fuer 2.8 und 2.9 bestimmt. */
+
+ // Normalisierung. aR1 soll der nach rechts und
+ // aR2 der nach links austretende sein.
+ Rectangle aBewR1(bRts1 ? aBewareRect1 : aBewareRect2);
+ Rectangle aBewR2(bRts1 ? aBewareRect2 : aBewareRect1);
+ Rectangle aBndR1(bRts1 ? aBoundRect1 : aBoundRect2);
+ Rectangle aBndR2(bRts1 ? aBoundRect2 : aBoundRect1);
+ if (aBewR1.Bottom()>aBewR2.Top() && aBewR1.Top()<aBewR2.Bottom()) {
+ // Ueberschneidung auf der Y-Achse. Faelle 2.1, 2.8, 2.9
+ if (aBewR1.Right()>aBewR2.Left()) {
+ // Faelle 2.8, 2.9
+ // Fall 2.8 ist immer Aussenrumlauf (bDirect=false).
+ // Fall 2.9 kann auch Direktverbindung sein (bei geringer
+ // Ueberschneidung der BewareRects ohne Ueberschneidung der
+ // Boundrects wenn die Linienaustritte sonst das BewareRect
+ // des jeweils anderen Objekts verletzen wuerden.
+ bool bCase29Direct=false;
+ bool bCase29=aBewR1.Right()>aBewR2.Left();
+ if (aBndR1.Right()<=aBndR2.Left()) { // Fall 2.9 und keine Boundrectueberschneidung
+ if ((aPt1.Y()>aBewareRect2.Top() && aPt1.Y()<aBewareRect2.Bottom()) ||
+ (aPt2.Y()>aBewareRect1.Top() && aPt2.Y()<aBewareRect1.Bottom())) {
+ bCase29Direct=true;
+ }
+ }
+ if (!bCase29Direct) {
+ bool bObenLang=Abs(nYMin-aMeeting.Y())<=Abs(nYMax-aMeeting.Y());
+ if (bObenLang) {
+ aMeeting.Y()=nYMin;
+ } else {
+ aMeeting.Y()=nYMax;
+ }
+ bMeetingYMid=false;
+ if (bCase29) {
+ // und nun noch dafuer sorgen, dass das
+ // umzingelte Obj nicht durchquert wird
+ if ((aBewR1.Center().Y()<aBewR2.Center().Y()) != bObenLang) {
+ aMeeting.X()=aBewR2.Right();
+ } else {
+ aMeeting.X()=aBewR1.Left();
+ }
+ bMeetingXMid=false;
+ }
+ } else {
+ // Direkte Verbindung (3-Linien Z-Verbindung), da
+ // Verletzung der BewareRects unvermeidlich ist.
+ // Via Dreisatz werden die BewareRects nun verkleinert.
+ long nWant1=aBewR1.Right()-aBndR1.Right(); // Abstand bei Obj1
+ long nWant2=aBndR2.Left()-aBewR2.Left(); // Abstand bei Obj2
+ long nSpace=aBndR2.Left()-aBndR1.Right(); // verfuegbarer Platz
+ long nGet1=BigMulDiv(nWant1,nSpace,nWant1+nWant2);
+ long nGet2=nSpace-nGet1;
+ if (bRts1) { // Normalisierung zurueckwandeln
+ aBewareRect1.Right()+=nGet1-nWant1;
+ aBewareRect2.Left()-=nGet2-nWant2;
+ } else {
+ aBewareRect2.Right()+=nGet1-nWant1;
+ aBewareRect1.Left()-=nGet2-nWant2;
+ }
+ nIntersections++; // Qualitaet herabsetzen
+ }
+ }
+ }
+ } else if (bVer1) { // beide senkrecht
+ Rectangle aBewR1(bUnt1 ? aBewareRect1 : aBewareRect2);
+ Rectangle aBewR2(bUnt1 ? aBewareRect2 : aBewareRect1);
+ Rectangle aBndR1(bUnt1 ? aBoundRect1 : aBoundRect2);
+ Rectangle aBndR2(bUnt1 ? aBoundRect2 : aBoundRect1);
+ if (aBewR1.Right()>aBewR2.Left() && aBewR1.Left()<aBewR2.Right()) {
+ // Ueberschneidung auf der Y-Achse. Faelle 2.1, 2.8, 2.9
+ if (aBewR1.Bottom()>aBewR2.Top()) {
+ // Faelle 2.8, 2.9
+ // Fall 2.8 ist immer Aussenrumlauf (bDirect=false).
+ // Fall 2.9 kann auch Direktverbindung sein (bei geringer
+ // Ueberschneidung der BewareRects ohne Ueberschneidung der
+ // Boundrects wenn die Linienaustritte sonst das BewareRect
+ // des jeweils anderen Objekts verletzen wuerden.
+ bool bCase29Direct=false;
+ bool bCase29=aBewR1.Bottom()>aBewR2.Top();
+ if (aBndR1.Bottom()<=aBndR2.Top()) { // Fall 2.9 und keine Boundrectueberschneidung
+ if ((aPt1.X()>aBewareRect2.Left() && aPt1.X()<aBewareRect2.Right()) ||
+ (aPt2.X()>aBewareRect1.Left() && aPt2.X()<aBewareRect1.Right())) {
+ bCase29Direct=true;
+ }
+ }
+ if (!bCase29Direct) {
+ bool bLinksLang=Abs(nXMin-aMeeting.X())<=Abs(nXMax-aMeeting.X());
+ if (bLinksLang) {
+ aMeeting.X()=nXMin;
+ } else {
+ aMeeting.X()=nXMax;
+ }
+ bMeetingXMid=false;
+ if (bCase29) {
+ // und nun noch dafuer sorgen, dass das
+ // umzingelte Obj nicht durchquert wird
+ if ((aBewR1.Center().X()<aBewR2.Center().X()) != bLinksLang) {
+ aMeeting.Y()=aBewR2.Bottom();
+ } else {
+ aMeeting.Y()=aBewR1.Top();
+ }
+ bMeetingYMid=false;
+ }
+ } else {
+ // Direkte Verbindung (3-Linien Z-Verbindung), da
+ // Verletzung der BewareRects unvermeidlich ist.
+ // Via Dreisatz werden die BewareRects nun verkleinert.
+ long nWant1=aBewR1.Bottom()-aBndR1.Bottom(); // Abstand bei Obj1
+ long nWant2=aBndR2.Top()-aBewR2.Top(); // Abstand bei Obj2
+ long nSpace=aBndR2.Top()-aBndR1.Bottom(); // verfuegbarer Platz
+ long nGet1=BigMulDiv(nWant1,nSpace,nWant1+nWant2);
+ long nGet2=nSpace-nGet1;
+ if (bUnt1) { // Normalisierung zurueckwandeln
+ aBewareRect1.Bottom()+=nGet1-nWant1;
+ aBewareRect2.Top()-=nGet2-nWant2;
+ } else {
+ aBewareRect2.Bottom()+=nGet1-nWant1;
+ aBewareRect1.Top()-=nGet2-nWant2;
+ }
+ nIntersections++; // Qualitaet herabsetzen
+ }
+ }
+ }
+ }
+ } else if (nMainCase==3) { // Fall 3: Einer waagerecht und der andere senkrecht. Sehr viele Fallunterscheidungen
+ /* Kleine Legende: -> Ohne Ueberschneidung, maximal Beruehrung. */
+ /* -> Ueberschneidung */
+ /* -> Selbe Hoehe */
+ /* -> Ueberschneidung */
+ /* -> Ohne Ueberschneidung, maximal Beruehrung. */
+ /* Linienaustritte links , rechts , oben und unten . */
+ /* Insgesamt sind 96 Konstellationen moeglich, wobei einige nicht einmal */
+ /* eindeutig einem Fall und damit einer Behandlungsmethode zugeordnet werden */
+ /* koennen. */
+ /* 3.1: Hierzu moegen alle Konstellationen zaehlen, die durch den */
+ /* Default-MeetingPoint zufriedenstellend abgedeckt sind (20+12). */
+ /* Diese 12 */
+ /* Konstel. */
+ /* jedoch */
+ /* nur zum */
+ /* Teil: */
+ /* Letztere 16 Faelle scheiden aus, sobald sich die Objekte offen */
+ /* gegenueberstehen (siehe Fall 3.2). */
+ /* 3.2: Die Objekte stehen sich offen gegenueber und somit ist eine */
+ /* Verbindung mit lediglich 2 Linien moeglich (4+20). */
+ /* Dieser Fall hat 1. Prioritaet. */
+ /* Diese 20 */
+ /* Konstel. */
+ /* jedoch */
+ /* nur zum */
+ /* Teil: */
+ /* 3.3: Die Linienaustritte zeigen vom anderen Objekt weg bzw. hinter */
+ /* dessen Ruecken vorbei (52+4). */
+ /* Diese 4 */
+ /* Konstel. */
+ /* jedoch */
+ /* nur zum */
+ /* Teil: */
+
+ // Fall 3.2
+ Rectangle aTmpR1(aBewareRect1);
+ Rectangle aTmpR2(aBewareRect2);
+ if (bBewareOverlap) {
+ // Ueberschneidung der BewareRects: BoundRects fuer Check auf Fall 3.2 verwenden.
+ aTmpR1=aBoundRect1;
+ aTmpR2=aBoundRect2;
+ }
+ if ((((bRts1 && aTmpR1.Right ()<=aPt2.X()) || (bLks1 && aTmpR1.Left()>=aPt2.X())) &&
+ ((bUnt2 && aTmpR2.Bottom()<=aPt1.Y()) || (bObn2 && aTmpR2.Top ()>=aPt1.Y()))) ||
+ (((bRts2 && aTmpR2.Right ()<=aPt1.X()) || (bLks2 && aTmpR2.Left()>=aPt1.X())) &&
+ ((bUnt1 && aTmpR1.Bottom()<=aPt2.Y()) || (bObn1 && aTmpR1.Top ()>=aPt2.Y())))) {
+ // Fall 3.2 trifft zu: Verbindung mit lediglich 2 Linien
+ bForceMeeting=true;
+ bMeetingXMid=false;
+ bMeetingYMid=false;
+ if (bHor1) {
+ aMeeting.X()=aPt2.X();
+ aMeeting.Y()=aPt1.Y();
+ } else {
+ aMeeting.X()=aPt1.X();
+ aMeeting.Y()=aPt2.Y();
+ }
+ // Falls Ueberschneidung der BewareRects:
+ aBewareRect1=aTmpR1;
+ aBewareRect2=aTmpR2;
+ } else if ((((bRts1 && aBewareRect1.Right ()>aBewareRect2.Left ()) ||
+ (bLks1 && aBewareRect1.Left ()<aBewareRect2.Right ())) &&
+ ((bUnt2 && aBewareRect2.Bottom()>aBewareRect1.Top ()) ||
+ (bObn2 && aBewareRect2.Top ()<aBewareRect1.Bottom()))) ||
+ (((bRts2 && aBewareRect2.Right ()>aBewareRect1.Left ()) ||
+ (bLks2 && aBewareRect2.Left ()<aBewareRect1.Right ())) &&
+ ((bUnt1 && aBewareRect1.Bottom()>aBewareRect2.Top ()) ||
+ (bObn1 && aBewareRect1.Top ()<aBewareRect2.Bottom())))) {
+ // Fall 3.3
+ bForceMeeting=true;
+ if (bRts1 || bRts2) { aMeeting.X()=nXMax; bMeetingXMid=false; }
+ if (bLks1 || bLks2) { aMeeting.X()=nXMin; bMeetingXMid=false; }
+ if (bUnt1 || bUnt2) { aMeeting.Y()=nYMax; bMeetingYMid=false; }
+ if (bObn1 || bObn2) { aMeeting.Y()=nYMin; bMeetingYMid=false; }
+ }
+ }
+ }
+
+ XPolygon aXP1(impOldCalcObjToCenter(aPt1,nAngle1,aBewareRect1,aMeeting));
+ XPolygon aXP2(impOldCalcObjToCenter(aPt2,nAngle2,aBewareRect2,aMeeting));
+ sal_uInt16 nXP1Anz=aXP1.GetPointCount();
+ sal_uInt16 nXP2Anz=aXP2.GetPointCount();
+ if (bInfo) {
+ pInfo->nObj1Lines=nXP1Anz; if (nXP1Anz>1) pInfo->nObj1Lines--;
+ pInfo->nObj2Lines=nXP2Anz; if (nXP2Anz>1) pInfo->nObj2Lines--;
+ }
+ Point aEP1(aXP1[nXP1Anz-1]);
+ Point aEP2(aXP2[nXP2Anz-1]);
+ bool bInsMeetingPoint=aEP1.X()!=aEP2.X() && aEP1.Y()!=aEP2.Y();
+ bool bHorzE1=aEP1.Y()==aXP1[nXP1Anz-2].Y(); // letzte Linie von XP1 horizontal?
+ bool bHorzE2=aEP2.Y()==aXP2[nXP2Anz-2].Y(); // letzte Linie von XP2 horizontal?
+ if (aEP1==aEP2 && (bHorzE1 && bHorzE2 && aEP1.Y()==aEP2.Y()) || (!bHorzE1 && !bHorzE2 && aEP1.X()==aEP2.X())) {
+ // Sonderbehandlung fuer 'I'-Verbinder
+ nXP1Anz--; aXP1.Remove(nXP1Anz,1);
+ nXP2Anz--; aXP2.Remove(nXP2Anz,1);
+ bMeetingXMid=false;
+ bMeetingYMid=false;
+ }
+ if (bInsMeetingPoint) {
+ aXP1.Insert(XPOLY_APPEND,aMeeting,XPOLY_NORMAL);
+ if (bInfo) {
+ // Durch einfuegen des MeetingPoints kommen 2 weitere Linie hinzu.
+ // Evtl. wird eine von diesen die Mittellinie.
+ if (pInfo->nObj1Lines==pInfo->nObj2Lines) {
+ pInfo->nObj1Lines++;
+ pInfo->nObj2Lines++;
+ } else {
+ if (pInfo->nObj1Lines>pInfo->nObj2Lines) {
+ pInfo->nObj2Lines++;
+ pInfo->nMiddleLine=nXP1Anz-1;
+ } else {
+ pInfo->nObj1Lines++;
+ pInfo->nMiddleLine=nXP1Anz;
+ }
+ }
+ }
+ } else if (bInfo && aEP1!=aEP2 && nXP1Anz+nXP2Anz>=4) {
+ // Durch Verbinden der beiden Enden kommt eine weitere Linie hinzu.
+ // Dies wird die Mittellinie.
+ pInfo->nMiddleLine=nXP1Anz-1;
+ }
+ sal_uInt16 nNum=aXP2.GetPointCount();
+ if (aXP1[nXP1Anz-1]==aXP2[nXP2Anz-1] && nXP1Anz>1 && nXP2Anz>1) nNum--;
+ while (nNum>0) {
+ nNum--;
+ aXP1.Insert(XPOLY_APPEND,aXP2[nNum],XPOLY_NORMAL);
+ }
+ sal_uInt16 nPntAnz=aXP1.GetPointCount();
+ char cForm=0;
+ if (bInfo || pnQuality!=NULL) {
+ cForm='?';
+ if (nPntAnz==2) cForm='I';
+ else if (nPntAnz==3) cForm='L';
+ else if (nPntAnz==4) { // Z oder U
+ if (nAngle1==nAngle2) cForm='U';
+ else cForm='Z';
+ } else if (nPntAnz==4) { /* - - */
+ /* ... - - */
+ } else if (nPntAnz==6) { // S oder C oder ...
+ if (nAngle1!=nAngle2) {
+ // Fuer Typ S hat Linie2 dieselbe Richtung wie Linie4.
+ // Bei Typ C sind die beiden genau entgegengesetzt.
+ Point aP1(aXP1[1]);
+ Point aP2(aXP1[2]);
+ Point aP3(aXP1[3]);
+ Point aP4(aXP1[4]);
+ if (aP1.Y()==aP2.Y()) { // beide Linien Horz
+ if ((aP1.X()<aP2.X())==(aP3.X()<aP4.X())) cForm='S';
+ else cForm='C';
+ } else { // sonst beide Linien Vert
+ if ((aP1.Y()<aP2.Y())==(aP3.Y()<aP4.Y())) cForm='S';
+ else cForm='C';
+ }
+ } else cForm='4'; // sonst der 3. Fall mit 5 Linien
+ } else cForm='?'; //
+ // Weitere Formen:
+ if (bInfo) {
+ pInfo->cOrthoForm=cForm;
+ if (cForm=='I' || cForm=='L' || cForm=='Z' || cForm=='U') {
+ pInfo->nObj1Lines=1;
+ pInfo->nObj2Lines=1;
+ if (cForm=='Z' || cForm=='U') {
+ pInfo->nMiddleLine=1;
+ } else {
+ pInfo->nMiddleLine=0xFFFF;
+ }
+ } else if (cForm=='S' || cForm=='C') {
+ pInfo->nObj1Lines=2;
+ pInfo->nObj2Lines=2;
+ pInfo->nMiddleLine=2;
+ }
+ }
+ }
+ if (pnQuality!=NULL) {
+ sal_uInt32 nQual=0;
+ sal_uInt32 nQual0=nQual; // Ueberlaeufe vorbeugen
+ bool bOverflow=false;
+ Point aPt0(aXP1[0]);
+ for (sal_uInt16 nPntNum=1; nPntNum<nPntAnz; nPntNum++) {
+ Point aPt1b(aXP1[nPntNum]);
+ nQual+=Abs(aPt1b.X()-aPt0.X())+Abs(aPt1b.Y()-aPt0.Y());
+ if (nQual<nQual0) bOverflow=true;
+ nQual0=nQual;
+ aPt0=aPt1b;
+ }
+
+ sal_uInt16 nTmp=nPntAnz;
+ if (cForm=='Z') {
+ nTmp=2; // Z-Form hat gute Qualitaet (nTmp=2 statt 4)
+ sal_uInt32 n1=Abs(aXP1[1].X()-aXP1[0].X())+Abs(aXP1[1].Y()-aXP1[0].Y());
+ sal_uInt32 n2=Abs(aXP1[2].X()-aXP1[1].X())+Abs(aXP1[2].Y()-aXP1[1].Y());
+ sal_uInt32 n3=Abs(aXP1[3].X()-aXP1[2].X())+Abs(aXP1[3].Y()-aXP1[2].Y());
+ // fuer moeglichst gleichlange Linien sorgen
+ sal_uInt32 nBesser=0;
+ n1+=n3;
+ n3=n2/4;
+ if (n1>=n2) nBesser=6;
+ else if (n1>=3*n3) nBesser=4;
+ else if (n1>=2*n3) nBesser=2;
+ if (aXP1[0].Y()!=aXP1[1].Y()) nBesser++; // Senkrechte Startlinie kriegt auch noch einen Pluspunkt (fuer H/V-Prio)
+ if (nQual>nBesser) nQual-=nBesser; else nQual=0;
+ }
+ if (nTmp>=3) {
+ nQual0=nQual;
+ nQual+=(sal_uInt32)nTmp*0x01000000;
+ if (nQual<nQual0 || nTmp>15) bOverflow=true;
+ }
+ if (nPntAnz>=2) { // Austrittswinkel nochmal pruefen
+ Point aP1(aXP1[1]); aP1-=aXP1[0];
+ Point aP2(aXP1[nPntAnz-2]); aP2-=aXP1[nPntAnz-1];
+ long nAng1=0; if (aP1.X()<0) nAng1=18000; if (aP1.Y()>0) nAng1=27000;
+ if (aP1.Y()<0) nAng1=9000; if (aP1.X()!=0 && aP1.Y()!=0) nAng1=1; // Schraeg!?!
+ long nAng2=0; if (aP2.X()<0) nAng2=18000; if (aP2.Y()>0) nAng2=27000;
+ if (aP2.Y()<0) nAng2=9000; if (aP2.X()!=0 && aP2.Y()!=0) nAng2=1; // Schraeg!?!
+ if (nAng1!=nAngle1) nIntersections++;
+ if (nAng2!=nAngle2) nIntersections++;
+ }
+
+ // Fuer den Qualitaetscheck wieder die Original-Rects verwenden und
+ // gleichzeitig checken, ob eins fuer die Edge-Berechnung verkleinert
+ // wurde (z.B. Fall 2.9)
+ aBewareRect1=rBewareRect1;
+ aBewareRect2=rBewareRect2;
+
+ for (sal_uInt16 i=0; i<nPntAnz; i++) {
+ Point aPt1b(aXP1[i]);
+ bool b1=aPt1b.X()>aBewareRect1.Left() && aPt1b.X()<aBewareRect1.Right() &&
+ aPt1b.Y()>aBewareRect1.Top() && aPt1b.Y()<aBewareRect1.Bottom();
+ bool b2=aPt1b.X()>aBewareRect2.Left() && aPt1b.X()<aBewareRect2.Right() &&
+ aPt1b.Y()>aBewareRect2.Top() && aPt1b.Y()<aBewareRect2.Bottom();
+ sal_uInt16 nInt0=nIntersections;
+ if (i==0 || i==nPntAnz-1) {
+ if (b1 && b2) nIntersections++;
+ } else {
+ if (b1) nIntersections++;
+ if (b2) nIntersections++;
+ }
+ // und nun noch auf Ueberschneidungen checken
+ if (i>0 && nInt0==nIntersections) {
+ if (aPt0.Y()==aPt1b.Y()) { // Horizontale Linie
+ if (aPt0.Y()>aBewareRect1.Top() && aPt0.Y()<aBewareRect1.Bottom() &&
+ ((aPt0.X()<=aBewareRect1.Left() && aPt1b.X()>=aBewareRect1.Right()) ||
+ (aPt1b.X()<=aBewareRect1.Left() && aPt0.X()>=aBewareRect1.Right()))) nIntersections++;
+ if (aPt0.Y()>aBewareRect2.Top() && aPt0.Y()<aBewareRect2.Bottom() &&
+ ((aPt0.X()<=aBewareRect2.Left() && aPt1b.X()>=aBewareRect2.Right()) ||
+ (aPt1b.X()<=aBewareRect2.Left() && aPt0.X()>=aBewareRect2.Right()))) nIntersections++;
+ } else { // Vertikale Linie
+ if (aPt0.X()>aBewareRect1.Left() && aPt0.X()<aBewareRect1.Right() &&
+ ((aPt0.Y()<=aBewareRect1.Top() && aPt1b.Y()>=aBewareRect1.Bottom()) ||
+ (aPt1b.Y()<=aBewareRect1.Top() && aPt0.Y()>=aBewareRect1.Bottom()))) nIntersections++;
+ if (aPt0.X()>aBewareRect2.Left() && aPt0.X()<aBewareRect2.Right() &&
+ ((aPt0.Y()<=aBewareRect2.Top() && aPt1b.Y()>=aBewareRect2.Bottom()) ||
+ (aPt1b.Y()<=aBewareRect2.Top() && aPt0.Y()>=aBewareRect2.Bottom()))) nIntersections++;
+ }
+ }
+ aPt0=aPt1b;
+ }
+ if (nPntAnz<=1) nIntersections++;
+ nQual0=nQual;
+ nQual+=(sal_uInt32)nIntersections*0x10000000;
+ if (nQual<nQual0 || nIntersections>15) bOverflow=true;
+
+ if (bOverflow || nQual==0xFFFFFFFF) nQual=0xFFFFFFFE;
+ *pnQuality=nQual;
+ }
+ if (bInfo) { // nun die Linienversaetze auf aXP1 anwenden
+ if (pInfo->nMiddleLine!=0xFFFF) {
+ const sal_uInt16 nIdx = (sal_uInt16)pInfo->ImpGetPolyIdx(MIDDLELINE,aXP1.GetPointCount());
+ if (pInfo->ImpIsHorzLine(MIDDLELINE,aXP1.GetPointCount())) {
+ aXP1[nIdx].Y()+=pInfo->aMiddleLine.getY();
+ aXP1[nIdx+1].Y()+=pInfo->aMiddleLine.getY();
+ } else {
+ aXP1[nIdx].X()+=pInfo->aMiddleLine.getX();
+ aXP1[nIdx+1].X()+=pInfo->aMiddleLine.getX();
+ }
+ }
+ if (pInfo->nObj1Lines>=2) {
+ const sal_uInt16 nIdx = (sal_uInt16)pInfo->ImpGetPolyIdx(OBJ1LINE2,aXP1.GetPointCount());
+ if (pInfo->ImpIsHorzLine(OBJ1LINE2,aXP1.GetPointCount())) {
+ aXP1[nIdx].Y()+=pInfo->aObj1Line2.getY();
+ aXP1[nIdx+1].Y()+=pInfo->aObj1Line2.getY();
+ } else {
+ aXP1[nIdx].X()+=pInfo->aObj1Line2.getX();
+ aXP1[nIdx+1].X()+=pInfo->aObj1Line2.getX();
+ }
+ }
+ if (pInfo->nObj1Lines>=3) {
+ const sal_uInt16 nIdx = (sal_uInt16)pInfo->ImpGetPolyIdx(OBJ1LINE3,aXP1.GetPointCount());
+ if (pInfo->ImpIsHorzLine(OBJ1LINE3,aXP1.GetPointCount())) {
+ aXP1[nIdx].Y()+=pInfo->aObj1Line3.getY();
+ aXP1[nIdx+1].Y()+=pInfo->aObj1Line3.getY();
+ } else {
+ aXP1[nIdx].X()+=pInfo->aObj1Line3.getX();
+ aXP1[nIdx+1].X()+=pInfo->aObj1Line3.getX();
+ }
+ }
+ if (pInfo->nObj2Lines>=2) {
+ const sal_uInt16 nIdx = (sal_uInt16)pInfo->ImpGetPolyIdx(OBJ2LINE2,aXP1.GetPointCount());
+ if (pInfo->ImpIsHorzLine(OBJ2LINE2,aXP1.GetPointCount())) {
+ aXP1[nIdx].Y()+=pInfo->aObj2Line2.getY();
+ aXP1[nIdx+1].Y()+=pInfo->aObj2Line2.getY();
+ } else {
+ aXP1[nIdx].X()+=pInfo->aObj2Line2.getX();
+ aXP1[nIdx+1].X()+=pInfo->aObj2Line2.getX();
+ }
+ }
+ if (pInfo->nObj2Lines>=3) {
+ const sal_uInt16 nIdx = (sal_uInt16)pInfo->ImpGetPolyIdx(OBJ2LINE3,aXP1.GetPointCount());
+ if (pInfo->ImpIsHorzLine(OBJ2LINE3,aXP1.GetPointCount())) {
+ aXP1[nIdx].Y()+=pInfo->aObj2Line3.getY();
+ aXP1[nIdx+1].Y()+=pInfo->aObj2Line3.getY();
+ } else {
+ aXP1[nIdx].X()+=pInfo->aObj2Line3.getX();
+ aXP1[nIdx+1].X()+=pInfo->aObj2Line3.getX();
+ }
+ }
+ }
+ // Nun mache ich ggf. aus dem Verbinder eine Bezierkurve
+ if (eKind==SDREDGE_BEZIER && nPntAnz>2) {
+ Point* pPt1=&aXP1[0];
+ Point* pPt2=&aXP1[1];
+ Point* pPt3=&aXP1[nPntAnz-2];
+ Point* pPt4=&aXP1[nPntAnz-1];
+ long dx1=pPt2->X()-pPt1->X();
+ long dy1=pPt2->Y()-pPt1->Y();
+ long dx2=pPt3->X()-pPt4->X();
+ long dy2=pPt3->Y()-pPt4->Y();
+ if (cForm=='L') { // nPntAnz==3
+ aXP1.SetFlags(1,XPOLY_CONTROL);
+ Point aPt3(*pPt2);
+ aXP1.Insert(2,aPt3,XPOLY_CONTROL);
+ nPntAnz=aXP1.GetPointCount();
+ pPt1=&aXP1[0];
+ pPt2=&aXP1[1];
+ pPt3=&aXP1[nPntAnz-2];
+ pPt4=&aXP1[nPntAnz-1];
+ pPt2->X()-=dx1/3;
+ pPt2->Y()-=dy1/3;
+ pPt3->X()-=dx2/3;
+ pPt3->Y()-=dy2/3;
+ } else if (nPntAnz>=4 && nPntAnz<=6) { // Z oder U oder ...
+ // fuer Alle Anderen werden die Endpunkte der Ausgangslinien
+ // erstmal zu Kontrollpunkten. Bei nPntAnz>4 ist also noch
+ // Nacharbeit erforderlich!
+ aXP1.SetFlags(1,XPOLY_CONTROL);
+ aXP1.SetFlags(nPntAnz-2,XPOLY_CONTROL);
+ // Distanz x1.5
+ pPt2->X()+=dx1/2;
+ pPt2->Y()+=dy1/2;
+ pPt3->X()+=dx2/2;
+ pPt3->Y()+=dy2/2;
+ if (nPntAnz==5) {
+ // Vor und hinter dem Mittelpunkt jeweils
+ // noch einen Kontrollpunkt einfuegen
+ Point aCenter(aXP1[2]);
+ long dx1b=aCenter.X()-aXP1[1].X();
+ long dy1b=aCenter.Y()-aXP1[1].Y();
+ long dx2b=aCenter.X()-aXP1[3].X();
+ long dy2b=aCenter.Y()-aXP1[3].Y();
+ aXP1.Insert(2,aCenter,XPOLY_CONTROL);
+ aXP1.SetFlags(3,XPOLY_SYMMTR);
+ aXP1.Insert(4,aCenter,XPOLY_CONTROL);
+ aXP1[2].X()-=dx1b/2;
+ aXP1[2].Y()-=dy1b/2;
+ aXP1[3].X()-=(dx1b+dx2b)/4;
+ aXP1[3].Y()-=(dy1b+dy2b)/4;
+ aXP1[4].X()-=dx2b/2;
+ aXP1[4].Y()-=dy2b/2;
+ }
+ if (nPntAnz==6) {
+ Point aPt1b(aXP1[2]);
+ Point aPt2b(aXP1[3]);
+ aXP1.Insert(2,aPt1b,XPOLY_CONTROL);
+ aXP1.Insert(5,aPt2b,XPOLY_CONTROL);
+ long dx=aPt1b.X()-aPt2b.X();
+ long dy=aPt1b.Y()-aPt2b.Y();
+ aXP1[3].X()-=dx/2;
+ aXP1[3].Y()-=dy/2;
+ aXP1.SetFlags(3,XPOLY_SYMMTR);
+ //aXP1[4].X()+=dx/2;
+ //aXP1[4].Y()+=dy/2;
+ aXP1.Remove(4,1); // weil identisch mit aXP1[3]
+ }
+ }
+ }
+ return aXP1.getB2DPolygon();
+ }
}
//////////////////////////////////////////////////////////////////////////////
+// SdrEdgeObj
+
+sdr::properties::BaseProperties* SdrEdgeObj::CreateObjectSpecificProperties()
+{
+ return new sdr::properties::ConnectorProperties(*this);
+}
+
+sdr::contact::ViewContact* SdrEdgeObj::CreateObjectSpecificViewContact()
+{
+ return new sdr::contact::ViewContactOfSdrEdgeObj(*this);
+}
+
+sdr::glue::GluePointProvider* SdrEdgeObj::CreateObjectSpecificGluePointProvider()
+{
+ return new sdr::glue::SdrEdgeObjGluePointProvider(*this);
+}
SdrEdgeObj::SdrEdgeObj(SdrModel& rSdrModel)
: SdrTextObj(rSdrModel),
- maCon1(),
- maCon2(),
+ mpCon1(new SdrObjConnection(this)),
+ mpCon2(new SdrObjConnection(this)),
maEdgeTrack(),
- maEdgeInfo(),
- mbEdgeTrackDirty(false),
+ mpEdgeInfo(new SdrEdgeInfoRec()),
mbEdgeTrackUserDefined(false),
- mbSuppressDefaultConnect(false)
+ mbSuppressDefaultConnect(false),
+ mbBoundRectCalculationRunning(false),
+ mbSuppressed(false)
{
- // default connector
- maEdgeTrack.append(basegfx::B2DPoint(0.0, 0.0));
- maEdgeTrack.append(basegfx::B2DPoint(0.0, 100.0));
+ // give an initial position to the points so that the initial transformation
+ // gets set
+ mpCon2->SetPosition(basegfx::B2DPoint(0.0, 100.0));
}
SdrEdgeObj::~SdrEdgeObj()
{
- DisconnectFromNode(true);
- DisconnectFromNode(false);
+}
+
+void SdrEdgeObj::geometryChange()
+{
+ const basegfx::B2DHomMatrix aCurrent(
+ SdrTextObj::getSdrObjectTransformation());
+ const basegfx::B2DRange aBaseRange(
+ mpCon1->GetPosition(),
+ mpCon2->GetPosition());
+ const basegfx::B2DHomMatrix aNew(
+ basegfx::tools::createScaleTranslateB2DHomMatrix(
+ aBaseRange.getRange(),
+ aBaseRange.getMinimum()));
+
+ if(aNew != aCurrent)
+ {
+ maSdrObjectTransformation.setB2DHomMatrix(aNew);
+ SetEdgeTrackDirty();
+ SetChanged();
+
+ // change implies interactive or listener-related change, so this
+ // can no longer be a user-defined EdgeTrack
+ mbEdgeTrackUserDefined = false;
+
+ // Broadcasting nur, wenn auf der selben Page
+ const SdrObjectChangeBroadcaster aSdrObjectChangeBroadcaster(*this);
+ }
}
void SdrEdgeObj::copyDataFromSdrObject(const SdrObject& rSource)
@@ -371,14 +1551,22 @@ void SdrEdgeObj::copyDataFromSdrObject(const SdrObject& rSource)
// call parent
SdrTextObj::copyDataFromSdrObject(rSource);
+ // copy connection (without changing owner), but do not
+ // keep object connection
+ *mpCon1 = *pSource->mpCon1;
+ mpCon1->SetConnectedSdrObject(0);
+
+ *mpCon2 = *pSource->mpCon2;
+ mpCon2->SetConnectedSdrObject(0);
+
// copy local data
maEdgeTrack = pSource->maEdgeTrack;
- mbEdgeTrackDirty = pSource->mbEdgeTrackDirty;
- maCon1 = pSource->maCon1;
- maCon2 = pSource->maCon2;
- maCon1.mpConnectedSdrObject = 0;
- maCon2.mpConnectedSdrObject = 0;
- maEdgeInfo = pSource->maEdgeInfo;
+ *mpEdgeInfo = *pSource->mpEdgeInfo;
+ mbEdgeTrackUserDefined = pSource->mbEdgeTrackUserDefined;
+ mbSuppressDefaultConnect = pSource->mbSuppressDefaultConnect;
+
+ // set internal bolleans to defaults
+ mbSuppressed = mbBoundRectCalculationRunning = false;
}
else
{
@@ -387,6 +1575,18 @@ void SdrEdgeObj::copyDataFromSdrObject(const SdrObject& rSource)
}
}
+SdrEdgeObj* SdrEdgeObj::checkIfUsesListener(SfxListener& rCandidate)
+{
+ SdrObjConnection* pSdrObjConnection = dynamic_cast< SdrObjConnection* >(&rCandidate);
+
+ if(pSdrObjConnection)
+ {
+ return pSdrObjConnection->getOwner();
+ }
+
+ return 0;
+}
+
SdrObject* SdrEdgeObj::CloneSdrObject(SdrModel* pTargetModel) const
{
SdrEdgeObj* pClone = new SdrEdgeObj(
@@ -402,15 +1602,10 @@ bool SdrEdgeObj::IsClosedObj() const
return false;
}
-bool SdrEdgeObj::IsSdrEdgeObj() const
-{
- return true;
-}
-
void SdrEdgeObj::ImpSetAttrToEdgeInfo()
{
const SfxItemSet& rSet = GetObjectItemSet();
- SdrEdgeKind eKind = ((SdrEdgeKindItem&)(rSet.Get(SDRATTR_EDGEKIND))).GetValue();
+ const SdrEdgeKind eKind((static_cast< const SdrEdgeKindItem& >(rSet.Get(SDRATTR_EDGEKIND))).GetValue());
sal_Int32 nVal1 = ((SdrEdgeLine1DeltaItem&)rSet.Get(SDRATTR_EDGELINE1DELTA)).GetValue();
sal_Int32 nVal2 = ((SdrEdgeLine2DeltaItem&)rSet.Get(SDRATTR_EDGELINE2DELTA)).GetValue();
sal_Int32 nVal3 = ((SdrEdgeLine3DeltaItem&)rSet.Get(SDRATTR_EDGELINE3DELTA)).GetValue();
@@ -420,68 +1615,71 @@ void SdrEdgeObj::ImpSetAttrToEdgeInfo()
sal_Int32 nVals[3] = { nVal1, nVal2, nVal3 };
sal_uInt16 n = 0;
- if(maEdgeInfo.nObj1Lines >= 2 && n < 3)
+ // force recalc EdgeTrack, we need evtl. the EdgeTrack PointCount (see below)
+ ImpRecalcEdgeTrack();
+
+ if(mpEdgeInfo->nObj1Lines >= 2 && n < 3)
{
- maEdgeInfo.ImpSetLineVersatz(OBJ1LINE2, maEdgeTrack.count(), nVals[n]);
+ mpEdgeInfo->ImpSetLineVersatz(OBJ1LINE2, maEdgeTrack.count(), nVals[n]);
n++;
}
- if(maEdgeInfo.nObj1Lines >= 3 && n < 3)
+ if(mpEdgeInfo->nObj1Lines >= 3 && n < 3)
{
- maEdgeInfo.ImpSetLineVersatz(OBJ1LINE3, maEdgeTrack.count(), nVals[n]);
+ mpEdgeInfo->ImpSetLineVersatz(OBJ1LINE3, maEdgeTrack.count(), nVals[n]);
n++;
}
- if(maEdgeInfo.nMiddleLine != 0xFFFF && n < 3)
+ if(mpEdgeInfo->nMiddleLine != 0xFFFF && n < 3)
{
- maEdgeInfo.ImpSetLineVersatz(MIDDLELINE, maEdgeTrack.count(), nVals[n]);
+ mpEdgeInfo->ImpSetLineVersatz(MIDDLELINE, maEdgeTrack.count(), nVals[n]);
n++;
}
- if(maEdgeInfo.nObj2Lines >= 3 && n < 3)
+ if(mpEdgeInfo->nObj2Lines >= 3 && n < 3)
{
- maEdgeInfo.ImpSetLineVersatz(OBJ2LINE3, maEdgeTrack.count(), nVals[n]);
+ mpEdgeInfo->ImpSetLineVersatz(OBJ2LINE3, maEdgeTrack.count(), nVals[n]);
n++;
}
- if(maEdgeInfo.nObj2Lines >= 2 && n < 3)
+ if(mpEdgeInfo->nObj2Lines >= 2 && n < 3)
{
- maEdgeInfo.ImpSetLineVersatz(OBJ2LINE2, maEdgeTrack.count(), nVals[n]);
+ mpEdgeInfo->ImpSetLineVersatz(OBJ2LINE2, maEdgeTrack.count(), nVals[n]);
n++;
}
}
else if(eKind == SDREDGE_THREELINES)
{
- bool bHor1 = maEdgeInfo.nAngle1 == 0 || maEdgeInfo.nAngle1 == 18000;
- bool bHor2 = maEdgeInfo.nAngle2 == 0 || maEdgeInfo.nAngle2 == 18000;
+ bool bHor1 = mpEdgeInfo->nAngle1 == 0 || mpEdgeInfo->nAngle1 == 18000;
+ bool bHor2 = mpEdgeInfo->nAngle2 == 0 || mpEdgeInfo->nAngle2 == 18000;
if(bHor1)
{
- maEdgeInfo.aObj1Line2.setX(nVal1);
+ mpEdgeInfo->aObj1Line2.setX(nVal1);
}
else
{
- maEdgeInfo.aObj1Line2.setY(nVal1);
+ mpEdgeInfo->aObj1Line2.setY(nVal1);
}
if(bHor2)
{
- maEdgeInfo.aObj2Line2.setX(nVal2);
+ mpEdgeInfo->aObj2Line2.setX(nVal2);
}
else
{
- maEdgeInfo.aObj2Line2.setY(nVal2);
+ mpEdgeInfo->aObj2Line2.setY(nVal2);
}
}
- // #84649#
- ImpDirtyEdgeTrack();
+ // if values have changed, a different EdgeTrack needs to be created
+ SetEdgeTrackDirty();
}
void SdrEdgeObj::ImpSetEdgeInfoToAttr()
{
const SfxItemSet& rSet = GetObjectItemSet();
- SdrEdgeKind eKind = ((SdrEdgeKindItem&)(rSet.Get(SDRATTR_EDGEKIND))).GetValue();
+ const SdrEdgeKind eKind((static_cast< const SdrEdgeKindItem& >(rSet.Get(SDRATTR_EDGEKIND))).GetValue());
sal_Int32 nValAnz = ((SfxUInt16Item&)rSet.Get(SDRATTR_EDGELINEDELTAANZ)).GetValue();
sal_Int32 nVal1 = ((SdrEdgeLine1DeltaItem&)rSet.Get(SDRATTR_EDGELINE1DELTA)).GetValue();
sal_Int32 nVal2 = ((SdrEdgeLine2DeltaItem&)rSet.Get(SDRATTR_EDGELINE2DELTA)).GetValue();
@@ -489,46 +1687,50 @@ void SdrEdgeObj::ImpSetEdgeInfoToAttr()
sal_Int32 nVals[3] = { nVal1, nVal2, nVal3 };
sal_uInt16 n = 0;
+ // force recalc EdgeTrack, we need evtl. changes to EdgeInfo before
+ // we write it back to the SfxItemSet
+ ImpRecalcEdgeTrack();
+
if(eKind == SDREDGE_ORTHOLINES || eKind == SDREDGE_BEZIER)
{
- if(maEdgeInfo.nObj1Lines >= 2 && n < 3)
+ if(mpEdgeInfo->nObj1Lines >= 2 && n < 3)
{
- nVals[n] = maEdgeInfo.ImpGetLineVersatz(OBJ1LINE2, maEdgeTrack.count());
+ nVals[n] = mpEdgeInfo->ImpGetLineVersatz(OBJ1LINE2, maEdgeTrack.count());
n++;
}
- if(maEdgeInfo.nObj1Lines >= 3 && n < 3)
+ if(mpEdgeInfo->nObj1Lines >= 3 && n < 3)
{
- nVals[n] = maEdgeInfo.ImpGetLineVersatz(OBJ1LINE3, maEdgeTrack.count());
+ nVals[n] = mpEdgeInfo->ImpGetLineVersatz(OBJ1LINE3, maEdgeTrack.count());
n++;
}
- if(maEdgeInfo.nMiddleLine != 0xFFFF && n < 3)
+ if(mpEdgeInfo->nMiddleLine != 0xFFFF && n < 3)
{
- nVals[n] = maEdgeInfo.ImpGetLineVersatz(MIDDLELINE, maEdgeTrack.count());
+ nVals[n] = mpEdgeInfo->ImpGetLineVersatz(MIDDLELINE, maEdgeTrack.count());
n++;
}
- if(maEdgeInfo.nObj2Lines >= 3 && n < 3)
+ if(mpEdgeInfo->nObj2Lines >= 3 && n < 3)
{
- nVals[n] = maEdgeInfo.ImpGetLineVersatz(OBJ2LINE3, maEdgeTrack.count());
+ nVals[n] = mpEdgeInfo->ImpGetLineVersatz(OBJ2LINE3, maEdgeTrack.count());
n++;
}
- if(maEdgeInfo.nObj2Lines >= 2 && n < 3)
+ if(mpEdgeInfo->nObj2Lines >= 2 && n < 3)
{
- nVals[n] = maEdgeInfo.ImpGetLineVersatz(OBJ2LINE2, maEdgeTrack.count());
+ nVals[n] = mpEdgeInfo->ImpGetLineVersatz(OBJ2LINE2, maEdgeTrack.count());
n++;
}
}
else if(eKind == SDREDGE_THREELINES)
{
- bool bHor1 = maEdgeInfo.nAngle1 == 0 || maEdgeInfo.nAngle1 == 18000;
- bool bHor2 = maEdgeInfo.nAngle2 == 0 || maEdgeInfo.nAngle2 == 18000;
+ bool bHor1 = mpEdgeInfo->nAngle1 == 0 || mpEdgeInfo->nAngle1 == 18000;
+ bool bHor2 = mpEdgeInfo->nAngle2 == 0 || mpEdgeInfo->nAngle2 == 18000;
n = 2;
- nVals[0] = bHor1 ? maEdgeInfo.aObj1Line2.getX() : maEdgeInfo.aObj1Line2.getY();
- nVals[1] = bHor2 ? maEdgeInfo.aObj2Line2.getX() : maEdgeInfo.aObj2Line2.getY();
+ nVals[0] = bHor1 ? mpEdgeInfo->aObj1Line2.getX() : mpEdgeInfo->aObj1Line2.getY();
+ nVals[1] = bHor2 ? mpEdgeInfo->aObj2Line2.getX() : mpEdgeInfo->aObj2Line2.getY();
}
if(n != nValAnz || nVals[0] != nVal1 || nVals[1] != nVal2 || nVals[2] != nVal3)
@@ -594,140 +1796,115 @@ sal_uInt16 SdrEdgeObj::GetObjIdentifier() const
return sal_uInt16(OBJ_EDGE);
}
-void SdrEdgeObj::ConnectToNode(bool bTail1, SdrObject* pObj)
+void SdrEdgeObj::SetEdgeTrackDirty()
{
- SdrObjConnection& rCon=GetConnection(bTail1);
- DisconnectFromNode(bTail1);
-
- if(pObj)
+ if(!mbEdgeTrackUserDefined)
{
- StartListening(*pObj);
- rCon.mpConnectedSdrObject = pObj;
+ maEdgeTrack.clear();
+ }
+}
- // #120437# If connection is set, reset bEdgeTrackUserDefined
- mbEdgeTrackUserDefined = false;
+void SdrEdgeObj::ConnectToSdrObject(bool bTail, SdrObject* pObj)
+{
+ SdrObjConnection& rCon(bTail ? *mpCon1 : *mpCon2);
- ImpDirtyEdgeTrack();
- }
+ rCon.SetConnectedSdrObject(pObj);
}
-void SdrEdgeObj::DisconnectFromNode(bool bTail1)
+SdrObject* SdrEdgeObj::GetSdrObjectConnection(bool bTail) const
{
- SdrObjConnection& rCon=GetConnection(bTail1);
+ const SdrObjConnection& rCon(bTail ? *mpCon1 : *mpCon2);
+ SdrObject* pObj = rCon.GetConnectedSdrObject();
- if(rCon.mpConnectedSdrObject)
+ if(!pObj)
{
- EndListening(*rCon.mpConnectedSdrObject);
- rCon.mpConnectedSdrObject = 0;
+ return 0;
}
-}
-SdrObject* SdrEdgeObj::GetConnectedNode(bool bTail1) const
-{
- SdrObject* pObj = GetConnection(bTail1).mpConnectedSdrObject;
+ if(!pObj->IsObjectInserted())
+ {
+ return 0;
+ }
+
+ const SdrPage* pOwningPage = getSdrPageFromSdrObject();
- if(pObj && (pObj->getSdrPageFromSdrObject() != getSdrPageFromSdrObject() || !pObj->IsObjectInserted()))
+ if(pOwningPage && pObj->getSdrPageFromSdrObject() != pOwningPage)
{
- pObj = 0;
+ return 0;
}
return pObj;
}
-bool SdrEdgeObj::CheckNodeConnection(bool bTail1) const
+bool SdrEdgeObj::CheckSdrObjectConnection(bool bTail) const
{
- bool bRet(false);
- const SdrObjConnection& rCon = GetConnection(bTail1);
- const sal_uInt32 nPtAnz(maEdgeTrack.count());
+ const SdrObject* pConnectedNode = GetSdrObjectConnection(bTail);
- if(rCon.mpConnectedSdrObject && rCon.mpConnectedSdrObject->getSdrPageFromSdrObject() == getSdrPageFromSdrObject() && nPtAnz)
+ if(!pConnectedNode)
{
- const sdr::glue::GluePointProvider& rProvider = rCon.mpConnectedSdrObject->GetGluePointProvider();
+ return false;
+ }
- if(rProvider.hasUserGluePoints())
- {
- const sdr::glue::GluePointVector aGluePointVector(rProvider.getUserGluePointVector());
- const sal_uInt32 nConAnz(aGluePointVector.size());
- const sal_uInt32 nGesAnz(nConAnz + rProvider.getAutoGluePointCount());
- const basegfx::B2DPoint aTail(bTail1 ? maEdgeTrack.getB2DPoint(0) : maEdgeTrack.getB2DPoint(nPtAnz - 1));
+ const sdr::glue::GluePointProvider& rProvider = pConnectedNode->GetGluePointProvider();
+
+ if(rProvider.hasUserGluePoints())
+ {
+ 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());
- for(sal_uInt32 i(0); i < nGesAnz && !bRet; i++)
+ for(sal_uInt32 i(0); i < nGesAnz; i++)
+ {
+ if(i < nConAnz)
{
- if(i < nConAnz)
+ // UserDefined or CustomShape
+ const sdr::glue::GluePoint* pCandidate = aGluePointVector[i];
+
+ if(pCandidate)
{
- // UserDefined or CustomShape
- const sdr::glue::GluePoint* pCandidate = aGluePointVector[i];
+ const basegfx::B2DPoint aGluePos(pConnectedNode->getSdrObjectTransformation() * pCandidate->getUnitPosition());
- if(pCandidate)
+ if(aCurrentPosition.equal(aGluePos))
{
- const basegfx::B2DPoint aGluePos(rCon.mpConnectedSdrObject->getSdrObjectTransformation() * pCandidate->getUnitPosition());
-
- bRet = (aTail == aGluePos);
- }
- else
- {
- OSL_ENSURE(false, "Got sdr::glue::PointVector with emty entries (!)");
+ return true;
}
}
- else //if (i<nConAnz+4)
+ else
{
- // Vertex
- const sdr::glue::GluePoint aPt(rProvider.getAutoGluePointByIndex(i - nConAnz));
- const basegfx::B2DPoint aGluePos(rCon.mpConnectedSdrObject->getSdrObjectTransformation() * aPt.getUnitPosition());
+ OSL_ENSURE(false, "Got sdr::glue::PointVector with emty entries (!)");
+ }
+ }
+ else //if (i<nConAnz+4)
+ {
+ // Vertex
+ const sdr::glue::GluePoint aPt(rProvider.getAutoGluePointByIndex(i - nConAnz));
+ const basegfx::B2DPoint aGluePos(pConnectedNode->getSdrObjectTransformation() * aPt.getUnitPosition());
- bRet = (aTail == aGluePos);
+ if(aCurrentPosition.equal(aGluePos))
+ {
+ return true;
}
}
}
}
- return bRet;
+ return false;
}
-void SdrEdgeObj::ImpSetTailPoint(bool bTail1, const basegfx::B2DPoint& rPt)
+void SdrEdgeObj::SetConnectorId(bool bTail, sal_uInt32 nId)
{
- const sal_uInt32 nPtAnz(maEdgeTrack.count());
+ SdrObjConnection& rCon(bTail ? *mpCon1 : *mpCon2);
- if(nPtAnz)
- {
- if(!bTail1)
- {
- maEdgeTrack.setB2DPoint(nPtAnz - 1, rPt);
- }
- else
- {
- maEdgeTrack.setB2DPoint(0, rPt);
- }
-
- ImpRecalcEdgeTrack();
- ActionChanged/*formallyinvalidateobjectrange*/();
- }
+ rCon.SetConnectorID(nId);
}
-void SdrEdgeObj::ImpDirtyEdgeTrack()
+sal_uInt32 SdrEdgeObj::GetConnectorId(bool bTail) const
{
- if ( !mbEdgeTrackUserDefined )
- {
- mbEdgeTrackDirty = true;
- }
- else
- {
- if ( !(getSdrModelFromSdrObject().isLocked()) )
- {
- mbEdgeTrackDirty = true;
- }
- }
-}
+ const SdrObjConnection& rCon(bTail ? *mpCon1 : *mpCon2);
-void SdrEdgeObj::ImpUndirtyEdgeTrack()
-{
- if (mbEdgeTrackDirty )
- {
- if (getSdrModelFromSdrObject().isLocked())
- {
- ImpRecalcEdgeTrack();
- }
- }
+ return rCon.GetConnectorId();
}
void SdrEdgeObj::ImpRecalcEdgeTrack()
@@ -738,6 +1915,12 @@ void SdrEdgeObj::ImpRecalcEdgeTrack()
return;
}
+ // not dirty at all
+ if(maEdgeTrack.count())
+ {
+ return;
+ }
+
// #120437# also not when model locked during import, but remember
if(getSdrModelFromSdrObject().isLocked())
{
@@ -761,7 +1944,7 @@ void SdrEdgeObj::ImpRecalcEdgeTrack()
// and the attr need to be set at EdgeInfo, else these attr *will be lost*
// in the following call to ImpSetEdgeInfoToAttr() sice they were never
// set before (!)
- maEdgeTrack = ImpCalcEdgeTrack(maCon1, maCon2, &maEdgeInfo);
+ maEdgeTrack = ImpCalcEdgeTrack(*mpCon1, *mpCon2, mpEdgeInfo, 0, 0);
ImpSetAttrToEdgeInfo();
mbSuppressed = false;
}
@@ -770,15 +1953,12 @@ void SdrEdgeObj::ImpRecalcEdgeTrack()
// SdrEdgeObj BoundRect calculations
mbBoundRectCalculationRunning = true;
- { // use local scope to trigger locally
+ {
+ // use local scope to trigger locally
const SdrObjectChangeBroadcaster aSdrObjectChangeBroadcaster(*this);
- maEdgeTrack = ImpCalcEdgeTrack(maCon1, maCon2, &maEdgeInfo);
- ImpSetEdgeInfoToAttr(); // Die Werte aus maEdgeInfo in den Pool kopieren
- mbEdgeTrackDirty = false;
-
- // Only redraw here, no object change
- ActionChanged();
+ maEdgeTrack = ImpCalcEdgeTrack(*mpCon1, *mpCon2, mpEdgeInfo, 0, 0);
+ ImpSetEdgeInfoToAttr(); // Die Werte aus mpEdgeInfo in den Pool kopieren
}
// #110649#
@@ -786,1105 +1966,250 @@ void SdrEdgeObj::ImpRecalcEdgeTrack()
}
}
-sal_uInt16 SdrEdgeObj::ImpCalcEscAngle(SdrObject* pObj, const basegfx::B2DPoint& rPt) const
-{
- if (pObj==NULL) return SDRESC_ALL;
- const basegfx::B2DRange aR(sdr::legacy::GetSnapRange(*pObj));
- long dxl(basegfx::fround(rPt.getX() - aR.getMinX()));
- long dyo(basegfx::fround(rPt.getY() - aR.getMinY()));
- long dxr(basegfx::fround(aR.getMaxX() - rPt.getX()));
- long dyu(basegfx::fround(aR.getMaxY() - rPt.getY()));
- bool bxMitt=Abs(dxl-dxr)<2;
- bool byMitt=Abs(dyo-dyu)<2;
- long dx=Min(dxl,dxr);
- long dy=Min(dyo,dyu);
- bool bDiag=Abs(dx-dy)<2;
- if (bxMitt && byMitt) return SDRESC_ALL; // In der Mitte
- if (bDiag) { // diagonal
- sal_uInt16 nRet=0;
- if (byMitt) nRet|=SDRESC_VERT;
- if (bxMitt) nRet|=SDRESC_HORZ;
- if (dxl<dxr) { // Links
- if (dyo<dyu) nRet|=sdr::glue::GluePoint::ESCAPE_DIRECTION_LEFT | sdr::glue::GluePoint::ESCAPE_DIRECTION_TOP;
- else nRet|=sdr::glue::GluePoint::ESCAPE_DIRECTION_LEFT | sdr::glue::GluePoint::ESCAPE_DIRECTION_BOTTOM;
- } else { // Rechts
- if (dyo<dyu) nRet|=sdr::glue::GluePoint::ESCAPE_DIRECTION_RIGHT | sdr::glue::GluePoint::ESCAPE_DIRECTION_TOP;
- else nRet|=sdr::glue::GluePoint::ESCAPE_DIRECTION_RIGHT | sdr::glue::GluePoint::ESCAPE_DIRECTION_BOTTOM;
- }
- return nRet;
- }
- if (dx<dy) { // waagerecht
- if (bxMitt) return SDRESC_HORZ;
- if (dxl<dxr) return sdr::glue::GluePoint::ESCAPE_DIRECTION_LEFT;
- else return sdr::glue::GluePoint::ESCAPE_DIRECTION_RIGHT;
- } else { // senkrecht
- if (byMitt) return SDRESC_VERT;
- if (dyo<dyu) return sdr::glue::GluePoint::ESCAPE_DIRECTION_TOP;
- else return sdr::glue::GluePoint::ESCAPE_DIRECTION_BOTTOM;
- }
-}
-
-XPolygon ImpCalcObjToCenter(const Point& rStPt, long nEscAngle, const Rectangle& rRect, const Point& rMeeting)
-{
- XPolygon aXP;
- aXP.Insert(XPOLY_APPEND,rStPt,XPOLY_NORMAL);
- bool bRts=nEscAngle==0;
- bool bObn=nEscAngle==9000;
- bool bLks=nEscAngle==18000;
- bool bUnt=nEscAngle==27000;
-
- Point aP1(rStPt); // erstmal den Pflichtabstand
- if (bLks) aP1.X()=rRect.Left();
- if (bRts) aP1.X()=rRect.Right();
- if (bObn) aP1.Y()=rRect.Top();
- if (bUnt) aP1.Y()=rRect.Bottom();
-
- bool bFinish=false;
- if (!bFinish) {
- Point aP2(aP1); // Und nun den Pflichtabstand ggf. bis auf Meetinghoehe erweitern
- if (bLks && rMeeting.X()<=aP2.X()) aP2.X()=rMeeting.X();
- if (bRts && rMeeting.X()>=aP2.X()) aP2.X()=rMeeting.X();
- if (bObn && rMeeting.Y()<=aP2.Y()) aP2.Y()=rMeeting.Y();
- if (bUnt && rMeeting.Y()>=aP2.Y()) aP2.Y()=rMeeting.Y();
- aXP.Insert(XPOLY_APPEND,aP2,XPOLY_NORMAL);
-
- Point aP3(aP2);
- if ((bLks && rMeeting.X()>aP2.X()) || (bRts && rMeeting.X()<aP2.X())) { // Aussenrum
- if (rMeeting.Y()<aP2.Y()) {
- aP3.Y()=rRect.Top();
- if (rMeeting.Y()<aP3.Y()) aP3.Y()=rMeeting.Y();
- } else {
- aP3.Y()=rRect.Bottom();
- if (rMeeting.Y()>aP3.Y()) aP3.Y()=rMeeting.Y();
- }
- aXP.Insert(XPOLY_APPEND,aP3,XPOLY_NORMAL);
- if (aP3.Y()!=rMeeting.Y()) {
- aP3.X()=rMeeting.X();
- aXP.Insert(XPOLY_APPEND,aP3,XPOLY_NORMAL);
- }
- }
- if ((bObn && rMeeting.Y()>aP2.Y()) || (bUnt && rMeeting.Y()<aP2.Y())) { // Aussenrum
- if (rMeeting.X()<aP2.X()) {
- aP3.X()=rRect.Left();
- if (rMeeting.X()<aP3.X()) aP3.X()=rMeeting.X();
- } else {
- aP3.X()=rRect.Right();
- if (rMeeting.X()>aP3.X()) aP3.X()=rMeeting.X();
- }
- aXP.Insert(XPOLY_APPEND,aP3,XPOLY_NORMAL);
- if (aP3.X()!=rMeeting.X()) {
- aP3.Y()=rMeeting.Y();
- aXP.Insert(XPOLY_APPEND,aP3,XPOLY_NORMAL);
- }
- }
- }
-#ifdef DBG_UTIL
- if (aXP.GetPointCount()>4) {
- DBG_ERROR("SdrEdgeObj::ImpCalcObjToCenter(): Polygon hat mehr als 4 Punkte!");
- }
-#endif
- return aXP;
-}
-
-// predeclaration
-basegfx::B2DPolygon ImpOldCalcEdgeTrack(
- const Point& rPt1, long nAngle1, const Rectangle& rBoundRect1, const Rectangle& rBewareRect1,
- const Point& rPt2, long nAngle2, const Rectangle& rBoundRect2, const Rectangle& rBewareRect2,
- SdrEdgeKind eKind,
- sal_uInt32* pnQuality, SdrEdgeInfoRec* pInfo);
-
basegfx::B2DPolygon SdrEdgeObj::ImpCalcEdgeTrack(
SdrObjConnection& rCon1,
SdrObjConnection& rCon2,
- SdrEdgeInfoRec* pInfo) const
+ SdrEdgeInfoRec* pInfo,
+ const basegfx::B2DHomMatrix* pTransA,
+ const basegfx::B2DHomMatrix* pTransB) const
{
- const sal_uInt32 nCount(maEdgeTrack.count());
basegfx::B2DPolygon aRetval;
+ basegfx::B2DPoint aPt1(rCon1.GetPosition());
+ basegfx::B2DPoint aPt2(rCon2.GetPosition());
+ const basegfx::B2DRange aBaseRange(aPt1, aPt2);
+ sdr::glue::GluePoint aGP1,aGP2;
+ sal_uInt16 nEsc1(SDRESC_ALL);
+ sal_uInt16 nEsc2(SDRESC_ALL);
+ basegfx::B2DRange aBoundRange1;
+ basegfx::B2DRange aBoundRange2;
+ basegfx::B2DRange aBewareRange1;
+ basegfx::B2DRange aBewareRange2;
+ const 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();
- if(nCount)
- {
- // get old start/end points
- basegfx::B2DPoint aPt1(maEdgeTrack.getB2DPoint(0));
- basegfx::B2DPoint aPt2(maEdgeTrack.getB2DPoint(nCount - 1));
- const basegfx::B2DRange aBaseRange(aPt1, aPt2);
- sdr::glue::GluePoint aGP1,aGP2;
- sal_uInt16 nEsc1(SDRESC_ALL);
- sal_uInt16 nEsc2(SDRESC_ALL);
- basegfx::B2DRange aBoundRange1;
- basegfx::B2DRange aBoundRange2;
- basegfx::B2DRange aBewareRange1;
- basegfx::B2DRange aBewareRange2;
- SdrPage* pOwningPage = getSdrPageFromSdrObject();
- bool bCon1(rCon1.mpConnectedSdrObject && rCon1.mpConnectedSdrObject->getSdrPageFromSdrObject() == pOwningPage);
- bool bCon2(rCon2.mpConnectedSdrObject && rCon2.mpConnectedSdrObject->getSdrPageFromSdrObject() == pOwningPage);
- const SfxItemSet& rSet = GetObjectItemSet();
-
- if(bCon1)
- {
- if(rCon1.mpConnectedSdrObject == this)
- {
- aBoundRange1 = aBaseRange;
- }
- else
- {
- aBoundRange1 = rCon1.mpConnectedSdrObject->getObjectRange(0);
- }
-
- const sal_Int32 nH(((SdrEdgeNode1HorzDistItem&)rSet.Get(SDRATTR_EDGENODE1HORZDIST)).GetValue());
- const sal_Int32 nV(((SdrEdgeNode1VertDistItem&)rSet.Get(SDRATTR_EDGENODE1VERTDIST)).GetValue());
-
- aBewareRange1 = basegfx::B2DRange(
- aBoundRange1.getMinX() - nH, aBoundRange1.getMinY() - nV,
- aBoundRange1.getMaxX() + nH, aBoundRange1.getMaxY() + nV);
+ if(bCon1)
+ {
+ if(rCon1.GetConnectedSdrObject() == this)
+ {
+ aBoundRange1 = aBaseRange;
}
else
{
- aBewareRange1 = aBoundRange1 = basegfx::B2DRange(aPt1);
+ aBoundRange1 = rCon1.GetConnectedSdrObject()->getObjectRange(0);
}
- if(bCon2)
- {
- if(rCon2.mpConnectedSdrObject == this)
- {
- aBoundRange2 = aBaseRange;
- }
- else
- {
- aBoundRange2 = rCon2.mpConnectedSdrObject->getObjectRange(0);
- }
+ const sal_Int32 nH(((SdrEdgeNode1HorzDistItem&)rSet.Get(SDRATTR_EDGENODE1HORZDIST)).GetValue());
+ const sal_Int32 nV(((SdrEdgeNode1VertDistItem&)rSet.Get(SDRATTR_EDGENODE1VERTDIST)).GetValue());
+
+ aBewareRange1 = basegfx::B2DRange(
+ aBoundRange1.getMinX() - nH, aBoundRange1.getMinY() - nV,
+ aBoundRange1.getMaxX() + nH, aBoundRange1.getMaxY() + nV);
+ }
+ else
+ {
+ aBewareRange1 = aBoundRange1 = basegfx::B2DRange(aPt1);
+ }
- const sal_Int32 nH(((SdrEdgeNode2HorzDistItem&)rSet.Get(SDRATTR_EDGENODE2HORZDIST)).GetValue());
- const sal_Int32 nV(((SdrEdgeNode2VertDistItem&)rSet.Get(SDRATTR_EDGENODE2VERTDIST)).GetValue());
+ if(pTransA)
+ {
+ aBoundRange1.transform(*pTransA);
+ aBewareRange1.transform(*pTransA);
+ aPt1 = *pTransA * aPt1;
+ }
- aBewareRange2 = basegfx::B2DRange(
- aBoundRange2.getMinX() - nH, aBoundRange2.getMinY() - nV,
- aBoundRange2.getMaxX() + nH, aBoundRange2.getMaxY() + nV);
+ if(bCon2)
+ {
+ if(rCon2.GetConnectedSdrObject() == this)
+ {
+ aBoundRange2 = aBaseRange;
}
else
{
- aBewareRange2 = aBoundRange2 = basegfx::B2DRange(aPt2);
+ aBoundRange2 = rCon2.GetConnectedSdrObject()->getObjectRange(0);
}
- sal_uInt32 nBestQual=0xFFFFFFFF;
- SdrEdgeInfoRec aBestInfo;
- const bool bAuto1(bCon1 && rCon1.mbBestVertex);
- const bool bAuto2(bCon2 && rCon2.mbBestVertex);
+ const sal_Int32 nH(((SdrEdgeNode2HorzDistItem&)rSet.Get(SDRATTR_EDGENODE2HORZDIST)).GetValue());
+ const sal_Int32 nV(((SdrEdgeNode2VertDistItem&)rSet.Get(SDRATTR_EDGENODE2VERTDIST)).GetValue());
+ aBewareRange2 = basegfx::B2DRange(
+ aBoundRange2.getMinX() - nH, aBoundRange2.getMinY() - nV,
+ aBoundRange2.getMaxX() + nH, aBoundRange2.getMaxY() + nV);
+ }
+ else
+ {
+ aBewareRange2 = aBoundRange2 = basegfx::B2DRange(aPt2);
+ }
+
+ if(pTransB)
+ {
+ aBoundRange2.transform(*pTransB);
+ aBewareRange2.transform(*pTransB);
+ aPt2 = *pTransB * aPt2;
+ }
+
+ sal_uInt32 nBestQual=0xFFFFFFFF;
+ SdrEdgeInfoRec aBestInfo;
+ const bool bAuto1(bCon1 && rCon1.IsBestVertex());
+ const bool bAuto2(bCon2 && rCon2.IsBestVertex());
+
+ if(bAuto1)
+ {
+ rCon1.setAutoVertex(true);
+ }
+
+ if(bAuto2)
+ {
+ rCon2.setAutoVertex(true);
+ }
+
+ sal_uInt16 nBestAuto1(0);
+ sal_uInt16 nBestAuto2(0);
+ sal_uInt16 nAnz1(bAuto1 ? 4 : 1);
+ sal_uInt16 nAnz2(bAuto2 ? 4 : 1);
+
+ // prepare vars for old interface stuff
+ const Rectangle aBoundRect1(
+ basegfx::fround(aBoundRange1.getMinX()), basegfx::fround(aBoundRange1.getMinY()),
+ basegfx::fround(aBoundRange1.getMaxX()), basegfx::fround(aBoundRange1.getMaxY()));
+ const Rectangle aBoundRect2(
+ basegfx::fround(aBoundRange2.getMinX()), basegfx::fround(aBoundRange2.getMinY()),
+ basegfx::fround(aBoundRange2.getMaxX()), basegfx::fround(aBoundRange2.getMaxY()));
+ const Rectangle aBewareRect1(
+ basegfx::fround(aBewareRange1.getMinX()), basegfx::fround(aBewareRange1.getMinY()),
+ basegfx::fround(aBewareRange1.getMaxX()), basegfx::fround(aBewareRange1.getMaxY()));
+ const Rectangle aBewareRect2(
+ basegfx::fround(aBewareRange2.getMinX()), basegfx::fround(aBewareRange2.getMinY()),
+ basegfx::fround(aBewareRange2.getMaxX()), basegfx::fround(aBewareRange2.getMaxY()));
+
+ for(sal_uInt16 nNum1(0); nNum1 < nAnz1; nNum1++)
+ {
if(bAuto1)
{
- rCon1.mbAutoVertex = true;
+ rCon1.SetConnectorID(nNum1);
}
- if(bAuto2)
+ if(bCon1 && rCon1.TakeGluePoint(aGP1))
{
- rCon2.mbAutoVertex = true;
- }
+ aPt1 = rCon1.GetConnectedSdrObject()->getSdrObjectTransformation() * aGP1.getUnitPosition();
+ nEsc1 = aGP1.getEscapeDirections();
- sal_uInt16 nBestAuto1(0);
- sal_uInt16 nBestAuto2(0);
- sal_uInt16 nAnz1(bAuto1 ? 4 : 1);
- sal_uInt16 nAnz2(bAuto2 ? 4 : 1);
+ if(pTransA)
+ {
+ aPt1 = *pTransA * aPt1;
+ }
+
+ if(sdr::glue::GluePoint::ESCAPE_DIRECTION_SMART == nEsc1)
+ {
+ nEsc1 = impOldCalcEscAngle(aBoundRange1, aPt1);
+ }
+ }
- // prepare vars for old interface stuff
const Point aPoint1(basegfx::fround(aPt1.getX()), basegfx::fround(aPt1.getY()));
- const Point aPoint2(basegfx::fround(aPt2.getX()), basegfx::fround(aPt2.getY()));
- const Rectangle aBoundRect1(
- basegfx::fround(aBoundRange1.getMinX()), basegfx::fround(aBoundRange1.getMinY()),
- basegfx::fround(aBoundRange1.getMaxX()), basegfx::fround(aBoundRange1.getMaxY()));
- const Rectangle aBoundRect2(
- basegfx::fround(aBoundRange2.getMinX()), basegfx::fround(aBoundRange2.getMinY()),
- basegfx::fround(aBoundRange2.getMaxX()), basegfx::fround(aBoundRange2.getMaxY()));
- const Rectangle aBewareRect1(
- basegfx::fround(aBewareRange1.getMinX()), basegfx::fround(aBewareRange1.getMinY()),
- basegfx::fround(aBewareRange1.getMaxX()), basegfx::fround(aBewareRange1.getMaxY()));
- const Rectangle aBewareRect2(
- basegfx::fround(aBewareRange2.getMinX()), basegfx::fround(aBewareRange2.getMinY()),
- basegfx::fround(aBewareRange2.getMaxX()), basegfx::fround(aBewareRange2.getMaxY()));
-
- for(sal_uInt16 nNum1(0); nNum1 < nAnz1; nNum1++)
- {
- if(bAuto1)
+
+ for(sal_uInt16 nNum2(0); nNum2 < nAnz2; nNum2++)
+ {
+ if(bAuto2)
{
- rCon1.mnConnectorId = nNum1;
+ rCon2.SetConnectorID(nNum2);
}
- if(bCon1 && rCon1.TakeGluePoint(aGP1))
+ if(bCon2 && rCon2.TakeGluePoint(aGP2))
{
- aPt1 = rCon1.mpConnectedSdrObject->getSdrObjectTransformation() * aGP1.getUnitPosition();
- nEsc1 = aGP1.getEscapeDirections();
+ aPt2 = rCon2.GetConnectedSdrObject()->getSdrObjectTransformation() * aGP2.getUnitPosition();
+ nEsc2 = aGP2.getEscapeDirections();
- if(sdr::glue::GluePoint::ESCAPE_DIRECTION_SMART == nEsc1)
+ if(pTransB)
{
- nEsc1 = ImpCalcEscAngle(rCon1.mpConnectedSdrObject, aPt1);
+ aPt2 = *pTransB * aPt2;
}
- }
- for(sal_uInt16 nNum2(0); nNum2 < nAnz2; nNum2++)
- {
- if(bAuto2)
+ if(sdr::glue::GluePoint::ESCAPE_DIRECTION_SMART == nEsc2)
{
- rCon2.mnConnectorId = nNum2;
+ nEsc2 = impOldCalcEscAngle(aBoundRange2, aPt2);
}
+ }
- if(bCon2 && rCon2.TakeGluePoint(aGP2))
- {
- aPt2 = rCon2.mpConnectedSdrObject->getSdrObjectTransformation() * aGP2.getUnitPosition();
- nEsc2 = aGP2.getEscapeDirections();
+ const Point aPoint2(basegfx::fround(aPt2.getX()), basegfx::fround(aPt2.getY()));
- if(sdr::glue::GluePoint::ESCAPE_DIRECTION_SMART == nEsc2)
- {
- nEsc2 = ImpCalcEscAngle(rCon2.mpConnectedSdrObject, aPt2);
- }
- }
+ for(long nA1(0); nA1 < 36000; nA1 += 9000)
+ {
+ const sal_uInt16 nE1(!nA1 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_RIGHT : 9000 == nA1 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_TOP : 18000 == nA1 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_LEFT : 27000 == nA1 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_BOTTOM : 0);
- for(long nA1(0); nA1 < 36000; nA1 += 9000)
+ for(long nA2(0); nA2 < 36000; nA2 += 9000)
{
- const sal_uInt16 nE1(!nA1 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_RIGHT : 9000 == nA1 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_TOP : 18000 == nA1 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_LEFT : 27000 == nA1 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_BOTTOM : 0);
+ const sal_uInt16 nE2(!nA2 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_RIGHT : 9000 == nA2 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_TOP : 18000 == nA2 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_LEFT : 27000 == nA2 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_BOTTOM : 0);
- for(long nA2(0); nA2 < 36000; nA2 += 9000)
+ if((nEsc1 & nE1) && (nEsc2 & nE2))
{
- const sal_uInt16 nE2(!nA2 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_RIGHT : 9000 == nA2 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_TOP : 18000 == nA2 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_LEFT : 27000 == nA2 ? sdr::glue::GluePoint::ESCAPE_DIRECTION_BOTTOM : 0);
+ sal_uInt32 nQual(0);
+ SdrEdgeInfoRec aInfo;
- if((nEsc1 & nE1) && (nEsc2 & nE2))
+ if(pInfo)
{
- sal_uInt32 nQual(0);
- SdrEdgeInfoRec aInfo;
-
- if(pInfo)
- {
- aInfo = *pInfo;
- }
-
- const basegfx::B2DPolygon aXP(
- ImpOldCalcEdgeTrack(
- aPoint1, nA1, aBoundRect1, aBewareRect1,
- aPoint2, nA2, aBoundRect2, aBewareRect2,
- ((SdrEdgeKindItem&)(GetObjectItem(SDRATTR_EDGEKIND))).GetValue(),
- &nQual,
- &aInfo));
-
- if(nQual < nBestQual)
- {
- aRetval = aXP;
- nBestQual = nQual;
- aBestInfo = aInfo;
- nBestAuto1 = nNum1;
- nBestAuto2 = nNum2;
- }
+ aInfo = *pInfo;
}
- }
- }
- }
- }
- if(bAuto1)
- {
- rCon1.mnConnectorId = nBestAuto1;
- }
-
- if(bAuto2)
- {
- rCon2.mnConnectorId = nBestAuto2;
- }
-
- if(pInfo)
- {
- *pInfo = aBestInfo;
- }
-
- return aRetval;
- }
-
- return aRetval;
-}
+ basegfx::B2DPolygon aXP(
+ impOldCalcEdgeTrack(
+ aPoint1, nA1, aBoundRect1, aBewareRect1,
+ aPoint2, nA2, aBoundRect2, aBewareRect2,
+ static_cast< const SdrEdgeKindItem& >(GetObjectItem(SDRATTR_EDGEKIND)).GetValue(),
+ &nQual,
+ &aInfo));
-basegfx::B2DPolygon ImpOldCalcEdgeTrack(
- const Point& rPt1, long nAngle1, const Rectangle& rBoundRect1, const Rectangle& rBewareRect1,
- const Point& rPt2, long nAngle2, const Rectangle& rBoundRect2, const Rectangle& rBewareRect2,
- SdrEdgeKind eKind,
- sal_uInt32* pnQuality, SdrEdgeInfoRec* pInfo)
-{
- bool bRts1=nAngle1==0;
- bool bObn1=nAngle1==9000;
- bool bLks1=nAngle1==18000;
- bool bUnt1=nAngle1==27000;
- bool bHor1=bLks1 || bRts1;
- bool bVer1=bObn1 || bUnt1;
- bool bRts2=nAngle2==0;
- bool bObn2=nAngle2==9000;
- bool bLks2=nAngle2==18000;
- bool bUnt2=nAngle2==27000;
- bool bHor2=bLks2 || bRts2;
- bool bVer2=bObn2 || bUnt2;
- bool bInfo=pInfo!=NULL;
- if (bInfo) {
- pInfo->cOrthoForm=0;
- pInfo->nAngle1=nAngle1;
- pInfo->nAngle2=nAngle2;
- pInfo->nObj1Lines=1;
- pInfo->nObj2Lines=1;
- pInfo->nMiddleLine=0xFFFF;
- }
- Point aPt1(rPt1);
- Point aPt2(rPt2);
- Rectangle aBoundRect1 (rBoundRect1 );
- Rectangle aBoundRect2 (rBoundRect2 );
- Rectangle aBewareRect1(rBewareRect1);
- Rectangle aBewareRect2(rBewareRect2);
- Point aMeeting((aPt1.X()+aPt2.X()+1)/2,(aPt1.Y()+aPt2.Y()+1)/2);
- bool bMeetingXMid=true;
- bool bMeetingYMid=true;
- if (eKind==SDREDGE_ONELINE) {
- XPolygon aXP(2);
- aXP[0]=rPt1;
- aXP[1]=rPt2;
- if (pnQuality!=NULL) {
- *pnQuality=Abs(rPt1.X()-rPt2.X())+Abs(rPt1.Y()-rPt2.Y());
- }
- return aXP.getB2DPolygon();
- } else if (eKind==SDREDGE_THREELINES) {
- XPolygon aXP(4);
- aXP[0]=rPt1;
- aXP[1]=rPt1;
- aXP[2]=rPt2;
- aXP[3]=rPt2;
- if (bRts1) aXP[1].X()=aBewareRect1.Right(); //+=500;
- if (bObn1) aXP[1].Y()=aBewareRect1.Top(); //-=500;
- if (bLks1) aXP[1].X()=aBewareRect1.Left(); //-=500;
- if (bUnt1) aXP[1].Y()=aBewareRect1.Bottom(); //+=500;
- if (bRts2) aXP[2].X()=aBewareRect2.Right(); //+=500;
- if (bObn2) aXP[2].Y()=aBewareRect2.Top(); //-=500;
- if (bLks2) aXP[2].X()=aBewareRect2.Left(); //-=500;
- if (bUnt2) aXP[2].Y()=aBewareRect2.Bottom(); //+=500;
- if (pnQuality!=NULL) {
- long nQ=Abs(aXP[1].X()-aXP[0].X())+Abs(aXP[1].Y()-aXP[0].Y());
- nQ+=Abs(aXP[2].X()-aXP[1].X())+Abs(aXP[2].Y()-aXP[1].Y());
- nQ+=Abs(aXP[3].X()-aXP[2].X())+Abs(aXP[3].Y()-aXP[2].Y());
- *pnQuality=nQ;
- }
- if (bInfo) {
- pInfo->nObj1Lines=2;
- pInfo->nObj2Lines=2;
- if (bHor1) {
- aXP[1].X()+=pInfo->aObj1Line2.getX();
- } else {
- aXP[1].Y()+=pInfo->aObj1Line2.getY();
- }
- if (bHor2) {
- aXP[2].X()+=pInfo->aObj2Line2.getX();
- } else {
- aXP[2].Y()+=pInfo->aObj2Line2.getY();
- }
- }
- return aXP.getB2DPolygon();
- }
- sal_uInt16 nIntersections=0;
- bool bForceMeeting=false; // Muss die Linie durch den MeetingPoint laufen?
- {
- Point aC1(aBewareRect1.Center());
- Point aC2(aBewareRect2.Center());
- if (aBewareRect1.Left()<=aBewareRect2.Right() && aBewareRect1.Right()>=aBewareRect2.Left()) {
- // Ueberschneidung auf der X-Achse
- long n1=Max(aBewareRect1.Left(),aBewareRect2.Left());
- long n2=Min(aBewareRect1.Right(),aBewareRect2.Right());
- aMeeting.X()=(n1+n2+1)/2;
- } else {
- // Ansonsten den Mittelpunkt des Freiraums
- if (aC1.X()<aC2.X()) {
- aMeeting.X()=(aBewareRect1.Right()+aBewareRect2.Left()+1)/2;
- } else {
- aMeeting.X()=(aBewareRect1.Left()+aBewareRect2.Right()+1)/2;
- }
- }
- if (aBewareRect1.Top()<=aBewareRect2.Bottom() && aBewareRect1.Bottom()>=aBewareRect2.Top()) {
- // Ueberschneidung auf der Y-Achse
- long n1=Max(aBewareRect1.Top(),aBewareRect2.Top());
- long n2=Min(aBewareRect1.Bottom(),aBewareRect2.Bottom());
- aMeeting.Y()=(n1+n2+1)/2;
- } else {
- // Ansonsten den Mittelpunkt des Freiraums
- if (aC1.Y()<aC2.Y()) {
- aMeeting.Y()=(aBewareRect1.Bottom()+aBewareRect2.Top()+1)/2;
- } else {
- aMeeting.Y()=(aBewareRect1.Top()+aBewareRect2.Bottom()+1)/2;
- }
- }
- // Im Prinzip gibt es 3 zu unterscheidene Faelle:
- // 1. Beide in die selbe Richtung
- // 2. Beide in genau entgegengesetzte Richtungen
- // 3. Einer waagerecht und der andere senkrecht
- long nXMin=Min(aBewareRect1.Left(),aBewareRect2.Left());
- long nXMax=Max(aBewareRect1.Right(),aBewareRect2.Right());
- long nYMin=Min(aBewareRect1.Top(),aBewareRect2.Top());
- long nYMax=Max(aBewareRect1.Bottom(),aBewareRect2.Bottom());
- //bool bBoundOverlap=aBoundRect1.Right()>aBoundRect2.Left() && aBoundRect1.Left()<aBoundRect2.Right() &&
- // aBoundRect1.Bottom()>aBoundRect2.Top() && aBoundRect1.Top()<aBoundRect2.Bottom();
- bool bBewareOverlap=aBewareRect1.Right()>aBewareRect2.Left() && aBewareRect1.Left()<aBewareRect2.Right() &&
- aBewareRect1.Bottom()>aBewareRect2.Top() && aBewareRect1.Top()<aBewareRect2.Bottom();
- unsigned nMainCase=3;
- if (nAngle1==nAngle2) nMainCase=1;
- else if ((bHor1 && bHor2) || (bVer1 && bVer2)) nMainCase=2;
- if (nMainCase==1) { // Fall 1: Beide in eine Richtung moeglich.
- if (bVer1) aMeeting.X()=(aPt1.X()+aPt2.X()+1)/2; // ist hier besser, als der
- if (bHor1) aMeeting.Y()=(aPt1.Y()+aPt2.Y()+1)/2; // Mittelpunkt des Freiraums
- // bX1Ok bedeutet, dass die Vertikale, die aus Obj1 austritt, keinen Konflikt mit Obj2 bildet, ...
- bool bX1Ok=aPt1.X()<=aBewareRect2.Left() || aPt1.X()>=aBewareRect2.Right();
- bool bX2Ok=aPt2.X()<=aBewareRect1.Left() || aPt2.X()>=aBewareRect1.Right();
- bool bY1Ok=aPt1.Y()<=aBewareRect2.Top() || aPt1.Y()>=aBewareRect2.Bottom();
- bool bY2Ok=aPt2.Y()<=aBewareRect1.Top() || aPt2.Y()>=aBewareRect1.Bottom();
- if (bLks1 && (bY1Ok || aBewareRect1.Left()<aBewareRect2.Right()) && (bY2Ok || aBewareRect2.Left()<aBewareRect1.Right())) {
- aMeeting.X()=nXMin;
- bMeetingXMid=false;
- }
- if (bRts1 && (bY1Ok || aBewareRect1.Right()>aBewareRect2.Left()) && (bY2Ok || aBewareRect2.Right()>aBewareRect1.Left())) {
- aMeeting.X()=nXMax;
- bMeetingXMid=false;
- }
- if (bObn1 && (bX1Ok || aBewareRect1.Top()<aBewareRect2.Bottom()) && (bX2Ok || aBewareRect2.Top()<aBewareRect1.Bottom())) {
- aMeeting.Y()=nYMin;
- bMeetingYMid=false;
- }
- if (bUnt1 && (bX1Ok || aBewareRect1.Bottom()>aBewareRect2.Top()) && (bX2Ok || aBewareRect2.Bottom()>aBewareRect1.Top())) {
- aMeeting.Y()=nYMax;
- bMeetingYMid=false;
- }
- } else if (nMainCase==2) {
- // Fall 2:
- bForceMeeting=true;
- if (bHor1) { // beide waagerecht
- /* 9 Moeglichkeiten: */
- /* 2.1 Gegenueber, Ueberschneidung */
- /* nur auf der Y-Achse */
- /* 2.2, 2.3 Gegenueber, vertikal versetzt. */
- /* Ueberschneidung weder auf der */
- /* X- noch auf der Y-Achse */
- /* 2.4, 2.5 Untereinander, */
- /* Ueberschneidung */
- /* nur auf X-Achse */
- /* 2.6, 2.7 Gegeneinander, vertikal versetzt. */
- /* Ueberschneidung weder auf der */
- /* X- noch auf der Y-Achse. */
- /* 2.8 Gegeneinander. */
- /* Ueberschneidung nur */
- /* auf der Y-Achse. */
- /* 2.9 Die BewareRects der Objekte ueberschneiden */
- /* sich auf X- und Y-Achse. */
- /* Die Faelle gelten entsprechend umgesetzt auch fuer */
- /* senkrechte Linienaustritte. */
- /* Die Faelle 2.1-2.7 werden mit dem Default-Meeting ausreichend*/
- /* gut behandelt. Spezielle MeetingPoints werden hier also nur */
- /* fuer 2.8 und 2.9 bestimmt. */
-
- // Normalisierung. aR1 soll der nach rechts und
- // aR2 der nach links austretende sein.
- Rectangle aBewR1(bRts1 ? aBewareRect1 : aBewareRect2);
- Rectangle aBewR2(bRts1 ? aBewareRect2 : aBewareRect1);
- Rectangle aBndR1(bRts1 ? aBoundRect1 : aBoundRect2);
- Rectangle aBndR2(bRts1 ? aBoundRect2 : aBoundRect1);
- if (aBewR1.Bottom()>aBewR2.Top() && aBewR1.Top()<aBewR2.Bottom()) {
- // Ueberschneidung auf der Y-Achse. Faelle 2.1, 2.8, 2.9
- if (aBewR1.Right()>aBewR2.Left()) {
- // Faelle 2.8, 2.9
- // Fall 2.8 ist immer Aussenrumlauf (bDirect=false).
- // Fall 2.9 kann auch Direktverbindung sein (bei geringer
- // Ueberschneidung der BewareRects ohne Ueberschneidung der
- // Boundrects wenn die Linienaustritte sonst das BewareRect
- // des jeweils anderen Objekts verletzen wuerden.
- bool bCase29Direct=false;
- bool bCase29=aBewR1.Right()>aBewR2.Left();
- if (aBndR1.Right()<=aBndR2.Left()) { // Fall 2.9 und keine Boundrectueberschneidung
- if ((aPt1.Y()>aBewareRect2.Top() && aPt1.Y()<aBewareRect2.Bottom()) ||
- (aPt2.Y()>aBewareRect1.Top() && aPt2.Y()<aBewareRect1.Bottom())) {
- bCase29Direct=true;
- }
- }
- if (!bCase29Direct) {
- bool bObenLang=Abs(nYMin-aMeeting.Y())<=Abs(nYMax-aMeeting.Y());
- if (bObenLang) {
- aMeeting.Y()=nYMin;
- } else {
- aMeeting.Y()=nYMax;
- }
- bMeetingYMid=false;
- if (bCase29) {
- // und nun noch dafuer sorgen, dass das
- // umzingelte Obj nicht durchquert wird
- if ((aBewR1.Center().Y()<aBewR2.Center().Y()) != bObenLang) {
- aMeeting.X()=aBewR2.Right();
- } else {
- aMeeting.X()=aBewR1.Left();
- }
- bMeetingXMid=false;
- }
- } else {
- // Direkte Verbindung (3-Linien Z-Verbindung), da
- // Verletzung der BewareRects unvermeidlich ist.
- // Via Dreisatz werden die BewareRects nun verkleinert.
- long nWant1=aBewR1.Right()-aBndR1.Right(); // Abstand bei Obj1
- long nWant2=aBndR2.Left()-aBewR2.Left(); // Abstand bei Obj2
- long nSpace=aBndR2.Left()-aBndR1.Right(); // verfuegbarer Platz
- long nGet1=BigMulDiv(nWant1,nSpace,nWant1+nWant2);
- long nGet2=nSpace-nGet1;
- if (bRts1) { // Normalisierung zurueckwandeln
- aBewareRect1.Right()+=nGet1-nWant1;
- aBewareRect2.Left()-=nGet2-nWant2;
- } else {
- aBewareRect2.Right()+=nGet1-nWant1;
- aBewareRect1.Left()-=nGet2-nWant2;
- }
- nIntersections++; // Qualitaet herabsetzen
- }
- }
- }
- } else if (bVer1) { // beide senkrecht
- Rectangle aBewR1(bUnt1 ? aBewareRect1 : aBewareRect2);
- Rectangle aBewR2(bUnt1 ? aBewareRect2 : aBewareRect1);
- Rectangle aBndR1(bUnt1 ? aBoundRect1 : aBoundRect2);
- Rectangle aBndR2(bUnt1 ? aBoundRect2 : aBoundRect1);
- if (aBewR1.Right()>aBewR2.Left() && aBewR1.Left()<aBewR2.Right()) {
- // Ueberschneidung auf der Y-Achse. Faelle 2.1, 2.8, 2.9
- if (aBewR1.Bottom()>aBewR2.Top()) {
- // Faelle 2.8, 2.9
- // Fall 2.8 ist immer Aussenrumlauf (bDirect=false).
- // Fall 2.9 kann auch Direktverbindung sein (bei geringer
- // Ueberschneidung der BewareRects ohne Ueberschneidung der
- // Boundrects wenn die Linienaustritte sonst das BewareRect
- // des jeweils anderen Objekts verletzen wuerden.
- bool bCase29Direct=false;
- bool bCase29=aBewR1.Bottom()>aBewR2.Top();
- if (aBndR1.Bottom()<=aBndR2.Top()) { // Fall 2.9 und keine Boundrectueberschneidung
- if ((aPt1.X()>aBewareRect2.Left() && aPt1.X()<aBewareRect2.Right()) ||
- (aPt2.X()>aBewareRect1.Left() && aPt2.X()<aBewareRect1.Right())) {
- bCase29Direct=true;
- }
+ if(aXP.isClosed())
+ {
+ // closed because correction (closeWithGeometryChange) was done when
+ // converted from Polygon class to B2DPolygon class using Polygon::getB2DPolygon()
+ // which by default corrects using basegfx::tools::checkClosed. This is
+ // not wanted in this case; e.g. when starting to construct a connector.
+ // I will correct it here since rewriting impOldCalcEdgeTrack and avoiding
+ // usage of old XPolygon/Polygon would be nice, but is dangerous and nearly
+ // impossible
+ basegfx::tools::openWithGeometryChange(aXP);
}
- if (!bCase29Direct) {
- bool bLinksLang=Abs(nXMin-aMeeting.X())<=Abs(nXMax-aMeeting.X());
- if (bLinksLang) {
- aMeeting.X()=nXMin;
- } else {
- aMeeting.X()=nXMax;
- }
- bMeetingXMid=false;
- if (bCase29) {
- // und nun noch dafuer sorgen, dass das
- // umzingelte Obj nicht durchquert wird
- if ((aBewR1.Center().X()<aBewR2.Center().X()) != bLinksLang) {
- aMeeting.Y()=aBewR2.Bottom();
- } else {
- aMeeting.Y()=aBewR1.Top();
- }
- bMeetingYMid=false;
- }
- } else {
- // Direkte Verbindung (3-Linien Z-Verbindung), da
- // Verletzung der BewareRects unvermeidlich ist.
- // Via Dreisatz werden die BewareRects nun verkleinert.
- long nWant1=aBewR1.Bottom()-aBndR1.Bottom(); // Abstand bei Obj1
- long nWant2=aBndR2.Top()-aBewR2.Top(); // Abstand bei Obj2
- long nSpace=aBndR2.Top()-aBndR1.Bottom(); // verfuegbarer Platz
- long nGet1=BigMulDiv(nWant1,nSpace,nWant1+nWant2);
- long nGet2=nSpace-nGet1;
- if (bUnt1) { // Normalisierung zurueckwandeln
- aBewareRect1.Bottom()+=nGet1-nWant1;
- aBewareRect2.Top()-=nGet2-nWant2;
- } else {
- aBewareRect2.Bottom()+=nGet1-nWant1;
- aBewareRect1.Top()-=nGet2-nWant2;
- }
- nIntersections++; // Qualitaet herabsetzen
+
+ if(nQual < nBestQual)
+ {
+ aRetval = aXP;
+ nBestQual = nQual;
+ aBestInfo = aInfo;
+ nBestAuto1 = nNum1;
+ nBestAuto2 = nNum2;
}
}
}
}
- } else if (nMainCase==3) { // Fall 3: Einer waagerecht und der andere senkrecht. Sehr viele Fallunterscheidungen
- /* Kleine Legende: -> Ohne Ueberschneidung, maximal Beruehrung. */
- /* -> Ueberschneidung */
- /* -> Selbe Hoehe */
- /* -> Ueberschneidung */
- /* -> Ohne Ueberschneidung, maximal Beruehrung. */
- /* Linienaustritte links , rechts , oben und unten . */
- /* Insgesamt sind 96 Konstellationen moeglich, wobei einige nicht einmal */
- /* eindeutig einem Fall und damit einer Behandlungsmethode zugeordnet werden */
- /* koennen. */
- /* 3.1: Hierzu moegen alle Konstellationen zaehlen, die durch den */
- /* Default-MeetingPoint zufriedenstellend abgedeckt sind (20+12). */
- /* Diese 12 */
- /* Konstel. */
- /* jedoch */
- /* nur zum */
- /* Teil: */
- /* Letztere 16 Faelle scheiden aus, sobald sich die Objekte offen */
- /* gegenueberstehen (siehe Fall 3.2). */
- /* 3.2: Die Objekte stehen sich offen gegenueber und somit ist eine */
- /* Verbindung mit lediglich 2 Linien moeglich (4+20). */
- /* Dieser Fall hat 1. Prioritaet. */
- /* Diese 20 */
- /* Konstel. */
- /* jedoch */
- /* nur zum */
- /* Teil: */
- /* 3.3: Die Linienaustritte zeigen vom anderen Objekt weg bzw. hinter */
- /* dessen Ruecken vorbei (52+4). */
- /* Diese 4 */
- /* Konstel. */
- /* jedoch */
- /* nur zum */
- /* Teil: */
-
- // Fall 3.2
- Rectangle aTmpR1(aBewareRect1);
- Rectangle aTmpR2(aBewareRect2);
- if (bBewareOverlap) {
- // Ueberschneidung der BewareRects: BoundRects fuer Check auf Fall 3.2 verwenden.
- aTmpR1=aBoundRect1;
- aTmpR2=aBoundRect2;
- }
- if ((((bRts1 && aTmpR1.Right ()<=aPt2.X()) || (bLks1 && aTmpR1.Left()>=aPt2.X())) &&
- ((bUnt2 && aTmpR2.Bottom()<=aPt1.Y()) || (bObn2 && aTmpR2.Top ()>=aPt1.Y()))) ||
- (((bRts2 && aTmpR2.Right ()<=aPt1.X()) || (bLks2 && aTmpR2.Left()>=aPt1.X())) &&
- ((bUnt1 && aTmpR1.Bottom()<=aPt2.Y()) || (bObn1 && aTmpR1.Top ()>=aPt2.Y())))) {
- // Fall 3.2 trifft zu: Verbindung mit lediglich 2 Linien
- bForceMeeting=true;
- bMeetingXMid=false;
- bMeetingYMid=false;
- if (bHor1) {
- aMeeting.X()=aPt2.X();
- aMeeting.Y()=aPt1.Y();
- } else {
- aMeeting.X()=aPt1.X();
- aMeeting.Y()=aPt2.Y();
- }
- // Falls Ueberschneidung der BewareRects:
- aBewareRect1=aTmpR1;
- aBewareRect2=aTmpR2;
- } else if ((((bRts1 && aBewareRect1.Right ()>aBewareRect2.Left ()) ||
- (bLks1 && aBewareRect1.Left ()<aBewareRect2.Right ())) &&
- ((bUnt2 && aBewareRect2.Bottom()>aBewareRect1.Top ()) ||
- (bObn2 && aBewareRect2.Top ()<aBewareRect1.Bottom()))) ||
- (((bRts2 && aBewareRect2.Right ()>aBewareRect1.Left ()) ||
- (bLks2 && aBewareRect2.Left ()<aBewareRect1.Right ())) &&
- ((bUnt1 && aBewareRect1.Bottom()>aBewareRect2.Top ()) ||
- (bObn1 && aBewareRect1.Top ()<aBewareRect2.Bottom())))) {
- // Fall 3.3
- bForceMeeting=true;
- if (bRts1 || bRts2) { aMeeting.X()=nXMax; bMeetingXMid=false; }
- if (bLks1 || bLks2) { aMeeting.X()=nXMin; bMeetingXMid=false; }
- if (bUnt1 || bUnt2) { aMeeting.Y()=nYMax; bMeetingYMid=false; }
- if (bObn1 || bObn2) { aMeeting.Y()=nYMin; bMeetingYMid=false; }
- }
}
}
- XPolygon aXP1(ImpCalcObjToCenter(aPt1,nAngle1,aBewareRect1,aMeeting));
- XPolygon aXP2(ImpCalcObjToCenter(aPt2,nAngle2,aBewareRect2,aMeeting));
- sal_uInt16 nXP1Anz=aXP1.GetPointCount();
- sal_uInt16 nXP2Anz=aXP2.GetPointCount();
- if (bInfo) {
- pInfo->nObj1Lines=nXP1Anz; if (nXP1Anz>1) pInfo->nObj1Lines--;
- pInfo->nObj2Lines=nXP2Anz; if (nXP2Anz>1) pInfo->nObj2Lines--;
- }
- Point aEP1(aXP1[nXP1Anz-1]);
- Point aEP2(aXP2[nXP2Anz-1]);
- bool bInsMeetingPoint=aEP1.X()!=aEP2.X() && aEP1.Y()!=aEP2.Y();
- bool bHorzE1=aEP1.Y()==aXP1[nXP1Anz-2].Y(); // letzte Linie von XP1 horizontal?
- bool bHorzE2=aEP2.Y()==aXP2[nXP2Anz-2].Y(); // letzte Linie von XP2 horizontal?
- if (aEP1==aEP2 && (bHorzE1 && bHorzE2 && aEP1.Y()==aEP2.Y()) || (!bHorzE1 && !bHorzE2 && aEP1.X()==aEP2.X())) {
- // Sonderbehandlung fuer 'I'-Verbinder
- nXP1Anz--; aXP1.Remove(nXP1Anz,1);
- nXP2Anz--; aXP2.Remove(nXP2Anz,1);
- bMeetingXMid=false;
- bMeetingYMid=false;
- }
- if (bInsMeetingPoint) {
- aXP1.Insert(XPOLY_APPEND,aMeeting,XPOLY_NORMAL);
- if (bInfo) {
- // Durch einfuegen des MeetingPoints kommen 2 weitere Linie hinzu.
- // Evtl. wird eine von diesen die Mittellinie.
- if (pInfo->nObj1Lines==pInfo->nObj2Lines) {
- pInfo->nObj1Lines++;
- pInfo->nObj2Lines++;
- } else {
- if (pInfo->nObj1Lines>pInfo->nObj2Lines) {
- pInfo->nObj2Lines++;
- pInfo->nMiddleLine=nXP1Anz-1;
- } else {
- pInfo->nObj1Lines++;
- pInfo->nMiddleLine=nXP1Anz;
- }
- }
- }
- } else if (bInfo && aEP1!=aEP2 && nXP1Anz+nXP2Anz>=4) {
- // Durch Verbinden der beiden Enden kommt eine weitere Linie hinzu.
- // Dies wird die Mittellinie.
- pInfo->nMiddleLine=nXP1Anz-1;
- }
- sal_uInt16 nNum=aXP2.GetPointCount();
- if (aXP1[nXP1Anz-1]==aXP2[nXP2Anz-1] && nXP1Anz>1 && nXP2Anz>1) nNum--;
- while (nNum>0) {
- nNum--;
- aXP1.Insert(XPOLY_APPEND,aXP2[nNum],XPOLY_NORMAL);
- }
- sal_uInt16 nPntAnz=aXP1.GetPointCount();
- char cForm=0;
- if (bInfo || pnQuality!=NULL) {
- cForm='?';
- if (nPntAnz==2) cForm='I';
- else if (nPntAnz==3) cForm='L';
- else if (nPntAnz==4) { // Z oder U
- if (nAngle1==nAngle2) cForm='U';
- else cForm='Z';
- } else if (nPntAnz==4) { /* - - */
- /* ... - - */
- } else if (nPntAnz==6) { // S oder C oder ...
- if (nAngle1!=nAngle2) {
- // Fuer Typ S hat Linie2 dieselbe Richtung wie Linie4.
- // Bei Typ C sind die beiden genau entgegengesetzt.
- Point aP1(aXP1[1]);
- Point aP2(aXP1[2]);
- Point aP3(aXP1[3]);
- Point aP4(aXP1[4]);
- if (aP1.Y()==aP2.Y()) { // beide Linien Horz
- if ((aP1.X()<aP2.X())==(aP3.X()<aP4.X())) cForm='S';
- else cForm='C';
- } else { // sonst beide Linien Vert
- if ((aP1.Y()<aP2.Y())==(aP3.Y()<aP4.Y())) cForm='S';
- else cForm='C';
- }
- } else cForm='4'; // sonst der 3. Fall mit 5 Linien
- } else cForm='?'; //
- // Weitere Formen:
- if (bInfo) {
- pInfo->cOrthoForm=cForm;
- if (cForm=='I' || cForm=='L' || cForm=='Z' || cForm=='U') {
- pInfo->nObj1Lines=1;
- pInfo->nObj2Lines=1;
- if (cForm=='Z' || cForm=='U') {
- pInfo->nMiddleLine=1;
- } else {
- pInfo->nMiddleLine=0xFFFF;
- }
- } else if (cForm=='S' || cForm=='C') {
- pInfo->nObj1Lines=2;
- pInfo->nObj2Lines=2;
- pInfo->nMiddleLine=2;
- }
- }
- }
- if (pnQuality!=NULL) {
- sal_uInt32 nQual=0;
- sal_uInt32 nQual0=nQual; // Ueberlaeufe vorbeugen
- bool bOverflow=false;
- Point aPt0(aXP1[0]);
- for (sal_uInt16 nPntNum=1; nPntNum<nPntAnz; nPntNum++) {
- Point aPt1b(aXP1[nPntNum]);
- nQual+=Abs(aPt1b.X()-aPt0.X())+Abs(aPt1b.Y()-aPt0.Y());
- if (nQual<nQual0) bOverflow=true;
- nQual0=nQual;
- aPt0=aPt1b;
- }
-
- sal_uInt16 nTmp=nPntAnz;
- if (cForm=='Z') {
- nTmp=2; // Z-Form hat gute Qualitaet (nTmp=2 statt 4)
- sal_uInt32 n1=Abs(aXP1[1].X()-aXP1[0].X())+Abs(aXP1[1].Y()-aXP1[0].Y());
- sal_uInt32 n2=Abs(aXP1[2].X()-aXP1[1].X())+Abs(aXP1[2].Y()-aXP1[1].Y());
- sal_uInt32 n3=Abs(aXP1[3].X()-aXP1[2].X())+Abs(aXP1[3].Y()-aXP1[2].Y());
- // fuer moeglichst gleichlange Linien sorgen
- sal_uInt32 nBesser=0;
- n1+=n3;
- n3=n2/4;
- if (n1>=n2) nBesser=6;
- else if (n1>=3*n3) nBesser=4;
- else if (n1>=2*n3) nBesser=2;
- if (aXP1[0].Y()!=aXP1[1].Y()) nBesser++; // Senkrechte Startlinie kriegt auch noch einen Pluspunkt (fuer H/V-Prio)
- if (nQual>nBesser) nQual-=nBesser; else nQual=0;
- }
- if (nTmp>=3) {
- nQual0=nQual;
- nQual+=(sal_uInt32)nTmp*0x01000000;
- if (nQual<nQual0 || nTmp>15) bOverflow=true;
- }
- if (nPntAnz>=2) { // Austrittswinkel nochmal pruefen
- Point aP1(aXP1[1]); aP1-=aXP1[0];
- Point aP2(aXP1[nPntAnz-2]); aP2-=aXP1[nPntAnz-1];
- long nAng1=0; if (aP1.X()<0) nAng1=18000; if (aP1.Y()>0) nAng1=27000;
- if (aP1.Y()<0) nAng1=9000; if (aP1.X()!=0 && aP1.Y()!=0) nAng1=1; // Schraeg!?!
- long nAng2=0; if (aP2.X()<0) nAng2=18000; if (aP2.Y()>0) nAng2=27000;
- if (aP2.Y()<0) nAng2=9000; if (aP2.X()!=0 && aP2.Y()!=0) nAng2=1; // Schraeg!?!
- if (nAng1!=nAngle1) nIntersections++;
- if (nAng2!=nAngle2) nIntersections++;
- }
-
- // Fuer den Qualitaetscheck wieder die Original-Rects verwenden und
- // gleichzeitig checken, ob eins fuer die Edge-Berechnung verkleinert
- // wurde (z.B. Fall 2.9)
- aBewareRect1=rBewareRect1;
- aBewareRect2=rBewareRect2;
-
- for (sal_uInt16 i=0; i<nPntAnz; i++) {
- Point aPt1b(aXP1[i]);
- bool b1=aPt1b.X()>aBewareRect1.Left() && aPt1b.X()<aBewareRect1.Right() &&
- aPt1b.Y()>aBewareRect1.Top() && aPt1b.Y()<aBewareRect1.Bottom();
- bool b2=aPt1b.X()>aBewareRect2.Left() && aPt1b.X()<aBewareRect2.Right() &&
- aPt1b.Y()>aBewareRect2.Top() && aPt1b.Y()<aBewareRect2.Bottom();
- sal_uInt16 nInt0=nIntersections;
- if (i==0 || i==nPntAnz-1) {
- if (b1 && b2) nIntersections++;
- } else {
- if (b1) nIntersections++;
- if (b2) nIntersections++;
- }
- // und nun noch auf Ueberschneidungen checken
- if (i>0 && nInt0==nIntersections) {
- if (aPt0.Y()==aPt1b.Y()) { // Horizontale Linie
- if (aPt0.Y()>aBewareRect1.Top() && aPt0.Y()<aBewareRect1.Bottom() &&
- ((aPt0.X()<=aBewareRect1.Left() && aPt1b.X()>=aBewareRect1.Right()) ||
- (aPt1b.X()<=aBewareRect1.Left() && aPt0.X()>=aBewareRect1.Right()))) nIntersections++;
- if (aPt0.Y()>aBewareRect2.Top() && aPt0.Y()<aBewareRect2.Bottom() &&
- ((aPt0.X()<=aBewareRect2.Left() && aPt1b.X()>=aBewareRect2.Right()) ||
- (aPt1b.X()<=aBewareRect2.Left() && aPt0.X()>=aBewareRect2.Right()))) nIntersections++;
- } else { // Vertikale Linie
- if (aPt0.X()>aBewareRect1.Left() && aPt0.X()<aBewareRect1.Right() &&
- ((aPt0.Y()<=aBewareRect1.Top() && aPt1b.Y()>=aBewareRect1.Bottom()) ||
- (aPt1b.Y()<=aBewareRect1.Top() && aPt0.Y()>=aBewareRect1.Bottom()))) nIntersections++;
- if (aPt0.X()>aBewareRect2.Left() && aPt0.X()<aBewareRect2.Right() &&
- ((aPt0.Y()<=aBewareRect2.Top() && aPt1b.Y()>=aBewareRect2.Bottom()) ||
- (aPt1b.Y()<=aBewareRect2.Top() && aPt0.Y()>=aBewareRect2.Bottom()))) nIntersections++;
- }
- }
- aPt0=aPt1b;
- }
- if (nPntAnz<=1) nIntersections++;
- nQual0=nQual;
- nQual+=(sal_uInt32)nIntersections*0x10000000;
- if (nQual<nQual0 || nIntersections>15) bOverflow=true;
-
- if (bOverflow || nQual==0xFFFFFFFF) nQual=0xFFFFFFFE;
- *pnQuality=nQual;
- }
- if (bInfo) { // nun die Linienversaetze auf aXP1 anwenden
- if (pInfo->nMiddleLine!=0xFFFF) {
- const sal_uInt16 nIdx = (sal_uInt16)pInfo->ImpGetPolyIdx(MIDDLELINE,aXP1.GetPointCount());
- if (pInfo->ImpIsHorzLine(MIDDLELINE,aXP1.GetPointCount())) {
- aXP1[nIdx].Y()+=pInfo->aMiddleLine.getY();
- aXP1[nIdx+1].Y()+=pInfo->aMiddleLine.getY();
- } else {
- aXP1[nIdx].X()+=pInfo->aMiddleLine.getX();
- aXP1[nIdx+1].X()+=pInfo->aMiddleLine.getX();
- }
- }
- if (pInfo->nObj1Lines>=2) {
- const sal_uInt16 nIdx = (sal_uInt16)pInfo->ImpGetPolyIdx(OBJ1LINE2,aXP1.GetPointCount());
- if (pInfo->ImpIsHorzLine(OBJ1LINE2,aXP1.GetPointCount())) {
- aXP1[nIdx].Y()+=pInfo->aObj1Line2.getY();
- aXP1[nIdx+1].Y()+=pInfo->aObj1Line2.getY();
- } else {
- aXP1[nIdx].X()+=pInfo->aObj1Line2.getX();
- aXP1[nIdx+1].X()+=pInfo->aObj1Line2.getX();
- }
- }
- if (pInfo->nObj1Lines>=3) {
- const sal_uInt16 nIdx = (sal_uInt16)pInfo->ImpGetPolyIdx(OBJ1LINE3,aXP1.GetPointCount());
- if (pInfo->ImpIsHorzLine(OBJ1LINE3,aXP1.GetPointCount())) {
- aXP1[nIdx].Y()+=pInfo->aObj1Line3.getY();
- aXP1[nIdx+1].Y()+=pInfo->aObj1Line3.getY();
- } else {
- aXP1[nIdx].X()+=pInfo->aObj1Line3.getX();
- aXP1[nIdx+1].X()+=pInfo->aObj1Line3.getX();
- }
- }
- if (pInfo->nObj2Lines>=2) {
- const sal_uInt16 nIdx = (sal_uInt16)pInfo->ImpGetPolyIdx(OBJ2LINE2,aXP1.GetPointCount());
- if (pInfo->ImpIsHorzLine(OBJ2LINE2,aXP1.GetPointCount())) {
- aXP1[nIdx].Y()+=pInfo->aObj2Line2.getY();
- aXP1[nIdx+1].Y()+=pInfo->aObj2Line2.getY();
- } else {
- aXP1[nIdx].X()+=pInfo->aObj2Line2.getX();
- aXP1[nIdx+1].X()+=pInfo->aObj2Line2.getX();
- }
- }
- if (pInfo->nObj2Lines>=3) {
- const sal_uInt16 nIdx = (sal_uInt16)pInfo->ImpGetPolyIdx(OBJ2LINE3,aXP1.GetPointCount());
- if (pInfo->ImpIsHorzLine(OBJ2LINE3,aXP1.GetPointCount())) {
- aXP1[nIdx].Y()+=pInfo->aObj2Line3.getY();
- aXP1[nIdx+1].Y()+=pInfo->aObj2Line3.getY();
- } else {
- aXP1[nIdx].X()+=pInfo->aObj2Line3.getX();
- aXP1[nIdx+1].X()+=pInfo->aObj2Line3.getX();
- }
- }
- }
- // Nun mache ich ggf. aus dem Verbinder eine Bezierkurve
- if (eKind==SDREDGE_BEZIER && nPntAnz>2) {
- Point* pPt1=&aXP1[0];
- Point* pPt2=&aXP1[1];
- Point* pPt3=&aXP1[nPntAnz-2];
- Point* pPt4=&aXP1[nPntAnz-1];
- long dx1=pPt2->X()-pPt1->X();
- long dy1=pPt2->Y()-pPt1->Y();
- long dx2=pPt3->X()-pPt4->X();
- long dy2=pPt3->Y()-pPt4->Y();
- if (cForm=='L') { // nPntAnz==3
- aXP1.SetFlags(1,XPOLY_CONTROL);
- Point aPt3(*pPt2);
- aXP1.Insert(2,aPt3,XPOLY_CONTROL);
- nPntAnz=aXP1.GetPointCount();
- pPt1=&aXP1[0];
- pPt2=&aXP1[1];
- pPt3=&aXP1[nPntAnz-2];
- pPt4=&aXP1[nPntAnz-1];
- pPt2->X()-=dx1/3;
- pPt2->Y()-=dy1/3;
- pPt3->X()-=dx2/3;
- pPt3->Y()-=dy2/3;
- } else if (nPntAnz>=4 && nPntAnz<=6) { // Z oder U oder ...
- // fuer Alle Anderen werden die Endpunkte der Ausgangslinien
- // erstmal zu Kontrollpunkten. Bei nPntAnz>4 ist also noch
- // Nacharbeit erforderlich!
- aXP1.SetFlags(1,XPOLY_CONTROL);
- aXP1.SetFlags(nPntAnz-2,XPOLY_CONTROL);
- // Distanz x1.5
- pPt2->X()+=dx1/2;
- pPt2->Y()+=dy1/2;
- pPt3->X()+=dx2/2;
- pPt3->Y()+=dy2/2;
- if (nPntAnz==5) {
- // Vor und hinter dem Mittelpunkt jeweils
- // noch einen Kontrollpunkt einfuegen
- Point aCenter(aXP1[2]);
- long dx1b=aCenter.X()-aXP1[1].X();
- long dy1b=aCenter.Y()-aXP1[1].Y();
- long dx2b=aCenter.X()-aXP1[3].X();
- long dy2b=aCenter.Y()-aXP1[3].Y();
- aXP1.Insert(2,aCenter,XPOLY_CONTROL);
- aXP1.SetFlags(3,XPOLY_SYMMTR);
- aXP1.Insert(4,aCenter,XPOLY_CONTROL);
- aXP1[2].X()-=dx1b/2;
- aXP1[2].Y()-=dy1b/2;
- aXP1[3].X()-=(dx1b+dx2b)/4;
- aXP1[3].Y()-=(dy1b+dy2b)/4;
- aXP1[4].X()-=dx2b/2;
- aXP1[4].Y()-=dy2b/2;
- }
- if (nPntAnz==6) {
- Point aPt1b(aXP1[2]);
- Point aPt2b(aXP1[3]);
- aXP1.Insert(2,aPt1b,XPOLY_CONTROL);
- aXP1.Insert(5,aPt2b,XPOLY_CONTROL);
- long dx=aPt1b.X()-aPt2b.X();
- long dy=aPt1b.Y()-aPt2b.Y();
- aXP1[3].X()-=dx/2;
- aXP1[3].Y()-=dy/2;
- aXP1.SetFlags(3,XPOLY_SYMMTR);
- //aXP1[4].X()+=dx/2;
- //aXP1[4].Y()+=dy/2;
- aXP1.Remove(4,1); // weil identisch mit aXP1[3]
- }
- }
+ if(bAuto1)
+ {
+ rCon1.SetConnectorID(nBestAuto1);
}
- return aXP1.getB2DPolygon();
-}
-
-/*
-Nach einer einfachen Rechnung koennte es max. 64 unterschiedliche Verlaeufe mit
-5 Linien, 32 mit 4 Linien, 16 mit 3, 8 mit 2 Linien und 4 mit 1 Linie geben=124.
-Normalisiert auf 1. Austrittswinkel nach rechts bleiben dann noch 31.
-Dann noch eine vertikale Spiegelung wegnormalisiert bleiben noch 16
-characteristische Verlaufszuege mit 1-5 Linien:
-Mit 1 Linie (Typ 'I'): --
-Mit 2 Linien (Typ 'L'): -
-Mit 3 Linien (Typ 'U'): - (Typ 'Z'): -
- - -
-Mit 4 Linien: 1 ist nicht plausibel, 3 ist=2 (90deg Drehung). Verbleibt 2,4
- - ڿ ڿ ڿ -
- - - - - - -
-Mit 5 Linien: nicht plausibel sind 1,2,4,5. 7 ist identisch mit 3 (Richtungsumkehr)
- Bleibt also 3,6 und 8. '4' 'S' 'C'
- - - - -
- - - - - - - - -
- - - - - - - - -- - -
-Insgesamt sind also 9 Grundtypen zu unterscheiden die den 400 Konstellationen
-aus Objektposition und Austrittswinkeln zuzuordnen sind.
-4 der 9 Grundtypen haben eine 'Mittellinie'. Die Anzahl der zu Objektabstaende
-je Objekt variiert von 0-3:
- Mi O1 O2 Anmerkung
-'I': n 0 0
-'L': n 0 0
-'U': n 0-1 0-1
-'Z': j 0 0
-4.1: j 0 1 = U+1 bzw. 1+U
-4.2: n 0-2 0-2 = Z+1
-'4': j 0 2 = Z+2
-'S': j 1 1 = 1+Z+1
-'C': n 0-3 0-3 = 1+U+1
-*/
-
-void __EXPORT SdrEdgeObj::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
-{
- const SfxSimpleHint* pSimple=dynamic_cast< const SfxSimpleHint* >( &rHint);
- sal_uInt32 nId=pSimple==0 ? 0 : pSimple->GetId();
- bool bDataChg=nId==SFX_HINT_DATACHANGED;
- bool bDying=nId==SFX_HINT_DYING;
- bool bObj1 = maCon1.mpConnectedSdrObject && maCon1.mpConnectedSdrObject == &rBC;
- bool bObj2 = maCon2.mpConnectedSdrObject && maCon2.mpConnectedSdrObject == &rBC;
- if (bDying && (bObj1 || bObj2)) {
- // #35605# Dying vorher abfangen, damit AttrObj nicht
- // wg. vermeintlicher Vorlagenaenderung rumbroadcastet
- if (bObj1) maCon1.mpConnectedSdrObject = 0;
- if (bObj2) maCon2.mpConnectedSdrObject = 0;
- return; // Und mehr braucht hier nicht getan werden.
- }
- if ( bObj1 || bObj2 )
+ if(bAuto2)
{
- mbEdgeTrackUserDefined = false;
+ rCon2.SetConnectorID(nBestAuto2);
}
- SdrTextObj::Notify(rBC,rHint);
- static sal_uInt16 nNotifyingCount = 0;
- if(!nNotifyingCount)
+ if(pInfo)
{
- // Hier nun auch ein VerriegelungsFlag
- nNotifyingCount++;
- const SdrBaseHint* pSdrHint = dynamic_cast< const SdrBaseHint* >(&rHint);
-
- if (bDataChg) { // StyleSheet geaendert
- ImpSetAttrToEdgeInfo(); // Werte bei Vorlagenaenderung vom Pool nach maEdgeInfo kopieren
- }
- SdrPage* pOwningPage = getSdrPageFromSdrObject();
- if (bDataChg ||
- (bObj1 && maCon1.mpConnectedSdrObject->getSdrPageFromSdrObject() == pOwningPage) ||
- (bObj2 && maCon2.mpConnectedSdrObject->getSdrPageFromSdrObject() == pOwningPage) ||
- (pSdrHint && pSdrHint->GetSdrHintKind()==HINT_OBJREMOVED))
- {
- // Broadcasting nur, wenn auf der selben Page
- const SdrObjectChangeBroadcaster aSdrObjectChangeBroadcaster(*this);
-
- ImpDirtyEdgeTrack();
- ActionChanged();
- }
-
- nNotifyingCount--;
+ *pInfo = aBestInfo;
}
+
+ return aRetval;
}
-/** updates edges that are connected to the edges of this object
- as if the connected objects send a repaint broadcast
- #103122#
-*/
-void SdrEdgeObj::ReformatEdge()
+void SdrEdgeObj::StyleSheetChanged()
{
- if(maCon1.mpConnectedSdrObject)
+ if(mpCon1->GetConnectedSdrObject() || mpCon2->GetConnectedSdrObject())
{
- SfxSimpleHint aHint( SFX_HINT_DATACHANGED );
- Notify( *maCon1.mpConnectedSdrObject, aHint );
- }
-
- if(maCon2.mpConnectedSdrObject)
- {
- SfxSimpleHint aHint( SFX_HINT_DATACHANGED );
- Notify( *maCon2.mpConnectedSdrObject, aHint );
+ ImpSetAttrToEdgeInfo();
+ SetEdgeTrackDirty();
+ SetChanged();
}
}
@@ -1917,26 +2242,23 @@ void SdrEdgeObj::SetEdgeTrackPath(const basegfx::B2DPolygon& rPoly)
if(rPoly.count() > 1)
{
maEdgeTrack = rPoly;
- mbEdgeTrackDirty = false;
mbEdgeTrackUserDefined = true;
- // #i110629# also set aRect and maSnapeRect dependent from maEdgeTrack
- const basegfx::B2DRange aPolygonBounds(maEdgeTrack.getB2DRange());
- sdr::legacy::SetSnapRange(*this, aPolygonBounds);
+ mpCon1->SetConnectedSdrObject(0);
+ mpCon1->SetPosition(maEdgeTrack.getB2DPoint(0));
+
+ mpCon2->SetConnectedSdrObject(0);
+ mpCon2->SetPosition(maEdgeTrack.getB2DPoint(maEdgeTrack.count() - 1));
}
else
{
- mbEdgeTrackDirty = true;
mbEdgeTrackUserDefined = false;
}
}
basegfx::B2DPolygon SdrEdgeObj::GetEdgeTrackPath() const
{
- if(mbEdgeTrackDirty)
- {
- const_cast< SdrEdgeObj* >(this)->ImpRecalcEdgeTrack();
- }
+ const_cast< SdrEdgeObj* >(this)->ImpRecalcEdgeTrack();
return maEdgeTrack;
}
@@ -1952,9 +2274,33 @@ void SdrEdgeObj::AddToHdlList(SdrHdlList& rHdlList) const
}
}
+bool SdrEdgeObj::checkHorizontalDrag(SdrEdgeLineCode eLineCode, bool bObjHdlTwo) const
+{
+ const SdrEdgeKind eEdgeKind((static_cast< const SdrEdgeKindItem& >(GetObjectItem(SDRATTR_EDGEKIND))).GetValue());
+
+ if(SDREDGE_ORTHOLINES == eEdgeKind || SDREDGE_BEZIER == eEdgeKind)
+ {
+ const_cast< SdrEdgeObj* >(this)->ImpRecalcEdgeTrack();
+
+ return !mpEdgeInfo->ImpIsHorzLine(eLineCode, maEdgeTrack.count());
+ }
+ else if(SDREDGE_THREELINES == eEdgeKind)
+ {
+ const sal_Int32 nWink(bObjHdlTwo ? mpEdgeInfo->nAngle1 : mpEdgeInfo->nAngle2);
+
+ if(!nWink || 18000 == nWink)
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
sal_uInt32 SdrEdgeObj::impOldGetHdlCount() const
{
- const SdrEdgeKind eKind(((SdrEdgeKindItem&)(GetObjectItem(SDRATTR_EDGEKIND))).GetValue());
+ const_cast< SdrEdgeObj* >(this)->ImpRecalcEdgeTrack();
+ const SdrEdgeKind eKind((static_cast< const SdrEdgeKindItem& >(GetObjectItem(SDRATTR_EDGEKIND))).GetValue());
const sal_uInt32 nPntAnz(maEdgeTrack.count());
sal_uInt32 nHdlAnz(0);
@@ -1964,20 +2310,20 @@ sal_uInt32 SdrEdgeObj::impOldGetHdlCount() const
if((SDREDGE_ORTHOLINES == eKind || SDREDGE_BEZIER == eKind) && 4 <= nPntAnz)
{
- const sal_uInt32 nO1(maEdgeInfo.nObj1Lines > 0 ? maEdgeInfo.nObj1Lines - 1 : 0);
- const sal_uInt32 nO2(maEdgeInfo.nObj2Lines > 0 ? maEdgeInfo.nObj2Lines - 1 : 0);
- const sal_uInt32 nM(maEdgeInfo.nMiddleLine != 0xFFFF ? 1 : 0);
+ const sal_uInt32 nO1(mpEdgeInfo->nObj1Lines > 0 ? mpEdgeInfo->nObj1Lines - 1 : 0);
+ const sal_uInt32 nO2(mpEdgeInfo->nObj2Lines > 0 ? mpEdgeInfo->nObj2Lines - 1 : 0);
+ const sal_uInt32 nM(mpEdgeInfo->nMiddleLine != 0xFFFF ? 1 : 0);
nHdlAnz += nO1 + nO2 + nM;
}
else if(SDREDGE_THREELINES == eKind && 4 == nPntAnz)
{
- if(GetConnectedNode(true))
+ if(GetSdrObjectConnection(true))
{
nHdlAnz++;
}
- if(GetConnectedNode(false))
+ if(GetSdrObjectConnection(false))
{
nHdlAnz++;
}
@@ -1990,37 +2336,38 @@ sal_uInt32 SdrEdgeObj::impOldGetHdlCount() const
SdrHdl* SdrEdgeObj::impOldGetHdl(SdrHdlList& rHdlList, sal_uInt32 nHdlNum) const
{
SdrHdl* pHdl = 0;
+ const_cast< SdrEdgeObj* >(this)->ImpRecalcEdgeTrack();
const sal_uInt32 nPntAnz(maEdgeTrack.count());
if(nPntAnz)
{
if(!nHdlNum)
{
- pHdl = new ImpEdgeHdl(rHdlList, *this, HDL_POLY, maEdgeTrack.getB2DPoint(0));
+ pHdl = new ImpEdgeHdl(rHdlList, *this, HDL_POLY, mpCon1->GetPosition());
- if(maCon1.mpConnectedSdrObject && maCon1.mbBestVertex)
+ if(mpCon1->GetConnectedSdrObject() && mpCon1->IsBestVertex())
{
pHdl->Set1PixMore(true);
}
}
else if(1 == nHdlNum)
{
- pHdl = new ImpEdgeHdl(rHdlList, *this, HDL_POLY, maEdgeTrack.getB2DPoint(nPntAnz - 1));
+ pHdl = new ImpEdgeHdl(rHdlList, *this, HDL_POLY, mpCon2->GetPosition());
- if(maCon2.mpConnectedSdrObject && maCon2.mbBestVertex)
+ if(mpCon2->GetConnectedSdrObject() && mpCon2->IsBestVertex())
{
pHdl->Set1PixMore(true);
}
}
else
{
- const SdrEdgeKind eKind(((SdrEdgeKindItem&)(GetObjectItem(SDRATTR_EDGEKIND))).GetValue());
+ const SdrEdgeKind eKind((static_cast< const SdrEdgeKindItem& >(GetObjectItem(SDRATTR_EDGEKIND))).GetValue());
if(SDREDGE_ORTHOLINES == eKind || SDREDGE_BEZIER == eKind)
{
- const sal_uInt32 nO1(maEdgeInfo.nObj1Lines > 0 ? maEdgeInfo.nObj1Lines - 1 : 0);
- const sal_uInt32 nO2(maEdgeInfo.nObj2Lines > 0 ? maEdgeInfo.nObj2Lines - 1 : 0);
- const sal_uInt32 nM(maEdgeInfo.nMiddleLine != 0xFFFF ? 1 : 0);
+ const sal_uInt32 nO1(mpEdgeInfo->nObj1Lines > 0 ? mpEdgeInfo->nObj1Lines - 1 : 0);
+ const sal_uInt32 nO2(mpEdgeInfo->nObj2Lines > 0 ? mpEdgeInfo->nObj2Lines - 1 : 0);
+ const sal_uInt32 nM(mpEdgeInfo->nMiddleLine != 0xFFFF ? 1 : 0);
sal_uInt32 nNum(nHdlNum - 2);
sal_Int32 nPt(0);
SdrEdgeLineCode aSdrEdgeLineCode(OBJ1LINE2);
@@ -2063,7 +2410,7 @@ SdrHdl* SdrEdgeObj::impOldGetHdl(SdrHdlList& rHdlList, sal_uInt32 nHdlNum) const
if(nNum < nM)
{
- nPt = maEdgeInfo.nMiddleLine;
+ nPt = mpEdgeInfo->nMiddleLine;
aSdrEdgeLineCode = MIDDLELINE;
}
}
@@ -2080,7 +2427,7 @@ SdrHdl* SdrEdgeObj::impOldGetHdl(SdrHdlList& rHdlList, sal_uInt32 nHdlNum) const
{
sal_uInt32 nNum(nHdlNum);
- if(!GetConnectedNode(true))
+ if(!GetSdrObjectConnection(true))
{
nNum++;
}
@@ -2109,8 +2456,6 @@ SdrHdl* SdrEdgeObj::impOldGetHdl(SdrHdlList& rHdlList, sal_uInt32 nHdlNum) const
return pHdl;
}
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
bool SdrEdgeObj::hasSpecialDrag() const
{
return true;
@@ -2121,9 +2466,9 @@ SdrObject* SdrEdgeObj::getFullDragClone() const
// use Clone operator
SdrEdgeObj* pRetval = static_cast< SdrEdgeObj* >(CloneSdrObject());
- // copy connections for clone, SdrEdgeObj::operator= does not do this
- pRetval->ConnectToNode(true, GetConnectedNode(true));
- pRetval->ConnectToNode(false, GetConnectedNode(false));
+ // copy connections for clone, clone itself does not do this for good reason
+ pRetval->ConnectToSdrObject(true, GetSdrObjectConnection(true));
+ pRetval->ConnectToSdrObject(false, GetSdrObjectConnection(false));
return pRetval;
}
@@ -2148,62 +2493,57 @@ bool SdrEdgeObj::applySpecialDrag(SdrDragStat& rDragStat)
const SdrEdgeObj* pOriginalEdge = dynamic_cast< const SdrEdgeObj* >(rDragStat.GetActiveHdl()->GetObj());
const bool bOriginalEdgeModified(pOriginalEdge == this);
+ // not user defined if dragging
+ mbEdgeTrackUserDefined = false;
+
if(!bOriginalEdgeModified && pOriginalEdge)
{
// copy connections when clone is modified. This is needed because
// as preparation to this modification the data from the original object
// was copied to the clone using the operator=. As can be seen there,
// that operator does not copy the connections (for good reason)
- ConnectToNode(true, pOriginalEdge->GetConnection(true).GetObject());
- ConnectToNode(false, pOriginalEdge->GetConnection(false).GetObject());
+ ConnectToSdrObject(true, pOriginalEdge->mpCon1->GetConnectedSdrObject());
+ ConnectToSdrObject(false, pOriginalEdge->mpCon2->GetConnectedSdrObject());
}
if(rDragStat.GetActiveHdl()->GetPointNum() < 2)
{
// start or end point connector drag
const bool bDragA(0 == rDragStat.GetActiveHdl()->GetPointNum());
- const basegfx::B2DPoint aPointNow(rDragStat.GetNow());
SdrView& rSdrView = rDragStat.GetSdrViewFromSdrDragStat();
if(rSdrView.GetSdrPageView())
{
- SdrObjConnection* pDraggedOne(bDragA ? &maCon1 : &maCon2);
-
- // clear connection
- DisconnectFromNode(bDragA);
+ SdrObjConnection& rDraggedOne(bDragA ? *mpCon1 : *mpCon2);
+ sal_uInt32 nID(0);
+ bool bBest(false);
+ bool bAuto(false);
// look for new connection
- FindConnector(aPointNow, rSdrView, *pDraggedOne, pOriginalEdge);
+ SdrObject* pNewContact = rSdrView.FindConnector(rDragStat.GetNow(), nID, bBest, bAuto, pOriginalEdge);
- if(pDraggedOne->mpConnectedSdrObject)
- {
- // if found, officially connect to it; FindConnector only
- // sets mpConnectedSdrObject hard
- SdrObject* pNewConnection = pDraggedOne->mpConnectedSdrObject;
- pDraggedOne->mpConnectedSdrObject = 0;
- ConnectToNode(bDragA, pNewConnection);
- }
+ // set parameters
+ rDraggedOne.SetConnectedSdrObject(0);
+ rDraggedOne.SetPosition(rDragStat.GetNow());
+ rDraggedOne.SetConnectorID(nID);
+ rDraggedOne.setBestConnection(bBest);
+ rDraggedOne.setBestVertex(bBest);
+ rDraggedOne.setAutoVertex(bAuto);
+ rDraggedOne.SetConnectedSdrObject(pNewContact);
if(!bOriginalEdgeModified)
{
// show IA helper, but only do this during IA, so not when the original
// Edge gets modified in the last call
- rDragStat.GetSdrViewFromSdrDragStat().SetConnectMarker(*pDraggedOne);
+ rDragStat.GetSdrViewFromSdrDragStat().SetConnectMarker(rDraggedOne.GetConnectedSdrObject());
}
}
- // change maEdgeTrack to modified position
- if(bDragA)
- {
- maEdgeTrack.setB2DPoint(0, aPointNow);
- }
- else
+ // reset edge info's offsets, this is a end point drag
+ if(mpEdgeInfo->ImpUsesUserDistances())
{
- maEdgeTrack.setB2DPoint(maEdgeTrack.count() - 1, aPointNow);
+ mpEdgeInfo->ImpResetUserDistances();
}
-
- // reset edge info's offsets, this is a end point drag
- maEdgeInfo.aObj1Line2 = maEdgeInfo.aObj1Line3 = maEdgeInfo.aObj2Line2 = maEdgeInfo.aObj2Line3 = maEdgeInfo.aMiddleLine = basegfx::B2DPoint();
}
else
{
@@ -2216,18 +2556,17 @@ bool SdrEdgeObj::applySpecialDrag(SdrDragStat& rDragStat)
const basegfx::B2DPoint aDist(rDragStat.GetNow() - rDragStat.GetStart());
sal_Int32 nDist(basegfx::fround(pEdgeHdl->IsHorzDrag() ? aDist.getX() : aDist.getY()));
- nDist += maEdgeInfo.ImpGetLineVersatz(eLineCode, maEdgeTrack.count());
- maEdgeInfo.ImpSetLineVersatz(eLineCode, maEdgeTrack.count(), nDist);
+ ImpRecalcEdgeTrack();
+ nDist += mpEdgeInfo->ImpGetLineVersatz(eLineCode, maEdgeTrack.count());
+ mpEdgeInfo->ImpSetLineVersatz(eLineCode, maEdgeTrack.count(), nDist);
+
+ SetEdgeTrackDirty();
+ SetChanged();
}
}
- // force recalc EdgeTrack
- maEdgeTrack = ImpCalcEdgeTrack(maCon1, maCon2, &maEdgeInfo);
- mbEdgeTrackDirty = false;
-
// save EdgeInfos and mark object as user modified
ImpSetEdgeInfoToAttr();
- mbEdgeTrackUserDefined = false;
if(bOriginalEdgeModified)
{
@@ -2236,7 +2575,7 @@ bool SdrEdgeObj::applySpecialDrag(SdrDragStat& rDragStat)
rDragStat.GetSdrViewFromSdrDragStat().HideConnectMarker();
}
- return true;
+ return true;
}
String SdrEdgeObj::getSpecialDragComment(const SdrDragStat& rDrag) const
@@ -2256,43 +2595,68 @@ String SdrEdgeObj::getSpecialDragComment(const SdrDragStat& rDrag) const
}
}
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-basegfx::B2DPolygon SdrEdgeObj::ImplAddConnectorOverlay(SdrDragMethod& rDragMethod, bool bTail1, bool bTail2, bool bDetail) const
+basegfx::B2DPolygon SdrEdgeObj::CreateConnectorOverlay(
+ const basegfx::B2DHomMatrix& rCurrentTransformation,
+ bool bTail1,
+ bool bTail2,
+ bool bDetail) const
{
basegfx::B2DPolygon aResult;
if(bDetail)
{
- SdrObjConnection aMyCon1(maCon1);
- SdrObjConnection aMyCon2(maCon2);
+ // to calculate connector overlay in interactive mode when a SdrObject
+ // is modified to which we are connected; this is not optimal and requires
+ // two extra transformations to ImpCalcEdgeTrack to implicitely transform
+ // the source and target point object information. It will be better to
+ // clone the whole involved structure in the future, including the involved
+ // connectors. This will then do everything automatically. For now - since
+ // SdrDragMove does not use Clones but transforms the original primitives -
+ // stay with the implicit transform(offset).
+ if(bTail1 && bTail2)
+ {
+ // start and end are influenced, just transform current EdgeTrack
+ aResult = GetEdgeTrackPath();
- SdrEdgeInfoRec aInfo(maEdgeInfo);
- aResult = ImpCalcEdgeTrack(aMyCon1, aMyCon2, &aInfo);
+ aResult.transform(rCurrentTransformation);
+ }
+ else
+ {
+ SdrObjConnection aMyCon1(*mpCon1);
+ SdrObjConnection aMyCon2(*mpCon2);
+ SdrEdgeInfoRec aInfo(*mpEdgeInfo);
+
+ aResult = ImpCalcEdgeTrack(
+ aMyCon1,
+ aMyCon2,
+ &aInfo,
+ bTail1 ? &rCurrentTransformation : 0,
+ bTail2 ? &rCurrentTransformation : 0);
+ }
}
else
{
- basegfx::B2DPoint aPt1(maEdgeTrack.getB2DPoint(0));
- basegfx::B2DPoint aPt2(maEdgeTrack.getB2DPoint(maEdgeTrack.count() - 1));
+ basegfx::B2DPoint aPt1(mpCon1->GetPosition());
+ basegfx::B2DPoint aPt2(mpCon2->GetPosition());
- if (maCon1.mpConnectedSdrObject && (maCon1.mbBestConnection || maCon1.mbBestVertex))
+ if(mpCon1->GetConnectedSdrObject() && (mpCon1->IsBestConnection() || mpCon1->IsBestVertex()))
{
- aPt1 = sdr::legacy::GetSnapRange(*maCon1.mpConnectedSdrObject).getCenter();
+ aPt1 = mpCon1->GetConnectedSdrObject()->getSdrObjectTransformation() * basegfx::B2DPoint(0.5, 0.5);
}
- if (maCon2.mpConnectedSdrObject && (maCon2.mbBestConnection || maCon2.mbBestVertex))
+ if(mpCon2->GetConnectedSdrObject() && (mpCon2->IsBestConnection() || mpCon2->IsBestVertex()))
{
- aPt2 = sdr::legacy::GetSnapRange(*maCon2.mpConnectedSdrObject).getCenter();
+ aPt2 = mpCon2->GetConnectedSdrObject()->getSdrObjectTransformation() * basegfx::B2DPoint(0.5, 0.5);
}
- if (bTail1)
+ if(bTail1)
{
- aPt1 *= rDragMethod.getCurrentTransformation();
+ aPt1 *= rCurrentTransformation;
}
- if (bTail2)
+ if(bTail2)
{
- aPt2 *= rDragMethod.getCurrentTransformation();
+ aPt2 *= rCurrentTransformation;
}
aResult.append(aPt1);
@@ -2305,41 +2669,48 @@ basegfx::B2DPolygon SdrEdgeObj::ImplAddConnectorOverlay(SdrDragMethod& rDragMeth
bool SdrEdgeObj::BegCreate(SdrDragStat& rDragStat)
{
rDragStat.SetNoSnap(true);
- maEdgeTrack.clear();
- maEdgeTrack.append(rDragStat.GetStart());
- maEdgeTrack.append(rDragStat.GetNow());
+
+ // prepare connector with new positions
+ mpCon1->SetConnectedSdrObject(0);
+ mpCon1->SetPosition(rDragStat.GetStart());
+
+ mpCon2->SetConnectedSdrObject(0);
+ mpCon2->SetPosition(rDragStat.GetNow());
SdrView& rSdrView = rDragStat.GetSdrViewFromSdrDragStat();
if(rSdrView.GetSdrPageView())
{
- FindConnector(rDragStat.GetStart(), rSdrView, maCon1, this);
- ConnectToNode(true, maCon1.mpConnectedSdrObject);
- }
+ // check for start connection to SdrObject and evtl. connect to it
+ sal_uInt32 nID(0);
+ bool bBest(false);
+ bool bAuto(false);
- maEdgeTrack = ImpCalcEdgeTrack(maCon1, maCon2, &maEdgeInfo);
+ mpCon1->SetConnectedSdrObject(rSdrView.FindConnector(rDragStat.GetStart(), nID, bBest, bAuto, this));
+ }
return true;
}
bool SdrEdgeObj::MovCreate(SdrDragStat& rDragStat)
{
- maEdgeTrack.setB2DPoint(maEdgeTrack.count() - 1, rDragStat.GetNow());
+ // prepare connector end with new position
+ mpCon2->SetConnectedSdrObject(0);
+ mpCon2->SetPosition(rDragStat.GetNow());
SdrView& rSdrView = rDragStat.GetSdrViewFromSdrDragStat();
if(rSdrView.GetSdrPageView())
{
- FindConnector(rDragStat.GetNow(), rSdrView, maCon2, this);
- rDragStat.GetSdrViewFromSdrDragStat().SetConnectMarker(maCon2);
+ // check for end connection to SdrObject and evtl. connect to it
+ sal_uInt32 nID(0);
+ bool bBest(false);
+ bool bAuto(false);
+ mpCon2->SetConnectedSdrObject(rSdrView.FindConnector(rDragStat.GetNow(), nID, bBest, bAuto, this));
+ rDragStat.GetSdrViewFromSdrDragStat().SetConnectMarker(mpCon2->GetConnectedSdrObject());
}
- ActionChanged();
- ConnectToNode(false, maCon2.mpConnectedSdrObject);
- maEdgeTrack = ImpCalcEdgeTrack(maCon1, maCon2, &maEdgeInfo);
- mbEdgeTrackDirty = false;
-
return true;
}
@@ -2349,14 +2720,10 @@ bool SdrEdgeObj::EndCreate(SdrDragStat& rDragStat, SdrCreateCmd eCmd)
if(bOk)
{
- ConnectToNode(true, maCon1.mpConnectedSdrObject);
- ConnectToNode(false, maCon2.mpConnectedSdrObject);
rDragStat.GetSdrViewFromSdrDragStat().HideConnectMarker();
- ImpSetEdgeInfoToAttr(); // Die Werte aus maEdgeInfo in den Pool kopieren
+ ImpSetEdgeInfoToAttr();
}
- ActionChanged();
-
return bOk;
}
@@ -2374,241 +2741,95 @@ void SdrEdgeObj::BrkCreate(SdrDragStat& rDragStat)
basegfx::B2DPolyPolygon SdrEdgeObj::TakeCreatePoly(const SdrDragStat& /*rStatDrag*/) const
{
- return basegfx::B2DPolyPolygon(maEdgeTrack);
-}
-
-void SdrEdgeObj::FindConnector(
- const basegfx::B2DPoint& rPt,
- const SdrView& rSdrView,
- SdrObjConnection& rCon,
- const SdrEdgeObj* pThis,
- OutputDevice* pOut)
-{
- rCon.ResetVars();
-
- if(rSdrView.GetSdrPageView())
- {
- if(!pOut)
- pOut = rSdrView.GetFirstOutputDevice(); // GetWin(0);
-
- if (!pOut)
- return;
-
- const Point aPt(basegfx::fround(rPt.getX()), basegfx::fround(rPt.getY()));
- SdrObjList* pOL = rSdrView.GetSdrPageView()->GetCurrentObjectList();
- const SetOfByte& rVisLayer = rSdrView.GetSdrPageView()->GetVisibleLayers();
- // Sensitiver Bereich der Konnektoren ist doppelt so gross wie die Handles:
- sal_uInt16 nMarkHdSiz = rSdrView.GetMarkHdlSizePixel();
- Size aHalfConSiz(nMarkHdSiz,nMarkHdSiz);
- aHalfConSiz=pOut->PixelToLogic(aHalfConSiz);
- Size aHalfCenterSiz(2*aHalfConSiz.Width(),2*aHalfConSiz.Height());
- Rectangle aMouseRect(aPt,aPt);
- aMouseRect.Left() -=aHalfConSiz.Width();
- aMouseRect.Top() -=aHalfConSiz.Height();
- aMouseRect.Right() +=aHalfConSiz.Width();
- aMouseRect.Bottom()+=aHalfConSiz.Height();
- sal_uInt16 nBoundHitTol=(sal_uInt16)aHalfConSiz.Width()/2; if (nBoundHitTol==0) nBoundHitTol=1;
- sal_uInt32 no=pOL->GetObjCount();
- bool bFnd=false;
- SdrObjConnection aTestCon;
- SdrObjConnection aBestCon;
- bool bTestBoundHit=false;
- //bool bBestBoundHit=false;
-
- while (no>0 && !bFnd)
- {
- // Problem: Gruppenobjekt mit verschiedenen Layern liefert LayerID 0 !!!!
- no--;
- SdrObject* pObj = pOL->GetObj(no);
- if (rVisLayer.IsSet(pObj->GetLayer()) && pObj->IsVisible() && // only visible objects
- (pThis==NULL || pObj != pThis)) // nicht an mich selbst connecten
- {
- Rectangle aObjBound(sdr::legacy::GetBoundRect(*pObj));
- if (aObjBound.IsOver(aMouseRect))
- {
- aTestCon.ResetVars();
- bTestBoundHit=false;
- const bool bEdge(pObj->IsSdrEdgeObj()); // kein BestCon fuer Edge
- // Die Userdefined Konnektoren haben absolute Prioritaet.
- // Danach kommt Vertex, Corner und Mitte(Best) gleich priorisiert.
- // Zum Schluss kommt noch ein HitTest aufs Obj.
- const sdr::glue::GluePointProvider& rProvider = pObj->GetGluePointProvider();
- const sdr::glue::GluePointVector aUserGluePointVector(rProvider.getUserGluePointVector());
- const sal_uInt32 nUserGluePointCount(aUserGluePointVector.size());
- const sal_uInt32 nAutoGluePointCount(rProvider.getAutoGluePointCount());
- const sal_uInt32 nAllGluePointCount(nUserGluePointCount + nAutoGluePointCount + 1);
- bool bUserFnd=false;
- sal_uInt32 nBestDist=0xFFFFFFFF;
-
- for (sal_uInt32 i=0; i<nAllGluePointCount; i++)
- {
- const bool bUser(i < nUserGluePointCount);
- const bool bVertex(i >= nUserGluePointCount && i < nUserGluePointCount + nAutoGluePointCount);
- const bool bCenter(i + 1 == nAllGluePointCount);
- bool bOk=false;
- Point aConPos;
- sal_uInt32 nConNum=i;
-
- if(bUser)
- {
- const sdr::glue::GluePoint* pCandidate = aUserGluePointVector[nConNum];
-
- if(pCandidate)
- {
- const basegfx::B2DPoint aPoint(pObj->getSdrObjectTransformation() * pCandidate->getUnitPosition());
-
- aConPos = Point(basegfx::fround(aPoint.getX()), basegfx::fround(aPoint.getY()));
- nConNum = pCandidate->getID();
- bOk = true;
- }
- else
- {
- OSL_ENSURE(false, "Got sdr::glue::PointVector with empty entries (!)");
- }
- }
- else if (bVertex && !bUserFnd)
- {
- nConNum = nConNum - nUserGluePointCount;
+ const_cast< SdrEdgeObj* >(this)->ImpRecalcEdgeTrack();
- const sdr::glue::GluePoint aLocalPt(rProvider.getAutoGluePointByIndex(nConNum));
- const basegfx::B2DPoint aPoint(pObj->getSdrObjectTransformation() * aLocalPt.getUnitPosition());
-
- aConPos = Point(basegfx::fround(aPoint.getX()), basegfx::fround(aPoint.getY()));
- bOk = true;
- }
- else if (bCenter && !bUserFnd && !bEdge)
- {
- // #109007#
- // Suppress default connect at object center
- if(!pThis || !pThis->GetSuppressDefaultConnect())
- {
- // Edges nicht!
- nConNum=0;
- aConPos=aObjBound.Center();
- bOk=true;
- }
- }
- if (bOk && aMouseRect.IsInside(aConPos))
- {
- if (bUser) bUserFnd=true;
- bFnd=true;
- sal_uInt32 nDist=(sal_uInt32)Abs(aConPos.X()-aPt.X())+(sal_uInt32)Abs(aConPos.Y()-aPt.Y());
-
- if (nDist<nBestDist)
- {
- nBestDist = nDist;
- aTestCon.mpConnectedSdrObject = pObj;
- aTestCon.mnConnectorId = nConNum;
- aTestCon.mbAutoVertex = bVertex;
- aTestCon.mbBestConnection = false; // bCenter;
- aTestCon.mbBestVertex = bCenter;
- }
- }
- }
- // Falls kein Konnektor getroffen wird nochmal
- // HitTest versucht fuer BestConnector (=bCenter)
- const basegfx::B2DPoint aHitTestPos(aPt.X(), aPt.Y());
- if(!bFnd &&
- !bEdge &&
- SdrObjectPrimitiveHit(*pObj, aHitTestPos, nBoundHitTol, rSdrView, false, 0))
- {
- // #109007#
- // Suppress default connect at object inside bound
- if(!pThis || !pThis->GetSuppressDefaultConnect())
- {
- bFnd = true;
- aTestCon.mpConnectedSdrObject = pObj;
- aTestCon.mbBestConnection = true;
- }
- }
- if (bFnd)
- {
- Rectangle aMouseRect2(aPt,aPt);
- aMouseRect.Left() -=nBoundHitTol;
- aMouseRect.Top() -=nBoundHitTol;
- aMouseRect.Right() +=nBoundHitTol;
- aMouseRect.Bottom()+=nBoundHitTol;
- bTestBoundHit=aObjBound.IsOver(aMouseRect2);
- }
- }
- }
- }
-
- rCon=aTestCon;
- }
+ return basegfx::B2DPolyPolygon(maEdgeTrack);
}
const basegfx::B2DHomMatrix& SdrEdgeObj::getSdrObjectTransformation() const
{
+ // nothing to do (evtl. add a check in debug mode, but the transformation
+ // should be up to date all the time as long as all changes to the geometry
+ // of this object use impChangeEdgeTrackData to change maEdgeTrack)
return SdrTextObj::getSdrObjectTransformation();
}
void SdrEdgeObj::setSdrObjectTransformation(const basegfx::B2DHomMatrix& rTransformation)
{
- if(rTransformation != getSdrObjectTransformation())
+ const basegfx::B2DHomMatrix aCurrentTransformation(getSdrObjectTransformation());
+
+ if(rTransformation != aCurrentTransformation)
{
// #54102# handle start and end point if not connected
- const bool bCon1(maCon1.mpConnectedSdrObject && maCon1.mpConnectedSdrObject->getSdrPageFromSdrObject() == getSdrPageFromSdrObject());
- const bool bCon2(maCon2.mpConnectedSdrObject && maCon2.mpConnectedSdrObject->getSdrPageFromSdrObject() == getSdrPageFromSdrObject());
- const sal_uInt32 nCount(maEdgeTrack.count());
- const bool bApplyTransform(nCount && (!bCon1 || !bCon2 || mbEdgeTrackUserDefined));
- basegfx::B2DHomMatrix aCompleteTransform;
+ const bool bCon1(GetSdrObjectConnection(true));
+ const bool bCon2(GetSdrObjectConnection(false));
+ const bool bUserDefined(maEdgeTrack.count() && mbEdgeTrackUserDefined);
+ const bool bApplyTransform(bUserDefined || !bCon1 || !bCon2);
+ const bool bCheckUserDistaces(!IsPasteResize() && mpEdgeInfo->ImpUsesUserDistances());
+ bool bScale(false);
if(bApplyTransform)
{
- // get old transform and invert
- aCompleteTransform = getSdrObjectTransformation();
+ // get old transform and invert, multiply with new transform to get full transform
+ basegfx::B2DHomMatrix aCompleteTransform(basegfx::tools::guaranteeMinimalScaling(aCurrentTransformation));
aCompleteTransform.invert();
- }
+ aCompleteTransform = rTransformation * aCompleteTransform;
- // call parent, set new transform
- SdrTextObj::setSdrObjectTransformation(rTransformation);
+ if(bCheckUserDistaces)
+ {
+ const basegfx::B2DVector aDiagonal(1.0, 1.0);
- if(bApplyTransform)
- {
- // multiply current transform (after change) to get full change
- aCompleteTransform = getSdrObjectTransformation() * aCompleteTransform;
+ bScale = !basegfx::fTools::equal(aDiagonal.getLength(), (aCompleteTransform * aDiagonal).getLength());
+ }
- if(mbEdgeTrackUserDefined)
+ if(bUserDefined)
{
// #120437# special handling when track is user defined
maEdgeTrack.transform(aCompleteTransform);
+
+ mpCon1->SetConnectedSdrObject(0);
+ mpCon1->SetPosition(maEdgeTrack.getB2DPoint(0));
+
+ mpCon2->SetConnectedSdrObject(0);
+ mpCon2->SetPosition(maEdgeTrack.getB2DPoint(maEdgeTrack.count() - 1));
}
else
{
- bool bDirtyEdgeTrack(false);
-
if(!bCon1)
{
// transform first point
- maEdgeTrack.setB2DPoint(0, aCompleteTransform * maEdgeTrack.getB2DPoint(0));
- bDirtyEdgeTrack = true;
+ mpCon1->SetPosition(aCompleteTransform * mpCon1->GetPosition());
}
if(!bCon2)
{
// transform last point
- maEdgeTrack.setB2DPoint(nCount - 1, aCompleteTransform * maEdgeTrack.getB2DPoint(nCount - 1));
- bDirtyEdgeTrack = true;
- }
-
- if(bDirtyEdgeTrack)
- {
- ImpDirtyEdgeTrack();
+ mpCon2->SetPosition(aCompleteTransform * mpCon2->GetPosition());
}
}
}
+ else
+ {
+ // both ends are connected to some SdrObject, thus transforming this
+ // object will do nothing, so no need to call parent and set the new
+ // transform at the underlying SdrObject.
+ // Reactions on changes of the connected SdrObjects is done in Notify.
+ }
- // if resize is not from paste, forget user distances
- if(!IsPasteResize())
+ // if resize contains scale and is not from paste, forget user distances
+ if(bCheckUserDistaces && bScale)
{
- maEdgeInfo.aObj1Line2 = maEdgeInfo.aObj1Line3 = maEdgeInfo.aObj2Line2 = maEdgeInfo.aObj2Line3 = maEdgeInfo.aMiddleLine = basegfx::B2DPoint();
+ mpEdgeInfo->ImpResetUserDistances();
+ ImpSetEdgeInfoToAttr();
+ SetEdgeTrackDirty();
+ SetChanged();
}
}
}
SdrObject* SdrEdgeObj::DoConvertToPolygonObject(bool bBezier, bool bAddText) const
{
+ const_cast< SdrEdgeObj* >(this)->ImpRecalcEdgeTrack();
SdrObject* pRet = ImpConvertMakeObj(basegfx::B2DPolyPolygon(maEdgeTrack), bBezier);
if(bAddText)
@@ -2626,24 +2847,14 @@ sal_uInt32 SdrEdgeObj::GetSnapPointCount() const
basegfx::B2DPoint SdrEdgeObj::GetSnapPoint(sal_uInt32 i) const
{
- const_cast< SdrEdgeObj* >(this)->ImpUndirtyEdgeTrack();
-
if(!i)
{
- return maEdgeTrack.getB2DPoint(0);
+ return mpCon1->GetPosition();
}
else
{
- const sal_uInt32 nAnz(maEdgeTrack.count());
-
- if(nAnz)
- {
- return maEdgeTrack.getB2DPoint(nAnz - 1);
- }
-
+ return mpCon2->GetPosition();
}
-
- return basegfx::B2DPoint();
}
bool SdrEdgeObj::IsPolygonObject() const
@@ -2651,154 +2862,75 @@ bool SdrEdgeObj::IsPolygonObject() const
return false;
}
-sal_uInt32 SdrEdgeObj::GetObjectPointCount() const
+SdrObjGeoData* SdrEdgeObj::NewGeoData() const
{
- return 0;
+ return new SdrEdgeObjGeoData;
}
-basegfx::B2DPoint SdrEdgeObj::GetObjectPoint(sal_uInt32 i) const
+void SdrEdgeObj::SaveGeoData(SdrObjGeoData& rGeo) const
{
- const_cast< SdrEdgeObj* >(this)->ImpUndirtyEdgeTrack();
+ // call parent
+ SdrTextObj::SaveGeoData(rGeo);
- if(!i)
+ SdrEdgeObjGeoData* pEGeo = dynamic_cast< SdrEdgeObjGeoData* >(&rGeo);
+
+ if(pEGeo)
{
- return maEdgeTrack.getB2DPoint(0);
+ *pEGeo->mpCon1 = *mpCon1; // this will ignore owner and make copy inactive
+ *pEGeo->mpCon2 = *mpCon2; // this will ignore owner and make copy inactive
+ pEGeo->maEdgeTrack = maEdgeTrack;
+ *pEGeo->mpEdgeInfo = *mpEdgeInfo;
+ pEGeo->mbEdgeTrackUserDefined = mbEdgeTrackUserDefined;
}
else
{
- const sal_uInt32 nAnz(maEdgeTrack.count());
-
- if(nAnz)
- {
- return maEdgeTrack.getB2DPoint(nAnz - 1);
- }
+ OSL_ENSURE(false, "SaveGeoData with wrong data type (!)");
}
-
- return basegfx::B2DPoint();
}
-void SdrEdgeObj::SetObjectPoint(const basegfx::B2DPoint& rPnt, sal_uInt32 i)
+void SdrEdgeObj::RestGeoData(const SdrObjGeoData& rGeo)
{
- ImpUndirtyEdgeTrack();
+ // call parent
+ SdrTextObj::RestGeoData(rGeo);
- if(!i)
+ const SdrEdgeObjGeoData* pEGeo = dynamic_cast< const SdrEdgeObjGeoData* >(&rGeo);
+
+ if(pEGeo)
{
- maEdgeTrack.setB2DPoint(0, rPnt);
+ *mpCon1 = *pEGeo->mpCon1;
+ *mpCon2 = *pEGeo->mpCon2;
+ maEdgeTrack = pEGeo->maEdgeTrack;
+ *mpEdgeInfo = *pEGeo->mpEdgeInfo;
+ mbEdgeTrackUserDefined = pEGeo->mbEdgeTrackUserDefined;
}
else
{
- const sal_uInt32 nAnz(maEdgeTrack.count());
-
- if(nAnz)
- {
- maEdgeTrack.setB2DPoint(nAnz - 1, rPnt);
- }
- else
- {
- OSL_ENSURE(false, "SetObjectPoint out of bound (!)");
- }
+ OSL_ENSURE(false, "RestGeoData with wrong data type (!)");
}
-
- SetEdgeTrackDirty();
- ActionChanged();
-}
-
-SdrEdgeObjGeoData::SdrEdgeObjGeoData()
-{
- // default connector
- maEdgeTrack.append(basegfx::B2DPoint(0.0, 0.0));
- maEdgeTrack.append(basegfx::B2DPoint(0.0, 100.0));
-}
-
-SdrEdgeObjGeoData::~SdrEdgeObjGeoData()
-{
-}
-
-SdrObjGeoData* SdrEdgeObj::NewGeoData() const
-{
- return new SdrEdgeObjGeoData;
}
-void SdrEdgeObj::SaveGeoData(SdrObjGeoData& rGeo) const
+basegfx::B2DPoint SdrEdgeObj::GetTailPoint(bool bTail) const
{
- SdrTextObj::SaveGeoData(rGeo);
-
- SdrEdgeObjGeoData& rEGeo = dynamic_cast< SdrEdgeObjGeoData& >(rGeo);
- rEGeo.maCon1 = maCon1;
- rEGeo.maCon2 = maCon2;
- rEGeo.maEdgeTrack = maEdgeTrack;
- rEGeo.mbEdgeTrackDirty = mbEdgeTrackDirty;
- rEGeo.mbEdgeTrackUserDefined = mbEdgeTrackUserDefined;
- rEGeo.maEdgeInfo = maEdgeInfo;
-}
-
-void SdrEdgeObj::RestGeoData(const SdrObjGeoData& rGeo)
-{
- SdrTextObj::RestGeoData(rGeo);
- const SdrEdgeObjGeoData& rEGeo = dynamic_cast< const SdrEdgeObjGeoData& >(rGeo);
-
- if(maCon1.mpConnectedSdrObject != rEGeo.maCon1.mpConnectedSdrObject)
+ if(bTail)
{
- if(maCon1.mpConnectedSdrObject)
- {
- EndListening(*maCon1.mpConnectedSdrObject);
- }
-
- maCon1 = rEGeo.maCon1;
-
- if(maCon1.mpConnectedSdrObject)
- {
- StartListening(*maCon1.mpConnectedSdrObject);
- }
+ return mpCon1->GetPosition();
}
-
- if(maCon2.mpConnectedSdrObject != rEGeo.maCon2.mpConnectedSdrObject)
+ else
{
- if(maCon2.mpConnectedSdrObject)
- {
- EndListening(*maCon2.mpConnectedSdrObject);
- }
-
- maCon2 = rEGeo.maCon2;
-
- if(maCon2.mpConnectedSdrObject)
- {
- StartListening(*maCon2.mpConnectedSdrObject);
- }
+ return mpCon2->GetPosition();
}
-
- maEdgeTrack = rEGeo.maEdgeTrack;
- mbEdgeTrackDirty = rEGeo.mbEdgeTrackDirty;
- mbEdgeTrackUserDefined = rEGeo.mbEdgeTrackUserDefined;
- maEdgeInfo = rEGeo.maEdgeInfo;
}
-basegfx::B2DPoint SdrEdgeObj::GetTailPoint( bool bTail ) const
+void SdrEdgeObj::SetTailPoint(bool bTail, const basegfx::B2DPoint& rPt)
{
- if(maEdgeTrack.count())
+ if(bTail)
{
- if(bTail)
- {
- return maEdgeTrack.getB2DPoint(0);
- }
- else
- {
- const sal_uInt32 nAnz(maEdgeTrack.count());
-
- if(nAnz)
- {
- return maEdgeTrack.getB2DPoint(nAnz - 1);
- }
- }
+ mpCon1->SetPosition(rPt);
+ }
+ else
+ {
+ mpCon2->SetPosition(rPt);
}
-
- return basegfx::B2DPoint();
-}
-
-void SdrEdgeObj::SetTailPoint( bool bTail, const basegfx::B2DPoint& rPt )
-{
- ImpSetTailPoint( bTail, rPt );
- SetChanged();
}
/** this method is used by the api to set a glue point for a connection
@@ -2808,10 +2940,7 @@ void SdrEdgeObj::SetTailPoint( bool bTail, const basegfx::B2DPoint& rPt )
*/
void SdrEdgeObj::setGluePointIndex(bool bTail, sal_Int32 nIndex /* = -1 */ )
{
- SdrObjConnection& rConn1 = GetConnection( bTail );
- rConn1.SetAutoVertex( nIndex >= 0 && nIndex <= 3 );
- rConn1.SetBestConnection( nIndex < 0 );
- rConn1.SetBestVertex( nIndex < 0 );
+ SdrObjConnection& rConn1(bTail ? *mpCon1 : *mpCon2);
if( nIndex > 3 )
{
@@ -2819,7 +2948,7 @@ void SdrEdgeObj::setGluePointIndex(bool bTail, sal_Int32 nIndex /* = -1 */ )
// for user defined glue points we have
// to get the id for this index first
- const SdrObject* pCandidate = rConn1.GetObject();
+ const SdrObject* pCandidate = rConn1.GetConnectedSdrObject();
if(pCandidate)
{
@@ -2836,39 +2965,31 @@ void SdrEdgeObj::setGluePointIndex(bool bTail, sal_Int32 nIndex /* = -1 */ )
nIndex = 0;
}
- rConn1.SetConnectorId(nIndex);
-
- SetChanged();
- ImpRecalcEdgeTrack();
+ rConn1.SetConnectorID(nIndex);
+ rConn1.setBestConnection(nIndex < 0);
+ rConn1.setBestVertex(nIndex < 0);
+ rConn1.setAutoVertex(nIndex >= 0 && nIndex <= 3);
}
/** this method is used by the api to return a glue point id for a connection.
See setGluePointId for possible return values */
-sal_Int32 SdrEdgeObj::getGluePointIndex( bool bTail )
+sal_Int32 SdrEdgeObj::getGluePointIndex(bool bTail)
{
- SdrObjConnection& rConn1 = GetConnection( bTail );
+ SdrObjConnection& rConn1(bTail ? *mpCon1 : *mpCon2);
sal_Int32 nId = -1;
- if( !rConn1.IsBestConnection() )
+
+ if(!rConn1.IsBestConnection())
{
nId = rConn1.GetConnectorId();
- if( !rConn1.IsAutoVertex() )
- nId += 3; // SJ: the start api index is 0, whereas the implementation in svx starts from 1
+
+ if(!rConn1.IsAutoVertex())
+ {
+ nId += 4; // The start api index and the implementation index is now both 0
+ }
}
+
return nId;
}
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// for geometry access -> GetEdgeTrackPath()
-
-//::basegfx::B2DPolygon SdrEdgeObj::getEdgeTrack() const
-//{
-// if(mbEdgeTrackDirty)
-// {
-// const_cast< SdrEdgeObj* >(this)->ImpRecalcEdgeTrack();
-// }
-//
-// return maEdgeTrack;
-//}
-
//////////////////////////////////////////////////////////////////////////////
// eof
diff --git a/svx/source/svdraw/svdograf.cxx b/svx/source/svdraw/svdograf.cxx
index d5ff10a4850e..5c308321fd16 100644
--- a/svx/source/svdraw/svdograf.cxx
+++ b/svx/source/svdraw/svdograf.cxx
@@ -475,10 +475,10 @@ SdrObject* SdrGrafObj::CloneSdrObject(SdrModel* pTargetModel) const
// -----------------------------------------------------------------------------
-bool SdrGrafObj::IsSdrGrafObj() const
-{
- return true;
-}
+//bool SdrGrafObj::IsSdrGrafObj() const
+//{
+// return true;
+//}
bool SdrGrafObj::DoesSupportTextIndentingOnLineWidthChange() const
{
diff --git a/svx/source/svdraw/svdotxtr.cxx b/svx/source/svdraw/svdotxtr.cxx
index aeff6460d51e..1d592337297a 100644
--- a/svx/source/svdraw/svdotxtr.cxx
+++ b/svx/source/svdraw/svdotxtr.cxx
@@ -66,21 +66,6 @@ void SdrTextObj::setSdrObjectTransformation(const basegfx::B2DHomMatrix& rTransf
// call parent
SdrAttrObj::setSdrObjectTransformation(rTransformation);
- // TTTT: check if the rebuild works
- //
- //sal_Int32 nHDist=GetTextLeftDistance()+GetTextRightDistance();
- //sal_Int32 nVDist=GetTextUpperDistance()+GetTextLowerDistance();
- //sal_Int32 nTWdt0=aRect.GetWidth ()-1-nHDist; if (nTWdt0<0) nTWdt0=0;
- //sal_Int32 nTHgt0=aRect.GetHeight()-1-nVDist; if (nTHgt0<0) nTHgt0=0;
- //sal_Int32 nTWdt1=rRect.GetWidth ()-1-nHDist; if (nTWdt1<0) nTWdt1=0;
- //sal_Int32 nTHgt1=rRect.GetHeight()-1-nVDist; if (nTHgt1<0) nTHgt1=0;
- // if (nTWdt0!=nTWdt1 && IsAutoGrowWidth() ) SetMinTextFrameWidth(nTWdt1);
- // if (nTHgt0!=nTHgt1 && IsAutoGrowHeight()) SetMinTextFrameHeight(nTHgt1);
- // if (GetFitToSize()==SDRTEXTFIT_RESIZEATTR) {
- // ResizeTextAttributes(Fraction(nTWdt1,nTWdt0),Fraction(nTHgt1,nTHgt0));
- // }
- // AdjustTextFrameWidthAndHeight();
-
// #115391#
AdaptTextMinSize();
diff --git a/svx/source/svdraw/svdouno.cxx b/svx/source/svdraw/svdouno.cxx
index 0f7a1f459ce3..6a83da5e50ce 100644
--- a/svx/source/svdraw/svdouno.cxx
+++ b/svx/source/svdraw/svdouno.cxx
@@ -322,10 +322,10 @@ SdrObject* SdrUnoObj::CloneSdrObject(SdrModel* pTargetModel) const
return pClone;
}
-bool SdrUnoObj::IsSdrUnoObj() const
-{
- return true;
-}
+//bool SdrUnoObj::IsSdrUnoObj() const
+//{
+// return true;
+//}
void SdrUnoObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
{
diff --git a/svx/source/svdraw/svdpage.cxx b/svx/source/svdraw/svdpage.cxx
index bbf1c3fdbfa4..74ef8940068b 100644
--- a/svx/source/svdraw/svdpage.cxx
+++ b/svx/source/svdraw/svdpage.cxx
@@ -163,8 +163,8 @@ void SdrObjList::copyDataFromSdrObjList(const SdrObjList& rSource)
if(pSrcEdge)
{
- SdrObject* pSrcNode1 = pSrcEdge->GetConnectedNode(true);
- SdrObject* pSrcNode2 = pSrcEdge->GetConnectedNode(false);
+ SdrObject* pSrcNode1 = pSrcEdge->GetSdrObjectConnection(true);
+ SdrObject* pSrcNode2 = pSrcEdge->GetSdrObjectConnection(false);
if(pSrcNode1 && pSrcNode1->getParentOfSdrObject() != pSrcEdge->getParentOfSdrObject())
{
@@ -190,7 +190,7 @@ void SdrObjList::copyDataFromSdrObjList(const SdrObjList& rSource)
if(pDstNode1)
{
// Sonst grober Fehler!
- pDstEdge->ConnectToNode(true, pDstNode1);
+ pDstEdge->ConnectToSdrObject(true, pDstNode1);
}
else
{
@@ -206,7 +206,7 @@ void SdrObjList::copyDataFromSdrObjList(const SdrObjList& rSource)
if(pDstNode2)
{
// Node war sonst wohl nicht markiert
- pDstEdge->ConnectToNode(false, pDstNode2);
+ pDstEdge->ConnectToSdrObject(false, pDstNode2);
}
else
{
diff --git a/svx/source/svdraw/svdview.cxx b/svx/source/svdraw/svdview.cxx
index b37f4b921ba8..975f6a9870ea 100644
--- a/svx/source/svdraw/svdview.cxx
+++ b/svx/source/svdraw/svdview.cxx
@@ -58,6 +58,7 @@
#include <drawinglayer/primitive2d/texthierarchyprimitive2d.hxx>
#include <svx/sdr/contact/viewcontact.hxx>
#include <drawinglayer/processor2d/contourextractor2d.hxx>
+#include <svx/svdogrp.hxx>
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -2243,4 +2244,118 @@ void SdrView::MoveHandleByVector(const SdrHdl& rHdl, const basegfx::B2DVector& r
}
////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrObject* SdrView::FindConnector(
+ const basegfx::B2DPoint& rPosition,
+ sal_uInt32& o_rnID,
+ bool& o_rbBest,
+ bool& o_rbAuto,
+ const SdrEdgeObj* pAvoidConnectioWith)
+{
+ SdrObject* pRetval = 0;
+ SdrPageView* pSdrPageView = GetSdrPageView();
+
+ if(pSdrPageView)
+ {
+ SdrObjList* pOL = pSdrPageView->GetCurrentObjectList();
+
+ if(pOL)
+ {
+ const SetOfByte& rVisLayer = pSdrPageView->GetVisibleLayers();
+ sal_uInt32 no(pOL->GetObjCount());
+
+ while(no && !pRetval)
+ {
+ SdrObject* pSdrObjectCandidate = pOL->GetObj(--no);
+ SdrObjGroup* pSdrObjGroup = dynamic_cast< SdrObjGroup* >(pSdrObjectCandidate);
+
+ if(pSdrObjectCandidate &&
+ (pSdrObjGroup || rVisLayer.IsSet(pSdrObjectCandidate->GetLayer())) && // GetLayer at groups is zero
+ (!pAvoidConnectioWith || pAvoidConnectioWith != pSdrObjectCandidate)) // no connections to pAvoidConnectioWith
+ {
+ basegfx::B2DRange aCandidateRange(pSdrObjectCandidate->getObjectRange(this));
+ const double fHitToleranceDoubled(getHitTolLog() * 2.0);
+
+ aCandidateRange.grow(fHitToleranceDoubled);
+
+ if(aCandidateRange.isInside(rPosition))
+ {
+ const sdr::glue::GluePointProvider& rProvider = pSdrObjectCandidate->GetGluePointProvider();
+ const sdr::glue::GluePointVector aUserGluePointVector(rProvider.getUserGluePointVector());
+ const sal_uInt32 nUserGluePointCount(aUserGluePointVector.size());
+ sal_uInt32 a(0);
+ double fShortest(0.0);
+
+ // check for UserGluePoint hit
+ for(a = 0; a < nUserGluePointCount; a++)
+ {
+ const sdr::glue::GluePoint* pGluePointCandidate = aUserGluePointVector[a];
+
+ if(pGluePointCandidate)
+ {
+ const basegfx::B2DPoint aPoint(pSdrObjectCandidate->getSdrObjectTransformation() * pGluePointCandidate->getUnitPosition());
+ const double fDistance(basegfx::B2DVector(aPoint - rPosition).getLength());
+
+ if(fDistance < fHitToleranceDoubled && (basegfx::fTools::equalZero(fShortest) || fDistance < fShortest))
+ {
+ fShortest = fDistance;
+ pRetval = pSdrObjectCandidate;
+ o_rnID = pGluePointCandidate->getID();
+ o_rbBest = false;
+ o_rbAuto = false;
+ }
+ }
+ else
+ {
+ OSL_ENSURE(false, "Got sdr::glue::PointVector with empty entries (!)");
+ }
+ }
+
+ // check for AutoGluePoint hit
+ if(!pRetval)
+ {
+ const sal_uInt32 nAutoGluePointCount(rProvider.getAutoGluePointCount());
+
+ for(a = 0; a < nAutoGluePointCount; a++)
+ {
+ const sdr::glue::GluePoint aLocalPt(rProvider.getAutoGluePointByIndex(a));
+ const basegfx::B2DPoint aPoint(pSdrObjectCandidate->getSdrObjectTransformation() * aLocalPt.getUnitPosition());
+ const double fDistance(basegfx::B2DVector(aPoint - rPosition).getLength());
+
+ if(fDistance < fHitToleranceDoubled && (basegfx::fTools::equalZero(fShortest) || fDistance < fShortest))
+ {
+ fShortest = fDistance;
+ pRetval = pSdrObjectCandidate;
+ o_rnID = a;
+ o_rbBest = false;
+ o_rbAuto = true;
+ }
+ }
+ }
+
+ // check if object is hit and setBestConnection
+ if(!pRetval
+ && !dynamic_cast< const SdrEdgeObj* >(pSdrObjectCandidate)
+ && SdrObjectPrimitiveHit(*pSdrObjectCandidate, rPosition, fHitToleranceDoubled, *this, false, 0)
+ && (!pAvoidConnectioWith || !pAvoidConnectioWith->GetSuppressDefaultConnect()))
+ {
+ pRetval = pSdrObjectCandidate;
+ o_rnID = 0;
+ o_rbBest = true;
+ o_rbAuto = false;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ OSL_ENSURE(false, "Empty current object list from PageView (!)");
+ }
+ }
+
+ return pRetval;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
// eof
diff --git a/svx/source/unodraw/unoshap2.cxx b/svx/source/unodraw/unoshap2.cxx
index fbeeea73674a..382b10b1b9f0 100644
--- a/svx/source/unodraw/unoshap2.cxx
+++ b/svx/source/unodraw/unoshap2.cxx
@@ -496,7 +496,7 @@ void SAL_CALL SvxShapeConnector::connectStart( const uno::Reference< drawing::XC
{
SdrEdgeObj* pEdge = dynamic_cast< SdrEdgeObj* >(mpObj.get());
OSL_ENSURE(pEdge, "OOps, SvxShapeConnector without SdrEdgeObj (!)");
- pEdge->ConnectToNode( sal_True, pShape->mpObj.get() );
+ pEdge->ConnectToSdrObject( true, pShape->mpObj.get() );
}
if( mpModel )
@@ -516,7 +516,7 @@ void SAL_CALL SvxShapeConnector::connectEnd( const uno::Reference< drawing::XCon
{
SdrEdgeObj* pEdge = dynamic_cast< SdrEdgeObj* >(mpObj.get());
OSL_ENSURE(pEdge, "OOps, SvxShapeConnector without SdrEdgeObj (!)");
- pEdge->ConnectToNode( sal_False, pShape->mpObj.get() );
+ pEdge->ConnectToSdrObject( false, pShape->mpObj.get() );
}
if( mpModel )
@@ -533,7 +533,7 @@ void SAL_CALL SvxShapeConnector::disconnectBegin( const uno::Reference< drawing:
{
SdrEdgeObj* pEdge = dynamic_cast< SdrEdgeObj* >(mpObj.get());
OSL_ENSURE(pEdge, "OOps, SvxShapeConnector without SdrEdgeObj (!)");
- pEdge->DisconnectFromNode( sal_True );
+ pEdge->ConnectToSdrObject(true);
}
if( mpModel )
@@ -550,7 +550,7 @@ void SAL_CALL SvxShapeConnector::disconnectEnd( const uno::Reference< drawing::X
{
SdrEdgeObj* pEdge = dynamic_cast< SdrEdgeObj* >(mpObj.get());
OSL_ENSURE(pEdge, "OOps, SvxShapeConnector without SdrEdgeObj (!)");
- pEdge->DisconnectFromNode( sal_False );
+ pEdge->ConnectToSdrObject(false);
}
if( mpModel )
diff --git a/svx/source/unodraw/unoshape.cxx b/svx/source/unodraw/unoshape.cxx
index 9fbd9d12b1aa..e3d3dc465e15 100644
--- a/svx/source/unodraw/unoshape.cxx
+++ b/svx/source/unodraw/unoshape.cxx
@@ -2477,7 +2477,7 @@ bool SvxShape::setPropertyValueImpl( const ::rtl::OUString&, const SfxItemProper
SdrObject* pNode = GetSdrObjectFromXShape( xShape );
if( pNode )
{
- pEdgeObj->ConnectToNode( pProperty->nWID == OWN_ATTR_EDGE_START_OBJ, pNode );
+ pEdgeObj->ConnectToSdrObject( pProperty->nWID == OWN_ATTR_EDGE_START_OBJ, pNode );
pEdgeObj->setGluePointIndex( pProperty->nWID == OWN_ATTR_EDGE_START_OBJ, -1 );
return true;
}
@@ -2519,10 +2519,24 @@ bool SvxShape::setPropertyValueImpl( const ::rtl::OUString&, const SfxItemProper
}
case OWN_ATTR_EDGE_POLYPOLYGONBEZIER:
{
- drawing::PolyPolygonBezierCoords aPolyPoly;
- if ( rValue >>= aPolyPoly )
+ basegfx::B2DPolyPolygon aNewPolyPolygon;
+
+ // #123616# be a little bit more flexible regardin gthe data type used
+ if( rValue.getValueType() == ::getCppuType(( const drawing::PointSequenceSequence*)0))
+ {
+ // get polygpon data from PointSequenceSequence
+ aNewPolyPolygon = basegfx::tools::UnoPointSequenceSequenceToB2DPolyPolygon(
+ *(const drawing::PointSequenceSequence*)rValue.getValue());
+ }
+ else if( rValue.getValueType() == ::getCppuType(( const drawing::PolyPolygonBezierCoords*)0))
+ {
+ // get polygpon data from PolyPolygonBezierCoords
+ aNewPolyPolygon = basegfx::tools::UnoPolyPolygonBezierCoordsToB2DPolyPolygon(
+ *(const drawing::PolyPolygonBezierCoords*)rValue.getValue());
+ }
+
+ if(aNewPolyPolygon.count())
{
- basegfx::B2DPolyPolygon aNewPolyPolygon(basegfx::tools::UnoPolyPolygonBezierCoordsToB2DPolyPolygon(aPolyPoly));
ForceMetricToItemPoolMetric( aNewPolyPolygon );
if(isWriterAnchorUsed())
@@ -3031,7 +3045,7 @@ bool SvxShape::getPropertyValueImpl( const ::rtl::OUString&, const SfxItemProper
case OWN_ATTR_EDGE_START_OBJ:
case OWN_ATTR_EDGE_END_OBJ:
{
- SdrObject* pNode = pEdgeObj->GetConnectedNode(pProperty->nWID == OWN_ATTR_EDGE_START_OBJ);
+ SdrObject* pNode = pEdgeObj->GetSdrObjectConnection(pProperty->nWID == OWN_ATTR_EDGE_START_OBJ);
if(pNode)
{
Reference< drawing::XShape > xShape( GetXShapeForSdrObject( pNode ) );
diff --git a/sw/source/core/frmedt/feshview.cxx b/sw/source/core/frmedt/feshview.cxx
index 5f5cf217a695..fabe65d2f858 100644
--- a/sw/source/core/frmedt/feshview.cxx
+++ b/sw/source/core/frmedt/feshview.cxx
@@ -88,6 +88,7 @@
#include <svx/fmmodel.hxx>
#include <svx/svdview.hxx>
#include <switerator.hxx>
+#include <svx/obj3d.hxx>
#define SCROLLVAL 75
@@ -2252,7 +2253,7 @@ sal_Bool SwFEShell::IsGroupSelected()
// Thus, use corresponding method instead of checking type.
if ( pObj->getChildrenOfSdrObject() &&
// --> FME 2004-12-08 #i38505# No ungroup allowed for 3d objects
- !pObj->IsE3dObject() &&
+ !dynamic_cast< E3dObject* >(pObj) &&
// <--
FLY_AS_CHAR != ((SwDrawContact*)findConnectionToSdrObject(pObj))->
GetFmt()->GetAnchor().GetAnchorId() )
diff --git a/sw/source/core/text/txtfly.cxx b/sw/source/core/text/txtfly.cxx
index 2c4e317aecb4..ac3693cd0012 100644
--- a/sw/source/core/text/txtfly.cxx
+++ b/sw/source/core/text/txtfly.cxx
@@ -1147,7 +1147,7 @@ sal_Bool SwTxtFly::GetTop( const SwAnchoredObject* _pAnchoredObj,
if(pSdrEdgeObj)
{
- if(pSdrEdgeObj->GetConnectedNode(true) || pSdrEdgeObj->GetConnectedNode(false))
+ if(pSdrEdgeObj->GetSdrObjectConnection(true) || pSdrEdgeObj->GetSdrObjectConnection(false))
{
return sal_False;
}
diff --git a/sw/source/core/text/txtio.cxx b/sw/source/core/text/txtio.cxx
index d7430808330d..88ffe0c41373 100644
--- a/sw/source/core/text/txtio.cxx
+++ b/sw/source/core/text/txtio.cxx
@@ -178,7 +178,7 @@ void lcl_OutFrame( SvFileStream& rStr, const SwFrm* pFrm, ByteString& rSp, sal_B
}
else
{
- aTmp = pAnchoredObj->GetDrawObj()->IsSdrUnoObj() ? "UNO" : "Drw";
+ aTmp = dynamic_cast< SdrUnoObj* >(pAnchoredObj->GetDrawObj()) ? "UNO" : "Drw";
rStr << aTmp;
}
// <--
@@ -205,7 +205,7 @@ void lcl_OutFrame( SvFileStream& rStr, const SwFrm* pFrm, ByteString& rSp, sal_B
}
else
{
- aTmp = pAnchoredObj->GetDrawObj()->IsSdrUnoObj() ? "UNO" : "Drw";
+ aTmp = dynamic_cast< SdrUnoObj* >(pAnchoredObj->GetDrawObj()) ? "UNO" : "Drw";
rStr << aTmp;
}
if( i < nCnt - 1 )
diff --git a/sw/source/ui/uiview/viewdraw.cxx b/sw/source/ui/uiview/viewdraw.cxx
index 842893d1638e..9653ff68592f 100644
--- a/sw/source/ui/uiview/viewdraw.cxx
+++ b/sw/source/ui/uiview/viewdraw.cxx
@@ -77,6 +77,7 @@
#include <svx/svdpagv.hxx>
#include <svx/extrusionbar.hxx>
#include <vcl/svapp.hxx>
+#include <svx/obj3d.hxx>
using namespace ::com::sun::star;
/*--------------------------------------------------------------------
@@ -745,7 +746,7 @@ sal_Bool SwView::HasDrwObj(SdrObject *pSdrObj) const
if ((bRet = HasDrwObj(pList->GetObj(i))) == sal_True)
break;
}
- else if (SdrInventor == pSdrObj->GetObjInventor() || pSdrObj->IsE3dObject())
+ else if (SdrInventor == pSdrObj->GetObjInventor() || dynamic_cast< E3dObject* >(pSdrObj))
return sal_True;
return bRet;