summaryrefslogtreecommitdiff
path: root/svx/source/svdraw/svdglev.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/svdraw/svdglev.cxx')
-rw-r--r--svx/source/svdraw/svdglev.cxx422
1 files changed, 422 insertions, 0 deletions
diff --git a/svx/source/svdraw/svdglev.cxx b/svx/source/svdraw/svdglev.cxx
new file mode 100644
index 000000000000..6eab2ea7ecfa
--- /dev/null
+++ b/svx/source/svdraw/svdglev.cxx
@@ -0,0 +1,422 @@
+/*************************************************************************
+ *
+ * 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/svdglev.hxx>
+#include <math.h>
+
+#include <svx/svdundo.hxx>
+#include "svdstr.hrc" // Namen aus der Resource
+#include "svdglob.hxx" // StringCache
+#include <svx/svdpagv.hxx>
+#include <svx/svdglue.hxx>
+#include <svx/svdtrans.hxx>
+#include <svx/svdobj.hxx>
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrGlueEditView::ImpClearVars()
+{
+}
+
+SdrGlueEditView::SdrGlueEditView(SdrModel* pModel1, OutputDevice* pOut):
+ SdrPolyEditView(pModel1,pOut)
+{
+ ImpClearVars();
+}
+
+SdrGlueEditView::~SdrGlueEditView()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrGlueEditView::ImpDoMarkedGluePoints(PGlueDoFunc pDoFunc, BOOL bConst, const void* p1, const void* p2, const void* p3, const void* p4, const void* p5)
+{
+ ULONG nMarkAnz=GetMarkedObjectCount();
+ for (ULONG nm=0; nm<nMarkAnz; nm++) {
+ SdrMark* pM=GetSdrMarkByIndex(nm);
+ SdrObject* pObj=pM->GetMarkedSdrObj();
+ const SdrUShortCont* pPts=pM->GetMarkedGluePoints();
+ ULONG nPtAnz=pPts==NULL ? 0 : pPts->GetCount();
+ if (nPtAnz!=0) {
+ SdrGluePointList* pGPL=NULL;
+ if (bConst) {
+ const SdrGluePointList* pConstGPL=pObj->GetGluePointList();
+ pGPL=(SdrGluePointList*)pConstGPL;
+ } else {
+ pGPL=pObj->ForceGluePointList();
+ }
+ if (pGPL!=NULL)
+ {
+ if(!bConst && IsUndoEnabled() )
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj));
+
+ for (ULONG nPtNum=0; nPtNum<nPtAnz; nPtNum++)
+ {
+ USHORT nPtId=pPts->GetObject(nPtNum);
+ USHORT nGlueIdx=pGPL->FindGluePoint(nPtId);
+ if (nGlueIdx!=SDRGLUEPOINT_NOTFOUND)
+ {
+ SdrGluePoint& rGP=(*pGPL)[nGlueIdx];
+ (*pDoFunc)(rGP,pObj,p1,p2,p3,p4,p5);
+ }
+ }
+ if (!bConst)
+ {
+ pObj->SetChanged();
+ pObj->BroadcastObjectChange();
+ }
+ }
+ }
+ }
+ if (!bConst && nMarkAnz!=0) pMod->SetChanged();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void ImpGetEscDir(SdrGluePoint& rGP, const SdrObject* /*pObj*/, const void* pbFirst, const void* pnThisEsc, const void* pnRet, const void*, const void*)
+{
+ USHORT& nRet=*(USHORT*)pnRet;
+ BOOL& bFirst=*(BOOL*)pbFirst;
+ if (nRet!=FUZZY) {
+ USHORT nEsc=rGP.GetEscDir();
+ BOOL bOn=(nEsc & *(USHORT*)pnThisEsc)!=0;
+ if (bFirst) { nRet=bOn; bFirst=FALSE; }
+ else if (nRet!=bOn) nRet=FUZZY;
+ }
+}
+
+TRISTATE SdrGlueEditView::IsMarkedGluePointsEscDir(USHORT nThisEsc) const
+{
+ ForceUndirtyMrkPnt();
+ BOOL bFirst=TRUE;
+ USHORT nRet=FALSE;
+ ((SdrGlueEditView*)this)->ImpDoMarkedGluePoints(ImpGetEscDir,TRUE,&bFirst,&nThisEsc,&nRet);
+ return (TRISTATE)nRet;
+}
+
+static void ImpSetEscDir(SdrGluePoint& rGP, const SdrObject* /*pObj*/, const void* pnThisEsc, const void* pbOn, const void*, const void*, const void*)
+{
+ USHORT nEsc=rGP.GetEscDir();
+ if (*(BOOL*)pbOn) nEsc|=*(USHORT*)pnThisEsc;
+ else nEsc&=~*(USHORT*)pnThisEsc;
+ rGP.SetEscDir(nEsc);
+}
+
+void SdrGlueEditView::SetMarkedGluePointsEscDir(USHORT nThisEsc, BOOL bOn)
+{
+ ForceUndirtyMrkPnt();
+ BegUndo(ImpGetResStr(STR_EditSetGlueEscDir),GetDescriptionOfMarkedGluePoints());
+ ImpDoMarkedGluePoints(ImpSetEscDir,FALSE,&nThisEsc,&bOn);
+ EndUndo();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void ImpGetPercent(SdrGluePoint& rGP, const SdrObject* /*pObj*/, const void* pbFirst, const void* pnRet, const void*, const void*, const void*)
+{
+ USHORT& nRet=*(USHORT*)pnRet;
+ BOOL& bFirst=*(BOOL*)pbFirst;
+ if (nRet!=FUZZY) {
+ bool bOn=rGP.IsPercent();
+ if (bFirst) { nRet=bOn; bFirst=FALSE; }
+ else if ((nRet!=0)!=bOn) nRet=FUZZY;
+ }
+}
+
+TRISTATE SdrGlueEditView::IsMarkedGluePointsPercent() const
+{
+ ForceUndirtyMrkPnt();
+ BOOL bFirst=TRUE;
+ USHORT nRet=TRUE;
+ ((SdrGlueEditView*)this)->ImpDoMarkedGluePoints(ImpGetPercent,TRUE,&bFirst,&nRet);
+ return (TRISTATE)nRet;
+}
+
+static void ImpSetPercent(SdrGluePoint& rGP, const SdrObject* pObj, const void* pbOn, const void*, const void*, const void*, const void*)
+{
+ Point aPos(rGP.GetAbsolutePos(*pObj));
+ rGP.SetPercent(*(BOOL*)pbOn);
+ rGP.SetAbsolutePos(aPos,*pObj);
+}
+
+void SdrGlueEditView::SetMarkedGluePointsPercent(BOOL bOn)
+{
+ ForceUndirtyMrkPnt();
+ BegUndo(ImpGetResStr(STR_EditSetGluePercent),GetDescriptionOfMarkedGluePoints());
+ ImpDoMarkedGluePoints(ImpSetPercent,FALSE,&bOn);
+ EndUndo();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void ImpGetAlign(SdrGluePoint& rGP, const SdrObject* /*pObj*/, const void* pbFirst, const void* pbDontCare, const void* pbVert, const void* pnRet, const void*)
+{
+ USHORT& nRet=*(USHORT*)pnRet;
+ BOOL& bFirst=*(BOOL*)pbFirst;
+ BOOL& bDontCare=*(BOOL*)pbDontCare;
+ BOOL bVert=*(BOOL*)pbVert;
+ if (!bDontCare) {
+ USHORT nAlg=0;
+ if (bVert) {
+ nAlg=rGP.GetVertAlign();
+ } else {
+ nAlg=rGP.GetHorzAlign();
+ }
+ if (bFirst) { nRet=nAlg; bFirst=FALSE; }
+ else if (nRet!=nAlg) {
+ if (bVert) {
+ nRet=SDRVERTALIGN_DONTCARE;
+ } else {
+ nRet=SDRHORZALIGN_DONTCARE;
+ }
+ bDontCare=TRUE;
+ }
+ }
+}
+
+USHORT SdrGlueEditView::GetMarkedGluePointsAlign(BOOL bVert) const
+{
+ ForceUndirtyMrkPnt();
+ BOOL bFirst=TRUE;
+ BOOL bDontCare=FALSE;
+ USHORT nRet=0;
+ ((SdrGlueEditView*)this)->ImpDoMarkedGluePoints(ImpGetAlign,TRUE,&bFirst,&bDontCare,&bVert,&nRet);
+ return nRet;
+}
+
+static void ImpSetAlign(SdrGluePoint& rGP, const SdrObject* pObj, const void* pbVert, const void* pnAlign, const void*, const void*, const void*)
+{
+ Point aPos(rGP.GetAbsolutePos(*pObj));
+ if (*(BOOL*)pbVert) { // bVert?
+ rGP.SetVertAlign(*(USHORT*)pnAlign);
+ } else {
+ rGP.SetHorzAlign(*(USHORT*)pnAlign);
+ }
+ rGP.SetAbsolutePos(aPos,*pObj);
+}
+
+void SdrGlueEditView::SetMarkedGluePointsAlign(BOOL bVert, USHORT nAlign)
+{
+ ForceUndirtyMrkPnt();
+ BegUndo(ImpGetResStr(STR_EditSetGlueAlign),GetDescriptionOfMarkedGluePoints());
+ ImpDoMarkedGluePoints(ImpSetAlign,FALSE,&bVert,&nAlign);
+ EndUndo();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+BOOL SdrGlueEditView::IsDeleteMarkedGluePointsPossible() const
+{
+ return HasMarkedGluePoints();
+}
+
+void SdrGlueEditView::DeleteMarkedGluePoints()
+{
+ BrkAction();
+ ForceUndirtyMrkPnt();
+ const bool bUndo = IsUndoEnabled();
+ if( bUndo )
+ BegUndo(ImpGetResStr(STR_EditDelete),GetDescriptionOfMarkedGluePoints(),SDRREPFUNC_OBJ_DELETE);
+
+ ULONG nMarkAnz=GetMarkedObjectCount();
+ for (ULONG nm=0; nm<nMarkAnz; nm++)
+ {
+ SdrMark* pM=GetSdrMarkByIndex(nm);
+ SdrObject* pObj=pM->GetMarkedSdrObj();
+ const SdrUShortCont* pPts=pM->GetMarkedGluePoints();
+ ULONG nPtAnz=pPts==NULL ? 0 : pPts->GetCount();
+ if (nPtAnz!=0)
+ {
+ SdrGluePointList* pGPL=pObj->ForceGluePointList();
+ if (pGPL!=NULL)
+ {
+ if( bUndo )
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj));
+
+ for (ULONG nPtNum=0; nPtNum<nPtAnz; nPtNum++)
+ {
+ USHORT nPtId=pPts->GetObject(nPtNum);
+ USHORT nGlueIdx=pGPL->FindGluePoint(nPtId);
+ if (nGlueIdx!=SDRGLUEPOINT_NOTFOUND)
+ {
+ pGPL->Delete(nGlueIdx);
+ }
+ }
+ pObj->SetChanged();
+ pObj->BroadcastObjectChange();
+ }
+ }
+ }
+ if( bUndo )
+ EndUndo();
+ UnmarkAllGluePoints();
+ if (nMarkAnz!=0)
+ pMod->SetChanged();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrGlueEditView::ImpCopyMarkedGluePoints()
+{
+ const bool bUndo = IsUndoEnabled();
+
+ if( bUndo )
+ BegUndo();
+
+ ULONG nMarkAnz=GetMarkedObjectCount();
+ for (ULONG nm=0; nm<nMarkAnz; nm++)
+ {
+ SdrMark* pM=GetSdrMarkByIndex(nm);
+ SdrObject* pObj=pM->GetMarkedSdrObj();
+ SdrUShortCont* pPts=pM->GetMarkedGluePoints();
+ SdrGluePointList* pGPL=pObj->ForceGluePointList();
+ ULONG nPtAnz=pPts==NULL ? 0 : pPts->GetCount();
+ if (nPtAnz!=0 && pGPL!=NULL)
+ {
+ if( bUndo )
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj));
+
+ for (ULONG nPtNum=0; nPtNum<nPtAnz; nPtNum++)
+ {
+ USHORT nPtId=pPts->GetObject(nPtNum);
+ USHORT nGlueIdx=pGPL->FindGluePoint(nPtId);
+ if (nGlueIdx!=SDRGLUEPOINT_NOTFOUND)
+ {
+ SdrGluePoint aNewGP((*pGPL)[nGlueIdx]); // GluePoint klonen
+ USHORT nNewIdx=pGPL->Insert(aNewGP); // und einfuegen
+ USHORT nNewId=(*pGPL)[nNewIdx].GetId(); // Id des neuen GluePoints ermitteln
+ pPts->Replace(nNewId,nPtNum); // und diesen markieren (anstelle des alten)
+ }
+ }
+ }
+ }
+ if( bUndo )
+ EndUndo();
+
+ if (nMarkAnz!=0)
+ pMod->SetChanged();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrGlueEditView::ImpTransformMarkedGluePoints(PGlueTrFunc pTrFunc, const void* p1, const void* p2, const void* p3, const void* p4, const void* p5)
+{
+ ULONG nMarkAnz=GetMarkedObjectCount();
+ for (ULONG nm=0; nm<nMarkAnz; nm++) {
+ SdrMark* pM=GetSdrMarkByIndex(nm);
+ SdrObject* pObj=pM->GetMarkedSdrObj();
+ const SdrUShortCont* pPts=pM->GetMarkedGluePoints();
+ ULONG nPtAnz=pPts==NULL ? 0 : pPts->GetCount();
+ if (nPtAnz!=0) {
+ SdrGluePointList* pGPL=pObj->ForceGluePointList();
+ if (pGPL!=NULL)
+ {
+ if( IsUndoEnabled() )
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj));
+
+ for (ULONG nPtNum=0; nPtNum<nPtAnz; nPtNum++) {
+ USHORT nPtId=pPts->GetObject(nPtNum);
+ USHORT nGlueIdx=pGPL->FindGluePoint(nPtId);
+ if (nGlueIdx!=SDRGLUEPOINT_NOTFOUND) {
+ SdrGluePoint& rGP=(*pGPL)[nGlueIdx];
+ Point aPos(rGP.GetAbsolutePos(*pObj));
+ (*pTrFunc)(aPos,p1,p2,p3,p4,p5);
+ rGP.SetAbsolutePos(aPos,*pObj);
+ }
+ }
+ pObj->SetChanged();
+ pObj->BroadcastObjectChange();
+ }
+ }
+ }
+ if (nMarkAnz!=0) pMod->SetChanged();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void ImpMove(Point& rPt, const void* p1, const void* /*p2*/, const void* /*p3*/, const void* /*p4*/, const void* /*p5*/)
+{
+ rPt.X()+=((const Size*)p1)->Width();
+ rPt.Y()+=((const Size*)p1)->Height();
+}
+
+void SdrGlueEditView::MoveMarkedGluePoints(const Size& rSiz, bool bCopy)
+{
+ ForceUndirtyMrkPnt();
+ XubString aStr(ImpGetResStr(STR_EditMove));
+ if (bCopy) aStr+=ImpGetResStr(STR_EditWithCopy);
+ BegUndo(aStr,GetDescriptionOfMarkedGluePoints(),SDRREPFUNC_OBJ_MOVE);
+ if (bCopy) ImpCopyMarkedGluePoints();
+ ImpTransformMarkedGluePoints(ImpMove,&rSiz);
+ EndUndo();
+ AdjustMarkHdl();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void ImpResize(Point& rPt, 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);
+}
+
+void SdrGlueEditView::ResizeMarkedGluePoints(const Point& rRef, const Fraction& xFact, const Fraction& yFact, bool bCopy)
+{
+ ForceUndirtyMrkPnt();
+ XubString aStr(ImpGetResStr(STR_EditResize));
+ if (bCopy) aStr+=ImpGetResStr(STR_EditWithCopy);
+ BegUndo(aStr,GetDescriptionOfMarkedGluePoints(),SDRREPFUNC_OBJ_RESIZE);
+ if (bCopy) ImpCopyMarkedGluePoints();
+ ImpTransformMarkedGluePoints(ImpResize,&rRef,&xFact,&yFact);
+ EndUndo();
+ AdjustMarkHdl();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void ImpRotate(Point& rPt, 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);
+}
+
+void SdrGlueEditView::RotateMarkedGluePoints(const Point& rRef, long nWink, bool bCopy)
+{
+ ForceUndirtyMrkPnt();
+ XubString aStr(ImpGetResStr(STR_EditRotate));
+ if (bCopy) aStr+=ImpGetResStr(STR_EditWithCopy);
+ BegUndo(aStr,GetDescriptionOfMarkedGluePoints(),SDRREPFUNC_OBJ_ROTATE);
+ if (bCopy) ImpCopyMarkedGluePoints();
+ double nSin=sin(nWink*nPi180);
+ double nCos=cos(nWink*nPi180);
+ ImpTransformMarkedGluePoints(ImpRotate,&rRef,&nWink,&nSin,&nCos);
+ EndUndo();
+ AdjustMarkHdl();
+}
+