summaryrefslogtreecommitdiff
path: root/svx/source/svdraw/svddrgv.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/svdraw/svddrgv.cxx')
-rw-r--r--svx/source/svdraw/svddrgv.cxx1009
1 files changed, 1009 insertions, 0 deletions
diff --git a/svx/source/svdraw/svddrgv.cxx b/svx/source/svdraw/svddrgv.cxx
new file mode 100644
index 000000000000..e232947cf933
--- /dev/null
+++ b/svx/source/svdraw/svddrgv.cxx
@@ -0,0 +1,1009 @@
+/* -*- 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/svddrgv.hxx>
+#include "svx/xattr.hxx"
+#include <svx/xpoly.hxx>
+#include <svx/svdetc.hxx>
+#include <svx/svdtrans.hxx>
+#include <svx/svdundo.hxx>
+#include <svx/svdocapt.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/svdoedge.hxx>
+#include "svx/svdstr.hrc"
+#include "svx/svdglob.hxx"
+#include "svddrgm1.hxx"
+#include <svx/obj3d.hxx>
+#include <svx/svdoashp.hxx>
+#include <svx/sdrpaintwindow.hxx>
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <svx/polypolygoneditor.hxx>
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <svx/sdr/overlay/overlaymanager.hxx>
+
+using namespace sdr;
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// @@@@@ @@@@@ @@@@ @@@@ @@ @@ @@ @@@@@ @@ @@
+// @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
+// @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @ @@
+// @@ @@ @@@@@ @@@@@@ @@ @@@ @@@@@ @@ @@@@ @@@@@@@
+// @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@@@@@
+// @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@ @@@
+// @@@@@ @@ @@ @@ @@ @@@@@ @ @@ @@@@@ @@ @@
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrDragView::ImpClearVars()
+{
+ bFramDrag=sal_False;
+ eDragMode=SDRDRAG_MOVE;
+ bDragLimit=sal_False;
+ bMarkedHitMovesAlways=sal_False;
+ eDragHdl=HDL_MOVE;
+ pDragHdl=NULL;
+ bDragHdl=sal_False;
+ bDragSpecial=sal_False;
+ mpCurrentSdrDragMethod=NULL;
+ bDragStripes=sal_False;
+ bMirrRefDragObj=sal_True;
+ bDragWithCopy=sal_False;
+ pInsPointUndo=NULL;
+ bInsGluePoint=sal_False;
+ bInsObjPointMode=sal_False;
+ bInsGluePointMode=sal_False;
+ nDragXorPolyLimit=100;
+ nDragXorPointLimit=500;
+ bNoDragXorPolys=sal_False;
+ bAutoVertexCon=sal_True;
+ bAutoCornerCon=sal_False;
+ bRubberEdgeDragging=sal_True;
+ nRubberEdgeDraggingLimit=100;
+ bDetailedEdgeDragging=sal_True;
+ nDetailedEdgeDraggingLimit=10;
+ bResizeAtCenter=sal_False;
+ bCrookAtCenter=sal_False;
+ bMouseHideWhileDraggingPoints=sal_False;
+
+ // init using default
+ mbSolidDragging = getOptionsDrawinglayer().IsSolidDragCreate();
+}
+
+void SdrDragView::ImpMakeDragAttr()
+{
+ ImpDelDragAttr();
+}
+
+SdrDragView::SdrDragView(SdrModel* pModel1, OutputDevice* pOut)
+: SdrExchangeView(pModel1,pOut)
+{
+ ImpClearVars();
+ ImpMakeDragAttr();
+}
+
+SdrDragView::~SdrDragView()
+{
+ ImpDelDragAttr();
+}
+
+void SdrDragView::ImpDelDragAttr()
+{
+}
+
+sal_Bool SdrDragView::IsAction() const
+{
+ return (mpCurrentSdrDragMethod || SdrExchangeView::IsAction());
+}
+
+void SdrDragView::MovAction(const Point& rPnt)
+{
+ SdrExchangeView::MovAction(rPnt);
+ if (mpCurrentSdrDragMethod)
+ {
+ MovDragObj(rPnt);
+ }
+}
+
+void SdrDragView::EndAction()
+{
+ if (mpCurrentSdrDragMethod)
+ {
+ EndDragObj(sal_False);
+ }
+ SdrExchangeView::EndAction();
+}
+
+void SdrDragView::BckAction()
+{
+ SdrExchangeView::BckAction();
+ BrkDragObj();
+}
+
+void SdrDragView::BrkAction()
+{
+ SdrExchangeView::BrkAction();
+ BrkDragObj();
+}
+
+void SdrDragView::TakeActionRect(Rectangle& rRect) const
+{
+ if (mpCurrentSdrDragMethod)
+ {
+ rRect=aDragStat.GetActionRect();
+ if (rRect.IsEmpty())
+ {
+ SdrPageView* pPV = GetSdrPageView();
+
+ if(pPV&& pPV->HasMarkedObjPageView())
+ {
+ // #i95646# is this used..?
+ const basegfx::B2DRange aBoundRange(mpCurrentSdrDragMethod->getCurrentRange());
+ rRect = Rectangle(
+ basegfx::fround(aBoundRange.getMinX()), basegfx::fround(aBoundRange.getMinY()),
+ basegfx::fround(aBoundRange.getMaxX()), basegfx::fround(aBoundRange.getMaxY()));
+ }
+ }
+ if (rRect.IsEmpty())
+ {
+ rRect=Rectangle(aDragStat.GetNow(),aDragStat.GetNow());
+ }
+ }
+ else
+ {
+ SdrExchangeView::TakeActionRect(rRect);
+ }
+}
+
+sal_Bool SdrDragView::TakeDragObjAnchorPos(Point& rPos, sal_Bool bTR ) const
+{
+ Rectangle aR;
+ TakeActionRect(aR);
+ rPos = bTR ? aR.TopRight() : aR.TopLeft();
+ if (GetMarkedObjectCount()==1 && IsDragObj() && // nur bei Einzelselektion
+ !IsDraggingPoints() && !IsDraggingGluePoints() && // nicht beim Punkteschieben
+ !mpCurrentSdrDragMethod->ISA(SdrDragMovHdl)) // nicht beim Handlesschieben
+ {
+ SdrObject* pObj=GetMarkedObjectByIndex(0);
+ if (pObj->ISA(SdrCaptionObj))
+ {
+ Point aPt(((SdrCaptionObj*)pObj)->GetTailPos());
+ sal_Bool bTail=eDragHdl==HDL_POLY; // Schwanz wird gedraggt (nicht so ganz feine Abfrage hier)
+ sal_Bool bOwn=mpCurrentSdrDragMethod->ISA(SdrDragObjOwn); // Objektspeziefisch
+ if (!bTail)
+ { // bei bTail liefert TakeActionRect schon das richtige
+ if (bOwn)
+ { // bOwn kann sein MoveTextFrame, ResizeTextFrame aber eben nicht mehr DragTail
+ rPos=aPt;
+ }
+ else
+ {
+ // drag the whole Object (Move, Resize, ...)
+ const basegfx::B2DPoint aTransformed(mpCurrentSdrDragMethod->getCurrentTransformation() * basegfx::B2DPoint(aPt.X(), aPt.Y()));
+ rPos.X() = basegfx::fround(aTransformed.getX());
+ rPos.Y() = basegfx::fround(aTransformed.getY());
+ }
+ }
+ }
+ return sal_True;
+ }
+ return sal_False;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+sal_Bool SdrDragView::TakeDragLimit(SdrDragMode /*eMode*/, Rectangle& /*rRect*/) const
+{
+ return sal_False;
+}
+
+sal_Bool SdrDragView::BegDragObj(const Point& rPnt, OutputDevice* pOut, SdrHdl* pHdl, short nMinMov, SdrDragMethod* pForcedMeth)
+{
+ BrkAction();
+
+ bool bRet=false;
+ {
+ SetDragWithCopy(sal_False);
+ //ForceEdgesOfMarkedNodes();
+ //TODO: aAni.Reset();
+ mpCurrentSdrDragMethod=NULL;
+ bDragSpecial=sal_False;
+ bDragLimit=sal_False;
+ SdrDragMode eTmpMode=eDragMode;
+ if (eTmpMode==SDRDRAG_MOVE && pHdl!=NULL && pHdl->GetKind()!=HDL_MOVE) {
+ eTmpMode=SDRDRAG_RESIZE;
+ }
+ bDragLimit=TakeDragLimit(eTmpMode,aDragLimit);
+ bFramDrag=ImpIsFrameHandles();
+ if (!bFramDrag &&
+ (pMarkedObj==NULL || !pMarkedObj->hasSpecialDrag()) &&
+ (pHdl==NULL || pHdl->GetObj()==NULL)) {
+ bFramDrag=sal_True;
+ }
+
+ Point aPnt(rPnt);
+ if(pHdl == NULL
+ || pHdl->GetKind() == HDL_MOVE
+ || pHdl->GetKind() == HDL_MIRX
+ || pHdl->GetKind() == HDL_TRNS
+ || pHdl->GetKind() == HDL_GRAD)
+ {
+ aDragStat.Reset(aPnt);
+ }
+ else
+ {
+ aDragStat.Reset(pHdl->GetPos());
+ }
+
+ aDragStat.SetView((SdrView*)this);
+ aDragStat.SetPageView(pMarkedPV); // <<-- hier muss die DragPV rein!!!
+ aDragStat.SetMinMove(ImpGetMinMovLogic(nMinMov,pOut));
+ aDragStat.SetHdl(pHdl);
+ aDragStat.NextPoint();
+ pDragWin=pOut;
+ pDragHdl=pHdl;
+ eDragHdl= pHdl==NULL ? HDL_MOVE : pHdl->GetKind();
+ bDragHdl=eDragHdl==HDL_REF1 || eDragHdl==HDL_REF2 || eDragHdl==HDL_MIRX;
+
+ // #103894# Expand test for HDL_ANCHOR_TR
+ sal_Bool bNotDraggable = (HDL_ANCHOR == eDragHdl || HDL_ANCHOR_TR == eDragHdl);
+
+ if(pHdl && (pHdl->GetKind() == HDL_SMARTTAG) && pForcedMeth )
+ {
+ // just use the forced method for smart tags
+ }
+ else if(bDragHdl)
+ {
+ mpCurrentSdrDragMethod = new SdrDragMovHdl(*this);
+ }
+ else if(!bNotDraggable)
+ {
+ switch (eDragMode)
+ {
+ case SDRDRAG_ROTATE: case SDRDRAG_SHEAR: case SDRDRAG_DISTORT:
+ {
+ switch (eDragHdl)
+ {
+ case HDL_LEFT: case HDL_RIGHT:
+ case HDL_UPPER: case HDL_LOWER:
+ {
+ // Sind 3D-Objekte selektiert?
+ sal_Bool b3DObjSelected = sal_False;
+ for(sal_uInt32 a=0;!b3DObjSelected && a<GetMarkedObjectCount();a++)
+ {
+ SdrObject* pObj = GetMarkedObjectByIndex(a);
+ if(pObj && pObj->ISA(E3dObject))
+ b3DObjSelected = sal_True;
+ }
+ // Falls ja, Shear auch bei !IsShearAllowed zulassen,
+ // da es sich bei 3D-Objekten um eingeschraenkte
+ // Rotationen handelt
+ if (!b3DObjSelected && !IsShearAllowed())
+ return sal_False;
+ mpCurrentSdrDragMethod = new SdrDragShear(*this,eDragMode==SDRDRAG_ROTATE);
+ } break;
+ case HDL_UPLFT: case HDL_UPRGT:
+ case HDL_LWLFT: case HDL_LWRGT:
+ {
+ if (eDragMode==SDRDRAG_SHEAR || eDragMode==SDRDRAG_DISTORT)
+ {
+ if (!IsDistortAllowed(sal_True) && !IsDistortAllowed(sal_False)) return sal_False;
+ mpCurrentSdrDragMethod = new SdrDragDistort(*this);
+ }
+ else
+ {
+ if (!IsRotateAllowed(sal_True)) return sal_False;
+ mpCurrentSdrDragMethod = new SdrDragRotate(*this);
+ }
+ } break;
+ default:
+ {
+ if (IsMarkedHitMovesAlways() && eDragHdl==HDL_MOVE)
+ { // HDL_MOVE ist auch wenn Obj direkt getroffen
+ if (!IsMoveAllowed()) return sal_False;
+ mpCurrentSdrDragMethod = new SdrDragMove(*this);
+ }
+ else
+ {
+ if (!IsRotateAllowed(sal_True)) return sal_False;
+ mpCurrentSdrDragMethod = new SdrDragRotate(*this);
+ }
+ }
+ }
+ } break;
+ case SDRDRAG_MIRROR:
+ {
+ if (eDragHdl==HDL_MOVE && IsMarkedHitMovesAlways())
+ {
+ if (!IsMoveAllowed()) return sal_False;
+ mpCurrentSdrDragMethod = new SdrDragMove(*this);
+ }
+ else
+ {
+ if (!IsMirrorAllowed(sal_True,sal_True)) return sal_False;
+ mpCurrentSdrDragMethod = new SdrDragMirror(*this);
+ }
+ } break;
+
+ case SDRDRAG_CROP:
+ {
+ if (eDragHdl==HDL_MOVE && IsMarkedHitMovesAlways())
+ {
+ if (!IsMoveAllowed())
+ return sal_False;
+ mpCurrentSdrDragMethod = new SdrDragMove(*this);
+ }
+ else
+ {
+ if (!IsCrookAllowed(sal_True) && !IsCrookAllowed(sal_False))
+ return sal_False;
+ mpCurrentSdrDragMethod = new SdrDragCrop(*this);
+ }
+ }
+ break;
+
+ case SDRDRAG_TRANSPARENCE:
+ {
+ if(eDragHdl == HDL_MOVE && IsMarkedHitMovesAlways())
+ {
+ if(!IsMoveAllowed())
+ return sal_False;
+ mpCurrentSdrDragMethod = new SdrDragMove(*this);
+ }
+ else
+ {
+ if(!IsTransparenceAllowed())
+ return sal_False;
+
+ mpCurrentSdrDragMethod = new SdrDragGradient(*this, sal_False);
+ }
+ break;
+ }
+ case SDRDRAG_GRADIENT:
+ {
+ if(eDragHdl == HDL_MOVE && IsMarkedHitMovesAlways())
+ {
+ if(!IsMoveAllowed())
+ return sal_False;
+ mpCurrentSdrDragMethod = new SdrDragMove(*this);
+ }
+ else
+ {
+ if(!IsGradientAllowed())
+ return sal_False;
+
+ mpCurrentSdrDragMethod = new SdrDragGradient(*this);
+ }
+ break;
+ }
+
+ case SDRDRAG_CROOK :
+ {
+ if (eDragHdl==HDL_MOVE && IsMarkedHitMovesAlways())
+ {
+ if (!IsMoveAllowed()) return sal_False;
+ mpCurrentSdrDragMethod = new SdrDragMove(*this);
+ }
+ else
+ {
+ if (!IsCrookAllowed(sal_True) && !IsCrookAllowed(sal_False)) return sal_False;
+ mpCurrentSdrDragMethod = new SdrDragCrook(*this);
+ }
+ } break;
+
+ default:
+ {
+ // SDRDRAG_MOVE
+ if((eDragHdl == HDL_MOVE) && !IsMoveAllowed())
+ {
+ return sal_False;
+ }
+ else if(eDragHdl == HDL_GLUE)
+ {
+ mpCurrentSdrDragMethod = new SdrDragMove(*this);
+ }
+ else
+ {
+ if(bFramDrag)
+ {
+ if(eDragHdl == HDL_MOVE)
+ {
+ mpCurrentSdrDragMethod = new SdrDragMove(*this);
+ }
+ else
+ {
+ if(!IsResizeAllowed(sal_True))
+ {
+ return sal_False;
+ }
+
+ sal_Bool bSingleTextObjMark = sal_False; // SJ: #i100490#
+ if ( GetMarkedObjectCount() == 1 )
+ {
+ pMarkedObj=GetMarkedObjectByIndex(0);
+ if ( pMarkedObj &&
+ pMarkedObj->ISA( SdrTextObj ) &&
+ static_cast<SdrTextObj*>(pMarkedObj)->IsTextFrame() )
+ bSingleTextObjMark = sal_True;
+ }
+ if ( bSingleTextObjMark )
+ mpCurrentSdrDragMethod = new SdrDragObjOwn(*this);
+ else
+ mpCurrentSdrDragMethod = new SdrDragResize(*this);
+ }
+ }
+ else
+ {
+ if(HDL_MOVE == eDragHdl)
+ {
+ const bool bCustomShapeSelected(1 == GetMarkedObjectCount() && GetMarkedObjectByIndex(0)->ISA(SdrObjCustomShape));
+
+ if(bCustomShapeSelected)
+ {
+ mpCurrentSdrDragMethod = new SdrDragMove( *this );
+ }
+ }
+ else if(HDL_POLY == eDragHdl)
+ {
+ const bool bConnectorSelected(1 == GetMarkedObjectCount() && GetMarkedObjectByIndex(0)->ISA(SdrEdgeObj));
+
+ if(bConnectorSelected)
+ {
+ // #i97784#
+ // fallback to old behaviour for connectors (see
+ // text in task description for more details)
+ }
+ else if(!IsMoveAllowed() || !IsResizeAllowed())
+ {
+ // #i77187#
+ // do not allow move of polygon points if object is move or size protected
+ return sal_False;
+ }
+ }
+
+ if(!mpCurrentSdrDragMethod)
+ {
+ // fallback to DragSpecial if no interaction defined
+ bDragSpecial = sal_True;
+ mpCurrentSdrDragMethod = new SdrDragObjOwn(*this);
+ }
+ }
+ }
+ }
+ }
+ }
+ if (pForcedMeth!=NULL)
+ {
+ delete mpCurrentSdrDragMethod;
+ mpCurrentSdrDragMethod = pForcedMeth;
+ }
+ aDragStat.SetDragMethod(mpCurrentSdrDragMethod);
+ if (mpCurrentSdrDragMethod)
+ {
+ bRet = mpCurrentSdrDragMethod->BeginSdrDrag();
+ if (!bRet)
+ {
+ if (pHdl==NULL && IS_TYPE(SdrDragObjOwn,mpCurrentSdrDragMethod))
+ {
+ // Aha, Obj kann nicht Move SpecialDrag, also MoveFrameDrag versuchen
+ delete mpCurrentSdrDragMethod;
+ mpCurrentSdrDragMethod = 0;
+ bDragSpecial=sal_False;
+
+ if (!IsMoveAllowed())
+ return sal_False;
+
+ bFramDrag=sal_True;
+ mpCurrentSdrDragMethod = new SdrDragMove(*this);
+ aDragStat.SetDragMethod(mpCurrentSdrDragMethod);
+ bRet = mpCurrentSdrDragMethod->BeginSdrDrag();
+ }
+ }
+ if (!bRet)
+ {
+ delete mpCurrentSdrDragMethod;
+ mpCurrentSdrDragMethod = 0;
+ aDragStat.SetDragMethod(mpCurrentSdrDragMethod);
+ }
+ }
+ }
+
+ return bRet;
+}
+
+void SdrDragView::MovDragObj(const Point& rPnt)
+{
+ if (mpCurrentSdrDragMethod)
+ {
+ Point aPnt(rPnt);
+ ImpLimitToWorkArea(aPnt);
+ mpCurrentSdrDragMethod->MoveSdrDrag(aPnt); // this call already makes a Hide()/Show combination
+ }
+}
+
+sal_Bool SdrDragView::EndDragObj(sal_Bool bCopy)
+{
+ bool bRet(false);
+
+ // #i73341# If insert GluePoint, do not insist on last points being different
+ if(mpCurrentSdrDragMethod && aDragStat.IsMinMoved() && (IsInsertGluePoint() || aDragStat.GetNow() != aDragStat.GetPrev()))
+ {
+ sal_uIntPtr nHdlAnzMerk=0;
+
+ if (bEliminatePolyPoints)
+ { // IBM Special
+ nHdlAnzMerk=GetMarkablePointCount();
+ }
+
+ const bool bUndo = IsUndoEnabled();
+ if (IsInsertGluePoint() && bUndo)
+ {
+ BegUndo(aInsPointUndoStr);
+ AddUndo(pInsPointUndo);
+ }
+
+ bRet = mpCurrentSdrDragMethod->EndSdrDrag(bCopy);
+
+ if( IsInsertGluePoint() && bUndo)
+ EndUndo();
+
+ delete mpCurrentSdrDragMethod;
+ mpCurrentSdrDragMethod = 0;
+
+ if (bEliminatePolyPoints)
+ { // IBM Special
+ if (nHdlAnzMerk!=GetMarkablePointCount())
+ {
+ UnmarkAllPoints();
+ }
+ }
+
+ if (bInsPolyPoint)
+ {
+ SetMarkHandles();
+ bInsPolyPoint=sal_False;
+ if( bUndo )
+ {
+ BegUndo(aInsPointUndoStr);
+ AddUndo(pInsPointUndo);
+ EndUndo();
+ }
+ }
+
+ eDragHdl=HDL_MOVE;
+ pDragHdl=NULL;
+
+ if (!bSomeObjChgdFlag)
+ {
+ // Aha, Obj hat nicht gebroadcastet (z.B. Writer FlyFrames)
+ if(!bDragHdl)
+ {
+ AdjustMarkHdl();
+ }
+ }
+ }
+ else
+ {
+ BrkDragObj();
+ }
+
+ bInsPolyPoint=sal_False;
+ SetInsertGluePoint(sal_False);
+
+ return bRet;
+}
+
+void SdrDragView::BrkDragObj()
+{
+ if (mpCurrentSdrDragMethod)
+ {
+ mpCurrentSdrDragMethod->CancelSdrDrag();
+
+ delete mpCurrentSdrDragMethod;
+ mpCurrentSdrDragMethod = 0;
+
+ if (bInsPolyPoint)
+ {
+ pInsPointUndo->Undo(); // Den eingefuegten Punkt wieder raus
+ delete pInsPointUndo;
+ pInsPointUndo=NULL;
+ SetMarkHandles();
+ bInsPolyPoint=sal_False;
+ }
+
+ if (IsInsertGluePoint())
+ {
+ pInsPointUndo->Undo(); // Den eingefuegten Klebepunkt wieder raus
+ delete pInsPointUndo;
+ pInsPointUndo=NULL;
+ SetInsertGluePoint(sal_False);
+ }
+
+ eDragHdl=HDL_MOVE;
+ pDragHdl=NULL;
+ }
+}
+
+sal_Bool SdrDragView::IsInsObjPointPossible() const
+{
+ return pMarkedObj!=NULL && pMarkedObj->IsPolyObj();
+}
+
+sal_Bool SdrDragView::ImpBegInsObjPoint(sal_Bool bIdxZwang, sal_uInt32 nIdx, const Point& rPnt, sal_Bool bNewObj, OutputDevice* pOut)
+{
+ sal_Bool bRet(sal_False);
+
+ if(pMarkedObj && pMarkedObj->ISA(SdrPathObj))
+ {
+ SdrPathObj* pMarkedPath = (SdrPathObj*)pMarkedObj;
+ BrkAction();
+ pInsPointUndo = dynamic_cast< SdrUndoGeoObj* >( GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pMarkedObj) );
+ DBG_ASSERT( pInsPointUndo, "svx::SdrDragView::BegInsObjPoint(), could not create correct undo object!" );
+
+ XubString aStr(ImpGetResStr(STR_DragInsertPoint));
+ XubString aName;
+ pMarkedObj->TakeObjNameSingul(aName);
+ xub_StrLen nPos(aStr.SearchAscii("%1"));
+
+ if(STRING_NOTFOUND != nPos)
+ {
+ aStr.Erase(nPos, 2);
+ aStr.Insert(aName, nPos);
+ }
+
+ aInsPointUndoStr = aStr;
+ Point aPt(rPnt);
+
+ if(bNewObj)
+ aPt = GetSnapPos(aPt,pMarkedPV);
+
+ sal_Bool bClosed0(pMarkedPath->IsClosedObj());
+
+ if(bIdxZwang)
+ {
+ mnInsPointNum = pMarkedPath->NbcInsPoint(nIdx, aPt, bNewObj, sal_True);
+ }
+ else
+ {
+ mnInsPointNum = pMarkedPath->NbcInsPointOld(aPt, bNewObj, sal_True);
+ }
+
+ if(bClosed0 != pMarkedPath->IsClosedObj())
+ {
+ // Obj was closed implicit
+ // object changed
+ pMarkedPath->SetChanged();
+ pMarkedPath->BroadcastObjectChange();
+ }
+
+ if(0xffffffff != mnInsPointNum)
+ {
+ bInsPolyPoint = sal_True;
+ UnmarkAllPoints();
+ AdjustMarkHdl();
+
+ bRet = BegDragObj(rPnt, pOut, aHdl.GetHdl(mnInsPointNum), 0);
+
+ if (bRet)
+ {
+ aDragStat.SetMinMoved();
+ MovDragObj(rPnt);
+ }
+ }
+ else
+ {
+ delete pInsPointUndo;
+ pInsPointUndo = NULL;
+ }
+ }
+
+ return bRet;
+}
+
+sal_Bool SdrDragView::EndInsObjPoint(SdrCreateCmd eCmd)
+{
+ if(IsInsObjPoint())
+ {
+ sal_uInt32 nNextPnt(mnInsPointNum);
+ Point aPnt(aDragStat.GetNow());
+ sal_Bool bOk=EndDragObj(sal_False);
+ if (bOk==sal_True && eCmd!=SDRCREATE_FORCEEND)
+ {
+ // Ret=True bedeutet: Action ist vorbei.
+ bOk=!(ImpBegInsObjPoint(sal_True, nNextPnt, aPnt, eCmd == SDRCREATE_NEXTOBJECT, pDragWin));
+ }
+
+ return bOk;
+ } else return sal_False;
+}
+
+sal_Bool SdrDragView::IsInsGluePointPossible() const
+{
+ sal_Bool bRet=sal_False;
+ if (IsInsGluePointMode() && AreObjectsMarked())
+ {
+ if (GetMarkedObjectCount()==1)
+ {
+ // sal_False liefern, wenn 1 Objekt und dieses ein Verbinder ist.
+ const SdrObject* pObj=GetMarkedObjectByIndex(0);
+ if (!HAS_BASE(SdrEdgeObj,pObj))
+ {
+ bRet=sal_True;
+ }
+ }
+ else
+ {
+ bRet=sal_True;
+ }
+ }
+ return bRet;
+}
+
+sal_Bool SdrDragView::BegInsGluePoint(const Point& rPnt)
+{
+ sal_Bool bRet=sal_False;
+ SdrObject* pObj;
+ SdrPageView* pPV;
+ sal_uIntPtr nMarkNum;
+ if (PickMarkedObj(rPnt,pObj,pPV,&nMarkNum,SDRSEARCH_PASS2BOUND))
+ {
+ BrkAction();
+ UnmarkAllGluePoints();
+ pInsPointUndo= dynamic_cast< SdrUndoGeoObj* >( GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj) );
+ DBG_ASSERT( pInsPointUndo, "svx::SdrDragView::BegInsObjPoint(), could not create correct undo object!" );
+ XubString aStr(ImpGetResStr(STR_DragInsertGluePoint));
+ XubString aName; pObj->TakeObjNameSingul(aName);
+
+ aStr.SearchAndReplaceAscii("%1", aName);
+
+ aInsPointUndoStr=aStr;
+ SdrGluePointList* pGPL=pObj->ForceGluePointList();
+ if (pGPL!=NULL)
+ {
+ sal_uInt16 nGlueIdx=pGPL->Insert(SdrGluePoint());
+ SdrGluePoint& rGP=(*pGPL)[nGlueIdx];
+ sal_uInt16 nGlueId=rGP.GetId();
+ rGP.SetAbsolutePos(rPnt,*pObj);
+
+ SdrHdl* pHdl=NULL;
+ if (MarkGluePoint(pObj,nGlueId,pPV))
+ {
+ pHdl=GetGluePointHdl(pObj,nGlueId);
+ }
+ if (pHdl!=NULL && pHdl->GetKind()==HDL_GLUE && pHdl->GetObj()==pObj && pHdl->GetObjHdlNum()==nGlueId)
+ {
+ SetInsertGluePoint(sal_True);
+ bRet=BegDragObj(rPnt,NULL,pHdl,0);
+ if (bRet)
+ {
+ aDragStat.SetMinMoved();
+ MovDragObj(rPnt);
+ }
+ else
+ {
+ SetInsertGluePoint(sal_False);
+ delete pInsPointUndo;
+ pInsPointUndo=NULL;
+ }
+ }
+ else
+ {
+ OSL_FAIL("BegInsGluePoint(): GluePoint-Handle nicht gefunden");
+ }
+ }
+ else
+ {
+ // Keine Klebepunkte moeglich bei diesem Objekt (z.B. Edge)
+ SetInsertGluePoint(sal_False);
+ delete pInsPointUndo;
+ pInsPointUndo=NULL;
+ }
+ }
+
+ return bRet;
+}
+
+void SdrDragView::ShowDragObj()
+{
+ if(mpCurrentSdrDragMethod && !aDragStat.IsShown())
+ {
+ for(sal_uInt32 a(0); a < PaintWindowCount(); a++)
+ {
+ SdrPaintWindow* pCandidate = GetPaintWindow(a);
+ sdr::overlay::OverlayManager* pOverlayManager = pCandidate->GetOverlayManager();
+
+ if(pOverlayManager)
+ {
+ mpCurrentSdrDragMethod->CreateOverlayGeometry(*pOverlayManager);
+
+ // #i101679# Force changed overlay to be shown
+ pOverlayManager->flush();
+ }
+ }
+
+ aDragStat.SetShown(sal_True);
+ }
+}
+
+void SdrDragView::HideDragObj()
+{
+ if(mpCurrentSdrDragMethod && aDragStat.IsShown())
+ {
+ mpCurrentSdrDragMethod->destroyOverlayGeometry();
+ aDragStat.SetShown(sal_False);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrDragView::SetNoDragXorPolys(sal_Bool bOn)
+{
+ if (IsNoDragXorPolys()!=bOn)
+ {
+ const bool bDragging(mpCurrentSdrDragMethod);
+ const bool bShown(bDragging && aDragStat.IsShown());
+
+ if(bShown)
+ {
+ HideDragObj();
+ }
+
+ bNoDragXorPolys = bOn;
+
+ if(bDragging)
+ {
+ // force recreation of drag content
+ mpCurrentSdrDragMethod->resetSdrDragEntries();
+ }
+
+ if(bShown)
+ {
+ ShowDragObj();
+ }
+ }
+}
+
+void SdrDragView::SetDragStripes(sal_Bool bOn)
+{
+ if (mpCurrentSdrDragMethod && aDragStat.IsShown())
+ {
+ HideDragObj();
+ bDragStripes=bOn;
+ ShowDragObj();
+ }
+ else
+ {
+ bDragStripes=bOn;
+ }
+}
+
+sal_Bool SdrDragView::IsOrthoDesired() const
+{
+ if(mpCurrentSdrDragMethod && (IS_TYPE(SdrDragObjOwn, mpCurrentSdrDragMethod) || IS_TYPE(SdrDragResize, mpCurrentSdrDragMethod)))
+ {
+ return bOrthoDesiredOnMarked;
+ }
+
+ return sal_False;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrDragView::SetRubberEdgeDragging(sal_Bool bOn)
+{
+ if (bOn!=IsRubberEdgeDragging())
+ {
+ sal_uIntPtr nAnz = GetEdgesOfMarkedNodes().GetMarkCount();
+ sal_Bool bShowHide=nAnz!=0 && IsDragObj() &&
+ (nRubberEdgeDraggingLimit>=nAnz);
+ if (bShowHide)
+ HideDragObj();
+ bRubberEdgeDragging=bOn;
+ if (bShowHide)
+ ShowDragObj();
+ }
+}
+
+void SdrDragView::SetRubberEdgeDraggingLimit(sal_uInt16 nEdgeObjAnz)
+{
+ if (nEdgeObjAnz!=nRubberEdgeDraggingLimit)
+ {
+ sal_uIntPtr nAnz = GetEdgesOfMarkedNodes().GetMarkCount();
+ sal_Bool bShowHide=IsRubberEdgeDragging() && nAnz!=0 && IsDragObj() &&
+ (nEdgeObjAnz>=nAnz)!=(nRubberEdgeDraggingLimit>=nAnz);
+ if (bShowHide)
+ HideDragObj();
+ nRubberEdgeDraggingLimit=nEdgeObjAnz;
+ if (bShowHide)
+ ShowDragObj();
+ }
+}
+
+void SdrDragView::SetDetailedEdgeDragging(sal_Bool bOn)
+{
+ if (bOn!=IsDetailedEdgeDragging())
+ {
+ sal_uIntPtr nAnz = GetEdgesOfMarkedNodes().GetMarkCount();
+ sal_Bool bShowHide=nAnz!=0 && IsDragObj() &&
+ (nDetailedEdgeDraggingLimit>=nAnz);
+ if (bShowHide)
+ HideDragObj();
+ bDetailedEdgeDragging=bOn;
+ if (bShowHide)
+ ShowDragObj();
+ }
+}
+
+void SdrDragView::SetDetailedEdgeDraggingLimit(sal_uInt16 nEdgeObjAnz)
+{
+ if (nEdgeObjAnz!=nDetailedEdgeDraggingLimit)
+ {
+ sal_uIntPtr nAnz = GetEdgesOfMarkedNodes().GetMarkCount();
+ sal_Bool bShowHide=IsDetailedEdgeDragging() && nAnz!=0 && IsDragObj() &&
+ (nEdgeObjAnz>=nAnz)!=(nDetailedEdgeDraggingLimit>=nAnz);
+ if (bShowHide)
+ HideDragObj();
+ nDetailedEdgeDraggingLimit=nEdgeObjAnz;
+ if (bShowHide)
+ ShowDragObj();
+ }
+}
+
+void SdrDragView::SetMarkHandles()
+{
+ if( pDragHdl )
+ pDragHdl = 0;
+
+ SdrExchangeView::SetMarkHandles();
+}
+
+void SdrDragView::SetSolidDragging(bool bOn)
+{
+ if((bool)mbSolidDragging != bOn)
+ {
+ mbSolidDragging = bOn;
+ }
+}
+
+bool SdrDragView::IsSolidDragging() const
+{
+ // allow each user to disable by having a local setting, but using AND for
+ // checking allowance
+ return mbSolidDragging && getOptionsDrawinglayer().IsSolidDragCreate();
+}
+
+// eof
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */