diff options
author | Armin Le Grand <alg@apache.org> | 2013-11-18 17:20:49 +0000 |
---|---|---|
committer | Armin Le Grand <alg@apache.org> | 2013-11-18 17:20:49 +0000 |
commit | 3e7d04fab78e5cc0aabd545283acc0dfe60ef86e (patch) | |
tree | 7bb3e09502b466686c2b28d3a09eb9b756c108a9 | |
parent | e9a2d5e2889fe43565fcf453fa9db3875187d20b (diff) |
Continued connector and gluepoint cleanup, further reworks
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; |