LCOV - code coverage report
Current view: top level - svx/source/svdraw - svdmrkv.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 583 1131 51.5 %
Date: 2015-06-13 12:38:46 Functions: 48 77 62.3 %
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/svdmrkv.hxx>
      22             : #include <svx/svdetc.hxx>
      23             : #include <svx/svdoedge.hxx>
      24             : #include "svdglob.hxx"
      25             : #include <svx/svdview.hxx>
      26             : #include <svx/svdpagv.hxx>
      27             : #include <svx/svdpage.hxx>
      28             : #include "svddrgm1.hxx"
      29             : 
      30             : #ifdef DBG_UTIL
      31             : #include <svdibrow.hxx>
      32             : #endif
      33             : 
      34             : #include <svx/svdoole2.hxx>
      35             : #include <svx/xgrad.hxx>
      36             : #include <svx/xflgrit.hxx>
      37             : #include "gradtrns.hxx"
      38             : #include <svx/xflftrit.hxx>
      39             : #include <svx/dialmgr.hxx>
      40             : #include "svx/svdstr.hrc"
      41             : #include <svx/svdundo.hxx>
      42             : #include <svx/svdopath.hxx>
      43             : #include <svx/scene3d.hxx>
      44             : #include <svx/svdovirt.hxx>
      45             : #include <sdr/overlay/overlayrollingrectangle.hxx>
      46             : #include <svx/sdr/overlay/overlaymanager.hxx>
      47             : #include <svx/sdrpaintwindow.hxx>
      48             : #include <svx/sdrpagewindow.hxx>
      49             : #include <svx/sdrhittesthelper.hxx>
      50             : #include <svx/svdocapt.hxx>
      51             : #include <svx/svdograf.hxx>
      52             : 
      53             : #include <editeng/editdata.hxx>
      54             : #include <LibreOfficeKit/LibreOfficeKitEnums.h>
      55             : 
      56             : using namespace com::sun::star;
      57             : 
      58             : // Migrate Marking of Objects, Points and GluePoints
      59             : 
      60             : class ImplMarkingOverlay
      61             : {
      62             :     // The OverlayObjects
      63             :     sdr::overlay::OverlayObjectList               maObjects;
      64             : 
      65             :     // The remembered second position in logical coordinates
      66             :     basegfx::B2DPoint                               maSecondPosition;
      67             : 
      68             :     // bitfield
      69             :     // A flag to remember if the action is for unmarking.
      70             :     bool                                            mbUnmarking : 1;
      71             : 
      72             : public:
      73             :     ImplMarkingOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos, bool bUnmarking = false);
      74             :     ~ImplMarkingOverlay();
      75             : 
      76             :     void SetSecondPosition(const basegfx::B2DPoint& rNewPosition);
      77           0 :     bool IsUnmarking() const { return mbUnmarking; }
      78             : };
      79             : 
      80           0 : ImplMarkingOverlay::ImplMarkingOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos, bool bUnmarking)
      81             : :   maSecondPosition(rStartPos),
      82           0 :     mbUnmarking(bUnmarking)
      83             : {
      84           0 :     for(sal_uInt32 a(0L); a < rView.PaintWindowCount(); a++)
      85             :     {
      86           0 :         SdrPaintWindow* pCandidate = rView.GetPaintWindow(a);
      87           0 :         rtl::Reference< sdr::overlay::OverlayManager > xTargetOverlay = pCandidate->GetOverlayManager();
      88             : 
      89           0 :         if (xTargetOverlay.is())
      90             :         {
      91             :             sdr::overlay::OverlayRollingRectangleStriped* pNew = new sdr::overlay::OverlayRollingRectangleStriped(
      92           0 :                 rStartPos, rStartPos, false);
      93           0 :             xTargetOverlay->add(*pNew);
      94           0 :             maObjects.append(*pNew);
      95             :         }
      96           0 :     }
      97           0 : }
      98             : 
      99           0 : ImplMarkingOverlay::~ImplMarkingOverlay()
     100             : {
     101             :     // The OverlayObjects are cleared using the destructor of OverlayObjectList.
     102             :     // That destructor calls clear() at the list which removes all objects from the
     103             :     // OverlayManager and deletes them.
     104           0 : }
     105             : 
     106           0 : void ImplMarkingOverlay::SetSecondPosition(const basegfx::B2DPoint& rNewPosition)
     107             : {
     108           0 :     if(rNewPosition != maSecondPosition)
     109             :     {
     110             :         // apply to OverlayObjects
     111           0 :         for(sal_uInt32 a(0L); a < maObjects.count(); a++)
     112             :         {
     113           0 :             sdr::overlay::OverlayRollingRectangleStriped& rCandidate = static_cast< sdr::overlay::OverlayRollingRectangleStriped&>(maObjects.getOverlayObject(a));
     114           0 :             rCandidate.setSecondPosition(rNewPosition);
     115             :         }
     116             : 
     117             :         // remember new position
     118           0 :         maSecondPosition = rNewPosition;
     119             :     }
     120           0 : }
     121             : 
     122             : 
     123             : 
     124             : // MarkView
     125             : 
     126             : 
     127             : 
     128        9504 : void SdrMarkView::ImpClearVars()
     129             : {
     130        9504 :     eDragMode=SDRDRAG_MOVE;
     131        9504 :     bRefHdlShownOnly=false;
     132        9504 :     eEditMode=SDREDITMODE_EDIT;
     133        9504 :     eEditMode0=SDREDITMODE_EDIT;
     134        9504 :     bDesignMode=false;
     135        9504 :     pMarkedObj=NULL;
     136        9504 :     pMarkedPV=NULL;
     137        9504 :     bForceFrameHandles=false;
     138        9504 :     bPlusHdlAlways=false;
     139        9504 :     nFrameHandlesLimit=50;
     140        9504 :     bInsPolyPoint=false;
     141        9504 :     mnInsPointNum = 0L;
     142        9504 :     bMarkedObjRectDirty=false;
     143        9504 :     bMarkedPointsRectsDirty=false;
     144        9504 :     mbMarkHandlesHidden = false;
     145        9504 :     bMrkPntDirty=false;
     146        9504 :     bMarkHdlWhenTextEdit=false;
     147        9504 :     bMarkableObjCountDirty=false; // not yet implemented
     148        9504 :     nMarkableObjCount=0;          // not yet implemented
     149             : 
     150             :     // Migrate selections
     151        9504 :     BrkMarkObj();
     152        9504 :     BrkMarkPoints();
     153        9504 :     BrkMarkGluePoints();
     154        9504 : }
     155             : 
     156        9504 : SdrMarkView::SdrMarkView(SdrModel* pModel1, OutputDevice* pOut)
     157             : :   SdrSnapView(pModel1,pOut),
     158             :     mpMarkObjOverlay(0L),
     159             :     mpMarkPointsOverlay(0L),
     160             :     mpMarkGluePointsOverlay(0L),
     161             :     maHdlList(this),
     162        9504 :     mpSdrViewSelection(new sdr::ViewSelection())
     163             : {
     164        9504 :     ImpClearVars();
     165        9504 :     StartListening(*pModel1);
     166        9504 : }
     167             : 
     168       18876 : SdrMarkView::~SdrMarkView()
     169             : {
     170             :     // Migrate selections
     171        9438 :     BrkMarkObj();
     172        9438 :     BrkMarkPoints();
     173        9438 :     BrkMarkGluePoints();
     174        9438 :     delete mpSdrViewSelection;
     175        9438 : }
     176             : 
     177      342865 : void SdrMarkView::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
     178             : {
     179      342865 :     const SdrHint* pSdrHint = dynamic_cast<const SdrHint*>(&rHint);
     180      342865 :     if (pSdrHint)
     181             :     {
     182      333794 :         SdrHintKind eKind=pSdrHint->GetKind();
     183             : 
     184      333794 :         if (eKind==HINT_OBJCHG || eKind==HINT_OBJINSERTED || eKind==HINT_OBJREMOVED)
     185             :         {
     186      288694 :             bMarkedObjRectDirty=true;
     187      288694 :             bMarkedPointsRectsDirty=true;
     188             :         }
     189             :     }
     190      342865 :     SdrSnapView::Notify(rBC,rHint);
     191      342865 : }
     192             : 
     193        3699 : void SdrMarkView::ModelHasChanged()
     194             : {
     195        3699 :     SdrPaintView::ModelHasChanged();
     196        3699 :     GetMarkedObjectListWriteAccess().SetNameDirty();
     197        3699 :     bMarkedObjRectDirty=true;
     198        3699 :     bMarkedPointsRectsDirty=true;
     199             :     // Example: Obj is selected and maMarkedObjectList is sorted.
     200             :     // In another View 2, the ObjOrder is changed (e. g. MovToTop())
     201             :     // Then we need to re-sort MarkList.
     202        3699 :     GetMarkedObjectListWriteAccess().SetUnsorted();
     203        3699 :     SortMarkedObjects();
     204        3699 :     bMrkPntDirty=true;
     205        3699 :     UndirtyMrkPnt();
     206        3699 :     SdrView* pV=static_cast<SdrView*>(this);
     207        3699 :     if (pV!=NULL && !pV->IsDragObj() && !pV->IsInsObjPoint()) {
     208        3699 :         AdjustMarkHdl();
     209             :     }
     210        3699 : }
     211             : 
     212             : 
     213             : 
     214        1876 : bool SdrMarkView::IsAction() const
     215             : {
     216        1876 :     return SdrSnapView::IsAction() || IsMarkObj() || IsMarkPoints() || IsMarkGluePoints();
     217             : }
     218             : 
     219           2 : void SdrMarkView::MovAction(const Point& rPnt)
     220             : {
     221           2 :     SdrSnapView::MovAction(rPnt);
     222             : 
     223           2 :     if(IsMarkObj())
     224             :     {
     225           0 :         MovMarkObj(rPnt);
     226             :     }
     227           2 :     else if(IsMarkPoints())
     228             :     {
     229           0 :         MovMarkPoints(rPnt);
     230             :     }
     231           2 :     else if(IsMarkGluePoints())
     232             :     {
     233           0 :         MovMarkGluePoints(rPnt);
     234             :     }
     235           2 : }
     236             : 
     237           0 : void SdrMarkView::EndAction()
     238             : {
     239           0 :     if(IsMarkObj())
     240             :     {
     241           0 :         EndMarkObj();
     242             :     }
     243           0 :     else if(IsMarkPoints())
     244             :     {
     245           0 :         EndMarkPoints();
     246             :     }
     247           0 :     else if(IsMarkGluePoints())
     248             :     {
     249           0 :         EndMarkGluePoints();
     250             :     }
     251             : 
     252           0 :     SdrSnapView::EndAction();
     253           0 : }
     254             : 
     255           0 : void SdrMarkView::BckAction()
     256             : {
     257           0 :     SdrSnapView::BckAction();
     258           0 :     BrkMarkObj();
     259           0 :     BrkMarkPoints();
     260           0 :     BrkMarkGluePoints();
     261           0 : }
     262             : 
     263        5984 : void SdrMarkView::BrkAction()
     264             : {
     265        5984 :     SdrSnapView::BrkAction();
     266        5984 :     BrkMarkObj();
     267        5984 :     BrkMarkPoints();
     268        5984 :     BrkMarkGluePoints();
     269        5984 : }
     270             : 
     271           0 : void SdrMarkView::TakeActionRect(Rectangle& rRect) const
     272             : {
     273           0 :     if(IsMarkObj() || IsMarkPoints() || IsMarkGluePoints())
     274             :     {
     275           0 :         rRect = Rectangle(aDragStat.GetStart(), aDragStat.GetNow());
     276             :     }
     277             :     else
     278             :     {
     279           0 :         SdrSnapView::TakeActionRect(rRect);
     280             :     }
     281           0 : }
     282             : 
     283             : 
     284             : 
     285           0 : void SdrMarkView::ClearPageView()
     286             : {
     287           0 :     UnmarkAllObj();
     288           0 :     SdrSnapView::ClearPageView();
     289           0 : }
     290             : 
     291        5243 : void SdrMarkView::HideSdrPage()
     292             : {
     293        5243 :     bool bMrkChg(false);
     294             : 
     295        5243 :     SdrPageView* pPageView = GetSdrPageView();
     296        5243 :     if (pPageView)
     297             :     {
     298             :         // break all creation actions when hiding page (#75081#)
     299        5029 :         BrkAction();
     300             : 
     301             :         // Discard all selections on this page
     302        5029 :         bMrkChg = GetMarkedObjectListWriteAccess().DeletePageView(*pPageView);
     303             :     }
     304             : 
     305        5243 :     SdrSnapView::HideSdrPage();
     306             : 
     307        5243 :     if(bMrkChg)
     308             :     {
     309          54 :         MarkListHasChanged();
     310          54 :         AdjustMarkHdl();
     311             :     }
     312        5243 : }
     313             : 
     314             : 
     315             : 
     316           0 : bool SdrMarkView::BegMarkObj(const Point& rPnt, bool bUnmark)
     317             : {
     318           0 :     BrkAction();
     319             : 
     320             :     DBG_ASSERT(0L == mpMarkObjOverlay, "SdrMarkView::BegMarkObj: There exists a mpMarkObjOverlay (!)");
     321           0 :     basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y());
     322           0 :     mpMarkObjOverlay = new ImplMarkingOverlay(*this, aStartPos, bUnmark);
     323             : 
     324           0 :     aDragStat.Reset(rPnt);
     325           0 :     aDragStat.NextPoint();
     326           0 :     aDragStat.SetMinMove(nMinMovLog);
     327             : 
     328           0 :     return true;
     329             : }
     330             : 
     331           0 : void SdrMarkView::MovMarkObj(const Point& rPnt)
     332             : {
     333           0 :     if(IsMarkObj() && aDragStat.CheckMinMoved(rPnt))
     334             :     {
     335           0 :         aDragStat.NextMove(rPnt);
     336             :         DBG_ASSERT(mpMarkObjOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
     337           0 :         basegfx::B2DPoint aNewPos(rPnt.X(), rPnt.Y());
     338           0 :         mpMarkObjOverlay->SetSecondPosition(aNewPos);
     339             :     }
     340           0 : }
     341             : 
     342           0 : bool SdrMarkView::EndMarkObj()
     343             : {
     344           0 :     bool bRetval(false);
     345             : 
     346           0 :     if(IsMarkObj())
     347             :     {
     348           0 :         if(aDragStat.IsMinMoved())
     349             :         {
     350           0 :             Rectangle aRect(aDragStat.GetStart(), aDragStat.GetNow());
     351           0 :             aRect.Justify();
     352           0 :             MarkObj(aRect, mpMarkObjOverlay->IsUnmarking());
     353           0 :             bRetval = true;
     354             :         }
     355             : 
     356             :         // cleanup
     357           0 :         BrkMarkObj();
     358             :     }
     359             : 
     360           0 :     return bRetval;
     361             : }
     362             : 
     363       24926 : void SdrMarkView::BrkMarkObj()
     364             : {
     365       24926 :     if(IsMarkObj())
     366             :     {
     367             :         DBG_ASSERT(mpMarkObjOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
     368           0 :         delete mpMarkObjOverlay;
     369           0 :         mpMarkObjOverlay = 0L;
     370             :     }
     371       24926 : }
     372             : 
     373             : 
     374             : 
     375           0 : bool SdrMarkView::BegMarkPoints(const Point& rPnt, bool bUnmark)
     376             : {
     377           0 :     if(HasMarkablePoints())
     378             :     {
     379           0 :         BrkAction();
     380             : 
     381             :         DBG_ASSERT(0L == mpMarkPointsOverlay, "SdrMarkView::BegMarkObj: There exists a mpMarkPointsOverlay (!)");
     382           0 :         basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y());
     383           0 :         mpMarkPointsOverlay = new ImplMarkingOverlay(*this, aStartPos, bUnmark);
     384             : 
     385           0 :         aDragStat.Reset(rPnt);
     386           0 :         aDragStat.NextPoint();
     387           0 :         aDragStat.SetMinMove(nMinMovLog);
     388             : 
     389           0 :         return true;
     390             :     }
     391             : 
     392           0 :     return false;
     393             : }
     394             : 
     395           0 : void SdrMarkView::MovMarkPoints(const Point& rPnt)
     396             : {
     397           0 :     if(IsMarkPoints() && aDragStat.CheckMinMoved(rPnt))
     398             :     {
     399           0 :         aDragStat.NextMove(rPnt);
     400             : 
     401             :         DBG_ASSERT(mpMarkPointsOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
     402           0 :         basegfx::B2DPoint aNewPos(rPnt.X(), rPnt.Y());
     403           0 :         mpMarkPointsOverlay->SetSecondPosition(aNewPos);
     404             :     }
     405           0 : }
     406             : 
     407           0 : bool SdrMarkView::EndMarkPoints()
     408             : {
     409           0 :     bool bRetval(false);
     410             : 
     411           0 :     if(IsMarkPoints())
     412             :     {
     413           0 :         if(aDragStat.IsMinMoved())
     414             :         {
     415           0 :             Rectangle aRect(aDragStat.GetStart(), aDragStat.GetNow());
     416           0 :             aRect.Justify();
     417           0 :             MarkPoints(aRect, mpMarkPointsOverlay->IsUnmarking());
     418             : 
     419           0 :             bRetval = true;
     420             :         }
     421             : 
     422             :         // cleanup
     423           0 :         BrkMarkPoints();
     424             :     }
     425             : 
     426           0 :     return bRetval;
     427             : }
     428             : 
     429       24926 : void SdrMarkView::BrkMarkPoints()
     430             : {
     431       24926 :     if(IsMarkPoints())
     432             :     {
     433             :         DBG_ASSERT(mpMarkPointsOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
     434           0 :         delete mpMarkPointsOverlay;
     435           0 :         mpMarkPointsOverlay = 0L;
     436             :     }
     437       24926 : }
     438             : 
     439             : 
     440             : 
     441           0 : bool SdrMarkView::BegMarkGluePoints(const Point& rPnt, bool bUnmark)
     442             : {
     443           0 :     if(HasMarkableGluePoints())
     444             :     {
     445           0 :         BrkAction();
     446             : 
     447             :         DBG_ASSERT(0L == mpMarkGluePointsOverlay, "SdrMarkView::BegMarkObj: There exists a mpMarkGluePointsOverlay (!)");
     448             : 
     449           0 :         basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y());
     450           0 :         mpMarkGluePointsOverlay = new ImplMarkingOverlay(*this, aStartPos, bUnmark);
     451           0 :         aDragStat.Reset(rPnt);
     452           0 :         aDragStat.NextPoint();
     453           0 :         aDragStat.SetMinMove(nMinMovLog);
     454             : 
     455           0 :         return true;
     456             :     }
     457             : 
     458           0 :     return false;
     459             : }
     460             : 
     461           0 : void SdrMarkView::MovMarkGluePoints(const Point& rPnt)
     462             : {
     463           0 :     if(IsMarkGluePoints() && aDragStat.CheckMinMoved(rPnt))
     464             :     {
     465           0 :         aDragStat.NextMove(rPnt);
     466             : 
     467             :         DBG_ASSERT(mpMarkGluePointsOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
     468           0 :         basegfx::B2DPoint aNewPos(rPnt.X(), rPnt.Y());
     469           0 :         mpMarkGluePointsOverlay->SetSecondPosition(aNewPos);
     470             :     }
     471           0 : }
     472             : 
     473           0 : bool SdrMarkView::EndMarkGluePoints()
     474             : {
     475           0 :     bool bRetval(false);
     476             : 
     477           0 :     if(IsMarkGluePoints())
     478             :     {
     479           0 :         if(aDragStat.IsMinMoved())
     480             :         {
     481           0 :             Rectangle aRect(aDragStat.GetStart(),aDragStat.GetNow());
     482           0 :             aRect.Justify();
     483           0 :             MarkGluePoints(&aRect, mpMarkGluePointsOverlay->IsUnmarking());
     484             : 
     485           0 :             bRetval = true;
     486             :         }
     487             : 
     488             :         // cleanup
     489           0 :         BrkMarkGluePoints();
     490             :     }
     491             : 
     492           0 :     return bRetval;
     493             : }
     494             : 
     495       24926 : void SdrMarkView::BrkMarkGluePoints()
     496             : {
     497       24926 :     if(IsMarkGluePoints())
     498             :     {
     499             :         DBG_ASSERT(mpMarkGluePointsOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
     500           0 :         delete mpMarkGluePointsOverlay;
     501           0 :         mpMarkGluePointsOverlay = 0L;
     502             :     }
     503       24926 : }
     504             : 
     505           0 : sal_uIntPtr SdrMarkView::GetMarkableObjCount() const
     506             : {
     507           0 :     sal_uIntPtr nCount=0;
     508           0 :     SdrPageView* pPV = GetSdrPageView();
     509             : 
     510           0 :     if(pPV)
     511             :     {
     512           0 :         SdrObjList* pOL=pPV->GetObjList();
     513           0 :         const size_t nObjCount = pOL->GetObjCount();
     514           0 :         for (size_t nObjNum=0; nObjNum<nObjCount; ++nObjNum) {
     515           0 :             SdrObject* pObj=pOL->GetObj(nObjNum);
     516           0 :             if (IsObjMarkable(pObj,pPV)) {
     517           0 :                 nCount++;
     518             :             }
     519             :         }
     520             :     }
     521           0 :     return nCount;
     522             : }
     523             : 
     524           0 : bool SdrMarkView::HasMarkableObj() const
     525             : {
     526           0 :     SdrPageView* pPV = GetSdrPageView();
     527           0 :     if(pPV)
     528             :     {
     529           0 :         SdrObjList* pOL=pPV->GetObjList();
     530           0 :         const size_t nObjCount = pOL->GetObjCount();
     531           0 :         for (size_t nObjNum = 0; nObjNum<nObjCount; ++nObjNum) {
     532           0 :             SdrObject* pObj=pOL->GetObj(nObjNum);
     533           0 :             if (IsObjMarkable(pObj,pPV)) {
     534           0 :                 return true;
     535             :             }
     536             :         }
     537             :     }
     538           0 :     return false;
     539             : }
     540             : 
     541       15263 : void SdrMarkView::hideMarkHandles()
     542             : {
     543       15263 :     if(!mbMarkHandlesHidden)
     544             :     {
     545       15263 :         mbMarkHandlesHidden = true;
     546       15263 :         AdjustMarkHdl();
     547             :     }
     548       15263 : }
     549             : 
     550       17669 : void SdrMarkView::showMarkHandles()
     551             : {
     552       17669 :     if(mbMarkHandlesHidden)
     553             :     {
     554       14996 :         mbMarkHandlesHidden = false;
     555       14996 :         AdjustMarkHdl();
     556             :     }
     557       17669 : }
     558             : 
     559       47653 : bool SdrMarkView::ImpIsFrameHandles() const
     560             : {
     561       47653 :     const size_t nMarkCount=GetMarkedObjectCount();
     562       47653 :     bool bFrmHdl=nMarkCount>static_cast<size_t>(nFrameHandlesLimit) || bForceFrameHandles;
     563       47653 :     bool bStdDrag=eDragMode==SDRDRAG_MOVE;
     564       47653 :     if (nMarkCount==1 && bStdDrag && bFrmHdl)
     565             :     {
     566         109 :         const SdrObject* pObj=GetMarkedObjectByIndex(0);
     567         109 :         if (pObj->GetObjInventor()==SdrInventor)
     568             :         {
     569         107 :             sal_uInt16 nIdent=pObj->GetObjIdentifier();
     570         107 :             if (nIdent==OBJ_LINE || nIdent==OBJ_EDGE || nIdent==OBJ_CAPTION || nIdent==OBJ_MEASURE || nIdent==OBJ_CUSTOMSHAPE || nIdent==OBJ_TABLE )
     571             :             {
     572          40 :                 bFrmHdl=false;
     573             :             }
     574             :         }
     575             :     }
     576       47653 :     if (!bStdDrag && !bFrmHdl) {
     577             :         // all other drag modes only with FrameHandles
     578           0 :         bFrmHdl=true;
     579           0 :         if (eDragMode==SDRDRAG_ROTATE) {
     580             :             // when rotating, use ObjOwn drag, if there's at least 1 PolyObj
     581           0 :             for (size_t nMarkNum=0; nMarkNum<nMarkCount && bFrmHdl; ++nMarkNum) {
     582           0 :                 const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
     583           0 :                 const SdrObject* pObj=pM->GetMarkedSdrObj();
     584           0 :                 bFrmHdl=!pObj->IsPolyObj();
     585             :             }
     586             :         }
     587             :     }
     588       47653 :     if (!bFrmHdl) {
     589             :         // FrameHandles, if at least 1 Obj can't do SpecialDrag
     590        8056 :         for (size_t nMarkNum=0; nMarkNum<nMarkCount && !bFrmHdl; ++nMarkNum) {
     591         607 :             const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
     592         607 :             const SdrObject* pObj=pM->GetMarkedSdrObj();
     593         607 :             bFrmHdl=!pObj->hasSpecialDrag();
     594             :         }
     595             :     }
     596             : 
     597             :     // no FrameHdl for crop
     598       47653 :     if(bFrmHdl && SDRDRAG_CROP == eDragMode)
     599             :     {
     600           0 :         bFrmHdl = false;
     601             :     }
     602             : 
     603       47653 :     return bFrmHdl;
     604             : }
     605             : 
     606       51281 : void SdrMarkView::SetMarkHandles()
     607             : {
     608             :     // remember old focus handle values to search for it again
     609       51281 :     const SdrHdl* pSaveOldFocusHdl = maHdlList.GetFocusHdl();
     610       51281 :     bool bSaveOldFocus(false);
     611       51281 :     sal_uInt32 nSavePolyNum(0L), nSavePointNum(0L);
     612       51281 :     SdrHdlKind eSaveKind(HDL_MOVE);
     613       51281 :     SdrObject* pSaveObj = NULL;
     614             : 
     615       51281 :     if(pSaveOldFocusHdl
     616           0 :         && pSaveOldFocusHdl->GetObj()
     617           0 :         && pSaveOldFocusHdl->GetObj()->ISA(SdrPathObj)
     618       51281 :         && (pSaveOldFocusHdl->GetKind() == HDL_POLY || pSaveOldFocusHdl->GetKind() == HDL_BWGT))
     619             :     {
     620           0 :         bSaveOldFocus = true;
     621           0 :         nSavePolyNum = pSaveOldFocusHdl->GetPolyNum();
     622           0 :         nSavePointNum = pSaveOldFocusHdl->GetPointNum();
     623           0 :         pSaveObj = pSaveOldFocusHdl->GetObj();
     624           0 :         eSaveKind = pSaveOldFocusHdl->GetKind();
     625             :     }
     626             : 
     627             :     // delete/clear all handles. This will always be done, even with areMarkHandlesHidden()
     628       51281 :     maHdlList.Clear();
     629       51281 :     maHdlList.SetRotateShear(eDragMode==SDRDRAG_ROTATE);
     630       51281 :     maHdlList.SetDistortShear(eDragMode==SDRDRAG_SHEAR);
     631       51281 :     pMarkedObj=NULL;
     632       51281 :     pMarkedPV=NULL;
     633             : 
     634             :     // are handles enabled at all? Create only then
     635       51281 :     if(!areMarkHandlesHidden())
     636             :     {
     637       35477 :         const size_t nMarkCount=GetMarkedObjectCount();
     638       35477 :         bool bStdDrag=eDragMode==SDRDRAG_MOVE;
     639       35477 :         bool bSingleTextObjMark=false;
     640             : 
     641       35477 :         if (nMarkCount==1)
     642             :         {
     643         120 :             pMarkedObj=GetMarkedObjectByIndex(0);
     644             :             bSingleTextObjMark =
     645         120 :                 pMarkedObj &&
     646         187 :                 pMarkedObj->ISA(SdrTextObj) &&
     647         187 :                 static_cast<SdrTextObj*>(pMarkedObj)->IsTextFrame();
     648             :         }
     649             : 
     650       35477 :         bool bFrmHdl=ImpIsFrameHandles();
     651             : 
     652       35477 :         if (nMarkCount>0)
     653             :         {
     654         240 :             pMarkedPV=GetSdrPageViewOfMarkedByIndex(0);
     655             : 
     656         751 :             for (size_t nMarkNum=0; nMarkNum<nMarkCount && (pMarkedPV!=NULL || !bFrmHdl); ++nMarkNum)
     657             :             {
     658         511 :                 const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
     659             : 
     660         511 :                 if (pMarkedPV!=pM->GetPageView())
     661             :                 {
     662           0 :                     pMarkedPV=NULL;
     663             :                 }
     664             :             }
     665             :         }
     666             : 
     667             :         // apply calc offset to marked object rect
     668             :         // ( necessary for handles to be displayed in
     669             :         // correct position )
     670       35477 :         Point aGridOff = GetGridOffset();
     671             : 
     672             :         // There can be multiple mark views, but we're only interested in the one that has a window associated.
     673       35477 :         const bool bTiledRendering = GetModel()->isTiledRendering() && GetFirstOutputDevice() && GetFirstOutputDevice()->GetOutDevType() == OUTDEV_WINDOW;
     674             : 
     675             :         // check if text edit or ole is active and handles need to be suppressed. This may be the case
     676             :         // when a single object is selected
     677             :         // Using a strict return statement is okay here; no handles means *no* handles.
     678       35477 :         if(pMarkedObj)
     679             :         {
     680             :             // formally #i33755#: If TextEdit is active the EditEngine will directly paint
     681             :             // to the window, so suppress Overlay and handles completely; a text frame for
     682             :             // the active text edit will be painted by the repaitnt mechanism in
     683             :             // SdrObjEditView::ImpPaintOutlinerView in this case. This needs to be reworked
     684             :             // in the future
     685             :             // Also formally #122142#: Pretty much the same for SdrCaptionObj's in calc.
     686         120 :             if(static_cast<SdrView*>(this)->IsTextEdit())
     687             :             {
     688           6 :                 const SdrTextObj* pSdrTextObj = dynamic_cast< const SdrTextObj* >(pMarkedObj);
     689             : 
     690           6 :                 if(pSdrTextObj && pSdrTextObj->IsInEditMode())
     691             :                 {
     692           6 :                     if (bTiledRendering)
     693             :                         // Suppress handles -> empty graphic selection.
     694           6 :                         GetModel()->libreOfficeKitCallback(LOK_CALLBACK_GRAPHIC_SELECTION, "EMPTY");
     695          12 :                     return;
     696             :                 }
     697             :             }
     698             : 
     699             :             // formally #i118524#: if inplace activated OLE is selected, suppress handles
     700         114 :             const SdrOle2Obj* pSdrOle2Obj = dynamic_cast< const SdrOle2Obj* >(pMarkedObj);
     701             : 
     702         114 :             if(pSdrOle2Obj && (pSdrOle2Obj->isInplaceActive() || pSdrOle2Obj->isUiActive()))
     703             :             {
     704           0 :                 return;
     705             :             }
     706             : 
     707         114 :             if (bTiledRendering && pMarkedObj->GetObjIdentifier() == OBJ_TABLE)
     708             :             {
     709           0 :                 rtl::Reference<sdr::SelectionController> xController = static_cast<SdrView*>(this)->getSelectionController();
     710           0 :                 if (xController.is() && xController->hasSelectedCells())
     711             :                 {
     712             :                     // The table shape has selected cells, which provide text selection already -> no graphic selection.
     713           0 :                     GetModel()->libreOfficeKitCallback(LOK_CALLBACK_GRAPHIC_SELECTION, "EMPTY");
     714           0 :                     return;
     715           0 :                 }
     716             :             }
     717             :         }
     718             : 
     719       35471 :         Rectangle aRect(GetMarkedObjRect());
     720             : 
     721       35471 :         if (bTiledRendering)
     722             :         {
     723         104 :             Rectangle aSelection(aRect);
     724         104 :             OString sSelection;
     725         104 :             if (aSelection.IsEmpty())
     726          89 :                 sSelection = "EMPTY";
     727             :             else
     728             :             {
     729             :                 // In case the map mode is in 100th MM, then need to convert the coordinates over to twips for LOK.
     730          15 :                 if (pMarkedPV)
     731             :                 {
     732          15 :                     if (OutputDevice* pOutputDevice = pMarkedPV->GetView().GetFirstOutputDevice())
     733             :                     {
     734          15 :                         if (pOutputDevice->GetMapMode().GetMapUnit() == MAP_100TH_MM)
     735           8 :                             aSelection = OutputDevice::LogicToLogic(aSelection, MAP_100TH_MM, MAP_TWIP);
     736             :                     }
     737             :                 }
     738             : 
     739          15 :                 sSelection = aSelection.toString();
     740             : 
     741             :                 // hide the text selection too
     742          15 :                 GetModel()->libreOfficeKitCallback(LOK_CALLBACK_TEXT_SELECTION, "");
     743             :             }
     744         104 :             GetModel()->libreOfficeKitCallback(LOK_CALLBACK_GRAPHIC_SELECTION, sSelection.getStr());
     745             :         }
     746             : 
     747       35471 :         if (bFrmHdl)
     748             :         {
     749       33021 :             if(!aRect.IsEmpty())
     750             :             { // otherwise nothing is found
     751         133 :                 if( bSingleTextObjMark )
     752             :                 {
     753           6 :                     const size_t nSiz0=maHdlList.GetHdlCount();
     754           6 :                     pMarkedObj->AddToHdlList(maHdlList);
     755           6 :                     const size_t nSiz1=maHdlList.GetHdlCount();
     756          66 :                     for (size_t i=nSiz0; i<nSiz1; ++i)
     757             :                     {
     758          60 :                         SdrHdl* pHdl=maHdlList.GetHdl(i);
     759          60 :                         pHdl->SetObj(pMarkedObj);
     760          60 :                         pHdl->SetPos( pHdl->GetPos() + aGridOff );
     761          60 :                         pHdl->SetPageView(pMarkedPV);
     762          60 :                         pHdl->SetObjHdlNum(sal_uInt16(i-nSiz0));
     763             :                     }
     764             :                 }
     765             :                 else
     766             :                 {
     767         127 :                     bool bWdt0=aRect.Left()==aRect.Right();
     768         127 :                     bool bHgt0=aRect.Top()==aRect.Bottom();
     769         127 :                     if (bWdt0 && bHgt0)
     770             :                     {
     771           0 :                         maHdlList.AddHdl(new SdrHdl(aRect.TopLeft(),HDL_UPLFT));
     772             :                     }
     773         127 :                     else if (!bStdDrag && (bWdt0 || bHgt0))
     774             :                     {
     775           0 :                         maHdlList.AddHdl(new SdrHdl(aRect.TopLeft()    ,HDL_UPLFT));
     776           0 :                         maHdlList.AddHdl(new SdrHdl(aRect.BottomRight(),HDL_LWRGT));
     777             :                     }
     778             :                     else
     779             :                     {
     780         127 :                         if (!bWdt0 && !bHgt0) maHdlList.AddHdl(new SdrHdl(aRect.TopLeft()     ,HDL_UPLFT));
     781         127 :                         if (          !bHgt0) maHdlList.AddHdl(new SdrHdl(aRect.TopCenter()   ,HDL_UPPER));
     782         127 :                         if (!bWdt0 && !bHgt0) maHdlList.AddHdl(new SdrHdl(aRect.TopRight()    ,HDL_UPRGT));
     783         127 :                         if (!bWdt0          ) maHdlList.AddHdl(new SdrHdl(aRect.LeftCenter()  ,HDL_LEFT ));
     784         127 :                         if (!bWdt0          ) maHdlList.AddHdl(new SdrHdl(aRect.RightCenter() ,HDL_RIGHT));
     785         127 :                         if (!bWdt0 && !bHgt0) maHdlList.AddHdl(new SdrHdl(aRect.BottomLeft()  ,HDL_LWLFT));
     786         127 :                         if (          !bHgt0) maHdlList.AddHdl(new SdrHdl(aRect.BottomCenter(),HDL_LOWER));
     787         127 :                         if (!bWdt0 && !bHgt0) maHdlList.AddHdl(new SdrHdl(aRect.BottomRight() ,HDL_LWRGT));
     788             :                     }
     789             :                 }
     790             :             }
     791             :         }
     792             :         else
     793             :         {
     794        2450 :             bool bDone(false);
     795             : 
     796             :             // moved crop handling to non-frame part and the handle creation to SdrGrafObj
     797        2450 :             if(1 == nMarkCount && pMarkedObj && SDRDRAG_CROP == eDragMode)
     798             :             {
     799             :                 // Default addCropHandles from SdrObject does nothing. When pMarkedObj is SdrGrafObj, previous
     800             :                 // behaviour occurs (code in svx/source/svdraw/svdograf.cxx). When pMarkedObj is SwVirtFlyDrawObj
     801             :                 // writer takes the responsibility of adding handles (code in sw/source/core/draw/dflyobj.cxx)
     802           0 :                 pMarkedObj->addCropHandles(maHdlList);
     803           0 :                 bDone = true;
     804             :             }
     805             : 
     806        2450 :             if(!bDone)
     807             :             {
     808        2639 :                 for (size_t nMarkNum=0; nMarkNum<nMarkCount; ++nMarkNum)
     809             :                 {
     810         189 :                     const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
     811         189 :                     SdrObject* pObj=pM->GetMarkedSdrObj();
     812         189 :                     SdrPageView* pPV=pM->GetPageView();
     813         189 :                     const size_t nSiz0=maHdlList.GetHdlCount();
     814         189 :                     pObj->AddToHdlList(maHdlList);
     815         189 :                     const size_t nSiz1=maHdlList.GetHdlCount();
     816         189 :                     bool bPoly=pObj->IsPolyObj();
     817         189 :                     const SdrUShortCont* pMrkPnts=pM->GetMarkedPoints();
     818        1170 :                     for (size_t i=nSiz0; i<nSiz1; ++i)
     819             :                     {
     820         981 :                         SdrHdl* pHdl=maHdlList.GetHdl(i);
     821         981 :                         pHdl->SetPos( pHdl->GetPos() + aGridOff );
     822         981 :                         pHdl->SetObj(pObj);
     823         981 :                         pHdl->SetPageView(pPV);
     824         981 :                         pHdl->SetObjHdlNum(sal_uInt16(i-nSiz0));
     825             : 
     826         981 :                         if (bPoly)
     827             :                         {
     828             :                             bool bSelected=pMrkPnts!=NULL
     829         701 :                                       && pMrkPnts->find( sal_uInt16(i-nSiz0) ) != pMrkPnts->end();
     830         701 :                             pHdl->SetSelected(bSelected);
     831         701 :                             if (bPlusHdlAlways || bSelected)
     832             :                             {
     833           0 :                                 sal_uInt32 nPlusAnz=pObj->GetPlusHdlCount(*pHdl);
     834           0 :                                 for (sal_uInt32 nPlusNum=0; nPlusNum<nPlusAnz; nPlusNum++)
     835             :                                 {
     836           0 :                                     SdrHdl* pPlusHdl=pObj->GetPlusHdl(*pHdl,nPlusNum);
     837           0 :                                     if (pPlusHdl!=NULL)
     838             :                                     {
     839           0 :                                         pPlusHdl->SetObj(pObj);
     840           0 :                                         pPlusHdl->SetPageView(pPV);
     841           0 :                                         pPlusHdl->SetPlusHdl(true);
     842           0 :                                         maHdlList.AddHdl(pPlusHdl);
     843             :                                     }
     844             :                                 }
     845             :                             }
     846             :                         }
     847             :                     }
     848             :                 }
     849             :             }
     850             :         }
     851             : 
     852             :         // GluePoint handles
     853       35976 :         for (size_t nMarkNum=0; nMarkNum<nMarkCount; ++nMarkNum)
     854             :         {
     855         505 :             const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
     856         505 :             SdrObject* pObj=pM->GetMarkedSdrObj();
     857         505 :             SdrPageView* pPV=pM->GetPageView();
     858         505 :             const SdrUShortCont* pMrkGlue=pM->GetMarkedGluePoints();
     859         505 :             if (pMrkGlue!=NULL)
     860             :             {
     861           0 :                 const SdrGluePointList* pGPL=pObj->GetGluePointList();
     862           0 :                 if (pGPL!=NULL)
     863             :                 {
     864           0 :                     for(SdrUShortCont::const_iterator it = pMrkGlue->begin(); it != pMrkGlue->end(); ++it)
     865             :                     {
     866           0 :                         sal_uInt16 nId=*it;
     867             :                         //nNum changed to nNumGP because already used in for loop
     868           0 :                         sal_uInt16 nNumGP=pGPL->FindGluePoint(nId);
     869           0 :                         if (nNumGP!=SDRGLUEPOINT_NOTFOUND)
     870             :                         {
     871           0 :                             const SdrGluePoint& rGP=(*pGPL)[nNumGP];
     872           0 :                             Point aPos(rGP.GetAbsolutePos(*pObj));
     873           0 :                             SdrHdl* pGlueHdl=new SdrHdl(aPos,HDL_GLUE);
     874           0 :                             pGlueHdl->SetObj(pObj);
     875           0 :                             pGlueHdl->SetPageView(pPV);
     876           0 :                             pGlueHdl->SetObjHdlNum(nId);
     877           0 :                             maHdlList.AddHdl(pGlueHdl);
     878             :                         }
     879             :                     }
     880             :                 }
     881             :             }
     882             :         }
     883             : 
     884             :         // rotation point/axis of reflection
     885       35471 :         AddDragModeHdl(eDragMode);
     886             : 
     887             :         // sort handles
     888       35471 :         maHdlList.Sort();
     889             : 
     890             :         // add custom handles (used by other apps, e.g. AnchorPos)
     891       35471 :         AddCustomHdl();
     892             : 
     893             :         // try to restore focus handle index from remembered values
     894       35471 :         if(bSaveOldFocus)
     895             :         {
     896           0 :             for(size_t a = 0; a < maHdlList.GetHdlCount(); ++a)
     897             :             {
     898           0 :                 SdrHdl* pCandidate = maHdlList.GetHdl(a);
     899             : 
     900           0 :                 if(pCandidate->GetObj()
     901           0 :                     && pCandidate->GetObj() == pSaveObj
     902           0 :                     && pCandidate->GetKind() == eSaveKind
     903           0 :                     && pCandidate->GetPolyNum() == nSavePolyNum
     904           0 :                     && pCandidate->GetPointNum() == nSavePointNum)
     905             :                 {
     906           0 :                     maHdlList.SetFocusHdl(pCandidate);
     907           0 :                     break;
     908             :                 }
     909             :             }
     910             :         }
     911             :     }
     912             : }
     913             : 
     914        2553 : void SdrMarkView::AddCustomHdl()
     915             : {
     916             :     // add custom handles (used by other apps, e.g. AnchorPos)
     917        2553 : }
     918             : 
     919        1407 : void SdrMarkView::SetDragMode(SdrDragMode eMode)
     920             : {
     921        1407 :     SdrDragMode eMode0=eDragMode;
     922        1407 :     eDragMode=eMode;
     923        1407 :     if (eDragMode==SDRDRAG_RESIZE) eDragMode=SDRDRAG_MOVE;
     924        1407 :     if (eDragMode!=eMode0) {
     925           0 :         ForceRefToMarked();
     926           0 :         SetMarkHandles();
     927             :         {
     928           0 :             if (AreObjectsMarked()) MarkListHasChanged();
     929             :         }
     930             :     }
     931        1407 : }
     932             : 
     933       35471 : void SdrMarkView::AddDragModeHdl(SdrDragMode eMode)
     934             : {
     935       35471 :     switch(eMode)
     936             :     {
     937             :         case SDRDRAG_ROTATE:
     938             :         {
     939             :             // add rotation center
     940           0 :             SdrHdl* pHdl = new SdrHdl(aRef1, HDL_REF1);
     941             : 
     942           0 :             maHdlList.AddHdl(pHdl);
     943             : 
     944           0 :             break;
     945             :         }
     946             :         case SDRDRAG_MIRROR:
     947             :         {
     948             :             // add axis of reflection
     949           0 :             SdrHdl* pHdl3 = new SdrHdl(aRef2, HDL_REF2);
     950           0 :             SdrHdl* pHdl2 = new SdrHdl(aRef1, HDL_REF1);
     951           0 :             SdrHdl* pHdl1 = new SdrHdlLine(*pHdl2, *pHdl3, HDL_MIRX);
     952             : 
     953           0 :             pHdl1->SetObjHdlNum(1); // for sorting
     954           0 :             pHdl2->SetObjHdlNum(2); // for sorting
     955           0 :             pHdl3->SetObjHdlNum(3); // for sorting
     956             : 
     957           0 :             maHdlList.AddHdl(pHdl1); // line comes first, so it is the last in HitTest
     958           0 :             maHdlList.AddHdl(pHdl2);
     959           0 :             maHdlList.AddHdl(pHdl3);
     960             : 
     961           0 :             break;
     962             :         }
     963             :         case SDRDRAG_TRANSPARENCE:
     964             :         {
     965             :             // add interactive transparency handle
     966           0 :             const size_t nMarkCount = GetMarkedObjectCount();
     967           0 :             if(nMarkCount == 1)
     968             :             {
     969           0 :                 SdrObject* pObj = GetMarkedObjectByIndex(0);
     970           0 :                 SdrModel* pModel = GetModel();
     971           0 :                 const SfxItemSet& rSet = pObj->GetMergedItemSet();
     972             : 
     973           0 :                 if(SfxItemState::SET != rSet.GetItemState(XATTR_FILLFLOATTRANSPARENCE, false))
     974             :                 {
     975             :                     // add this item, it's not yet there
     976             :                     XFillFloatTransparenceItem aNewItem(
     977           0 :                         static_cast<const XFillFloatTransparenceItem&>(rSet.Get(XATTR_FILLFLOATTRANSPARENCE)));
     978           0 :                     XGradient aGrad = aNewItem.GetGradientValue();
     979             : 
     980           0 :                     aNewItem.SetEnabled(true);
     981           0 :                     aGrad.SetStartIntens(100);
     982           0 :                     aGrad.SetEndIntens(100);
     983           0 :                     aNewItem.SetGradientValue(aGrad);
     984             : 
     985             :                     // add undo to allow user to take back this step
     986           0 :                     if( pModel->IsUndoEnabled() )
     987             :                     {
     988           0 :                         pModel->BegUndo(SVX_RESSTR(SIP_XA_FILLTRANSPARENCE));
     989           0 :                         pModel->AddUndo(pModel->GetSdrUndoFactory().CreateUndoAttrObject(*pObj));
     990           0 :                         pModel->EndUndo();
     991             :                     }
     992             : 
     993           0 :                     SfxItemSet aNewSet(pModel->GetItemPool());
     994           0 :                     aNewSet.Put(aNewItem);
     995           0 :                     pObj->SetMergedItemSetAndBroadcast(aNewSet);
     996             :                 }
     997             : 
     998             :                 // set values and transform to vector set
     999           0 :                 GradTransformer aGradTransformer;
    1000           0 :                 GradTransVector aGradTransVector;
    1001           0 :                 GradTransGradient aGradTransGradient;
    1002             : 
    1003           0 :                 aGradTransGradient.aGradient = static_cast<const XFillFloatTransparenceItem&>(rSet.Get(XATTR_FILLFLOATTRANSPARENCE)).GetGradientValue();
    1004           0 :                 GradTransformer::GradToVec(aGradTransGradient, aGradTransVector, pObj);
    1005             : 
    1006             :                 // build handles
    1007           0 :                 const Point aTmpPos1(basegfx::fround(aGradTransVector.maPositionA.getX()), basegfx::fround(aGradTransVector.maPositionA.getY()));
    1008           0 :                 const Point aTmpPos2(basegfx::fround(aGradTransVector.maPositionB.getX()), basegfx::fround(aGradTransVector.maPositionB.getY()));
    1009           0 :                 SdrHdlColor* pColHdl1 = new SdrHdlColor(aTmpPos1, aGradTransVector.aCol1, SDR_HANDLE_COLOR_SIZE_NORMAL, true);
    1010           0 :                 SdrHdlColor* pColHdl2 = new SdrHdlColor(aTmpPos2, aGradTransVector.aCol2, SDR_HANDLE_COLOR_SIZE_NORMAL, true);
    1011           0 :                 SdrHdlGradient* pGradHdl = new SdrHdlGradient(aTmpPos1, aTmpPos2, false);
    1012             :                 DBG_ASSERT(pColHdl1 && pColHdl2 && pGradHdl, "Could not get all necessary handles!");
    1013             : 
    1014             :                 // link them
    1015           0 :                 pGradHdl->SetColorHandles(pColHdl1, pColHdl2);
    1016           0 :                 pGradHdl->SetObj(pObj);
    1017           0 :                 pColHdl1->SetColorChangeHdl(LINK(pGradHdl, SdrHdlGradient, ColorChangeHdl));
    1018           0 :                 pColHdl2->SetColorChangeHdl(LINK(pGradHdl, SdrHdlGradient, ColorChangeHdl));
    1019             : 
    1020             :                 // insert them
    1021           0 :                 maHdlList.AddHdl(pColHdl1);
    1022           0 :                 maHdlList.AddHdl(pColHdl2);
    1023           0 :                 maHdlList.AddHdl(pGradHdl);
    1024             :             }
    1025           0 :             break;
    1026             :         }
    1027             :         case SDRDRAG_GRADIENT:
    1028             :         {
    1029             :             // add interactive gradient handle
    1030           0 :             const size_t nMarkCount = GetMarkedObjectCount();
    1031           0 :             if(nMarkCount == 1)
    1032             :             {
    1033           0 :                 SdrObject* pObj = GetMarkedObjectByIndex(0);
    1034           0 :                 const SfxItemSet& rSet = pObj->GetMergedItemSet();
    1035           0 :                 drawing::FillStyle eFillStyle = static_cast<const XFillStyleItem&>(rSet.Get(XATTR_FILLSTYLE)).GetValue();
    1036             : 
    1037           0 :                 if(eFillStyle == drawing::FillStyle_GRADIENT)
    1038             :                 {
    1039             :                     // set values and transform to vector set
    1040           0 :                     GradTransformer aGradTransformer;
    1041           0 :                     GradTransVector aGradTransVector;
    1042           0 :                     GradTransGradient aGradTransGradient;
    1043           0 :                     Size aHdlSize(15, 15);
    1044             : 
    1045           0 :                     aGradTransGradient.aGradient = static_cast<const XFillGradientItem&>(rSet.Get(XATTR_FILLGRADIENT)).GetGradientValue();
    1046           0 :                     GradTransformer::GradToVec(aGradTransGradient, aGradTransVector, pObj);
    1047             : 
    1048             :                     // build handles
    1049           0 :                     const Point aTmpPos1(basegfx::fround(aGradTransVector.maPositionA.getX()), basegfx::fround(aGradTransVector.maPositionA.getY()));
    1050           0 :                     const Point aTmpPos2(basegfx::fround(aGradTransVector.maPositionB.getX()), basegfx::fround(aGradTransVector.maPositionB.getY()));
    1051           0 :                     SdrHdlColor* pColHdl1 = new SdrHdlColor(aTmpPos1, aGradTransVector.aCol1, aHdlSize, false);
    1052           0 :                     SdrHdlColor* pColHdl2 = new SdrHdlColor(aTmpPos2, aGradTransVector.aCol2, aHdlSize, false);
    1053           0 :                     SdrHdlGradient* pGradHdl = new SdrHdlGradient(aTmpPos1, aTmpPos2, true);
    1054             :                     DBG_ASSERT(pColHdl1 && pColHdl2 && pGradHdl, "Could not get all necessary handles!");
    1055             : 
    1056             :                     // link them
    1057           0 :                     pGradHdl->SetColorHandles(pColHdl1, pColHdl2);
    1058           0 :                     pGradHdl->SetObj(pObj);
    1059           0 :                     pColHdl1->SetColorChangeHdl(LINK(pGradHdl, SdrHdlGradient, ColorChangeHdl));
    1060           0 :                     pColHdl2->SetColorChangeHdl(LINK(pGradHdl, SdrHdlGradient, ColorChangeHdl));
    1061             : 
    1062             :                     // insert them
    1063           0 :                     maHdlList.AddHdl(pColHdl1);
    1064           0 :                     maHdlList.AddHdl(pColHdl2);
    1065           0 :                     maHdlList.AddHdl(pGradHdl);
    1066             :                 }
    1067             :             }
    1068           0 :             break;
    1069             :         }
    1070             :         case SDRDRAG_CROP:
    1071             :         {
    1072             :             // TODO
    1073           0 :             break;
    1074             :         }
    1075       35471 :         default: break;
    1076             :     }
    1077       35471 : }
    1078             : 
    1079             : /** handle mouse over effects for handles */
    1080           4 : bool SdrMarkView::MouseMove(const MouseEvent& rMEvt, vcl::Window* pWin)
    1081             : {
    1082           4 :     if(maHdlList.GetHdlCount())
    1083             :     {
    1084           4 :         SdrHdl* pMouseOverHdl = 0;
    1085           4 :         if( !rMEvt.IsLeaveWindow() && pWin )
    1086             :         {
    1087           4 :             Point aMDPos( pWin->PixelToLogic( rMEvt.GetPosPixel() ) );
    1088           4 :             pMouseOverHdl = PickHandle(aMDPos);
    1089             :         }
    1090             : 
    1091             :         // notify last mouse over handle that he lost the mouse
    1092           4 :         const size_t nHdlCount = maHdlList.GetHdlCount();
    1093             : 
    1094          33 :         for(size_t nHdl = 0; nHdl < nHdlCount; ++nHdl)
    1095             :         {
    1096          31 :             SdrHdl* pCurrentHdl = GetHdl(nHdl);
    1097          31 :             if( pCurrentHdl->mbMouseOver )
    1098             :             {
    1099           2 :                 if( pCurrentHdl != pMouseOverHdl )
    1100             :                 {
    1101           2 :                     pCurrentHdl->mbMouseOver = false;
    1102           2 :                     pCurrentHdl->onMouseLeave();
    1103             :                 }
    1104           2 :                 break;
    1105             :             }
    1106             :         }
    1107             : 
    1108             :         // notify current mouse over handle
    1109           4 :         if( pMouseOverHdl )
    1110             :         {
    1111           2 :             pMouseOverHdl->mbMouseOver = true;
    1112           2 :             pMouseOverHdl->onMouseEnter(rMEvt);
    1113             :         }
    1114             :     }
    1115           4 :     return SdrSnapView::MouseMove(rMEvt, pWin);
    1116             : }
    1117             : 
    1118           0 : void SdrMarkView::ForceRefToMarked()
    1119             : {
    1120           0 :     switch(eDragMode)
    1121             :     {
    1122             :         case SDRDRAG_ROTATE:
    1123             :         {
    1124           0 :             Rectangle aR(GetMarkedObjRect());
    1125           0 :             aRef1 = aR.Center();
    1126             : 
    1127           0 :             break;
    1128             :         }
    1129             : 
    1130             :         case SDRDRAG_MIRROR:
    1131             :         {
    1132             :             // first calculate the length of the axis of reflection
    1133           0 :             long nOutMin=0;
    1134           0 :             long nOutMax=0;
    1135           0 :             long nMinLen=0;
    1136           0 :             long nObjDst=0;
    1137           0 :             long nOutHgt=0;
    1138           0 :             OutputDevice* pOut=GetFirstOutputDevice();
    1139           0 :             if (pOut!=NULL) {
    1140             :                 // minimum length: 50 pixels
    1141           0 :                 nMinLen=pOut->PixelToLogic(Size(0,50)).Height();
    1142             :                 // 20 pixels distance to the Obj for the reference point
    1143           0 :                 nObjDst=pOut->PixelToLogic(Size(0,20)).Height();
    1144             :                 // MinY/MaxY
    1145             :                 // margin = minimum length = 10 pixels
    1146           0 :                 long nDst=pOut->PixelToLogic(Size(0,10)).Height();
    1147           0 :                 nOutMin=-pOut->GetMapMode().GetOrigin().Y();
    1148           0 :                 nOutMax=pOut->GetOutputSize().Height()-1+nOutMin;
    1149           0 :                 nOutMin+=nDst;
    1150           0 :                 nOutMax-=nDst;
    1151             :                 // absolute minimum length, however, is 10 pixels
    1152           0 :                 if (nOutMax-nOutMin<nDst) {
    1153           0 :                     nOutMin+=nOutMax+1;
    1154           0 :                     nOutMin/=2;
    1155           0 :                     nOutMin-=(nDst+1)/2;
    1156           0 :                     nOutMax=nOutMin+nDst;
    1157             :                 }
    1158           0 :                 nOutHgt=nOutMax-nOutMin;
    1159             :                 // otherwise minimum length = 1/4 OutHgt
    1160           0 :                 long nTemp=nOutHgt/4;
    1161           0 :                 if (nTemp>nMinLen) nMinLen=nTemp;
    1162             :             }
    1163             : 
    1164           0 :             Rectangle aR(GetMarkedObjBoundRect());
    1165           0 :             Point aCenter(aR.Center());
    1166           0 :             long nMarkHgt=aR.GetHeight()-1;
    1167           0 :             long nHgt=nMarkHgt+nObjDst*2;       // 20 pixels overlapping above and below
    1168           0 :             if (nHgt<nMinLen) nHgt=nMinLen;     // minimum length 50 pixels or 1/4 OutHgt, respectively
    1169             : 
    1170           0 :             long nY1=aCenter.Y()-(nHgt+1)/2;
    1171           0 :             long nY2=nY1+nHgt;
    1172             : 
    1173           0 :             if (pOut!=NULL && nMinLen>nOutHgt) nMinLen=nOutHgt; // TODO: maybe shorten this a little
    1174             : 
    1175           0 :             if (pOut!=NULL) { // now move completely into the visible area
    1176           0 :                 if (nY1<nOutMin) {
    1177           0 :                     nY1=nOutMin;
    1178           0 :                     if (nY2<nY1+nMinLen) nY2=nY1+nMinLen;
    1179             :                 }
    1180           0 :                 if (nY2>nOutMax) {
    1181           0 :                     nY2=nOutMax;
    1182           0 :                     if (nY1>nY2-nMinLen) nY1=nY2-nMinLen;
    1183             :                 }
    1184             :             }
    1185             : 
    1186           0 :             aRef1.X()=aCenter.X();
    1187           0 :             aRef1.Y()=nY1;
    1188           0 :             aRef2.X()=aCenter.X();
    1189           0 :             aRef2.Y()=nY2;
    1190             : 
    1191           0 :             break;
    1192             :         }
    1193             : 
    1194             :         case SDRDRAG_TRANSPARENCE:
    1195             :         case SDRDRAG_GRADIENT:
    1196             :         case SDRDRAG_CROP:
    1197             :         {
    1198           0 :             Rectangle aRect(GetMarkedObjBoundRect());
    1199           0 :             aRef1 = aRect.TopLeft();
    1200           0 :             aRef2 = aRect.BottomRight();
    1201           0 :             break;
    1202             :         }
    1203           0 :         default: break;
    1204             :     }
    1205           0 : }
    1206             : 
    1207           0 : void SdrMarkView::SetRef1(const Point& rPt)
    1208             : {
    1209           0 :     if(eDragMode == SDRDRAG_ROTATE || eDragMode == SDRDRAG_MIRROR)
    1210             :     {
    1211           0 :         aRef1 = rPt;
    1212           0 :         SdrHdl* pH = maHdlList.GetHdl(HDL_REF1);
    1213           0 :         if(pH)
    1214           0 :             pH->SetPos(rPt);
    1215             :     }
    1216           0 : }
    1217             : 
    1218           0 : void SdrMarkView::SetRef2(const Point& rPt)
    1219             : {
    1220           0 :     if(eDragMode == SDRDRAG_MIRROR)
    1221             :     {
    1222           0 :         aRef2 = rPt;
    1223           0 :         SdrHdl* pH = maHdlList.GetHdl(HDL_REF2);
    1224           0 :         if(pH)
    1225           0 :             pH->SetPos(rPt);
    1226             :     }
    1227           0 : }
    1228             : 
    1229       53426 : void SdrMarkView::CheckMarked()
    1230             : {
    1231      107631 :     for (size_t nm=GetMarkedObjectCount(); nm>0;) {
    1232         779 :         --nm;
    1233         779 :         SdrMark* pM=GetSdrMarkByIndex(nm);
    1234         779 :         SdrObject* pObj=pM->GetMarkedSdrObj();
    1235         779 :         SdrPageView* pPV=pM->GetPageView();
    1236         779 :         SdrLayerID nLay=pObj->GetLayer();
    1237         779 :         bool bRaus=!pObj->IsInserted(); // Obj deleted?
    1238         779 :         if (!pObj->Is3DObj()) {
    1239         779 :             bRaus=bRaus || pObj->GetPage()!=pPV->GetPage();   // Obj suddenly in different Page or Group
    1240             :         }
    1241        1558 :         bRaus=bRaus || pPV->GetLockedLayers().IsSet(nLay) ||  // Layer locked?
    1242        1558 :                        !pPV->GetVisibleLayers().IsSet(nLay);  // Layer invisible?
    1243             : 
    1244         779 :         if( !bRaus )
    1245         779 :             bRaus = !pObj->IsVisible(); // invisible objects can not be selected
    1246             : 
    1247         779 :         if (!bRaus) {
    1248             :             // Grouped objects can now be selected.
    1249             :             // After EnterGroup the higher-level objects,
    1250             :             // have to be deselected, though.
    1251         779 :             const SdrObjList* pOOL=pObj->GetObjList();
    1252         779 :             const SdrObjList* pVOL=pPV->GetObjList();
    1253        1564 :             while (pOOL!=NULL && pOOL!=pVOL) {
    1254           6 :                 pOOL=pOOL->GetUpList();
    1255             :             }
    1256         779 :             bRaus=pOOL!=pVOL;
    1257             :         }
    1258             : 
    1259         779 :         if (bRaus)
    1260             :         {
    1261           0 :             GetMarkedObjectListWriteAccess().DeleteMark(nm);
    1262             :         }
    1263             :         else
    1264             :         {
    1265         779 :             if (!IsGluePointEditMode()) { // selected glue points only in GlueEditMode
    1266         779 :                 SdrUShortCont* pPts=pM->GetMarkedGluePoints();
    1267         779 :                 if (pPts!=NULL) {
    1268           0 :                     pPts->clear();
    1269             :                 }
    1270             :             }
    1271             :         }
    1272             :     }
    1273             : 
    1274             :     // at least reset the remembered BoundRect to prevent handle
    1275             :     // generation if bForceFrameHandles is TRUE.
    1276       53426 :     bMarkedObjRectDirty = true;
    1277       53426 : }
    1278             : 
    1279       51281 : void SdrMarkView::SetMarkRects()
    1280             : {
    1281       51281 :     SdrPageView* pPV = GetSdrPageView();
    1282             : 
    1283       51281 :     if(pPV)
    1284             :     {
    1285       45114 :         pPV->SetHasMarkedObj(GetSnapRectFromMarkedObjects(pPV, pPV->MarkSnap()));
    1286       45114 :         GetBoundRectFromMarkedObjects(pPV, pPV->MarkBound());
    1287             :     }
    1288       51281 : }
    1289             : 
    1290        4889 : void SdrMarkView::SetFrameHandles(bool bOn)
    1291             : {
    1292        4889 :     if (bOn!=bForceFrameHandles) {
    1293        3825 :         bool bOld=ImpIsFrameHandles();
    1294        3825 :         bForceFrameHandles=bOn;
    1295        3825 :         bool bNew=ImpIsFrameHandles();
    1296        3825 :         if (bNew!=bOld) {
    1297        3825 :             AdjustMarkHdl();
    1298        3825 :             MarkListHasChanged();
    1299             :         }
    1300             :     }
    1301        4889 : }
    1302             : 
    1303         353 : void SdrMarkView::SetEditMode(SdrViewEditMode eMode)
    1304             : {
    1305         353 :     if (eMode!=eEditMode) {
    1306           6 :         bool bGlue0=eEditMode==SDREDITMODE_GLUEPOINTEDIT;
    1307           6 :         bool bEdge0=static_cast<SdrCreateView*>(this)->IsEdgeTool();
    1308           6 :         eEditMode0=eEditMode;
    1309           6 :         eEditMode=eMode;
    1310           6 :         bool bGlue1=eEditMode==SDREDITMODE_GLUEPOINTEDIT;
    1311           6 :         bool bEdge1=static_cast<SdrCreateView*>(this)->IsEdgeTool();
    1312             :         // avoid flickering when switching between GlueEdit and EdgeTool
    1313           6 :         if (bGlue1 && !bGlue0) ImpSetGlueVisible2(bGlue1);
    1314           6 :         if (bEdge1!=bEdge0) ImpSetGlueVisible3(bEdge1);
    1315           6 :         if (!bGlue1 && bGlue0) ImpSetGlueVisible2(bGlue1);
    1316           6 :         if (bGlue0 && !bGlue1) UnmarkAllGluePoints();
    1317             :     }
    1318         353 : }
    1319             : 
    1320             : 
    1321             : 
    1322         672 : bool SdrMarkView::IsObjMarkable(SdrObject* pObj, SdrPageView* pPV) const
    1323             : {
    1324         672 :     if (pObj)
    1325             :     {
    1326        1351 :         if (pObj->IsMarkProtect() ||
    1327         961 :             (!bDesignMode && pObj->IsUnoObj()))
    1328             :         {
    1329             :             // object not selectable or
    1330             :             // SdrUnoObj not in DesignMode
    1331           7 :             return false;
    1332             :         }
    1333             :     }
    1334         665 :     return pPV==NULL || pPV->IsObjMarkable(pObj);
    1335             : }
    1336             : 
    1337           1 : bool SdrMarkView::IsMarkedObjHit(const Point& rPnt, short nTol) const
    1338             : {
    1339           1 :     bool bRet=false;
    1340           1 :     nTol=ImpGetHitTolLogic(nTol,NULL);
    1341           1 :     Point aPt(rPnt);
    1342           1 :     for (size_t nm=0; nm<GetMarkedObjectCount() && !bRet; ++nm) {
    1343           0 :         SdrMark* pM=GetSdrMarkByIndex(nm);
    1344           0 :         bRet = 0 != CheckSingleSdrObjectHit(aPt,sal_uInt16(nTol),pM->GetMarkedSdrObj(),pM->GetPageView(),SdrSearchOptions::NONE,0);
    1345             :     }
    1346           1 :     return bRet;
    1347             : }
    1348             : 
    1349        2909 : SdrHdl* SdrMarkView::PickHandle(const Point& rPnt, SdrSearchOptions nOptions, SdrHdl* pHdl0) const
    1350             : {
    1351        2909 :     if (bSomeObjChgdFlag) { // recalculate handles, if necessary
    1352        1066 :         FlushComeBackTimer();
    1353             :     }
    1354        2909 :     bool bBack(nOptions & SdrSearchOptions::BACKWARD);
    1355        2909 :     bool bNext(nOptions & SdrSearchOptions::NEXT);
    1356        2909 :     Point aPt(rPnt);
    1357        2909 :     return maHdlList.IsHdlListHit(aPt,bBack,bNext,pHdl0);
    1358             : }
    1359             : 
    1360           3 : bool SdrMarkView::MarkObj(const Point& rPnt, short nTol, bool bToggle, bool bDeep)
    1361             : {
    1362             :     SdrObject* pObj;
    1363             :     SdrPageView* pPV;
    1364           3 :     nTol=ImpGetHitTolLogic(nTol,NULL);
    1365           3 :     SdrSearchOptions nOptions=SdrSearchOptions::PICKMARKABLE;
    1366           3 :     if (bDeep) nOptions=nOptions|SdrSearchOptions::DEEP;
    1367           3 :     bool bRet=PickObj(rPnt,(sal_uInt16)nTol,pObj,pPV,nOptions);
    1368           3 :     if (bRet) {
    1369           2 :         bool bUnmark=bToggle && IsObjMarked(pObj);
    1370           2 :         MarkObj(pObj,pPV,bUnmark);
    1371             :     }
    1372           3 :     return bRet;
    1373             : }
    1374             : 
    1375           1 : bool SdrMarkView::MarkNextObj(bool bPrev)
    1376             : {
    1377           1 :     SdrPageView* pPageView = GetSdrPageView();
    1378             : 
    1379           1 :     if(!pPageView)
    1380             :     {
    1381           0 :         return false;
    1382             :     }
    1383             : 
    1384           1 :     SortMarkedObjects();
    1385           1 :     const size_t nMarkCount=GetMarkedObjectCount();
    1386           1 :     size_t nChgMarkNum = SAL_MAX_SIZE; // number of the MarkEntry we want to replace
    1387           1 :     size_t nSearchObjNum = bPrev ? 0 : SAL_MAX_SIZE;
    1388           1 :     if (nMarkCount!=0) {
    1389           0 :         nChgMarkNum=bPrev ? 0 : nMarkCount-1;
    1390           0 :         SdrMark* pM=GetSdrMarkByIndex(nChgMarkNum);
    1391             :         OSL_ASSERT(pM!=NULL);
    1392           0 :         if (pM->GetMarkedSdrObj() != NULL)
    1393           0 :             nSearchObjNum = pM->GetMarkedSdrObj()->GetNavigationPosition();
    1394             :     }
    1395             : 
    1396           1 :     SdrObject* pMarkObj=NULL;
    1397           1 :     SdrObjList* pSearchObjList=pPageView->GetObjList();
    1398           1 :     const size_t nObjCount = pSearchObjList->GetObjCount();
    1399           1 :     if (nObjCount!=0) {
    1400           1 :         if (nSearchObjNum>nObjCount) nSearchObjNum=nObjCount;
    1401           3 :         while (pMarkObj==NULL && ((!bPrev && nSearchObjNum>0) || (bPrev && nSearchObjNum<nObjCount)))
    1402             :         {
    1403           1 :             if (!bPrev)
    1404           1 :                 nSearchObjNum--;
    1405           1 :             SdrObject* pSearchObj = pSearchObjList->GetObjectForNavigationPosition(nSearchObjNum);
    1406           1 :             if (IsObjMarkable(pSearchObj,pPageView))
    1407             :             {
    1408           1 :                 if (TryToFindMarkedObject(pSearchObj)==SAL_MAX_SIZE)
    1409             :                 {
    1410           1 :                     pMarkObj=pSearchObj;
    1411             :                 }
    1412             :             }
    1413           1 :             if (bPrev) nSearchObjNum++;
    1414             :         }
    1415             :     }
    1416             : 
    1417           1 :     if(!pMarkObj)
    1418             :     {
    1419           0 :         return false;
    1420             :     }
    1421             : 
    1422           1 :     if (nChgMarkNum!=SAL_MAX_SIZE)
    1423             :     {
    1424           0 :         GetMarkedObjectListWriteAccess().DeleteMark(nChgMarkNum);
    1425             :     }
    1426           1 :     MarkObj(pMarkObj,pPageView); // also calls MarkListHasChanged(), AdjustMarkHdl()
    1427           1 :     return true;
    1428             : }
    1429             : 
    1430           0 : bool SdrMarkView::MarkNextObj(const Point& rPnt, short nTol, bool bPrev)
    1431             : {
    1432           0 :     SortMarkedObjects();
    1433           0 :     nTol=ImpGetHitTolLogic(nTol,NULL);
    1434           0 :     Point aPt(rPnt);
    1435           0 :     SdrMark* pTopMarkHit=NULL;
    1436           0 :     SdrMark* pBtmMarkHit=NULL;
    1437           0 :     size_t nTopMarkHit=0;
    1438           0 :     size_t nBtmMarkHit=0;
    1439             :     // find topmost of the selected objects that is hit by rPnt
    1440           0 :     const size_t nMarkCount=GetMarkedObjectCount();
    1441           0 :     for (size_t nm=nMarkCount; nm>0 && pTopMarkHit==NULL;) {
    1442           0 :         --nm;
    1443           0 :         SdrMark* pM=GetSdrMarkByIndex(nm);
    1444           0 :         if(CheckSingleSdrObjectHit(aPt,sal_uInt16(nTol),pM->GetMarkedSdrObj(),pM->GetPageView(),SdrSearchOptions::NONE,0))
    1445             :         {
    1446           0 :             pTopMarkHit=pM;
    1447           0 :             nTopMarkHit=nm;
    1448             :         }
    1449             :     }
    1450             :     // nothing found, in this case, just select an object
    1451           0 :     if (pTopMarkHit==NULL) return MarkObj(rPnt,sal_uInt16(nTol),false);
    1452             : 
    1453           0 :     SdrObject* pTopObjHit=pTopMarkHit->GetMarkedSdrObj();
    1454           0 :     SdrObjList* pObjList=pTopObjHit->GetObjList();
    1455           0 :     SdrPageView* pPV=pTopMarkHit->GetPageView();
    1456             :     // find lowermost of the selected objects that is hit by rPnt
    1457             :     // and is placed on the same PageView as pTopMarkHit
    1458           0 :     for (size_t nm=0; nm<nMarkCount && pBtmMarkHit==NULL; ++nm) {
    1459           0 :         SdrMark* pM=GetSdrMarkByIndex(nm);
    1460           0 :         SdrPageView* pPV2=pM->GetPageView();
    1461           0 :         if (pPV2==pPV && CheckSingleSdrObjectHit(aPt,sal_uInt16(nTol),pM->GetMarkedSdrObj(),pPV2,SdrSearchOptions::NONE,0))
    1462             :         {
    1463           0 :             pBtmMarkHit=pM;
    1464           0 :             nBtmMarkHit=nm;
    1465             :         }
    1466             :     }
    1467           0 :     if (pBtmMarkHit==NULL) { pBtmMarkHit=pTopMarkHit; nBtmMarkHit=nTopMarkHit; }
    1468           0 :     SdrObject* pBtmObjHit=pBtmMarkHit->GetMarkedSdrObj();
    1469           0 :     const size_t nObjCount = pObjList->GetObjCount();
    1470             : 
    1471           0 :     size_t nSearchBeg = 0;
    1472           0 :     E3dScene* pScene = NULL;
    1473           0 :     SdrObject* pObjHit = (bPrev) ? pBtmObjHit : pTopObjHit;
    1474           0 :     bool bRemap = pObjHit->ISA(E3dCompoundObject)
    1475           0 :         && static_cast<E3dCompoundObject*>(pObjHit)->IsAOrdNumRemapCandidate(pScene);
    1476             : 
    1477           0 :     if(bPrev)
    1478             :     {
    1479           0 :         sal_uInt32 nOrdNumBtm(pBtmObjHit->GetOrdNum());
    1480             : 
    1481           0 :         if(bRemap)
    1482             :         {
    1483           0 :             nOrdNumBtm = pScene->RemapOrdNum(nOrdNumBtm);
    1484             :         }
    1485             : 
    1486           0 :         nSearchBeg = nOrdNumBtm + 1;
    1487             :     }
    1488             :     else
    1489             :     {
    1490           0 :         sal_uInt32 nOrdNumTop(pTopObjHit->GetOrdNum());
    1491             : 
    1492           0 :         if(bRemap)
    1493             :         {
    1494           0 :             nOrdNumTop = pScene->RemapOrdNum(nOrdNumTop);
    1495             :         }
    1496             : 
    1497           0 :         nSearchBeg = nOrdNumTop;
    1498             :     }
    1499             : 
    1500           0 :     size_t no=nSearchBeg;
    1501           0 :     SdrObject* pFndObj=NULL;
    1502           0 :     while (pFndObj==NULL && ((!bPrev && no>0) || (bPrev && no<nObjCount))) {
    1503           0 :         if (!bPrev) no--;
    1504             :         SdrObject* pObj;
    1505             : 
    1506           0 :         if(bRemap)
    1507             :         {
    1508           0 :             pObj = pObjList->GetObj(pScene->RemapOrdNum(no));
    1509             :         }
    1510             :         else
    1511             :         {
    1512           0 :             pObj = pObjList->GetObj(no);
    1513             :         }
    1514             : 
    1515           0 :         if (CheckSingleSdrObjectHit(aPt,sal_uInt16(nTol),pObj,pPV,SdrSearchOptions::TESTMARKABLE,0))
    1516             :         {
    1517           0 :             if (TryToFindMarkedObject(pObj)==SAL_MAX_SIZE) {
    1518           0 :                 pFndObj=pObj;
    1519             :             } else {
    1520             :                 // TODO: for performance reasons set on to Top or Btm, if necessary
    1521             :             }
    1522             :         }
    1523           0 :         if (bPrev) no++;
    1524             :     }
    1525           0 :     if (pFndObj!=NULL)
    1526             :     {
    1527           0 :         GetMarkedObjectListWriteAccess().DeleteMark(bPrev?nBtmMarkHit:nTopMarkHit);
    1528           0 :         GetMarkedObjectListWriteAccess().InsertEntry(SdrMark(pFndObj,pPV));
    1529           0 :         MarkListHasChanged();
    1530           0 :         AdjustMarkHdl();
    1531             :     }
    1532           0 :     return pFndObj!=NULL;
    1533             : }
    1534             : 
    1535           0 : bool SdrMarkView::MarkObj(const Rectangle& rRect, bool bUnmark)
    1536             : {
    1537           0 :     bool bFnd=false;
    1538           0 :     Rectangle aR(rRect);
    1539             :     SdrObjList* pObjList;
    1540           0 :     BrkAction();
    1541           0 :     SdrPageView* pPV = GetSdrPageView();
    1542             : 
    1543           0 :     if(pPV)
    1544             :     {
    1545           0 :         pObjList=pPV->GetObjList();
    1546           0 :         Rectangle aFrm1(aR);
    1547           0 :         const size_t nObjCount = pObjList->GetObjCount();
    1548           0 :         for (size_t nO=0; nO<nObjCount; ++nO) {
    1549           0 :             SdrObject* pObj=pObjList->GetObj(nO);
    1550           0 :             Rectangle aRect(pObj->GetCurrentBoundRect());
    1551           0 :             if (aFrm1.IsInside(aRect)) {
    1552           0 :                 if (!bUnmark) {
    1553           0 :                     if (IsObjMarkable(pObj,pPV))
    1554             :                     {
    1555           0 :                         GetMarkedObjectListWriteAccess().InsertEntry(SdrMark(pObj,pPV));
    1556           0 :                         bFnd=true;
    1557             :                     }
    1558             :                 } else {
    1559           0 :                     const size_t nPos=TryToFindMarkedObject(pObj);
    1560           0 :                     if (nPos!=SAL_MAX_SIZE)
    1561             :                     {
    1562           0 :                         GetMarkedObjectListWriteAccess().DeleteMark(nPos);
    1563           0 :                         bFnd=true;
    1564             :                     }
    1565             :                 }
    1566             :             }
    1567             :         }
    1568             :     }
    1569           0 :     if (bFnd) {
    1570           0 :         SortMarkedObjects();
    1571           0 :         MarkListHasChanged();
    1572           0 :         AdjustMarkHdl();
    1573             :     }
    1574           0 :     return bFnd;
    1575             : }
    1576             : 
    1577         537 : void SdrMarkView::MarkObj(SdrObject* pObj, SdrPageView* pPV, bool bUnmark, bool bImpNoSetMarkHdl)
    1578             : {
    1579         537 :     if (pObj!=NULL && pPV!=NULL && IsObjMarkable(pObj, pPV)) {
    1580         535 :         BrkAction();
    1581         535 :         if (!bUnmark)
    1582             :         {
    1583         524 :             GetMarkedObjectListWriteAccess().InsertEntry(SdrMark(pObj,pPV));
    1584             :         }
    1585             :         else
    1586             :         {
    1587          11 :             const size_t nPos=TryToFindMarkedObject(pObj);
    1588          11 :             if (nPos!=SAL_MAX_SIZE)
    1589             :             {
    1590           0 :                 GetMarkedObjectListWriteAccess().DeleteMark(nPos);
    1591             :             }
    1592             :         }
    1593         535 :         if (!bImpNoSetMarkHdl) {
    1594         458 :             MarkListHasChanged();
    1595         458 :             AdjustMarkHdl();
    1596             :         }
    1597             :     }
    1598         537 : }
    1599             : 
    1600           4 : bool SdrMarkView::IsObjMarked(SdrObject* pObj) const
    1601             : {
    1602           4 :     return TryToFindMarkedObject(pObj)!=SAL_MAX_SIZE;
    1603             : }
    1604             : 
    1605        8860 : sal_uInt16 SdrMarkView::GetMarkHdlSizePixel() const
    1606             : {
    1607        8860 :     return maHdlList.GetHdlSize()*2+1;
    1608             : }
    1609             : 
    1610        4924 : void SdrMarkView::SetMarkHdlSizePixel(sal_uInt16 nSiz)
    1611             : {
    1612        4924 :     if (nSiz<3) nSiz=3;
    1613        4924 :     nSiz/=2;
    1614        4924 :     if (nSiz!=maHdlList.GetHdlSize()) {
    1615        3607 :         maHdlList.SetHdlSize(nSiz);
    1616             :     }
    1617        4924 : }
    1618             : 
    1619        4703 : SdrObject* SdrMarkView::CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObject* pObj, SdrPageView* pPV, SdrSearchOptions nOptions, const SetOfByte* pMVisLay) const
    1620             : {
    1621        4703 :     if(((nOptions & SdrSearchOptions::IMPISMASTER) && pObj->IsNotVisibleAsMaster()) || (!pObj->IsVisible()))
    1622             :     {
    1623         424 :         return NULL;
    1624             :     }
    1625             : 
    1626        4279 :     const bool bCheckIfMarkable(nOptions & SdrSearchOptions::TESTMARKABLE);
    1627        4279 :     const bool bDeep(nOptions & SdrSearchOptions::DEEP);
    1628        4279 :     const bool bOLE(pObj->ISA(SdrOle2Obj));
    1629        4279 :     const bool bTXT(pObj->ISA(SdrTextObj) && static_cast<SdrTextObj*>(pObj)->IsTextFrame());
    1630        4279 :     SdrObject* pRet=NULL;
    1631        4279 :     Rectangle aRect(pObj->GetCurrentBoundRect());
    1632             :     // hack for calc grid sync
    1633        4279 :     aRect += pObj->GetGridOffset();
    1634        4279 :     sal_uInt16 nTol2(nTol);
    1635             : 
    1636             :     // double tolerance for OLE, text frames and objects in
    1637             :     // active text edit
    1638        4279 :     if(bOLE || bTXT || pObj==static_cast<const SdrObjEditView*>(this)->GetTextEditObject())
    1639             :     {
    1640        1195 :         nTol2*=2;
    1641             :     }
    1642             : 
    1643        4279 :     aRect.Left  ()-=nTol2; // add 1 tolerance for all objects
    1644        4279 :     aRect.Top   ()-=nTol2;
    1645        4279 :     aRect.Right ()+=nTol2;
    1646        4279 :     aRect.Bottom()+=nTol2;
    1647             : 
    1648        4279 :     if (aRect.IsInside(rPnt))
    1649             :     {
    1650         141 :         if ((!bCheckIfMarkable || IsObjMarkable(pObj,pPV)))
    1651             :         {
    1652          80 :             SdrObjList* pOL=pObj->GetSubList();
    1653             : 
    1654          80 :             if (pOL!=NULL && pOL->GetObjCount()!=0)
    1655             :             {
    1656             :                 SdrObject* pTmpObj;
    1657             :                 // adjustment hit point for virtual objects
    1658           3 :                 Point aPnt( rPnt );
    1659             : 
    1660           3 :                 if ( pObj->ISA(SdrVirtObj) )
    1661             :                 {
    1662           0 :                     Point aOffset = static_cast<SdrVirtObj*>(pObj)->GetOffset();
    1663           0 :                     aPnt.Move( -aOffset.X(), -aOffset.Y() );
    1664             :                 }
    1665             : 
    1666           3 :                 pRet=CheckSingleSdrObjectHit(aPnt,nTol,pOL,pPV,nOptions,pMVisLay,pTmpObj);
    1667             :             }
    1668             :             else
    1669             :             {
    1670          77 :                 if(!pMVisLay || pMVisLay->IsSet(pObj->GetLayer()))
    1671             :                 {
    1672          77 :                     pRet = SdrObjectPrimitiveHit(*pObj, rPnt, nTol2, *pPV, &pPV->GetVisibleLayers(), false);
    1673             :                 }
    1674             :             }
    1675             :         }
    1676             :     }
    1677             : 
    1678        4279 :     if (!bDeep && pRet!=NULL)
    1679             :     {
    1680          24 :         pRet=pObj;
    1681             :     }
    1682             : 
    1683        4279 :     return pRet;
    1684             : }
    1685             : 
    1686           3 : SdrObject* SdrMarkView::CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObjList* pOL, SdrPageView* pPV, SdrSearchOptions nOptions, const SetOfByte* pMVisLay, SdrObject*& rpRootObj) const
    1687             : {
    1688           3 :     return (*this).CheckSingleSdrObjectHit(rPnt,nTol,pOL,pPV,nOptions,pMVisLay,rpRootObj,NULL);
    1689             : }
    1690        3579 : SdrObject* SdrMarkView::CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObjList* pOL, SdrPageView* pPV, SdrSearchOptions nOptions, const SetOfByte* pMVisLay, SdrObject*& rpRootObj,const SdrMarkList * pMarkList) const
    1691             : {
    1692        3579 :     bool bBack(nOptions & SdrSearchOptions::BACKWARD);
    1693        3579 :     bool bBefMrk(nOptions & SdrSearchOptions::BEFOREMARK);
    1694        3579 :     SdrObject* pRet=NULL;
    1695        3579 :     rpRootObj=NULL;
    1696        3579 :     if (pOL!=NULL)
    1697             :     {
    1698        3579 :         bool bRemap(pOL->GetOwnerObj() && pOL->GetOwnerObj()->ISA(E3dScene));
    1699        3579 :         E3dScene* pRemapScene = (bRemap ? static_cast<E3dScene*>(pOL->GetOwnerObj()) : 0L);
    1700             : 
    1701        3579 :         const size_t nObjCount=pOL->GetObjCount();
    1702        3579 :         size_t nObjNum=bBack ? 0 : nObjCount;
    1703       11857 :         while (pRet==NULL && (bBack ? nObjNum<nObjCount : nObjNum>0)) {
    1704        4699 :             if (!bBack) nObjNum--;
    1705             :             SdrObject* pObj;
    1706             : 
    1707        4699 :             if(bRemap)
    1708             :             {
    1709           0 :                 pObj = pOL->GetObj(pRemapScene->RemapOrdNum(nObjNum));
    1710             :             }
    1711             :             else
    1712             :             {
    1713        4699 :                 pObj = pOL->GetObj(nObjNum);
    1714             :             }
    1715        4699 :             if (bBefMrk)
    1716             :             {
    1717           0 :                 if ((pMarkList)!=NULL)
    1718             :                 {
    1719           0 :                     if ((*pMarkList).FindObject(pObj)!=SAL_MAX_SIZE)
    1720             :                     {
    1721           0 :                         return NULL;
    1722             :                     }
    1723             :                 }
    1724             :             }
    1725        4699 :             pRet=CheckSingleSdrObjectHit(rPnt,nTol,pObj,pPV,nOptions,pMVisLay);
    1726        4699 :             if (pRet!=NULL) rpRootObj=pObj;
    1727        4699 :             if (bBack) nObjNum++;
    1728             :         }
    1729             :     }
    1730        3579 :     return pRet;
    1731             : }
    1732             : 
    1733        2563 : bool SdrMarkView::PickObj(const Point& rPnt, short nTol, SdrObject*& rpObj, SdrPageView*& rpPV, SdrSearchOptions nOptions) const
    1734             : {
    1735        2563 :     return PickObj(rPnt,nTol,rpObj,rpPV,nOptions,NULL,NULL);
    1736             : }
    1737             : 
    1738        3261 : bool SdrMarkView::PickObj(const Point& rPnt, short nTol, SdrObject*& rpObj, SdrPageView*& rpPV, SdrSearchOptions nOptions, SdrObject** ppRootObj, bool* pbHitPassDirect) const
    1739             : { // TODO: lacks a Pass2,Pass3
    1740        3261 :     SortMarkedObjects();
    1741        3261 :     if (ppRootObj!=NULL) *ppRootObj=NULL;
    1742        3261 :     if (pbHitPassDirect!=NULL) *pbHitPassDirect=true;
    1743        3261 :     rpObj=NULL;
    1744        3261 :     rpPV=NULL;
    1745        3261 :     bool bWholePage(nOptions & SdrSearchOptions::WHOLEPAGE);
    1746        3261 :     bool bMarked(nOptions & SdrSearchOptions::MARKED);
    1747        3261 :     bool bMasters=!bMarked && bool(nOptions & SdrSearchOptions::ALSOONMASTER);
    1748        3261 :     bool bBack(nOptions & SdrSearchOptions::BACKWARD);
    1749             : #if OSL_DEBUG_LEVEL > 0
    1750             :     bool bNext(nOptions & SdrSearchOptions::NEXT); (void)bNext; // n.i.
    1751             :     bool bBoundCheckOn2ndPass(nOptions & SdrSearchOptions::PASS2BOUND); (void)bBoundCheckOn2ndPass;// n.i.
    1752             :     bool bCheckNearestOn3rdPass(nOptions & SdrSearchOptions::PASS3NEAREST); (void)bCheckNearestOn3rdPass;// n.i.
    1753             : #endif
    1754        3261 :     if (nTol<0) nTol=ImpGetHitTolLogic(nTol,NULL);
    1755        3261 :     Point aPt(rPnt);
    1756        3261 :     SdrObject* pObj=NULL;
    1757        3261 :     SdrObject* pHitObj=NULL;
    1758        3261 :     SdrPageView* pPV=NULL;
    1759        3261 :     if (!bBack && static_cast<const SdrObjEditView*>(this)->IsTextEditFrameHit(rPnt)) {
    1760           0 :         pObj=static_cast<const SdrObjEditView*>(this)->GetTextEditObject();
    1761           0 :         pHitObj=pObj;
    1762           0 :         pPV=static_cast<const SdrObjEditView*>(this)->GetTextEditPageView();
    1763             :     }
    1764        3261 :     if (bMarked) {
    1765         349 :         const size_t nMrkAnz=GetMarkedObjectCount();
    1766         349 :         size_t nMrkNum=bBack ? 0 : nMrkAnz;
    1767         702 :         while (pHitObj==NULL && (bBack ? nMrkNum<nMrkAnz : nMrkNum>0)) {
    1768           4 :             if (!bBack) nMrkNum--;
    1769           4 :             SdrMark* pM=GetSdrMarkByIndex(nMrkNum);
    1770           4 :             pObj=pM->GetMarkedSdrObj();
    1771           4 :             pPV=pM->GetPageView();
    1772           4 :             pHitObj=CheckSingleSdrObjectHit(aPt,nTol,pObj,pPV,nOptions,NULL);
    1773           4 :             if (bBack) nMrkNum++;
    1774             :         }
    1775             :     }
    1776             :     else
    1777             :     {
    1778        2912 :         pPV = GetSdrPageView();
    1779             : 
    1780        2912 :         if(pPV)
    1781             :         {
    1782        2912 :             SdrPage* pPage=pPV->GetPage();
    1783        2912 :             sal_uInt16 nPgAnz=1;
    1784             : 
    1785        2912 :             if(bMasters && pPage->TRG_HasMasterPage())
    1786             :             {
    1787         671 :                 nPgAnz++;
    1788             :             }
    1789             : 
    1790        2912 :             bool bExtraPassForWholePage=bWholePage && pPage!=pPV->GetObjList();
    1791        2912 :             if (bExtraPassForWholePage) nPgAnz++; // First search in AktObjList, then on the entire page
    1792        2912 :             sal_uInt16 nPgNum=bBack ? 0 : nPgAnz;
    1793        9400 :             while (pHitObj==NULL && (bBack ? nPgNum<nPgAnz : nPgNum>0)) {
    1794        3576 :                 SdrSearchOptions nTmpOptions=nOptions;
    1795        3576 :                 if (!bBack) nPgNum--;
    1796        3576 :                 const SetOfByte* pMVisLay=NULL;
    1797        3576 :                 SdrObjList* pObjList=NULL;
    1798        3576 :                 if (pbHitPassDirect!=NULL) *pbHitPassDirect = true;
    1799        3576 :                 if (nPgNum>=nPgAnz-1 || (bExtraPassForWholePage && nPgNum>=nPgAnz-2))
    1800             :                 {
    1801        2912 :                     pObjList=pPV->GetObjList();
    1802        5824 :                     if (bExtraPassForWholePage && nPgNum==nPgAnz-2) {
    1803           0 :                         pObjList=pPage;
    1804           0 :                         if (pbHitPassDirect!=NULL) *pbHitPassDirect = false;
    1805             :                     }
    1806             :                 }
    1807             :                 else
    1808             :                 {
    1809             :                     // otherwise MasterPage
    1810         664 :                     SdrPage& rMasterPage = pPage->TRG_GetMasterPage();
    1811         664 :                     pMVisLay = &pPage->TRG_GetMasterPageVisibleLayers();
    1812         664 :                     pObjList = &rMasterPage;
    1813             : 
    1814         664 :                     if (pbHitPassDirect!=NULL) *pbHitPassDirect = false;
    1815         664 :                     nTmpOptions=nTmpOptions | SdrSearchOptions::IMPISMASTER;
    1816             :                 }
    1817        3576 :                 pHitObj=CheckSingleSdrObjectHit(aPt,nTol,pObjList,pPV,nTmpOptions,pMVisLay,pObj,&(GetMarkedObjectList()));
    1818        3576 :                 if (bBack) nPgNum++;
    1819             :             }
    1820             :         }
    1821             :     }
    1822        3261 :     if (pHitObj!=NULL) {
    1823          28 :         if (ppRootObj!=NULL) *ppRootObj=pObj;
    1824          28 :         if (nOptions & SdrSearchOptions::DEEP) pObj=pHitObj;
    1825          28 :         if (nOptions & SdrSearchOptions::TESTTEXTEDIT) {
    1826           0 :             if (!pObj->HasTextEdit() || pPV->GetLockedLayers().IsSet(pObj->GetLayer())) {
    1827           0 :                 pObj=NULL;
    1828             :             }
    1829             :         }
    1830          28 :         if (pObj!=NULL && (nOptions & SdrSearchOptions::TESTMACRO)) {
    1831           1 :             SdrObjMacroHitRec aHitRec;
    1832           1 :             aHitRec.aPos=aPt;
    1833           1 :             aHitRec.aDownPos=aPt;
    1834           1 :             aHitRec.nTol=nTol;
    1835           1 :             aHitRec.pVisiLayer=&pPV->GetVisibleLayers();
    1836           1 :             aHitRec.pPageView=pPV;
    1837           1 :             if (!pObj->HasMacro() || !pObj->IsMacroHit(aHitRec)) pObj=NULL;
    1838             :         }
    1839          28 :         if (pObj!=NULL && (nOptions & SdrSearchOptions::WITHTEXT) && pObj->GetOutlinerParaObject()==NULL) pObj=NULL;
    1840          28 :         if (pObj!=NULL && (nOptions & SdrSearchOptions::TESTTEXTAREA) && pPV)
    1841             :         {
    1842           0 :             if(!SdrObjectPrimitiveHit(*pObj, aPt, 0, *pPV, 0, true))
    1843             :             {
    1844           0 :                 pObj = 0;
    1845             :             }
    1846             :         }
    1847          28 :         if (pObj!=NULL) {
    1848          27 :             rpObj=pObj;
    1849          27 :             rpPV=pPV;
    1850             :         }
    1851             :     }
    1852        3261 :     return rpObj!=NULL;
    1853             : }
    1854             : 
    1855           0 : bool SdrMarkView::PickMarkedObj(const Point& rPnt, SdrObject*& rpObj, SdrPageView*& rpPV, SdrSearchOptions nOptions) const
    1856             : {
    1857           0 :     SortMarkedObjects();
    1858           0 :     bool bBoundCheckOn2ndPass(nOptions & SdrSearchOptions::PASS2BOUND);
    1859           0 :     bool bCheckNearestOn3rdPass(nOptions & SdrSearchOptions::PASS3NEAREST);
    1860           0 :     rpObj=NULL;
    1861           0 :     rpPV=NULL;
    1862           0 :     Point aPt(rPnt);
    1863           0 :     sal_uInt16 nTol=(sal_uInt16)nHitTolLog;
    1864           0 :     bool bFnd=false;
    1865           0 :     const size_t nMarkCount=GetMarkedObjectCount();
    1866           0 :     for (size_t nMarkNum=nMarkCount; nMarkNum>0 && !bFnd;) {
    1867           0 :         --nMarkNum;
    1868           0 :         SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
    1869           0 :         SdrPageView* pPV=pM->GetPageView();
    1870           0 :         SdrObject* pObj=pM->GetMarkedSdrObj();
    1871           0 :         bFnd = 0 != CheckSingleSdrObjectHit(aPt,nTol,pObj,pPV,SdrSearchOptions::TESTMARKABLE,0);
    1872           0 :         if (bFnd) {
    1873           0 :             rpObj=pObj;
    1874           0 :             rpPV=pPV;
    1875             :         }
    1876             :     }
    1877           0 :     if ((bBoundCheckOn2ndPass || bCheckNearestOn3rdPass) && !bFnd) {
    1878           0 :         SdrObject* pBestObj=NULL;
    1879           0 :         SdrPageView* pBestPV=NULL;
    1880           0 :         sal_uIntPtr nBestDist=ULONG_MAX;
    1881           0 :         for (size_t nMarkNum=nMarkCount; nMarkNum>0 && !bFnd;) {
    1882           0 :             --nMarkNum;
    1883           0 :             SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
    1884           0 :             SdrPageView* pPV=pM->GetPageView();
    1885           0 :             SdrObject* pObj=pM->GetMarkedSdrObj();
    1886           0 :             Rectangle aRect(pObj->GetCurrentBoundRect());
    1887           0 :             aRect.Left  ()-=nTol;
    1888           0 :             aRect.Top   ()-=nTol;
    1889           0 :             aRect.Right ()+=nTol;
    1890           0 :             aRect.Bottom()+=nTol;
    1891           0 :             if (aRect.IsInside(aPt)) {
    1892           0 :                 bFnd=true;
    1893           0 :                 rpObj=pObj;
    1894           0 :                 rpPV=pPV;
    1895           0 :             } else if (bCheckNearestOn3rdPass) {
    1896           0 :                 sal_uIntPtr nDist=0;
    1897           0 :                 if (aPt.X()<aRect.Left())   nDist+=aRect.Left()-aPt.X();
    1898           0 :                 if (aPt.X()>aRect.Right())  nDist+=aPt.X()-aRect.Right();
    1899           0 :                 if (aPt.Y()<aRect.Top())    nDist+=aRect.Top()-aPt.Y();
    1900           0 :                 if (aPt.Y()>aRect.Bottom()) nDist+=aPt.Y()-aRect.Bottom();
    1901           0 :                 if (nDist<nBestDist) {
    1902           0 :                     pBestObj=pObj;
    1903           0 :                     pBestPV=pPV;
    1904             :                 }
    1905             :             }
    1906             :         }
    1907           0 :         if (bCheckNearestOn3rdPass && !bFnd) {
    1908           0 :             rpObj=pBestObj;
    1909           0 :             rpPV=pBestPV;
    1910           0 :             bFnd=pBestObj!=NULL;
    1911             :         }
    1912             :     }
    1913           0 :     return bFnd;
    1914             : }
    1915             : 
    1916             : 
    1917        3122 : void SdrMarkView::UnmarkAllObj(SdrPageView* pPV)
    1918             : {
    1919        3122 :     if (GetMarkedObjectCount()!=0) {
    1920         279 :         BrkAction();
    1921         279 :         if (pPV!=NULL)
    1922             :         {
    1923           8 :             GetMarkedObjectListWriteAccess().DeletePageView(*pPV);
    1924             :         }
    1925             :         else
    1926             :         {
    1927         271 :             GetMarkedObjectListWriteAccess().Clear();
    1928             :         }
    1929         279 :         pMarkedObj=NULL;
    1930         279 :         pMarkedPV=NULL;
    1931         279 :         MarkListHasChanged();
    1932         279 :         AdjustMarkHdl();
    1933             :     }
    1934        3122 : }
    1935             : 
    1936           0 : void SdrMarkView::MarkAllObj(SdrPageView* _pPV)
    1937             : {
    1938           0 :     BrkAction();
    1939             : 
    1940           0 :     if(!_pPV)
    1941             :     {
    1942           0 :         _pPV = GetSdrPageView();
    1943             :     }
    1944             : 
    1945             :     // #i69171# _pPV may still be NULL if there is no SDrPageView (!), e.g. when inserting
    1946             :     // other files
    1947           0 :     if(_pPV)
    1948             :     {
    1949           0 :         const bool bMarkChg(GetMarkedObjectListWriteAccess().InsertPageView(*_pPV));
    1950             : 
    1951           0 :         if(bMarkChg)
    1952             :         {
    1953           0 :             MarkListHasChanged();
    1954             :         }
    1955             :     }
    1956             : 
    1957           0 :     if(GetMarkedObjectCount())
    1958             :     {
    1959           0 :         AdjustMarkHdl();
    1960             :     }
    1961           0 : }
    1962             : 
    1963       51281 : void SdrMarkView::AdjustMarkHdl()
    1964             : {
    1965       51281 :     CheckMarked();
    1966       51281 :     SetMarkRects();
    1967       51281 :     SetMarkHandles();
    1968       51281 : }
    1969             : 
    1970         264 : Rectangle SdrMarkView::GetMarkedObjBoundRect() const
    1971             : {
    1972         264 :     Rectangle aRect;
    1973         528 :     for (size_t nm=0; nm<GetMarkedObjectCount(); ++nm) {
    1974         264 :         SdrMark* pM=GetSdrMarkByIndex(nm);
    1975         264 :         SdrObject* pO=pM->GetMarkedSdrObj();
    1976         264 :         Rectangle aR1(pO->GetCurrentBoundRect());
    1977             :         // Ensure marked area includes the calc offset
    1978             :         // ( if applicable ) to sync to grid
    1979         264 :         aR1 += pO->GetGridOffset();
    1980         264 :         if (aRect.IsEmpty()) aRect=aR1;
    1981           0 :         else aRect.Union(aR1);
    1982             :     }
    1983         264 :     return aRect;
    1984             : }
    1985             : 
    1986       35478 : Point SdrMarkView::GetGridOffset() const
    1987             : {
    1988       35478 :     Point aOffset;
    1989             :     // calculate the area occupied by the union of each marked object
    1990             :     // ( synced to grid ) and compare to the same unsynced area to calculate
    1991             :     // the offset. Hopefully that's the sensible thing to do
    1992       35478 :     const Rectangle& aGroupSyncedRect = GetMarkedObjRect();
    1993       35478 :     aOffset =   aGroupSyncedRect.TopLeft() - aMarkedObjRectNoOffset.TopLeft();
    1994       35478 :     return aOffset;
    1995             : }
    1996             : 
    1997       71064 : const Rectangle& SdrMarkView::GetMarkedObjRect() const
    1998             : {
    1999       71064 :     if (bMarkedObjRectDirty) {
    2000       35491 :         const_cast<SdrMarkView*>(this)->bMarkedObjRectDirty=false;
    2001       35491 :         Rectangle aRect;
    2002       35491 :         Rectangle aRect2;
    2003       36015 :         for (size_t nm=0; nm<GetMarkedObjectCount(); ++nm) {
    2004         524 :             SdrMark* pM=GetSdrMarkByIndex(nm);
    2005         524 :             SdrObject* pO=pM->GetMarkedSdrObj();
    2006         524 :             Rectangle aR1(pO->GetSnapRect());
    2007             :             // apply calc offset to marked object rect
    2008             :             // ( necessary for handles to be displayed in
    2009             :             // correct position )
    2010         524 :             if (aRect2.IsEmpty()) aRect2=aR1;
    2011         273 :             else aRect2.Union( aR1 );
    2012         524 :             aR1 += pO->GetGridOffset();
    2013         524 :             if (aRect.IsEmpty()) aRect=aR1;
    2014         273 :             else aRect.Union(aR1);
    2015             :         }
    2016       35491 :         const_cast<SdrMarkView*>(this)->aMarkedObjRect=aRect;
    2017       35491 :         const_cast<SdrMarkView*>(this)->aMarkedObjRectNoOffset=aRect2;
    2018             :     }
    2019       71064 :     return aMarkedObjRect;
    2020             : }
    2021             : 
    2022             : 
    2023             : 
    2024           1 : void SdrMarkView::ImpTakeDescriptionStr(sal_uInt16 nStrCacheID, OUString& rStr, sal_uInt16 nVal, ImpTakeDescriptionOptions nOpt) const
    2025             : {
    2026           1 :     rStr = ImpGetResStr(nStrCacheID);
    2027           1 :     sal_Int32 nPos = rStr.indexOf("%1");
    2028             : 
    2029           1 :     if(nPos != -1)
    2030             :     {
    2031           1 :         if(nOpt == ImpTakeDescriptionOptions::POINTS)
    2032             :         {
    2033           0 :             rStr = rStr.replaceAt(nPos, 2, GetDescriptionOfMarkedPoints());
    2034             :         }
    2035           1 :         else if(nOpt == ImpTakeDescriptionOptions::GLUEPOINTS)
    2036             :         {
    2037           0 :             rStr = rStr.replaceAt(nPos, 2, GetDescriptionOfMarkedGluePoints());
    2038             :         }
    2039             :         else
    2040             :         {
    2041           1 :             rStr = rStr.replaceAt(nPos, 2, GetDescriptionOfMarkedObjects());
    2042             :         }
    2043             :     }
    2044             : 
    2045           1 :     rStr = rStr.replaceFirst("%2", OUString::number( nVal ));
    2046           1 : }
    2047             : 
    2048             : 
    2049             : 
    2050           0 : bool SdrMarkView::EnterMarkedGroup()
    2051             : {
    2052           0 :     bool bRet=false;
    2053             :     // We enter only the first group found (in only one PageView), because
    2054             :     // PageView::EnterGroup calls an AdjustMarkHdl.
    2055             :     // TODO: I'll have to prevent that via a flag.
    2056           0 :     SdrPageView* pPV = GetSdrPageView();
    2057             : 
    2058           0 :     if(pPV)
    2059             :     {
    2060           0 :         bool bEnter=false;
    2061           0 :         for (size_t nm = GetMarkedObjectCount(); nm > 0 && !bEnter;)
    2062             :         {
    2063           0 :             --nm;
    2064           0 :             SdrMark* pM=GetSdrMarkByIndex(nm);
    2065           0 :             if (pM->GetPageView()==pPV) {
    2066           0 :                 SdrObject* pObj=pM->GetMarkedSdrObj();
    2067           0 :                 if (pObj->IsGroupObject()) {
    2068           0 :                     if (pPV->EnterGroup(pObj)) {
    2069           0 :                         bRet=true;
    2070           0 :                         bEnter=true;
    2071             :                     }
    2072             :                 }
    2073             :             }
    2074             :         }
    2075             :     }
    2076           0 :     return bRet;
    2077             : }
    2078             : 
    2079             : 
    2080             : 
    2081        4661 : void SdrMarkView::MarkListHasChanged()
    2082             : {
    2083        4661 :     GetMarkedObjectListWriteAccess().SetNameDirty();
    2084        4661 :     SetEdgesOfMarkedNodesDirty();
    2085             : 
    2086        4661 :     bMarkedObjRectDirty=true;
    2087        4661 :     bMarkedPointsRectsDirty=true;
    2088             : #ifdef DBG_UTIL
    2089             :     if (pItemBrowser!=nullptr) pItemBrowser->SetDirty();
    2090             : #endif
    2091        4661 :     bool bOneEdgeMarked=false;
    2092        4661 :     if (GetMarkedObjectCount()==1) {
    2093         366 :         const SdrObject* pObj=GetMarkedObjectByIndex(0);
    2094         366 :         if (pObj->GetObjInventor()==SdrInventor) {
    2095         365 :             sal_uInt16 nIdent=pObj->GetObjIdentifier();
    2096         365 :             bOneEdgeMarked=nIdent==OBJ_EDGE;
    2097             :         }
    2098             :     }
    2099        4661 :     ImpSetGlueVisible4(bOneEdgeMarked);
    2100        4661 : }
    2101             : 
    2102             : 
    2103             : 
    2104           0 : void SdrMarkView::SetMoveOutside(bool bOn)
    2105             : {
    2106           0 :     maHdlList.SetMoveOutside(bOn);
    2107           0 : }
    2108             : 
    2109       10021 : void SdrMarkView::SetDesignMode( bool _bOn )
    2110             : {
    2111       10021 :     if ( bDesignMode != _bOn )
    2112             :     {
    2113        8999 :         bDesignMode = _bOn;
    2114        8999 :         SdrPageView* pPageView = GetSdrPageView();
    2115        8999 :         if ( pPageView )
    2116          23 :             pPageView->SetDesignMode( _bOn );
    2117             :     }
    2118       10456 : }
    2119             : 
    2120             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11