LCOV - code coverage report
Current view: top level - svx/source/svdraw - svdsnpv.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 101 314 32.2 %
Date: 2015-06-13 12:38:46 Functions: 8 32 25.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : #include <svx/svdsnpv.hxx>
      22             : #include <math.h>
      23             : 
      24             : #include <svx/svdetc.hxx>
      25             : #include <svx/svdobj.hxx>
      26             : #include <svx/svdpagv.hxx>
      27             : #include <svx/svdpage.hxx>
      28             : #include "svx/svditer.hxx"
      29             : #include <svx/sdr/overlay/overlayobjectlist.hxx>
      30             : #include <sdr/overlay/overlaycrosshair.hxx>
      31             : #include <sdr/overlay/overlayhelpline.hxx>
      32             : #include <svx/sdr/overlay/overlaymanager.hxx>
      33             : #include <basegfx/matrix/b2dhommatrix.hxx>
      34             : #include <svx/sdrpaintwindow.hxx>
      35             : 
      36             : 
      37             : class ImplPageOriginOverlay
      38             : {
      39             :     // The OverlayObjects
      40             :     sdr::overlay::OverlayObjectList               maObjects;
      41             : 
      42             :     // The current position in logical coodinates
      43             :     basegfx::B2DPoint                               maPosition;
      44             : 
      45             : public:
      46             :     ImplPageOriginOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos);
      47             :     ~ImplPageOriginOverlay();
      48             : 
      49             :     void SetPosition(const basegfx::B2DPoint& rNewPosition);
      50             : };
      51             : 
      52           0 : ImplPageOriginOverlay::ImplPageOriginOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos)
      53           0 : :   maPosition(rStartPos)
      54             : {
      55           0 :     for(sal_uInt32 a(0L); a < rView.PaintWindowCount(); a++)
      56             :     {
      57           0 :         SdrPaintWindow* pCandidate = rView.GetPaintWindow(a);
      58           0 :         rtl::Reference< sdr::overlay::OverlayManager > xTargetOverlay = pCandidate->GetOverlayManager();
      59             : 
      60           0 :         if (xTargetOverlay.is())
      61             :         {
      62             :             sdr::overlay::OverlayCrosshairStriped* aNew = new sdr::overlay::OverlayCrosshairStriped(
      63           0 :                 maPosition);
      64           0 :             xTargetOverlay->add(*aNew);
      65           0 :             maObjects.append(*aNew);
      66             :         }
      67           0 :     }
      68           0 : }
      69             : 
      70           0 : ImplPageOriginOverlay::~ImplPageOriginOverlay()
      71             : {
      72             :     // The OverlayObjects are cleared using the destructor of OverlayObjectList.
      73             :     // That destructor calls clear() at the list which removes all objects from the
      74             :     // OverlayManager and deletes them.
      75           0 : }
      76             : 
      77           0 : void ImplPageOriginOverlay::SetPosition(const basegfx::B2DPoint& rNewPosition)
      78             : {
      79           0 :     if(rNewPosition != maPosition)
      80             :     {
      81             :         // apply to OverlayObjects
      82           0 :         for(sal_uInt32 a(0); a < maObjects.count(); a++)
      83             :         {
      84             :             sdr::overlay::OverlayCrosshairStriped* pCandidate =
      85           0 :                 static_cast< sdr::overlay::OverlayCrosshairStriped* >(&maObjects.getOverlayObject(a));
      86             : 
      87           0 :             if(pCandidate)
      88             :             {
      89           0 :                 pCandidate->setBasePosition(rNewPosition);
      90             :             }
      91             :         }
      92             : 
      93             :         // remember new position
      94           0 :         maPosition = rNewPosition;
      95             :     }
      96           0 : }
      97             : 
      98             : 
      99             : class ImplHelpLineOverlay
     100             : {
     101             :     // The OverlayObjects
     102             :     sdr::overlay::OverlayObjectList               maObjects;
     103             : 
     104             :     // The current position in logical coodinates
     105             :     basegfx::B2DPoint                               maPosition;
     106             : 
     107             :     // HelpLine specific stuff
     108             :     SdrPageView*                                    mpPageView;
     109             :     sal_uInt16                                      mnHelpLineNumber;
     110             :     SdrHelpLineKind                                 meHelpLineKind;
     111             : 
     112             : public:
     113             :     ImplHelpLineOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos,
     114             :         SdrPageView* pPageView, sal_uInt16 nHelpLineNumber, SdrHelpLineKind eKind);
     115             :     ~ImplHelpLineOverlay();
     116             : 
     117             :     void SetPosition(const basegfx::B2DPoint& rNewPosition);
     118             : 
     119             :     // access to HelpLine specific stuff
     120           0 :     SdrPageView* GetPageView() const { return mpPageView; }
     121           0 :     sal_uInt16 GetHelpLineNumber() const { return mnHelpLineNumber; }
     122           0 :     SdrHelpLineKind GetHelpLineKind() const { return meHelpLineKind; }
     123             : };
     124             : 
     125           0 : ImplHelpLineOverlay::ImplHelpLineOverlay(
     126             :     const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos,
     127             :     SdrPageView* pPageView, sal_uInt16 nHelpLineNumber, SdrHelpLineKind eKind)
     128             : :   maPosition(rStartPos),
     129             :     mpPageView(pPageView),
     130             :     mnHelpLineNumber(nHelpLineNumber),
     131           0 :     meHelpLineKind(eKind)
     132             : {
     133           0 :     for(sal_uInt32 a(0L); a < rView.PaintWindowCount(); a++)
     134             :     {
     135           0 :         SdrPaintWindow* pCandidate = rView.GetPaintWindow(a);
     136           0 :         rtl::Reference< sdr::overlay::OverlayManager > xTargetOverlay = pCandidate->GetOverlayManager();
     137             : 
     138           0 :         if (xTargetOverlay.is())
     139             :         {
     140             :             sdr::overlay::OverlayHelplineStriped* aNew = new sdr::overlay::OverlayHelplineStriped(
     141           0 :                 maPosition, meHelpLineKind);
     142           0 :             xTargetOverlay->add(*aNew);
     143           0 :             maObjects.append(*aNew);
     144             :         }
     145           0 :     }
     146           0 : }
     147             : 
     148           0 : ImplHelpLineOverlay::~ImplHelpLineOverlay()
     149             : {
     150             :     // The OverlayObjects are cleared using the destructor of OverlayObjectList.
     151             :     // That destructor calls clear() at the list which removes all objects from the
     152             :     // OverlayManager and deletes them.
     153           0 : }
     154             : 
     155           0 : void ImplHelpLineOverlay::SetPosition(const basegfx::B2DPoint& rNewPosition)
     156             : {
     157           0 :     if(rNewPosition != maPosition)
     158             :     {
     159             :         // apply to OverlayObjects
     160           0 :         for(sal_uInt32 a(0); a < maObjects.count(); a++)
     161             :         {
     162             :             sdr::overlay::OverlayHelplineStriped* pCandidate =
     163           0 :                 static_cast< sdr::overlay::OverlayHelplineStriped* >(&maObjects.getOverlayObject(a));
     164             : 
     165           0 :             if(pCandidate)
     166             :             {
     167           0 :                 pCandidate->setBasePosition(rNewPosition);
     168             :             }
     169             :         }
     170             : 
     171             :         // remember new position
     172           0 :         maPosition = rNewPosition;
     173             :     }
     174           0 : }
     175             : 
     176             : 
     177        9504 : SdrSnapView::SdrSnapView(SdrModel* pModel1, OutputDevice* pOut)
     178             :     : SdrPaintView(pModel1,pOut)
     179             :     , mpPageOriginOverlay(0L)
     180             :     , mpHelpLineOverlay(0L)
     181             :     , nMagnSizPix(4)
     182             :     , nSnapAngle(1500)
     183             :     , nEliminatePolyPointLimitAngle(0)
     184             :     , eCrookMode(SDRCROOK_ROTATE)
     185             :     , bSnapEnab(true)
     186             :     , bGridSnap(true)
     187             :     , bSnapTo1Pix(true)
     188             :     , bBordSnap(true)
     189             :     , bHlplSnap(true)
     190             :     , bOFrmSnap(true)
     191             :     , bOPntSnap(false)
     192             :     , bOConSnap(true)
     193             :     , bMoveMFrmSnap(true)
     194             :     , bMoveOFrmSnap(true)
     195             :     , bMoveOPntSnap(true)
     196             :     , bMoveOConSnap(true)
     197             :     , bMoveSnapOnlyTopLeft(false)
     198             :     , bOrtho(false)
     199             :     , bBigOrtho(true)
     200             :     , bAngleSnapEnab(false)
     201             :     , bMoveOnlyDragging(false)
     202             :     , bSlantButShear(false)
     203             :     , bCrookNoContortion(false)
     204             :     , bHlplFixed(false)
     205        9504 :     , bEliminatePolyPoints(false)
     206             : {
     207        9504 : }
     208             : 
     209       18876 : SdrSnapView::~SdrSnapView()
     210             : {
     211        9438 :     BrkSetPageOrg();
     212        9438 :     BrkDragHelpLine();
     213        9438 : }
     214             : 
     215             : 
     216             : 
     217        1876 : bool SdrSnapView::IsAction() const
     218             : {
     219        1876 :     return IsSetPageOrg() || IsDragHelpLine() || SdrPaintView::IsAction();
     220             : }
     221             : 
     222           2 : void SdrSnapView::MovAction(const Point& rPnt)
     223             : {
     224           2 :     SdrPaintView::MovAction(rPnt);
     225           2 :     if (IsSetPageOrg()) {
     226           0 :         MovSetPageOrg(rPnt);
     227             :     }
     228           2 :     if (IsDragHelpLine()) {
     229           0 :         MovDragHelpLine(rPnt);
     230             :     }
     231           2 : }
     232             : 
     233           0 : void SdrSnapView::EndAction()
     234             : {
     235           0 :     if (IsSetPageOrg()) {
     236           0 :         EndSetPageOrg();
     237             :     }
     238           0 :     if (IsDragHelpLine()) {
     239           0 :         EndDragHelpLine();
     240             :     }
     241           0 :     SdrPaintView::EndAction();
     242           0 : }
     243             : 
     244           0 : void SdrSnapView::BckAction()
     245             : {
     246           0 :     BrkSetPageOrg();
     247           0 :     BrkDragHelpLine();
     248           0 :     SdrPaintView::BckAction();
     249           0 : }
     250             : 
     251        5984 : void SdrSnapView::BrkAction()
     252             : {
     253        5984 :     BrkSetPageOrg();
     254        5984 :     BrkDragHelpLine();
     255        5984 :     SdrPaintView::BrkAction();
     256        5984 : }
     257             : 
     258           0 : void SdrSnapView::TakeActionRect(Rectangle& rRect) const
     259             : {
     260           0 :     if (IsSetPageOrg() || IsDragHelpLine()) {
     261           0 :         rRect=Rectangle(aDragStat.GetNow(),aDragStat.GetNow());
     262             :     } else {
     263           0 :         SdrPaintView::TakeActionRect(rRect);
     264             :     }
     265           0 : }
     266             : 
     267             : 
     268             : 
     269           0 : Point SdrSnapView::GetSnapPos(const Point& rPnt, const SdrPageView* pPV) const
     270             : {
     271           0 :     Point aPt(rPnt);
     272           0 :     SnapPos(aPt,pPV);
     273           0 :     return aPt;
     274             : }
     275             : 
     276             : #define NOT_SNAPPED 0x7FFFFFFF
     277           3 : SdrSnap SdrSnapView::SnapPos(Point& rPnt, const SdrPageView* pPV) const
     278             : {
     279           3 :     if (!bSnapEnab) return SdrSnap::NOTSNAPPED;
     280           3 :     long x=rPnt.X();
     281           3 :     long y=rPnt.Y();
     282           3 :     if (pPV==NULL) {
     283           0 :         pPV=GetSdrPageView();
     284           0 :         if (pPV==NULL) return SdrSnap::NOTSNAPPED;
     285             :     }
     286             : 
     287           3 :     long dx=NOT_SNAPPED;
     288           3 :     long dy=NOT_SNAPPED;
     289             :     long dx1,dy1;
     290           3 :     long mx=aMagnSiz.Width();
     291           3 :     long my=aMagnSiz.Height();
     292           3 :     if (bHlplVisible && bHlplSnap && !IsDragHelpLine())
     293             :     {
     294           0 :         const SdrHelpLineList& rHLL=pPV->GetHelpLines();
     295           0 :         sal_uInt16 nCount=rHLL.GetCount();
     296           0 :         for (sal_uInt16 i=nCount; i>0;) {
     297           0 :             i--;
     298           0 :             const SdrHelpLine& rHL=rHLL[i];
     299           0 :             const Point& rPos=rHL.GetPos();
     300           0 :             switch (rHL.GetKind()) {
     301             :                 case SDRHELPLINE_VERTICAL: {
     302           0 :                     long a=x-rPos.X();
     303           0 :                     if (std::abs(a)<=mx) { dx1=-a; if (std::abs(dx1)<std::abs(dx)) dx=dx1; }
     304           0 :                 } break;
     305             :                 case SDRHELPLINE_HORIZONTAL: {
     306           0 :                     long b=y-rPos.Y();
     307           0 :                     if (std::abs(b)<=my) { dy1=-b; if (std::abs(dy1)<std::abs(dy)) dy=dy1; }
     308           0 :                 } break;
     309             :                 case SDRHELPLINE_POINT: {
     310           0 :                     long a=x-rPos.X();
     311           0 :                     long b=y-rPos.Y();
     312           0 :                     if (std::abs(a)<=mx && std::abs(b)<=my) {
     313           0 :                         dx1=-a; dy1=-b;
     314           0 :                         if (std::abs(dx1)<std::abs(dx) && std::abs(dy1)<std::abs(dy)) { dx=dx1; dy=dy1; }
     315             :                     }
     316           0 :                 } break;
     317             :             } // switch
     318             :         }
     319             :     }
     320           3 :     if (bBordVisible && bBordSnap) {
     321           2 :         SdrPage* pPage=pPV->GetPage();
     322           2 :         long xs=pPage->GetWdt();
     323           2 :         long ys=pPage->GetHgt();
     324           2 :         long lft=pPage->GetLftBorder();
     325           2 :         long rgt=pPage->GetRgtBorder();
     326           2 :         long upp=pPage->GetUppBorder();
     327           2 :         long lwr=pPage->GetLwrBorder();
     328             :         long a;
     329           2 :         a=x- lft    ; if (std::abs(a)<=mx) { dx1=-a; if (std::abs(dx1)<std::abs(dx)) dx=dx1; } // left margin
     330           2 :         a=x-(xs-rgt); if (std::abs(a)<=mx) { dx1=-a; if (std::abs(dx1)<std::abs(dx)) dx=dx1; } // right margin
     331           2 :         a=x         ; if (std::abs(a)<=mx) { dx1=-a; if (std::abs(dx1)<std::abs(dx)) dx=dx1; } // left edge of paper
     332           2 :         a=x- xs     ; if (std::abs(a)<=mx) { dx1=-a; if (std::abs(dx1)<std::abs(dx)) dx=dx1; } // right edge of paper
     333           2 :         a=y- upp    ; if (std::abs(a)<=my) { dy1=-a; if (std::abs(dy1)<std::abs(dy)) dy=dy1; } // left margin
     334           2 :         a=y-(ys-lwr); if (std::abs(a)<=my) { dy1=-a; if (std::abs(dy1)<std::abs(dy)) dy=dy1; } // right margin
     335           2 :         a=y         ; if (std::abs(a)<=my) { dy1=-a; if (std::abs(dy1)<std::abs(dy)) dy=dy1; } // left edge of paper
     336           2 :         a=y- ys     ; if (std::abs(a)<=my) { dy1=-a; if (std::abs(dy1)<std::abs(dy)) dy=dy1; } // right edge of paper
     337             :     }
     338           3 :     if (bOFrmSnap || bOPntSnap) {
     339           3 :         sal_uIntPtr nMaxPointSnapCount=200;
     340           3 :         sal_uIntPtr nMaxFrameSnapCount=200;
     341             : 
     342             :         // go back to IM_DEEPNOGROUPS runthrough for snap to object comparisons
     343           3 :         SdrObjListIter aIter(*pPV->GetPage(),IM_DEEPNOGROUPS,true);
     344             : 
     345           9 :         while (aIter.IsMore() && (nMaxPointSnapCount>0 || nMaxFrameSnapCount>0)) {
     346           3 :             SdrObject* pO=aIter.Next();
     347           3 :             Rectangle aRect(pO->GetCurrentBoundRect());
     348           3 :             aRect.Left  ()-=mx;
     349           3 :             aRect.Right ()+=mx;
     350           3 :             aRect.Top   ()-=my;
     351           3 :             aRect.Bottom()+=my;
     352           3 :             if (aRect.IsInside(rPnt)) {
     353           1 :                 if (bOPntSnap && nMaxPointSnapCount>0)
     354             :                 {
     355           0 :                     sal_uInt32 nCount(pO->GetSnapPointCount());
     356           0 :                     for (sal_uInt32 i(0L); i < nCount && nMaxPointSnapCount > 0L; i++)
     357             :                     {
     358           0 :                         Point aP(pO->GetSnapPoint(i));
     359           0 :                         dx1=x-aP.X();
     360           0 :                         dy1=y-aP.Y();
     361           0 :                         if (std::abs(dx1)<=mx && std::abs(dy1)<=my && std::abs(dx1)<std::abs(dx) && std::abs(dy1)<std::abs(dy)) {
     362           0 :                             dx=-dx1;
     363           0 :                             dy=-dy1;
     364             :                         }
     365           0 :                         nMaxPointSnapCount--;
     366             :                     }
     367             :                 }
     368           1 :                 if (bOFrmSnap && nMaxFrameSnapCount>0) {
     369           1 :                     Rectangle aLog(pO->GetSnapRect());
     370           1 :                     Rectangle aR1(aLog);
     371           1 :                     aR1.Left  ()-=mx;
     372           1 :                     aR1.Right ()+=mx;
     373           1 :                     aR1.Top   ()-=my;
     374           1 :                     aR1.Bottom()+=my;
     375           1 :                     if (aR1.IsInside(rPnt)) {
     376           1 :                         if (std::abs(x-aLog.Left  ())<=mx) { dx1=-(x-aLog.Left  ()); if (std::abs(dx1)<std::abs(dx)) dx=dx1; }
     377           1 :                         if (std::abs(x-aLog.Right ())<=mx) { dx1=-(x-aLog.Right ()); if (std::abs(dx1)<std::abs(dx)) dx=dx1; }
     378           1 :                         if (std::abs(y-aLog.Top   ())<=my) { dy1=-(y-aLog.Top   ()); if (std::abs(dy1)<std::abs(dy)) dy=dy1; }
     379           1 :                         if (std::abs(y-aLog.Bottom())<=my) { dy1=-(y-aLog.Bottom()); if (std::abs(dy1)<std::abs(dy)) dy=dy1; }
     380             :                     }
     381           1 :                     nMaxFrameSnapCount--;
     382             :                 }
     383             :             }
     384           3 :         }
     385             :     }
     386           3 :     if(bGridSnap)
     387             :     {
     388           2 :         double fSnapWidth = aSnapWdtX;
     389           2 :         if(dx == NOT_SNAPPED && fSnapWidth != 0.0)
     390             :         {
     391           2 :             double fx = (double)x;
     392             : 
     393             :             // round instead of trunc
     394           2 :             if(fx - (double)pPV->GetPageOrigin().X() >= 0.0)
     395           2 :                 fx += fSnapWidth / 2.0;
     396             :             else
     397           0 :                 fx -= fSnapWidth / 2.0;
     398             : 
     399           2 :             x = (long)((fx - (double)pPV->GetPageOrigin().X()) / fSnapWidth);
     400           2 :             x = (long)((double)x * fSnapWidth + (double)pPV->GetPageOrigin().X());
     401           2 :             dx = 0;
     402             :         }
     403           2 :         fSnapWidth = aSnapWdtY;
     404           2 :         if(dy == NOT_SNAPPED && fSnapWidth)
     405             :         {
     406           1 :             double fy = (double)y;
     407             : 
     408             :             // round instead of trunc
     409           1 :             if(fy - (double)pPV->GetPageOrigin().Y() >= 0.0)
     410           1 :                 fy += fSnapWidth / 2.0;
     411             :             else
     412           0 :                 fy -= fSnapWidth / 2.0;
     413             : 
     414           1 :             y = (long)((fy - (double)pPV->GetPageOrigin().Y()) / fSnapWidth);
     415           1 :             y = (long)((double)y * fSnapWidth + (double)pPV->GetPageOrigin().Y());
     416           1 :             dy = 0;
     417             :         }
     418             :     }
     419           3 :     SdrSnap bRet=SdrSnap::NOTSNAPPED;
     420           3 :     if (dx==NOT_SNAPPED) dx=0; else bRet|=SdrSnap::XSNAPPED;
     421           3 :     if (dy==NOT_SNAPPED) dy=0; else bRet|=SdrSnap::YSNAPPED;
     422           3 :     rPnt.X()=x+dx;
     423           3 :     rPnt.Y()=y+dy;
     424           3 :     return bRet;
     425             : }
     426             : 
     427           0 : void SdrSnapView::CheckSnap(const Point& rPt, const SdrPageView* pPV, long& nBestXSnap, long& nBestYSnap, bool& bXSnapped, bool& bYSnapped) const
     428             : {
     429           0 :     Point aPt(rPt);
     430           0 :     SdrSnap nRet=SnapPos(aPt,pPV);
     431           0 :     aPt-=rPt;
     432           0 :     if (nRet & SdrSnap::XSNAPPED) {
     433           0 :         if (bXSnapped) {
     434           0 :             if (std::abs(aPt.X())<std::abs(nBestXSnap)) {
     435           0 :                 nBestXSnap=aPt.X();
     436             :             }
     437             :         } else {
     438           0 :             nBestXSnap=aPt.X();
     439           0 :             bXSnapped=true;
     440             :         }
     441             :     }
     442           0 :     if (nRet & SdrSnap::YSNAPPED) {
     443           0 :         if (bYSnapped) {
     444           0 :             if (std::abs(aPt.Y())<std::abs(nBestYSnap)) {
     445           0 :                 nBestYSnap=aPt.Y();
     446             :             }
     447             :         } else {
     448           0 :             nBestYSnap=aPt.Y();
     449           0 :             bYSnapped=true;
     450             :         }
     451             :     }
     452           0 : }
     453             : 
     454             : 
     455             : 
     456           0 : bool SdrSnapView::BegSetPageOrg(const Point& rPnt)
     457             : {
     458           0 :     BrkAction();
     459             : 
     460             :     DBG_ASSERT(0L == mpPageOriginOverlay, "SdrSnapView::BegSetPageOrg: There exists a ImplPageOriginOverlay (!)");
     461           0 :     basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y());
     462           0 :     mpPageOriginOverlay = new ImplPageOriginOverlay(*this, aStartPos);
     463           0 :     aDragStat.Reset(GetSnapPos(rPnt,NULL));
     464             : 
     465           0 :     return true;
     466             : }
     467             : 
     468           0 : void SdrSnapView::MovSetPageOrg(const Point& rPnt)
     469             : {
     470           0 :     if(IsSetPageOrg())
     471             :     {
     472           0 :         aDragStat.NextMove(GetSnapPos(rPnt,NULL));
     473             :         DBG_ASSERT(mpPageOriginOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
     474           0 :         basegfx::B2DPoint aNewPos(aDragStat.GetNow().X(), aDragStat.GetNow().Y());
     475           0 :         mpPageOriginOverlay->SetPosition(aNewPos);
     476             :     }
     477           0 : }
     478             : 
     479           0 : bool SdrSnapView::EndSetPageOrg()
     480             : {
     481           0 :     bool bRet(false);
     482             : 
     483           0 :     if(IsSetPageOrg())
     484             :     {
     485           0 :         SdrPageView* pPV = GetSdrPageView();
     486             : 
     487           0 :         if(pPV)
     488             :         {
     489           0 :             Point aPnt(aDragStat.GetNow());
     490           0 :             pPV->SetPageOrigin(aPnt);
     491           0 :             bRet = true;
     492             :         }
     493             : 
     494             :         // cleanup
     495           0 :         BrkSetPageOrg();
     496             :     }
     497             : 
     498           0 :     return bRet;
     499             : }
     500             : 
     501       15422 : void SdrSnapView::BrkSetPageOrg()
     502             : {
     503       15422 :     if(IsSetPageOrg())
     504             :     {
     505             :         DBG_ASSERT(mpPageOriginOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
     506           0 :         delete mpPageOriginOverlay;
     507           0 :         mpPageOriginOverlay = 0L;
     508             :     }
     509       15422 : }
     510             : 
     511             : 
     512             : 
     513           0 : bool SdrSnapView::PickHelpLine(const Point& rPnt, short nTol, const OutputDevice& rOut, sal_uInt16& rnHelpLineNum, SdrPageView*& rpPV) const
     514             : {
     515           0 :     rpPV=NULL;
     516           0 :     nTol=ImpGetHitTolLogic(nTol,&rOut);
     517           0 :     SdrPageView* pPV = GetSdrPageView();
     518             : 
     519           0 :     if(pPV)
     520             :     {
     521           0 :         Point aPnt(rPnt);
     522           0 :         sal_uInt16 nIndex=pPV->GetHelpLines().HitTest(aPnt,sal_uInt16(nTol),rOut);
     523           0 :         if (nIndex!=SDRHELPLINE_NOTFOUND) {
     524           0 :             rpPV=pPV;
     525           0 :             rnHelpLineNum=nIndex;
     526           0 :             return true;
     527             :         }
     528             :     }
     529           0 :     return false;
     530             : }
     531             : 
     532             : // start HelpLine drag for new HelpLine
     533           0 : bool SdrSnapView::BegDragHelpLine(sal_uInt16 nHelpLineNum, SdrPageView* pPV)
     534             : {
     535           0 :     bool bRet(false);
     536             : 
     537           0 :     if(!bHlplFixed)
     538             :     {
     539           0 :         BrkAction();
     540             : 
     541           0 :         if(pPV && nHelpLineNum < pPV->GetHelpLines().GetCount())
     542             :         {
     543           0 :             const SdrHelpLineList& rHelpLines = pPV->GetHelpLines();
     544           0 :             const SdrHelpLine& rHelpLine = rHelpLines[nHelpLineNum];
     545           0 :             Point aHelpLinePos = rHelpLine.GetPos();
     546           0 :             basegfx::B2DPoint aStartPos(aHelpLinePos.X(), aHelpLinePos.Y());
     547             : 
     548             :             DBG_ASSERT(0L == mpHelpLineOverlay, "SdrSnapView::BegDragHelpLine: There exists a ImplHelpLineOverlay (!)");
     549           0 :             mpHelpLineOverlay = new ImplHelpLineOverlay(*this, aStartPos, pPV, nHelpLineNum, rHelpLine.GetKind());
     550             : 
     551           0 :             aDragStat.Reset(GetSnapPos(aHelpLinePos, pPV));
     552           0 :             aDragStat.SetMinMove(ImpGetMinMovLogic(-3, 0L));
     553             : 
     554           0 :             bRet = true;
     555             :         }
     556             :     }
     557             : 
     558           0 :     return bRet;
     559             : }
     560             : 
     561             : // start HelpLine drag with existing HelpLine
     562           0 : bool SdrSnapView::BegDragHelpLine(const Point& rPnt, SdrHelpLineKind eNewKind)
     563             : {
     564           0 :     bool bRet(false);
     565             : 
     566           0 :     BrkAction();
     567             : 
     568           0 :     if(GetSdrPageView())
     569             :     {
     570             :         DBG_ASSERT(0L == mpHelpLineOverlay, "SdrSnapView::BegDragHelpLine: There exists a ImplHelpLineOverlay (!)");
     571           0 :         basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y());
     572           0 :         mpHelpLineOverlay = new ImplHelpLineOverlay(*this, aStartPos, 0L, 0, eNewKind);
     573           0 :         aDragStat.Reset(GetSnapPos(rPnt, 0L));
     574           0 :         bRet = true;
     575             :     }
     576             : 
     577           0 :     return bRet;
     578             : }
     579             : 
     580           0 : Pointer SdrSnapView::GetDraggedHelpLinePointer() const
     581             : {
     582           0 :     if(IsDragHelpLine())
     583             :     {
     584           0 :         switch(mpHelpLineOverlay->GetHelpLineKind())
     585             :         {
     586           0 :             case SDRHELPLINE_VERTICAL  : return Pointer(PointerStyle::ESize);
     587           0 :             case SDRHELPLINE_HORIZONTAL: return Pointer(PointerStyle::SSize);
     588           0 :             default                    : return Pointer(PointerStyle::Move);
     589             :         }
     590             :     }
     591             : 
     592           0 :     return Pointer(PointerStyle::Move);
     593             : }
     594             : 
     595           0 : void SdrSnapView::MovDragHelpLine(const Point& rPnt)
     596             : {
     597           0 :     if(IsDragHelpLine() && aDragStat.CheckMinMoved(rPnt))
     598             :     {
     599           0 :         Point aPnt(GetSnapPos(rPnt, 0L));
     600             : 
     601           0 :         if(aPnt != aDragStat.GetNow())
     602             :         {
     603           0 :             aDragStat.NextMove(aPnt);
     604             :             DBG_ASSERT(mpHelpLineOverlay, "SdrSnapView::MovDragHelpLine: no ImplHelpLineOverlay (!)");
     605           0 :             basegfx::B2DPoint aNewPos(aDragStat.GetNow().X(), aDragStat.GetNow().Y());
     606           0 :             mpHelpLineOverlay->SetPosition(aNewPos);
     607             :         }
     608             :     }
     609           0 : }
     610             : 
     611           0 : bool SdrSnapView::EndDragHelpLine()
     612             : {
     613           0 :     bool bRet(false);
     614             : 
     615           0 :     if(IsDragHelpLine())
     616             :     {
     617           0 :         if(aDragStat.IsMinMoved())
     618             :         {
     619           0 :             SdrPageView* pPageView = mpHelpLineOverlay->GetPageView();
     620             : 
     621           0 :             if(pPageView)
     622             :             {
     623             :                 // moved existing one
     624           0 :                 Point aPnt(aDragStat.GetNow());
     625           0 :                 const SdrHelpLineList& rHelpLines = pPageView->GetHelpLines();
     626           0 :                 SdrHelpLine aChangedHelpLine = rHelpLines[mpHelpLineOverlay->GetHelpLineNumber()];
     627           0 :                 aChangedHelpLine.SetPos(aPnt);
     628           0 :                 pPageView->SetHelpLine(mpHelpLineOverlay->GetHelpLineNumber(), aChangedHelpLine);
     629             : 
     630           0 :                 bRet = true;
     631             :             }
     632             :             else
     633             :             {
     634             :                 // create new one
     635           0 :                 pPageView = GetSdrPageView();
     636             : 
     637           0 :                 if(pPageView)
     638             :                 {
     639           0 :                     Point aPnt(aDragStat.GetNow());
     640           0 :                     SdrHelpLine aNewHelpLine(mpHelpLineOverlay->GetHelpLineKind(), aPnt);
     641           0 :                     pPageView->InsertHelpLine(aNewHelpLine);
     642             : 
     643           0 :                     bRet = true;
     644             :                 }
     645             :             }
     646             :         }
     647             : 
     648             :         // cleanup
     649           0 :         BrkDragHelpLine();
     650             :     }
     651             : 
     652           0 :     return bRet;
     653             : }
     654             : 
     655       15422 : void SdrSnapView::BrkDragHelpLine()
     656             : {
     657       15422 :     if(IsDragHelpLine())
     658             :     {
     659             :         DBG_ASSERT(mpHelpLineOverlay, "SdrSnapView::EndDragHelpLine: no ImplHelpLineOverlay (!)");
     660           0 :         delete mpHelpLineOverlay;
     661           0 :         mpHelpLineOverlay = 0L;
     662             :     }
     663       15422 : }
     664             : 
     665             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11