summaryrefslogtreecommitdiff
path: root/svx/source/svdraw/svdpoev.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/svdraw/svdpoev.cxx')
-rw-r--r--svx/source/svdraw/svdpoev.cxx746
1 files changed, 746 insertions, 0 deletions
diff --git a/svx/source/svdraw/svdpoev.cxx b/svx/source/svdraw/svdpoev.cxx
new file mode 100644
index 000000000000..ae98ae8f8cf3
--- /dev/null
+++ b/svx/source/svdraw/svdpoev.cxx
@@ -0,0 +1,746 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_svx.hxx"
+
+#include <svx/svdpoev.hxx>
+#include <math.h>
+#include <svx/svdpagv.hxx>
+#include <svx/svdpage.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/svdundo.hxx>
+#include "svx/svdstr.hrc" // Namen aus der Resource
+#include "svx/svdglob.hxx" // StringCache
+#include <svx/svdtrans.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <vcl/salbtype.hxx> // FRound
+
+#include <svx/polypolygoneditor.hxx>
+
+using namespace sdr;
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrPolyEditView::ImpResetPolyPossibilityFlags()
+{
+ eMarkedPointsSmooth=SDRPATHSMOOTH_DONTCARE;
+ eMarkedSegmentsKind=SDRPATHSEGMENT_DONTCARE;
+ bSetMarkedPointsSmoothPossible=sal_False;
+ bSetMarkedSegmentsKindPossible=sal_False;
+}
+
+void SdrPolyEditView::ImpClearVars()
+{
+ ImpResetPolyPossibilityFlags();
+}
+
+SdrPolyEditView::SdrPolyEditView(SdrModel* pModel1, OutputDevice* pOut):
+ SdrEditView(pModel1,pOut)
+{
+ ImpClearVars();
+}
+
+SdrPolyEditView::~SdrPolyEditView()
+{
+}
+
+void SdrPolyEditView::ImpCheckPolyPossibilities()
+{
+ ImpResetPolyPossibilityFlags();
+ const sal_uIntPtr nMarkAnz(GetMarkedObjectCount());
+
+ if(nMarkAnz && !ImpIsFrameHandles())
+ {
+ bool b1stSmooth(true);
+ bool b1stSegm(true);
+ bool bCurve(false);
+ bool bSmoothFuz(false);
+ bool bSegmFuz(false);
+ basegfx::B2VectorContinuity eSmooth = basegfx::CONTINUITY_NONE;
+
+ for(sal_uIntPtr nMarkNum(0L); nMarkNum < nMarkAnz; nMarkNum++)
+ {
+ SdrMark* pM = GetSdrMarkByIndex(nMarkNum);
+ CheckPolyPossibilitiesHelper( pM, b1stSmooth, b1stSegm, bCurve, bSmoothFuz, bSegmFuz, eSmooth );
+ }
+ }
+}
+
+void SdrPolyEditView::CheckPolyPossibilitiesHelper( SdrMark* pM, bool& b1stSmooth, bool& b1stSegm, bool& bCurve, bool& bSmoothFuz, bool& bSegmFuz, basegfx::B2VectorContinuity& eSmooth )
+{
+ SdrObject* pObj = pM->GetMarkedSdrObj();
+ SdrUShortCont* pPts = pM->GetMarkedPoints();
+ SdrPathObj* pPath = PTR_CAST(SdrPathObj,pObj);
+
+ if(pPath && pPts)
+ {
+ const sal_uInt32 nMarkedPntAnz(pPts->GetCount());
+
+ if(nMarkedPntAnz)
+ {
+ bool bClosed(pPath->IsClosed());
+ bSetMarkedPointsSmoothPossible = true;
+
+ if(bClosed)
+ {
+ bSetMarkedSegmentsKindPossible = true;
+ }
+
+ for(sal_uInt32 nMarkedPntNum(0L); nMarkedPntNum < nMarkedPntAnz; nMarkedPntNum++)
+ {
+ sal_uInt32 nNum(pPts->GetObject(nMarkedPntNum));
+ sal_uInt32 nPolyNum, nPntNum;
+
+ if(PolyPolygonEditor::GetRelativePolyPoint(pPath->GetPathPoly(), nNum, nPolyNum, nPntNum))
+ {
+ const basegfx::B2DPolygon aLocalPolygon(pPath->GetPathPoly().getB2DPolygon(nPolyNum));
+ bool bCanSegment(bClosed || nPntNum < aLocalPolygon.count() - 1L);
+
+ if(!bSetMarkedSegmentsKindPossible && bCanSegment)
+ {
+ bSetMarkedSegmentsKindPossible = true;
+ }
+
+ if(!bSmoothFuz)
+ {
+ if (b1stSmooth)
+ {
+ b1stSmooth = false;
+ eSmooth = basegfx::tools::getContinuityInPoint(aLocalPolygon, nPntNum);
+ }
+ else
+ {
+ bSmoothFuz = (eSmooth != basegfx::tools::getContinuityInPoint(aLocalPolygon, nPntNum));
+ }
+ }
+
+ if(!bSegmFuz)
+ {
+ if(bCanSegment)
+ {
+ bool bCrv(aLocalPolygon.isNextControlPointUsed(nPntNum));
+
+ if(b1stSegm)
+ {
+ b1stSegm = false;
+ bCurve = bCrv;
+ }
+ else
+ {
+ bSegmFuz = (bCrv != bCurve);
+ }
+ }
+ }
+ }
+ }
+
+ if(!b1stSmooth && !bSmoothFuz)
+ {
+ if(basegfx::CONTINUITY_NONE == eSmooth)
+ {
+ eMarkedPointsSmooth = SDRPATHSMOOTH_ANGULAR;
+ }
+
+ if(basegfx::CONTINUITY_C1 == eSmooth)
+ {
+ eMarkedPointsSmooth = SDRPATHSMOOTH_ASYMMETRIC;
+ }
+
+ if(basegfx::CONTINUITY_C2 == eSmooth)
+ {
+ eMarkedPointsSmooth = SDRPATHSMOOTH_SYMMETRIC;
+ }
+ }
+
+ if(!b1stSegm && !bSegmFuz)
+ {
+ eMarkedSegmentsKind = (bCurve) ? SDRPATHSEGMENT_CURVE : SDRPATHSEGMENT_LINE;
+ }
+ }
+ }
+}
+
+void SdrPolyEditView::SetMarkedPointsSmooth(SdrPathSmoothKind eKind)
+{
+ basegfx::B2VectorContinuity eFlags;
+
+ if(SDRPATHSMOOTH_ANGULAR == eKind)
+ {
+ eFlags = basegfx::CONTINUITY_NONE;
+ }
+ else if(SDRPATHSMOOTH_ASYMMETRIC == eKind)
+ {
+ eFlags = basegfx::CONTINUITY_C1;
+ }
+ else if(SDRPATHSMOOTH_SYMMETRIC == eKind)
+ {
+ eFlags = basegfx::CONTINUITY_C2;
+ }
+ else
+ {
+ return;
+ }
+
+ if(HasMarkedPoints())
+ {
+ SortMarkedObjects();
+
+ const bool bUndo = IsUndoEnabled();
+ if( bUndo )
+ BegUndo(ImpGetResStr(STR_EditSetPointsSmooth), GetDescriptionOfMarkedPoints());
+ sal_uIntPtr nMarkAnz(GetMarkedObjectCount());
+
+ for(sal_uIntPtr nMarkNum(nMarkAnz); nMarkNum > 0L;)
+ {
+ nMarkNum--;
+ SdrMark* pM = GetSdrMarkByIndex(nMarkNum);
+ SdrUShortCont* pPts = pM->GetMarkedPoints();
+ SdrPathObj* pPath = dynamic_cast< SdrPathObj* >( pM->GetMarkedSdrObj() );
+
+ if(pPts && pPath)
+ {
+ PolyPolygonEditor aEditor( pPath->GetPathPoly(), pPath->IsClosed() );
+ if(aEditor.SetPointsSmooth( eFlags, pPts->getContainer() ) )
+ {
+ if( bUndo )
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pPath));
+ pPath->SetPathPoly(aEditor.GetPolyPolygon());
+ }
+ }
+ }
+
+ if( bUndo )
+ EndUndo();
+ }
+}
+
+void SdrPolyEditView::SetMarkedSegmentsKind(SdrPathSegmentKind eKind)
+{
+ if(HasMarkedPoints())
+ {
+ SortMarkedObjects();
+
+ const bool bUndo = IsUndoEnabled();
+ if( bUndo )
+ BegUndo(ImpGetResStr(STR_EditSetSegmentsKind), GetDescriptionOfMarkedPoints());
+ sal_uIntPtr nMarkAnz(GetMarkedObjectCount());
+
+ for(sal_uIntPtr nMarkNum(nMarkAnz); nMarkNum > 0L;)
+ {
+ nMarkNum--;
+ SdrMark* pM = GetSdrMarkByIndex(nMarkNum);
+ SdrUShortCont* pPts = pM->GetMarkedPoints();
+ SdrPathObj* pPath = dynamic_cast< SdrPathObj* >( pM->GetMarkedSdrObj() );
+
+ if(pPts && pPath)
+ {
+ PolyPolygonEditor aEditor( pPath->GetPathPoly(), pPath->IsClosed() );
+ if(aEditor.SetSegmentsKind( eKind, pPts->getContainer()) )
+ {
+ if( bUndo )
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pPath));
+ pPath->SetPathPoly(aEditor.GetPolyPolygon());
+ }
+ }
+ }
+
+ if( bUndo )
+ EndUndo();
+ }
+}
+
+sal_Bool SdrPolyEditView::IsSetMarkedPointsSmoothPossible() const
+{
+ ForcePossibilities();
+ return bSetMarkedPointsSmoothPossible;
+}
+
+SdrPathSmoothKind SdrPolyEditView::GetMarkedPointsSmooth() const
+{
+ ForcePossibilities();
+ return eMarkedPointsSmooth;
+}
+
+sal_Bool SdrPolyEditView::IsSetMarkedSegmentsKindPossible() const
+{
+ ForcePossibilities();
+ return bSetMarkedSegmentsKindPossible;
+}
+
+SdrPathSegmentKind SdrPolyEditView::GetMarkedSegmentsKind() const
+{
+ ForcePossibilities();
+ return eMarkedSegmentsKind;
+}
+
+sal_Bool SdrPolyEditView::IsDeleteMarkedPointsPossible() const
+{
+ return HasMarkedPoints();
+}
+
+void SdrPolyEditView::DeleteMarkedPoints()
+{
+ if (HasMarkedPoints())
+ {
+ BrkAction();
+ SortMarkedObjects();
+ sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
+
+ const bool bUndo = IsUndoEnabled();
+ if( bUndo )
+ {
+ // Description
+ BegUndo(ImpGetResStr(STR_EditDelete),GetDescriptionOfMarkedPoints(),SDRREPFUNC_OBJ_DELETE);
+ }
+
+ for (sal_uIntPtr nMarkNum=nMarkAnz; nMarkNum>0;)
+ {
+ nMarkNum--;
+ SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
+ SdrUShortCont* pPts=pM->GetMarkedPoints();
+ SdrPathObj* pPath = dynamic_cast< SdrPathObj* >( pM->GetMarkedSdrObj() );
+
+ if( pPath && pPts )
+ {
+ PolyPolygonEditor aEditor( pPath ->GetPathPoly(), pPath->IsClosed() );
+ if( aEditor.DeletePoints( pPts->getContainer() ) )
+ {
+ if( aEditor.GetPolyPolygon().count() )
+ {
+ if( bUndo )
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pPath ));
+ pPath->SetPathPoly( aEditor.GetPolyPolygon() );
+ }
+ else
+ {
+ if( bUndo )
+ AddUndo( GetModel()->GetSdrUndoFactory().CreateUndoDeleteObject(*pPath ) );
+ pM->GetPageView()->GetObjList()->RemoveObject(pPath->GetOrdNum());
+ if( !bUndo )
+ {
+ SdrObject* pObj = pPath;
+ SdrObject::Free(pObj);
+ }
+ }
+ }
+ }
+ }
+
+ if( bUndo )
+ EndUndo();
+ UnmarkAllPoints();
+ MarkListHasChanged();
+ }
+}
+
+void SdrPolyEditView::RipUpAtMarkedPoints()
+{
+ if(HasMarkedPoints())
+ {
+ SortMarkedObjects();
+ sal_uInt32 nMarkAnz(GetMarkedObjectCount());
+
+ const bool bUndo = IsUndoEnabled();
+ if( bUndo )
+ BegUndo(ImpGetResStr(STR_EditRipUp), GetDescriptionOfMarkedPoints());
+
+ for(sal_uInt32 nMarkNum(nMarkAnz); nMarkNum > 0L;)
+ {
+ nMarkNum--;
+ SdrMark* pM = GetSdrMarkByIndex(nMarkNum);
+ SdrUShortCont* pPts = pM->GetMarkedPoints();
+ SdrPathObj* pObj = PTR_CAST(SdrPathObj, pM->GetMarkedSdrObj());
+
+ if(pPts && pObj)
+ {
+ pPts->ForceSort();
+ if( bUndo )
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj));
+ sal_Bool bKorregFlag(sal_False);
+ sal_uInt32 nMarkPtsAnz(pPts->GetCount());
+ sal_uInt32 nMax(pObj->GetHdlCount());
+
+ for(sal_uInt32 i(nMarkPtsAnz); i > 0L;)
+ {
+ i--;
+ sal_uInt32 nNewPt0Idx(0L);
+ SdrObject* pNeuObj = pObj->RipPoint(pPts->GetObject(i), nNewPt0Idx);
+
+ if(pNeuObj)
+ {
+ SdrInsertReason aReason(SDRREASON_VIEWCALL, pObj);
+ pM->GetPageView()->GetObjList()->InsertObject(pNeuObj, pObj->GetOrdNum() + 1, &aReason);
+ if( bUndo )
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoNewObject(*pNeuObj));
+ MarkObj(pNeuObj, pM->GetPageView(), sal_False, sal_True);
+ }
+
+ if(nNewPt0Idx)
+ {
+ // Korrektur notwendig?
+ DBG_ASSERT(bKorregFlag==sal_False,"Mehrfache Indexkorrektur bei SdrPolyEditView::RipUp()");
+ if(!bKorregFlag)
+ {
+ bKorregFlag = sal_True;
+
+ for(sal_uInt32 nBla(0L); nBla < nMarkPtsAnz; nBla++)
+ {
+ sal_uInt32 nPntNum(pPts->GetObject(nBla));
+ nPntNum += nNewPt0Idx;
+
+ if(nPntNum >= nMax)
+ {
+ nPntNum -= nMax;
+ }
+
+ pPts->Replace((sal_uInt16)nPntNum, nBla);
+ }
+
+ i = nMarkPtsAnz; // ... und nochmal von vorn
+ }
+ }
+ }
+ }
+ }
+
+ UnmarkAllPoints();
+ if( bUndo )
+ EndUndo();
+ MarkListHasChanged();
+ }
+}
+
+bool SdrPolyEditView::IsRipUpAtMarkedPointsPossible() const
+{
+ bool bRetval(false);
+ const sal_uInt32 nMarkCount(GetMarkedObjectCount());
+
+ for(sal_uInt32 a(0); a < nMarkCount; a++)
+ {
+ const SdrMark* pMark = GetSdrMarkByIndex(a);
+ const SdrPathObj* pMarkedPathObject = dynamic_cast< const SdrPathObj* >(pMark->GetMarkedSdrObj());
+
+ if(pMarkedPathObject)
+ {
+ const SdrUShortCont* pSelectedPoints = pMark->GetMarkedPoints();
+
+ if(pSelectedPoints && pSelectedPoints->GetCount())
+ {
+ const basegfx::B2DPolyPolygon& rPathPolyPolygon = pMarkedPathObject->GetPathPoly();
+
+ if(1 == rPathPolyPolygon.count())
+ {
+ // #i76617# Do not yet use basegfx::B2DPolygon since curve definitions
+ // are different and methods need to be changed thoroughly with interaction rework
+ const Polygon aPathPolygon(rPathPolyPolygon.getB2DPolygon(0));
+ const sal_uInt16 nPointCount(aPathPolygon.GetSize());
+
+ if(nPointCount >= 3)
+ {
+ bRetval = pMarkedPathObject->IsClosedObj(); // #i76617# aPathPolygon.isClosed();
+
+ for(sal_uInt32 b(0); !bRetval && b < pSelectedPoints->GetCount(); b++)
+ {
+ const sal_uInt16 nMarkedPointNum(pSelectedPoints->GetObject(b));
+
+ bRetval = (nMarkedPointNum > 0 && nMarkedPointNum < nPointCount - 1);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return bRetval;
+}
+
+bool SdrPolyEditView::IsOpenCloseMarkedObjectsPossible() const
+{
+ bool bRetval(false);
+ const sal_uInt32 nMarkCount(GetMarkedObjectCount());
+
+ for(sal_uInt32 a(0); a < nMarkCount; a++)
+ {
+ const SdrMark* pMark = GetSdrMarkByIndex(a);
+ const SdrPathObj* pMarkedPathObject = dynamic_cast< const SdrPathObj* >(pMark->GetMarkedSdrObj());
+
+ if(pMarkedPathObject)
+ {
+ // #i76617# Do not yet use basegfx::B2DPolygon since curve definitions
+ // are different and methods need to be changed thoroughly with interaction rework
+ const PolyPolygon aPathPolyPolygon(pMarkedPathObject->GetPathPoly());
+ const sal_uInt16 nPolygonCount(aPathPolyPolygon.Count());
+
+ for(sal_uInt16 b(0); !bRetval && b < nPolygonCount; b++)
+ {
+ const Polygon& rPathPolygon = aPathPolyPolygon[b];
+ const sal_uInt16 nPointCount(rPathPolygon.GetSize());
+
+ bRetval = (nPointCount >= 3);
+ }
+ }
+ }
+
+ return bRetval;
+}
+
+SdrObjClosedKind SdrPolyEditView::GetMarkedObjectsClosedState() const
+{
+ bool bOpen(false);
+ bool bClosed(false);
+ const sal_uInt32 nMarkCount(GetMarkedObjectCount());
+
+ for(sal_uInt32 a(0); !(bOpen && bClosed) && a < nMarkCount; a++)
+ {
+ const SdrMark* pMark = GetSdrMarkByIndex(a);
+ const SdrPathObj* pMarkedPathObject = dynamic_cast< const SdrPathObj* >(pMark->GetMarkedSdrObj());
+
+ if(pMarkedPathObject)
+ {
+ if(pMarkedPathObject->IsClosedObj())
+ {
+ bClosed = true;
+ }
+ else
+ {
+ bOpen = true;
+ }
+ }
+ }
+
+ if(bOpen && bClosed)
+ {
+ return SDROBJCLOSED_DONTCARE;
+ }
+ else if(bOpen)
+ {
+ return SDROBJCLOSED_OPEN;
+ }
+ else
+ {
+ return SDROBJCLOSED_CLOSED;
+ }
+}
+
+void SdrPolyEditView::ShutMarkedObjects()
+{
+ CloseMarkedObjects();
+}
+
+void SdrPolyEditView::CloseMarkedObjects(sal_Bool bToggle, sal_Bool bOpen) // , long nOpenDistance)
+{
+ if (AreObjectsMarked())
+ {
+ const bool bUndo = IsUndoEnabled();
+ if( bUndo )
+ BegUndo(ImpGetResStr(STR_EditShut),GetDescriptionOfMarkedPoints());
+
+ bool bChg=false;
+ sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
+ for (sal_uIntPtr nm=0; nm<nMarkAnz; nm++)
+ {
+ SdrMark* pM=GetSdrMarkByIndex(nm);
+ SdrObject* pO=pM->GetMarkedSdrObj();
+ sal_Bool bClosed=pO->IsClosedObj();
+ if ((pO->IsPolyObj() && (bClosed==bOpen)) || bToggle)
+ {
+ if( bUndo )
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pO));
+
+ SdrPathObj* pPathObj = dynamic_cast< SdrPathObj* >( pO );
+ if(pPathObj)
+ pPathObj->ToggleClosed();
+ bChg=true;
+ }
+ }
+
+ if( bUndo )
+ EndUndo();
+
+ if (bChg)
+ {
+ UnmarkAllPoints();
+ MarkListHasChanged();
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrPolyEditView::ImpCopyMarkedPoints()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrPolyEditView::ImpTransformMarkedPoints(PPolyTrFunc pTrFunc, const void* p1, const void* p2, const void* p3, const void* p4, const void* p5)
+{
+ const bool bUndo = IsUndoEnabled();
+
+ sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
+ for (sal_uIntPtr nm=0; nm<nMarkAnz; nm++)
+ {
+ SdrMark* pM=GetSdrMarkByIndex(nm);
+ SdrObject* pObj=pM->GetMarkedSdrObj();
+ const SdrUShortCont* pPts=pM->GetMarkedPoints();
+ sal_uIntPtr nPtAnz=pPts==NULL ? 0 : pPts->GetCount();
+ SdrPathObj* pPath=PTR_CAST(SdrPathObj,pObj);
+ if (nPtAnz!=0 && pPath!=NULL)
+ {
+ if( bUndo )
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj));
+
+ basegfx::B2DPolyPolygon aXPP(pPath->GetPathPoly());
+
+ for(sal_uInt32 nPtNum(0L); nPtNum < nPtAnz; nPtNum++)
+ {
+ sal_uInt32 nPt(pPts->GetObject(nPtNum));
+ sal_uInt32 nPolyNum, nPointNum;
+
+ if(PolyPolygonEditor::GetRelativePolyPoint(aXPP, nPt, nPolyNum, nPointNum))
+ {
+ //#i83671# used nLocalPointNum (which was the polygon point count)
+ // instead of the point index (nPointNum). This of course leaded
+ // to a wrong point access to the B2DPolygon.
+ basegfx::B2DPolygon aNewXP(aXPP.getB2DPolygon(nPolyNum));
+ Point aPos, aC1, aC2;
+ bool bC1(false);
+ bool bC2(false);
+
+ const basegfx::B2DPoint aB2DPos(aNewXP.getB2DPoint(nPointNum));
+ aPos = Point(FRound(aB2DPos.getX()), FRound(aB2DPos.getY()));
+
+ if(aNewXP.isPrevControlPointUsed(nPointNum))
+ {
+ const basegfx::B2DPoint aB2DC1(aNewXP.getPrevControlPoint(nPointNum));
+ aC1 = Point(FRound(aB2DC1.getX()), FRound(aB2DC1.getY()));
+ bC1 = true;
+ }
+
+ if(aNewXP.isNextControlPointUsed(nPointNum))
+ {
+ const basegfx::B2DPoint aB2DC2(aNewXP.getNextControlPoint(nPointNum));
+ aC2 = Point(FRound(aB2DC2.getX()), FRound(aB2DC2.getY()));
+ bC2 = true;
+ }
+
+ (*pTrFunc)(aPos,&aC1,&aC2,p1,p2,p3,p4,p5);
+ aNewXP.setB2DPoint(nPointNum, basegfx::B2DPoint(aPos.X(), aPos.Y()));
+
+ if (bC1)
+ {
+ aNewXP.setPrevControlPoint(nPointNum, basegfx::B2DPoint(aC1.X(), aC1.Y()));
+ }
+
+ if (bC2)
+ {
+ aNewXP.setNextControlPoint(nPointNum, basegfx::B2DPoint(aC2.X(), aC2.Y()));
+ }
+
+ aXPP.setB2DPolygon(nPolyNum, aNewXP);
+ }
+ }
+
+ pPath->SetPathPoly(aXPP);
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void ImpMove(Point& rPt, Point* pC1, Point* pC2, const void* p1, const void* /*p2*/, const void* /*p3*/, const void* /*p4*/, const void* /*p5*/)
+{
+ MovePoint(rPt,*(const Size*)p1);
+ if (pC1!=NULL) MovePoint(*pC1,*(const Size*)p1);
+ if (pC2!=NULL) MovePoint(*pC2,*(const Size*)p1);
+}
+
+void SdrPolyEditView::MoveMarkedPoints(const Size& rSiz, bool bCopy)
+{
+ bCopy=sal_False; // noch nicht implementiert
+ ForceUndirtyMrkPnt();
+ XubString aStr(ImpGetResStr(STR_EditMove));
+ if (bCopy) aStr+=ImpGetResStr(STR_EditWithCopy);
+ BegUndo(aStr,GetDescriptionOfMarkedPoints(),SDRREPFUNC_OBJ_MOVE);
+ if (bCopy) ImpCopyMarkedPoints();
+ ImpTransformMarkedPoints(ImpMove,&rSiz);
+ EndUndo();
+ AdjustMarkHdl();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void ImpResize(Point& rPt, Point* pC1, Point* pC2, const void* p1, const void* p2, const void* p3, const void* /*p4*/, const void* /*p5*/)
+{
+ ResizePoint(rPt,*(const Point*)p1,*(const Fraction*)p2,*(const Fraction*)p3);
+ if (pC1!=NULL) ResizePoint(*pC1,*(const Point*)p1,*(const Fraction*)p2,*(const Fraction*)p3);
+ if (pC2!=NULL) ResizePoint(*pC2,*(const Point*)p1,*(const Fraction*)p2,*(const Fraction*)p3);
+}
+
+void SdrPolyEditView::ResizeMarkedPoints(const Point& rRef, const Fraction& xFact, const Fraction& yFact, bool bCopy)
+{
+ bCopy=sal_False; // noch nicht implementiert
+ ForceUndirtyMrkPnt();
+ XubString aStr(ImpGetResStr(STR_EditResize));
+ if (bCopy) aStr+=ImpGetResStr(STR_EditWithCopy);
+ BegUndo(aStr,GetDescriptionOfMarkedPoints(),SDRREPFUNC_OBJ_RESIZE);
+ if (bCopy) ImpCopyMarkedPoints();
+ ImpTransformMarkedPoints(ImpResize,&rRef,&xFact,&yFact);
+ EndUndo();
+ AdjustMarkHdl();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void ImpRotate(Point& rPt, Point* pC1, Point* pC2, const void* p1, const void* /*p2*/, const void* p3, const void* p4, const void* /*p5*/)
+{
+ RotatePoint(rPt,*(const Point*)p1,*(const double*)p3,*(const double*)p4);
+ if (pC1!=NULL) RotatePoint(*pC1,*(const Point*)p1,*(const double*)p3,*(const double*)p4);
+ if (pC2!=NULL) RotatePoint(*pC2,*(const Point*)p1,*(const double*)p3,*(const double*)p4);
+}
+
+void SdrPolyEditView::RotateMarkedPoints(const Point& rRef, long nWink, bool bCopy)
+{
+ bCopy=sal_False; // noch nicht implementiert
+ ForceUndirtyMrkPnt();
+ XubString aStr(ImpGetResStr(STR_EditResize));
+ if (bCopy) aStr+=ImpGetResStr(STR_EditWithCopy);
+ BegUndo(aStr,GetDescriptionOfMarkedPoints(),SDRREPFUNC_OBJ_ROTATE);
+ if (bCopy) ImpCopyMarkedPoints();
+ double nSin=sin(nWink*nPi180);
+ double nCos=cos(nWink*nPi180);
+ ImpTransformMarkedPoints(ImpRotate,&rRef,&nWink,&nSin,&nCos);
+ EndUndo();
+ AdjustMarkHdl();
+}
+
+// eof
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */