LCOV - code coverage report
Current view: top level - svx/source/svdraw - svdview.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 171 796 21.5 %
Date: 2014-11-03 Functions: 20 38 52.6 %
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             : #include <editeng/eeitem.hxx>
      21             : 
      22             : #include "svx/svdstr.hrc"
      23             : #include "svdglob.hxx"
      24             : #include <svx/svdpagv.hxx>
      25             : #include <svx/svdmrkv.hxx>
      26             : #include <svx/svdedxv.hxx>
      27             : #include <svx/svdobj.hxx>
      28             : #include <svx/svdopath.hxx>
      29             : #include <svx/svdograf.hxx>
      30             : #include <svx/svdomedia.hxx>
      31             : #include <svx/svdetc.hxx>
      32             : 
      33             : #ifdef DBG_UTIL
      34             : #include <svdibrow.hxx>
      35             : #endif
      36             : 
      37             : #include "svx/svdoutl.hxx"
      38             : #include "svx/svdview.hxx"
      39             : #include "editeng/editview.hxx"
      40             : #include "editeng/flditem.hxx"
      41             : #include "svx/obj3d.hxx"
      42             : #include "svx/svddrgmt.hxx"
      43             : #include "svx/svdotable.hxx"
      44             : #include <tools/tenccvt.hxx>
      45             : #include <svx/sdr/overlay/overlaypolypolygon.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/sdr/contact/viewcontact.hxx>
      51             : #include <drawinglayer/processor2d/contourextractor2d.hxx>
      52             : 
      53             : 
      54             : 
      55        1100 : SdrViewEvent::SdrViewEvent()
      56             : :     pHdl(NULL),
      57             :       pObj(NULL),
      58             :       pRootObj(NULL),
      59             :       pPV(NULL),
      60             :       pURLField(NULL),
      61             :       eHit(SDRHIT_NONE),
      62             :       eEvent(SDREVENT_NONE),
      63             :       eHdlKind(HDL_MOVE),
      64             :       eEndCreateCmd(SDRCREATE_NEXTPOINT),
      65             :       nMouseClicks(0),
      66             :       nMouseMode(0),
      67             :       nMouseCode(0),
      68             :       nHlplIdx(0),
      69             :       nGlueId(0),
      70             :       bMouseDown(false),
      71             :       bMouseUp(false),
      72             :       bDoubleHdlSize(false),
      73             :       bIsAction(false),
      74             :       bIsTextEdit(false),
      75             :       bTextEditHit(false),
      76             :       bAddMark(false),
      77             :       bUnmark(false),
      78             :       bPrevNextMark(false),
      79             :       bMarkPrev(false),
      80             :       bInsPointNewObj(false),
      81             :       bDragWithCopy(false),
      82             :       bCaptureMouse(false),
      83        1100 :       bReleaseMouse(false)
      84             : {
      85        1100 : }
      86             : 
      87        1100 : SdrViewEvent::~SdrViewEvent()
      88             : {
      89        1100 : }
      90             : 
      91             : 
      92             : // helper class for all D&D overlays
      93             : 
      94           0 : void SdrDropMarkerOverlay::ImplCreateOverlays(
      95             :     const SdrView& rView,
      96             :     const basegfx::B2DPolyPolygon& rLinePolyPolygon)
      97             : {
      98           0 :     for(sal_uInt32 a(0L); a < rView.PaintWindowCount(); a++)
      99             :     {
     100           0 :         SdrPaintWindow* pCandidate = rView.GetPaintWindow(a);
     101           0 :         rtl::Reference< ::sdr::overlay::OverlayManager > xTargetOverlay = pCandidate->GetOverlayManager();
     102             : 
     103           0 :         if (xTargetOverlay.is())
     104             :         {
     105             :             ::sdr::overlay::OverlayPolyPolygonStripedAndFilled* pNew = new ::sdr::overlay::OverlayPolyPolygonStripedAndFilled(
     106           0 :                 rLinePolyPolygon);
     107             : 
     108           0 :             xTargetOverlay->add(*pNew);
     109           0 :             maObjects.append(*pNew);
     110             :         }
     111           0 :     }
     112           0 : }
     113             : 
     114           0 : SdrDropMarkerOverlay::SdrDropMarkerOverlay(const SdrView& rView, const SdrObject& rObject)
     115             : {
     116             :     ImplCreateOverlays(
     117             :         rView,
     118           0 :         rObject.TakeXorPoly());
     119           0 : }
     120             : 
     121           0 : SdrDropMarkerOverlay::SdrDropMarkerOverlay(const SdrView& rView, const Rectangle& rRectangle)
     122             : {
     123           0 :     basegfx::B2DPolygon aB2DPolygon;
     124             : 
     125           0 :     aB2DPolygon.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Top()));
     126           0 :     aB2DPolygon.append(basegfx::B2DPoint(rRectangle.Right(), rRectangle.Top()));
     127           0 :     aB2DPolygon.append(basegfx::B2DPoint(rRectangle.Right(), rRectangle.Bottom()));
     128           0 :     aB2DPolygon.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom()));
     129           0 :     aB2DPolygon.setClosed(true);
     130             : 
     131             :     ImplCreateOverlays(
     132             :         rView,
     133           0 :         basegfx::B2DPolyPolygon(aB2DPolygon));
     134           0 : }
     135             : 
     136           0 : SdrDropMarkerOverlay::SdrDropMarkerOverlay(const SdrView& rView, const Point& rStart, const Point& rEnd)
     137             : {
     138           0 :     basegfx::B2DPolygon aB2DPolygon;
     139             : 
     140           0 :     aB2DPolygon.append(basegfx::B2DPoint(rStart.X(), rStart.Y()));
     141           0 :     aB2DPolygon.append(basegfx::B2DPoint(rEnd.X(), rEnd.Y()));
     142           0 :     aB2DPolygon.setClosed(true);
     143             : 
     144             :     ImplCreateOverlays(
     145             :         rView,
     146           0 :         basegfx::B2DPolyPolygon(aB2DPolygon));
     147           0 : }
     148             : 
     149           0 : SdrDropMarkerOverlay::~SdrDropMarkerOverlay()
     150             : {
     151             :     // The OverlayObjects are cleared using the destructor of OverlayObjectList.
     152             :     // That destructor calls clear() at the list which removes all objects from the
     153             :     // OverlayManager and deletes them.
     154           0 : }
     155             : 
     156             : 
     157     1335471 : TYPEINIT1(SdrView,SdrCreateView);
     158             : 
     159       15989 : SdrView::SdrView(SdrModel* pModel1, OutputDevice* pOut)
     160             : :   SdrCreateView(pModel1,pOut),
     161             :     bNoExtendedMouseDispatcher(false),
     162             :     bNoExtendedKeyDispatcher(false),
     163             :     bNoExtendedCommandDispatcher(false),
     164       15989 :     mbMasterPagePaintCaching(false)
     165             : {
     166       15989 :     bTextEditOnObjectsWithoutTextIfTextTool=false;
     167             : 
     168       15989 :     maAccessibilityOptions.AddListener(this);
     169             : 
     170       15989 :     onAccessibilityOptionsChanged();
     171       15989 : }
     172             : 
     173       40395 : SdrView::~SdrView()
     174             : {
     175       15919 :     maAccessibilityOptions.RemoveListener(this);
     176       24476 : }
     177             : 
     178           0 : bool SdrView::KeyInput(const KeyEvent& rKEvt, vcl::Window* pWin)
     179             : {
     180           0 :     SetActualWin(pWin);
     181           0 :     bool bRet = SdrCreateView::KeyInput(rKEvt,pWin);
     182           0 :     if (!bRet && !IsExtendedKeyInputDispatcherEnabled()) {
     183           0 :         bRet = true;
     184           0 :         switch (rKEvt.GetKeyCode().GetFullFunction()) {
     185           0 :             case KeyFuncType::CUT   : Cut(); break;
     186           0 :             case KeyFuncType::COPY  : Yank(); break;
     187           0 :             case KeyFuncType::PASTE : Paste(pWin); break;
     188           0 :             case KeyFuncType::DELETE: DeleteMarked(); break;
     189           0 :             case KeyFuncType::UNDO: pMod->Undo(); break;
     190           0 :             case KeyFuncType::REDO: pMod->Redo(); break;
     191           0 :             case KeyFuncType::REPEAT: pMod->Repeat(*this); break;
     192             :             default: {
     193           0 :                 switch (rKEvt.GetKeyCode().GetFullCode()) {
     194             :                     case KEY_ESCAPE: {
     195           0 :                         if (IsTextEdit()) SdrEndTextEdit();
     196           0 :                         if (IsAction()) BrkAction();
     197           0 :                         if (pWin!=NULL) pWin->ReleaseMouse();
     198           0 :                     } break;
     199           0 :                     case KEY_DELETE: DeleteMarked(); break;
     200           0 :                     case KEY_CUT: case KEY_DELETE+KEY_SHIFT: Cut(); break;
     201           0 :                     case KEY_COPY: case KEY_INSERT+KEY_MOD1: Yank(); break;
     202           0 :                     case KEY_PASTE: case KEY_INSERT+KEY_SHIFT: Paste(pWin); break;
     203           0 :                     case KEY_UNDO: case KEY_BACKSPACE+KEY_MOD2: pMod->Undo(); break;
     204           0 :                     case KEY_BACKSPACE+KEY_MOD2+KEY_SHIFT: pMod->Redo(); break;
     205           0 :                     case KEY_REPEAT: case KEY_BACKSPACE+KEY_MOD2+KEY_MOD1: pMod->Repeat(*this); break;
     206           0 :                     case KEY_MOD1+KEY_A: MarkAll(); break;
     207           0 :                     default: bRet=false;
     208             :                 } // switch
     209             :             }
     210             :         } // switch
     211           0 :         if (bRet && pWin!=NULL) {
     212             :             pWin->SetPointer(GetPreferredPointer(
     213           0 :                 pWin->PixelToLogic(pWin->ScreenToOutputPixel( pWin->GetPointerPosPixel() ) ),
     214             :                 pWin,
     215           0 :                 rKEvt.GetKeyCode().GetModifier()));
     216             :         }
     217             :     }
     218           0 :     return bRet;
     219             : }
     220             : 
     221           0 : bool SdrView::MouseButtonDown(const MouseEvent& rMEvt, vcl::Window* pWin)
     222             : {
     223           0 :     SetActualWin(pWin);
     224           0 :     if (rMEvt.IsLeft()) aDragStat.SetMouseDown(true);
     225           0 :     bool bRet = SdrCreateView::MouseButtonDown(rMEvt,pWin);
     226           0 :     if (!bRet && !IsExtendedMouseEventDispatcherEnabled()) {
     227           0 :         SdrViewEvent aVEvt;
     228           0 :         PickAnything(rMEvt,SDRMOUSEBUTTONDOWN,aVEvt);
     229           0 :         bRet = DoMouseEvent(aVEvt);
     230             :     }
     231           0 :     return bRet;
     232             : }
     233             : 
     234           0 : bool SdrView::MouseButtonUp(const MouseEvent& rMEvt, vcl::Window* pWin)
     235             : {
     236           0 :     SetActualWin(pWin);
     237           0 :     if (rMEvt.IsLeft()) aDragStat.SetMouseDown(false);
     238           0 :     bool bAction = IsAction();
     239           0 :     bool bRet = !bAction && SdrCreateView::MouseButtonUp(rMEvt,pWin);
     240           0 :     if (!bRet && !IsExtendedMouseEventDispatcherEnabled()) {
     241           0 :         SdrViewEvent aVEvt;
     242           0 :         PickAnything(rMEvt,SDRMOUSEBUTTONUP,aVEvt);
     243           0 :         bRet = DoMouseEvent(aVEvt);
     244             :     }
     245           0 :     return bRet;
     246             : }
     247             : 
     248           0 : bool SdrView::MouseMove(const MouseEvent& rMEvt, vcl::Window* pWin)
     249             : {
     250           0 :     SetActualWin(pWin);
     251           0 :     aDragStat.SetMouseDown(rMEvt.IsLeft());
     252           0 :     bool bRet = SdrCreateView::MouseMove(rMEvt,pWin);
     253           0 :     if (!IsExtendedMouseEventDispatcherEnabled() && !IsTextEditInSelectionMode()) {
     254           0 :         SdrViewEvent aVEvt;
     255           0 :         PickAnything(rMEvt,SDRMOUSEMOVE,aVEvt);
     256           0 :         if (DoMouseEvent(aVEvt)) bRet=true;
     257             :     }
     258             : 
     259           0 :     return bRet;
     260             : }
     261             : 
     262           0 : bool SdrView::Command(const CommandEvent& rCEvt, vcl::Window* pWin)
     263             : {
     264           0 :     SetActualWin(pWin);
     265           0 :     bool bRet = SdrCreateView::Command(rCEvt,pWin);
     266           0 :     return bRet;
     267             : }
     268             : 
     269         592 : bool SdrView::GetAttributes(SfxItemSet& rTargetSet, bool bOnlyHardAttr) const
     270             : {
     271         592 :     return SdrCreateView::GetAttributes(rTargetSet, bOnlyHardAttr);
     272             : }
     273             : 
     274           0 : SfxStyleSheet* SdrView::GetStyleSheet() const
     275             : {
     276           0 :     return SdrCreateView::GetStyleSheet();
     277             : }
     278             : 
     279           0 : SdrHitKind SdrView::PickAnything(const MouseEvent& rMEvt, sal_uInt16 nEventKind, SdrViewEvent& rVEvt) const
     280             : {
     281           0 :     rVEvt.bMouseDown=nEventKind==SDRMOUSEBUTTONDOWN;
     282           0 :     rVEvt.bMouseUp=nEventKind==SDRMOUSEBUTTONUP;
     283           0 :     rVEvt.nMouseClicks=rMEvt.GetClicks();
     284           0 :     rVEvt.nMouseMode=rMEvt.GetMode();
     285           0 :     rVEvt.nMouseCode=rMEvt.GetButtons() | rMEvt.GetModifier();
     286           0 :     const OutputDevice* pOut=pActualOutDev;
     287           0 :     if (pOut==NULL)
     288             :     {
     289           0 :         pOut = GetFirstOutputDevice();
     290             :     }
     291           0 :     Point aPnt(rMEvt.GetPosPixel());
     292           0 :     if (pOut!=NULL) aPnt=pOut->PixelToLogic(aPnt);
     293           0 :     rVEvt.aLogicPos=aPnt;
     294           0 :     return PickAnything(aPnt,rVEvt);
     295             : }
     296             : 
     297             : // Dragging with the Mouse (Move)
     298             : // Example when creating a rectangle: MouseDown has to happen without a ModKey,
     299             : // else we usually force a selection (see below).
     300             : // When pressing Shift, Ctrl and Alt at the same time while doing a MouseMove,
     301             : // a centered, not snapped square is created.
     302             : // The dual allocation of Ortho and Shift won't usually create a problem, as the
     303             : // two functions are in most cases mutually exclusive. Only shearing (the kind
     304             : // that happens when contorting, not when rotating) can use both functions at
     305             : // the same time. To get around this, the user can use e. g. help lines.
     306             : #define MODKEY_NoSnap    bCtrl  /* temporarily disable snapping */
     307             : #define MODKEY_Ortho     bShift /* ortho */
     308             : #define MODKEY_Center    bAlt   /* create/resize centeredly */
     309             : #define MODKEY_AngleSnap bShift
     310             : #define MODKEY_CopyDrag  bCtrl  /* drag and copy */
     311             : 
     312             : // click somewhere (MouseDown)
     313             : #define MODKEY_PolyPoly  bAlt   /* new Poly at InsPt and at Create */
     314             : #define MODKEY_MultiMark bShift /* MarkObj without doing UnmarkAll first */
     315             : #define MODKEY_Unmark    bAlt   /* deselect with a dragged frame */
     316             : #define MODKEY_ForceMark bCtrl  /* force dragging a frame, even if there's an object at cursor position */
     317             : #define MODKEY_DeepMark  bAlt   /* MarkNextObj */
     318             : #define MODKEY_DeepBackw bShift /* MarkNextObj but backwards */
     319             : 
     320         550 : SdrHitKind SdrView::PickAnything(const Point& rLogicPos, SdrViewEvent& rVEvt) const
     321             : {
     322         550 :     const OutputDevice* pOut=pActualOutDev;
     323         550 :     if (pOut==NULL)
     324             :     {
     325           0 :         pOut = GetFirstOutputDevice();
     326             :     }
     327             : 
     328             :     // #i73628# Use a non-changeable copy of he logic position
     329         550 :     const Point aLocalLogicPosition(rLogicPos);
     330             : 
     331         550 :     bool bEditMode=IsEditMode();
     332         550 :     bool bPointMode=bEditMode && HasMarkablePoints();
     333         550 :     bool bGluePointMode=IsGluePointEditMode();
     334         550 :     bool bInsPolyPt=bPointMode && IsInsObjPointMode() && IsInsObjPointPossible();
     335         550 :     bool bInsGluePt=bGluePointMode && IsInsGluePointMode() && IsInsGluePointPossible();
     336         550 :     bool bIsTextEdit=IsTextEdit();
     337         550 :     bool bTextEditHit=IsTextEditHit(aLocalLogicPosition,0/*nHitTolLog*/);
     338         550 :     bool bTextEditSel=IsTextEditInSelectionMode();
     339         550 :     bool bShift=(rVEvt.nMouseCode & KEY_SHIFT) !=0;
     340         550 :     bool bCtrl=(rVEvt.nMouseCode & KEY_MOD1) !=0;
     341         550 :     bool bAlt=(rVEvt.nMouseCode & KEY_MOD2) !=0;
     342         550 :     SdrHitKind eHit=SDRHIT_NONE;
     343         550 :     SdrHdl* pHdl=pOut!=NULL && !bTextEditSel ? PickHandle(aLocalLogicPosition) : NULL;
     344         550 :     SdrPageView* pPV=NULL;
     345         550 :     SdrObject* pObj=NULL;
     346         550 :     SdrObject* pHitObj=NULL;
     347         550 :     sal_uInt16 nHitPassNum=0;
     348         550 :     sal_uInt16 nHlplIdx=0;
     349         550 :     sal_uInt16 nGlueId=0;
     350         550 :     if (bTextEditHit || bTextEditSel)
     351             :     {
     352           0 :         eHit=SDRHIT_TEXTEDIT;
     353           0 :         bTextEditHit=true;
     354             :     }
     355         550 :     else if (pHdl!=NULL)
     356             :     {
     357           0 :         eHit=SDRHIT_HANDLE; // handle is hit: highest priority
     358             :     }
     359         550 :     else if (bEditMode && IsHlplVisible() && IsHlplFront() && pOut!=NULL && PickHelpLine(aLocalLogicPosition,nHitTolLog,*pOut,nHlplIdx,pPV))
     360             :     {
     361           0 :         eHit=SDRHIT_HELPLINE; // help line in the foreground hit: can be moved now
     362             :     }
     363         550 :     else if (bGluePointMode && PickGluePoint(aLocalLogicPosition,pObj,nGlueId,pPV))
     364             :     {
     365           0 :         eHit=SDRHIT_GLUEPOINT; // deselected glue point hit
     366             :     }
     367         550 :     else if (PickObj(aLocalLogicPosition,nHitTolLog,pHitObj,pPV,SDRSEARCH_DEEP|SDRSEARCH_MARKED,&pObj,&nHitPassNum))
     368             :     {
     369           0 :         eHit=SDRHIT_MARKEDOBJECT;
     370           0 :         ::sdr::table::SdrTableObj* pTableObj = dynamic_cast< ::sdr::table::SdrTableObj* >( pObj );
     371           0 :         if( pTableObj )
     372             :         {
     373           0 :             sal_Int32 nX = 0, nY = 0;
     374           0 :             switch( pTableObj->CheckTableHit( aLocalLogicPosition, nX, nY, 0 ) )
     375             :             {
     376             :                 case sdr::table::SDRTABLEHIT_CELL:
     377           0 :                     eHit = SDRHIT_CELL;
     378           0 :                     break;
     379             :                 case sdr::table::SDRTABLEHIT_CELLTEXTAREA:
     380           0 :                     eHit = SDRHIT_TEXTEDITOBJ;
     381           0 :                     break;
     382             :                 default:
     383           0 :                     break;
     384             :             }
     385             :         }
     386             :     }
     387         550 :     else if (PickObj(aLocalLogicPosition,nHitTolLog,pHitObj,pPV,SDRSEARCH_DEEP|SDRSEARCH_ALSOONMASTER|SDRSEARCH_WHOLEPAGE,&pObj,&nHitPassNum))
     388             :     {
     389             :         // MasterPages and WholePage for Macro and URL
     390           0 :         eHit=SDRHIT_UNMARKEDOBJECT;
     391           0 :         ::sdr::table::SdrTableObj* pTableObj = dynamic_cast< ::sdr::table::SdrTableObj* >( pObj );
     392           0 :         if( pTableObj )
     393             :         {
     394           0 :             sal_Int32 nX = 0, nY = 0;
     395           0 :             switch( pTableObj->CheckTableHit( aLocalLogicPosition, nX, nY, 0 ) )
     396             :             {
     397             :                 case sdr::table::SDRTABLEHIT_CELL:
     398           0 :                     eHit = SDRHIT_CELL;
     399           0 :                     break;
     400             :                 case sdr::table::SDRTABLEHIT_CELLTEXTAREA:
     401           0 :                     eHit = SDRHIT_TEXTEDITOBJ;
     402           0 :                     break;
     403             :                 default:
     404           0 :                     break;
     405             :             }
     406             :         }
     407             :     }
     408         550 :     else if (bEditMode && IsHlplVisible() && !IsHlplFront() && pOut!=NULL && PickHelpLine(aLocalLogicPosition,nHitTolLog,*pOut,nHlplIdx,pPV))
     409             :     {
     410           0 :         eHit=SDRHIT_HELPLINE; // help line in foreground hit: can be moved now
     411             :     }
     412         550 :     if (IsMacroMode() && eHit==SDRHIT_UNMARKEDOBJECT)
     413             :     {
     414           0 :         bool bRoot=pObj->HasMacro();
     415           0 :         bool bDeep=pObj!=pHitObj && pHitObj->HasMacro();
     416           0 :         bool bMid=false; // Have we hit upon a grouped group with a macro?
     417           0 :         SdrObject* pMidObj=NULL;
     418           0 :         if (pObj!=pHitObj)
     419             :         {
     420           0 :             SdrObject* pObjTmp=NULL;
     421           0 :             pObjTmp=pHitObj->GetUpGroup();
     422           0 :             if (pObjTmp==pObj) pObjTmp=NULL;
     423           0 :             while (pObjTmp!=NULL)
     424             :             {
     425           0 :                 if (pObjTmp->HasMacro())
     426             :                 {
     427           0 :                     bMid=true;
     428           0 :                     pMidObj=pObjTmp;
     429             :                 }
     430           0 :                 pObjTmp=pObjTmp->GetUpGroup();
     431           0 :                 if (pObjTmp==pObj) pObjTmp=NULL;
     432             :             }
     433             :         }
     434             : 
     435           0 :         if (bDeep || bMid || bRoot)
     436             :         {
     437           0 :             SdrObjMacroHitRec aHitRec;
     438           0 :             aHitRec.aPos=aLocalLogicPosition;
     439           0 :             aHitRec.aDownPos=aLocalLogicPosition;
     440           0 :             aHitRec.nTol=nHitTolLog;
     441           0 :             aHitRec.pVisiLayer=&pPV->GetVisibleLayers();
     442           0 :             aHitRec.pPageView=pPV;
     443           0 :             if (bDeep) bDeep=pHitObj->IsMacroHit(aHitRec);
     444           0 :             if (bMid ) bMid =pMidObj->IsMacroHit(aHitRec);
     445           0 :             if (bRoot) bRoot=pObj->IsMacroHit(aHitRec);
     446           0 :             if (bRoot || bMid || bDeep)
     447             :             {
     448             :                 // Priorities: 1. Root, 2. Mid, 3. Deep
     449           0 :                 rVEvt.pRootObj=pObj;
     450           0 :                 if (!bRoot) pObj=pMidObj;
     451           0 :                 if (!bRoot && !bMid) pObj=pHitObj;
     452           0 :                 eHit=SDRHIT_MACRO;
     453             :             }
     454             :         }
     455             :     }
     456             :     // check for URL field
     457         550 :     if (IsMacroMode() && eHit==SDRHIT_UNMARKEDOBJECT)
     458             :     {
     459           0 :         SdrTextObj* pTextObj=PTR_CAST(SdrTextObj,pHitObj);
     460           0 :         if (pTextObj!=NULL && pTextObj->HasText())
     461             :         {
     462           0 :             bool bTEHit(pPV &&
     463           0 :                 SdrObjectPrimitiveHit(*pTextObj, aLocalLogicPosition, 0, *pPV, &pPV->GetVisibleLayers(), true));
     464             : 
     465           0 :             if (bTEHit)
     466             :             {
     467           0 :                 Rectangle aTextRect;
     468           0 :                 Rectangle aAnchor;
     469           0 :                 SdrOutliner* pOutliner = &pTextObj->ImpGetDrawOutliner();
     470           0 :                 if( pTextObj->GetModel() )
     471           0 :                     pOutliner = &pTextObj->GetModel()->GetHitTestOutliner();
     472             : 
     473           0 :                 pTextObj->TakeTextRect( *pOutliner, aTextRect, false, &aAnchor, false );
     474             : 
     475             :                 // #i73628# Use a text-relative position for hit test in hit test outliner
     476           0 :                 Point aTemporaryTextRelativePosition(aLocalLogicPosition - aTextRect.TopLeft());
     477             : 
     478             :                 // account for FitToSize
     479           0 :                 bool bFitToSize(pTextObj->IsFitToSize());
     480           0 :                 if (bFitToSize) {
     481           0 :                     Fraction aX(aTextRect.GetWidth()-1,aAnchor.GetWidth()-1);
     482           0 :                     Fraction aY(aTextRect.GetHeight()-1,aAnchor.GetHeight()-1);
     483           0 :                     ResizePoint(aTemporaryTextRelativePosition,Point(),aX,aY);
     484             :                 }
     485             :                 // account for rotation
     486           0 :                 const GeoStat& rGeo=pTextObj->GetGeoStat();
     487           0 :                 if (rGeo.nRotationAngle!=0) RotatePoint(aTemporaryTextRelativePosition,Point(),-rGeo.nSin,rGeo.nCos); // -sin for Unrotate
     488             :                 // we currently don't account for ticker text
     489           0 :                 if(pActualOutDev && pActualOutDev->GetOutDevType() == OUTDEV_WINDOW)
     490             :                 {
     491           0 :                     OutlinerView aOLV(pOutliner, const_cast<vcl::Window*>(static_cast<const vcl::Window*>(pActualOutDev)));
     492           0 :                     const EditView& aEV=aOLV.GetEditView();
     493           0 :                     const SvxFieldItem* pItem=aEV.GetField(aTemporaryTextRelativePosition);
     494           0 :                     if (pItem!=NULL) {
     495           0 :                         const SvxFieldData* pFld=pItem->GetField();
     496           0 :                         const SvxURLField* pURL=PTR_CAST(SvxURLField,pFld);
     497           0 :                         if (pURL!=NULL) {
     498           0 :                             eHit=SDRHIT_URLFIELD;
     499           0 :                             rVEvt.pURLField=pURL;
     500             :                         }
     501           0 :                     }
     502             :                 }
     503             :             }
     504             :         }
     505             :     }
     506             : 
     507        1100 :     if (nHitPassNum==SDRSEARCHPASS_DIRECT &&
     508           0 :         (eHit==SDRHIT_MARKEDOBJECT || eHit==SDRHIT_UNMARKEDOBJECT) &&
     509         550 :         (IsTextTool() || (IsEditMode() && IsQuickTextEditMode())) && pHitObj->HasTextEdit())
     510             :     {
     511             :         // Around the TextEditArea there's a border to select without going into text edit mode.
     512           0 :         Rectangle aBoundRect(pHitObj->GetCurrentBoundRect());
     513             : 
     514             :         // Force to SnapRect when Fontwork
     515           0 :         if(pHitObj->ISA(SdrTextObj) && static_cast<SdrTextObj*>(pHitObj)->IsFontwork())
     516             :         {
     517           0 :             aBoundRect = pHitObj->GetSnapRect();
     518             :         }
     519             : 
     520           0 :         sal_Int32 nTolerance(nHitTolLog);
     521           0 :         bool bBoundRectHit(false);
     522             : 
     523           0 :         if(pOut)
     524             :         {
     525           0 :             nTolerance = pOut->PixelToLogic(Size(2, 0)).Width();
     526             :         }
     527             : 
     528           0 :         if( (aLocalLogicPosition.X() >= aBoundRect.Left() - nTolerance && aLocalLogicPosition.X() <= aBoundRect.Left() + nTolerance)
     529           0 :          || (aLocalLogicPosition.X() >= aBoundRect.Right() - nTolerance && aLocalLogicPosition.X() <= aBoundRect.Right() + nTolerance)
     530           0 :          || (aLocalLogicPosition.Y() >= aBoundRect.Top() - nTolerance && aLocalLogicPosition.Y() <= aBoundRect.Top() + nTolerance)
     531           0 :          || (aLocalLogicPosition.Y() >= aBoundRect.Bottom() - nTolerance && aLocalLogicPosition.Y() <= aBoundRect.Bottom() + nTolerance))
     532             :         {
     533           0 :             bBoundRectHit = true;
     534             :         }
     535             : 
     536           0 :         if(!bBoundRectHit)
     537             :         {
     538           0 :             bool bTEHit(pPV &&
     539           0 :                 SdrObjectPrimitiveHit(*pHitObj, aLocalLogicPosition, 0, *pPV, &pPV->GetVisibleLayers(), true));
     540             : 
     541             :             // TextEdit attached to an object in a locked layer
     542           0 :             if (pPV->GetLockedLayers().IsSet(pHitObj->GetLayer()))
     543             :             {
     544           0 :                 bTEHit=false;
     545             :             }
     546             : 
     547           0 :             if (bTEHit)
     548             :             {
     549           0 :                 rVEvt.pRootObj=pObj;
     550           0 :                 pObj=pHitObj;
     551           0 :                 eHit=SDRHIT_TEXTEDITOBJ;
     552             :             }
     553             :         }
     554             :     }
     555         550 :     if (nHitPassNum!=SDRSEARCHPASS_DIRECT && eHit==SDRHIT_UNMARKEDOBJECT) {
     556           0 :         eHit=SDRHIT_NONE;
     557           0 :         pObj=NULL;
     558           0 :         pPV=NULL;
     559             :     }
     560         550 :     bool bMouseLeft=(rVEvt.nMouseCode&MOUSE_LEFT)!=0;
     561         550 :     bool bMouseRight=(rVEvt.nMouseCode&MOUSE_RIGHT)!=0;
     562         550 :     bool bMouseDown=rVEvt.bMouseDown;
     563         550 :     bool bMouseUp=rVEvt.bMouseUp;
     564         550 :     SdrEventKind eEvent=SDREVENT_NONE;
     565         550 :     bool bIsAction=IsAction();
     566             : 
     567         550 :     if (bIsAction)
     568             :     {
     569           0 :         if (bMouseDown)
     570             :         {
     571           0 :             if (bMouseRight) eEvent=SDREVENT_BCKACTION;
     572             :         }
     573           0 :         else if (bMouseUp)
     574             :         {
     575           0 :             if (bMouseLeft)
     576             :             {
     577           0 :                 eEvent=SDREVENT_ENDACTION;
     578           0 :                 if (IsDragObj())
     579             :                 {
     580           0 :                     eEvent=SDREVENT_ENDDRAG;
     581           0 :                     rVEvt.bDragWithCopy=MODKEY_CopyDrag;
     582             :                 }
     583           0 :                 else if (IsCreateObj() || IsInsObjPoint())
     584             :                 {
     585           0 :                     eEvent=IsCreateObj() ? SDREVENT_ENDCREATE : SDREVENT_ENDINSOBJPOINT;
     586           0 :                     rVEvt.eEndCreateCmd=SDRCREATE_NEXTPOINT;
     587           0 :                     if (MODKEY_PolyPoly) rVEvt.eEndCreateCmd=SDRCREATE_NEXTOBJECT;
     588           0 :                     if (rVEvt.nMouseClicks>1) rVEvt.eEndCreateCmd=SDRCREATE_FORCEEND;
     589             :                 }
     590           0 :                 else if (IsMarking())
     591             :                 {
     592           0 :                     eEvent=SDREVENT_ENDMARK;
     593           0 :                     if (!aDragStat.IsMinMoved())
     594             :                     {
     595           0 :                         eEvent=SDREVENT_BRKMARK;
     596           0 :                         rVEvt.bAddMark=MODKEY_MultiMark;
     597             :                     }
     598             :                 }
     599             :             }
     600             :         }
     601             :         else
     602             :         {
     603           0 :             eEvent=SDREVENT_MOVACTION;
     604             :         }
     605             :     }
     606         550 :     else if (eHit==SDRHIT_TEXTEDIT)
     607             :     {
     608           0 :         eEvent=SDREVENT_TEXTEDIT;
     609             :     }
     610         550 :     else if (bMouseDown && bMouseLeft)
     611             :     {
     612         550 :         if (rVEvt.nMouseClicks==2 && rVEvt.nMouseCode==MOUSE_LEFT && pObj!=NULL && pHitObj!=NULL && pHitObj->HasTextEdit() && eHit==SDRHIT_MARKEDOBJECT)
     613             :         {
     614           0 :             rVEvt.pRootObj=pObj;
     615           0 :             pObj=pHitObj;
     616           0 :             eEvent=SDREVENT_BEGTEXTEDIT;
     617             :         }
     618         550 :         else if (MODKEY_ForceMark && eHit!=SDRHIT_URLFIELD)
     619             :         {
     620           0 :             eEvent=SDREVENT_BEGMARK; // AddMark,Unmark */
     621             :         }
     622         550 :         else if (eHit==SDRHIT_HELPLINE)
     623             :         {
     624           0 :             eEvent=SDREVENT_BEGDRAGHELPLINE; // nothing, actually
     625             :         }
     626         550 :         else if (eHit==SDRHIT_GLUEPOINT)
     627             :         {
     628           0 :             eEvent=SDREVENT_MARKGLUEPOINT; // AddMark+Drag
     629           0 :             rVEvt.bAddMark=MODKEY_MultiMark || MODKEY_DeepMark; // if not hit with Deep
     630             :         }
     631         550 :         else if (eHit==SDRHIT_HANDLE)
     632             :         {
     633           0 :             eEvent=SDREVENT_BEGDRAGOBJ;    // Mark+Drag,AddMark+Drag,DeepMark+Drag,Unmark
     634           0 :             bool bGlue=pHdl->GetKind()==HDL_GLUE;
     635           0 :             bool bPoly=!bGlue && IsPointMarkable(*pHdl);
     636           0 :             bool bMarked=bGlue || (bPoly && pHdl->IsSelected());
     637           0 :             if (bGlue || bPoly)
     638             :             {
     639           0 :                 eEvent=bGlue ? SDREVENT_MARKGLUEPOINT : SDREVENT_MARKPOINT;
     640           0 :                 if (MODKEY_DeepMark)
     641             :                 {
     642           0 :                     rVEvt.bAddMark=true;
     643           0 :                     rVEvt.bPrevNextMark=true;
     644           0 :                     rVEvt.bMarkPrev=MODKEY_DeepBackw;
     645             :                 }
     646           0 :                 else if (MODKEY_MultiMark)
     647             :                 {
     648           0 :                     rVEvt.bAddMark=true;
     649           0 :                     rVEvt.bUnmark=bMarked; // Toggle
     650           0 :                     if (bGlue)
     651             :                     {
     652           0 :                         pObj=pHdl->GetObj();
     653           0 :                         nGlueId=(sal_uInt16)pHdl->GetObjHdlNum();
     654             :                     }
     655             :                 }
     656           0 :                 else if (bMarked)
     657             :                 {
     658           0 :                     eEvent=SDREVENT_BEGDRAGOBJ; // don't change MarkState, only change Drag
     659             :                 }
     660             :             }
     661             :         }
     662         550 :         else if (bInsPolyPt && (MODKEY_PolyPoly || (!MODKEY_MultiMark && !MODKEY_DeepMark)))
     663             :         {
     664           0 :             eEvent=SDREVENT_BEGINSOBJPOINT;
     665           0 :             rVEvt.bInsPointNewObj=MODKEY_PolyPoly;
     666             :         }
     667         550 :         else if (bInsGluePt && !MODKEY_MultiMark && !MODKEY_DeepMark)
     668             :         {
     669           0 :             eEvent=SDREVENT_BEGINSGLUEPOINT;
     670             :         }
     671         550 :         else if (eHit==SDRHIT_TEXTEDITOBJ)
     672             :         {
     673           0 :             eEvent=SDREVENT_BEGTEXTEDIT; // AddMark+Drag,DeepMark+Drag,Unmark
     674           0 :             if (MODKEY_MultiMark || MODKEY_DeepMark)
     675             :             { // if not hit with Deep
     676           0 :                 eEvent=SDREVENT_MARKOBJ;
     677             :             }
     678             :         }
     679         550 :         else if (eHit==SDRHIT_MACRO)
     680             :         {
     681           0 :             eEvent=SDREVENT_BEGMACROOBJ;       // AddMark+Drag
     682           0 :             if (MODKEY_MultiMark || MODKEY_DeepMark)
     683             :             { // if not hit with Deep
     684           0 :                 eEvent=SDREVENT_MARKOBJ;
     685             :             }
     686             :         }
     687         550 :         else if (eHit==SDRHIT_URLFIELD)
     688             :         {
     689           0 :             eEvent=SDREVENT_EXECUTEURL;       // AddMark+Drag
     690           0 :             if (MODKEY_MultiMark || MODKEY_DeepMark)
     691             :             { // if not hit with Deep
     692           0 :                 eEvent=SDREVENT_MARKOBJ;
     693             :             }
     694             :         }
     695         550 :         else if (eHit==SDRHIT_MARKEDOBJECT)
     696             :         {
     697           0 :             eEvent=SDREVENT_BEGDRAGOBJ; // DeepMark+Drag,Unmark
     698             : 
     699           0 :             if (MODKEY_MultiMark || MODKEY_DeepMark)
     700             :             { // if not hit with Deep
     701           0 :                 eEvent=SDREVENT_MARKOBJ;
     702             :             }
     703             :         }
     704         550 :         else if (IsCreateMode())
     705             :         {
     706           0 :             eEvent=SDREVENT_BEGCREATEOBJ;          // nothing, actually
     707             :         }
     708         550 :         else if (eHit==SDRHIT_UNMARKEDOBJECT)
     709             :         {
     710           0 :             eEvent=SDREVENT_MARKOBJ;  // AddMark+Drag
     711             :         }
     712             :         else
     713             :         {
     714         550 :             eEvent=SDREVENT_BEGMARK;
     715             :         }
     716             : 
     717         550 :         if (eEvent==SDREVENT_MARKOBJ)
     718             :         {
     719           0 :             rVEvt.bAddMark=MODKEY_MultiMark || MODKEY_DeepMark; // if not hit with Deep
     720           0 :             rVEvt.bPrevNextMark=MODKEY_DeepMark;
     721           0 :             rVEvt.bMarkPrev=MODKEY_DeepMark && MODKEY_DeepBackw;
     722             :         }
     723         550 :         if (eEvent==SDREVENT_BEGMARK)
     724             :         {
     725         550 :             rVEvt.bAddMark=MODKEY_MultiMark;
     726         550 :             rVEvt.bUnmark=MODKEY_Unmark;
     727             :         }
     728             :     }
     729         550 :     rVEvt.bIsAction=bIsAction;
     730         550 :     rVEvt.bIsTextEdit=bIsTextEdit;
     731         550 :     rVEvt.bTextEditHit=bTextEditHit;
     732         550 :     rVEvt.aLogicPos=aLocalLogicPosition;
     733         550 :     rVEvt.pHdl=pHdl;
     734         550 :     rVEvt.pObj=pObj;
     735         550 :     if(rVEvt.pRootObj==NULL)
     736         550 :         rVEvt.pRootObj=pObj;
     737         550 :     rVEvt.pPV=pPV;
     738         550 :     rVEvt.nHlplIdx=nHlplIdx;
     739         550 :     rVEvt.nGlueId=nGlueId;
     740         550 :     rVEvt.eHit=eHit;
     741         550 :     rVEvt.eEvent=eEvent;
     742         550 :     rVEvt.bCaptureMouse=bMouseLeft && bMouseDown && eEvent!=SDREVENT_NONE;
     743         550 :     rVEvt.bReleaseMouse=bMouseLeft && bMouseUp;
     744             : #ifdef DGB_UTIL
     745             :     if (rVEvt.pRootObj!=NULL) {
     746             :         if (rVEvt.pRootObj->GetObjList()!=rVEvt.pPV->GetObjList()) {
     747             :             OSL_FAIL("SdrView::PickAnything(): pRootObj->GetObjList()!=pPV->GetObjList() !");
     748             :         }
     749             :     }
     750             : #endif
     751         550 :     return eHit;
     752             : }
     753             : 
     754           0 : bool SdrView::DoMouseEvent(const SdrViewEvent& rVEvt)
     755             : {
     756           0 :     bool bRet=false;
     757           0 :     SdrHitKind eHit=rVEvt.eHit;
     758           0 :     Point aLogicPos(rVEvt.aLogicPos);
     759             : 
     760           0 :     bool bShift=(rVEvt.nMouseCode & KEY_SHIFT) !=0;
     761           0 :     bool bCtrl=(rVEvt.nMouseCode & KEY_MOD1) !=0;
     762           0 :     bool bAlt=(rVEvt.nMouseCode & KEY_MOD2) !=0;
     763           0 :     bool bMouseLeft=(rVEvt.nMouseCode&MOUSE_LEFT)!=0;
     764           0 :     bool bMouseDown=rVEvt.bMouseDown;
     765           0 :     bool bMouseUp=rVEvt.bMouseUp;
     766           0 :     if (bMouseDown) {
     767           0 :         if (bMouseLeft) aDragStat.SetMouseDown(true);
     768           0 :     } else if (bMouseUp) {
     769           0 :         if (bMouseLeft) aDragStat.SetMouseDown(false);
     770             :     } else { // else, MouseMove
     771           0 :         aDragStat.SetMouseDown(bMouseLeft);
     772             :     }
     773             : 
     774             : #ifdef MODKEY_NoSnap
     775           0 :     SetSnapEnabled(!MODKEY_NoSnap);
     776             : #endif
     777             : #ifdef MODKEY_Ortho
     778           0 :     SetOrtho(MODKEY_Ortho!=IsOrthoDesired());
     779             : #endif
     780             : #ifdef MODKEY_AngleSnap
     781           0 :     SetAngleSnapEnabled(MODKEY_AngleSnap);
     782             : #endif
     783             : #ifdef MODKEY_CopyDrag
     784           0 :     SetDragWithCopy(MODKEY_CopyDrag);
     785             : #endif
     786             : #ifdef MODKEY_Center
     787           0 :     SetCreate1stPointAsCenter(MODKEY_Center);
     788           0 :     SetResizeAtCenter(MODKEY_Center);
     789           0 :     SetCrookAtCenter(MODKEY_Center);
     790             : #endif
     791           0 :     if (bMouseLeft && bMouseDown && rVEvt.bIsTextEdit && (eHit==SDRHIT_UNMARKEDOBJECT || eHit==SDRHIT_NONE)) {
     792           0 :         SdrEndTextEdit(); // User has clicked beneath object, exit edit mode.
     793             :         // pHdl is invalid, then, that shouldn't matter, though, as we expect
     794             :         // pHdl==NULL (because of eHit).
     795             :     }
     796           0 :     switch (rVEvt.eEvent) {
     797           0 :         case SDREVENT_NONE: bRet=false; break;
     798           0 :         case SDREVENT_TEXTEDIT: bRet=false; break; // Events handled by the OutlinerView are not taken into account here.
     799           0 :         case SDREVENT_MOVACTION: MovAction(aLogicPos); bRet=true; break;
     800           0 :         case SDREVENT_ENDACTION: EndAction(); bRet=true; break;
     801           0 :         case SDREVENT_BCKACTION: BckAction(); bRet=true; break;
     802           0 :         case SDREVENT_BRKACTION: BrkAction(); bRet=true; break;
     803           0 :         case SDREVENT_ENDMARK  : EndAction(); bRet=true; break;
     804             :         case SDREVENT_BRKMARK  : {
     805           0 :             BrkAction();
     806           0 :             if (!MarkObj(aLogicPos,nHitTolLog,rVEvt.bAddMark)) {
     807             :                 // No object hit. Do the following:
     808             :                 // 1. deselect any selected glue points
     809             :                 // 2. deselect any selected polygon points
     810             :                 // 3. deselect any selected objects
     811           0 :                 if (!rVEvt.bAddMark) UnmarkAll();
     812             :             }
     813           0 :             bRet=true;
     814           0 :         } break;
     815             :         case SDREVENT_ENDCREATE: { // if necessary, MarkObj
     816           0 :             SdrCreateCmd eCmd=SDRCREATE_NEXTPOINT;
     817           0 :             if (MODKEY_PolyPoly) eCmd=SDRCREATE_NEXTOBJECT;
     818           0 :             if (rVEvt.nMouseClicks>1) eCmd=SDRCREATE_FORCEEND;
     819           0 :             if (!EndCreateObj(eCmd)) { // Don't evaluate event for Create? -> Select
     820           0 :                 if (eHit==SDRHIT_UNMARKEDOBJECT || eHit==SDRHIT_TEXTEDIT) {
     821           0 :                     MarkObj(rVEvt.pRootObj,rVEvt.pPV);
     822           0 :                     if (eHit==SDRHIT_TEXTEDIT)
     823             :                     {
     824           0 :                         bool bRet2(pActualOutDev && OUTDEV_WINDOW == pActualOutDev->GetOutDevType() &&
     825           0 :                             SdrBeginTextEdit(rVEvt.pObj, rVEvt.pPV, const_cast<vcl::Window*>(static_cast<const vcl::Window*>(pActualOutDev)), false, (SdrOutliner*)0L));
     826             : 
     827           0 :                         if(bRet2)
     828             :                         {
     829           0 :                             MouseEvent aMEvt(pActualOutDev->LogicToPixel(aLogicPos),
     830           0 :                                              1,rVEvt.nMouseMode,rVEvt.nMouseCode,rVEvt.nMouseCode);
     831             : 
     832           0 :                             OutlinerView* pOLV=GetTextEditOutlinerView();
     833           0 :                             if (pOLV!=NULL) {
     834           0 :                                 pOLV->MouseButtonDown(aMEvt); // event for the Outliner, but without double-click
     835           0 :                                 pOLV->MouseButtonUp(aMEvt); // event for the Outliner, but without double-click
     836             :                             }
     837             :                         }
     838             :                     }
     839           0 :                     bRet=true; // object is selected and (if necessary) TextEdit is started
     840           0 :                 } else bRet=false; // canceled Create, nothing else
     841           0 :             } else bRet=true; // return true for EndCreate
     842           0 :         } break;
     843             :         case SDREVENT_ENDDRAG: {
     844           0 :             bRet=EndDragObj(IsDragWithCopy());
     845           0 :             ForceMarkedObjToAnotherPage(); // TODO: Undo+bracing missing!
     846           0 :         } break;
     847             :         case SDREVENT_MARKOBJ: { // + (if applicable) BegDrag
     848           0 :             if (!rVEvt.bAddMark) UnmarkAllObj();
     849           0 :             bool bUnmark=rVEvt.bUnmark;
     850           0 :             if (rVEvt.bPrevNextMark) {
     851           0 :                 bRet=MarkNextObj(aLogicPos,nHitTolLog,rVEvt.bMarkPrev);
     852             :             } else {
     853           0 :                 SortMarkedObjects();
     854           0 :                 const size_t nAnz0=GetMarkedObjectCount();
     855           0 :                 bRet=MarkObj(aLogicPos,nHitTolLog,rVEvt.bAddMark);
     856           0 :                 SortMarkedObjects();
     857           0 :                 const size_t nAnz1=GetMarkedObjectCount();
     858           0 :                 bUnmark=nAnz1<nAnz0;
     859             :             }
     860           0 :             if (!bUnmark) {
     861           0 :                 BegDragObj(aLogicPos,NULL,(SdrHdl*)NULL,nMinMovLog);
     862           0 :                 bRet=true;
     863             :             }
     864           0 :         } break;
     865             :         case SDREVENT_MARKPOINT: { // + (if applicable) BegDrag
     866           0 :             if (!rVEvt.bAddMark) UnmarkAllPoints();
     867           0 :             if (rVEvt.bPrevNextMark) {
     868           0 :                 bRet=MarkNextPoint(aLogicPos,rVEvt.bMarkPrev);
     869             :             } else {
     870           0 :                 bRet=MarkPoint(*rVEvt.pHdl,rVEvt.bUnmark);
     871             :             }
     872           0 :             if (!rVEvt.bUnmark && !rVEvt.bPrevNextMark) {
     873           0 :                 BegDragObj(aLogicPos,NULL,rVEvt.pHdl,nMinMovLog);
     874           0 :                 bRet=true;
     875             :             }
     876           0 :         } break;
     877             :         case SDREVENT_MARKGLUEPOINT: { // + (if applicable) BegDrag
     878           0 :             if (!rVEvt.bAddMark) UnmarkAllGluePoints();
     879           0 :             if (rVEvt.bPrevNextMark) {
     880           0 :                 bRet=MarkNextGluePoint(aLogicPos,rVEvt.bMarkPrev);
     881             :             } else {
     882           0 :                 bRet=MarkGluePoint(rVEvt.pObj,rVEvt.nGlueId,rVEvt.pPV,rVEvt.bUnmark);
     883             :             }
     884           0 :             if (!rVEvt.bUnmark && !rVEvt.bPrevNextMark) {
     885           0 :                 SdrHdl* pHdl=GetGluePointHdl(rVEvt.pObj,rVEvt.nGlueId);
     886           0 :                 BegDragObj(aLogicPos,NULL,pHdl,nMinMovLog);
     887           0 :                 bRet=true;
     888             :             }
     889           0 :         } break;
     890           0 :         case SDREVENT_BEGMARK: bRet=BegMark(aLogicPos,rVEvt.bAddMark,rVEvt.bUnmark); break;
     891           0 :         case SDREVENT_BEGINSOBJPOINT: bRet = BegInsObjPoint(aLogicPos, MODKEY_PolyPoly); break;
     892             :         case SDREVENT_ENDINSOBJPOINT: {
     893           0 :             SdrCreateCmd eCmd=SDRCREATE_NEXTPOINT;
     894           0 :             if (MODKEY_PolyPoly) eCmd=SDRCREATE_NEXTOBJECT;
     895           0 :             if (rVEvt.nMouseClicks>1) eCmd=SDRCREATE_FORCEEND;
     896           0 :             EndInsObjPoint(eCmd);
     897           0 :             bRet=true;
     898           0 :         } break;
     899           0 :         case SDREVENT_BEGINSGLUEPOINT: bRet=BegInsGluePoint(aLogicPos); break;
     900           0 :         case SDREVENT_BEGDRAGHELPLINE: bRet=BegDragHelpLine(rVEvt.nHlplIdx,rVEvt.pPV); break;
     901           0 :         case SDREVENT_BEGDRAGOBJ: bRet=BegDragObj(aLogicPos,NULL,rVEvt.pHdl,nMinMovLog); break;
     902             :         case SDREVENT_BEGCREATEOBJ: {
     903           0 :             if (nAktInvent==SdrInventor && nAktIdent==OBJ_CAPTION) {
     904           0 :                 long nHgt=SdrEngineDefaults::GetFontHeight();
     905           0 :                 bRet=BegCreateCaptionObj(aLogicPos,Size(5*nHgt,2*nHgt));
     906           0 :             } else bRet=BegCreateObj(aLogicPos);
     907           0 :         } break;
     908             :         case SDREVENT_BEGMACROOBJ: {
     909           0 :             bRet=BegMacroObj(aLogicPos,nHitTolLog,rVEvt.pObj,rVEvt.pPV,const_cast<vcl::Window*>(static_cast<const vcl::Window*>(pActualOutDev)));
     910           0 :         } break;
     911             :         case SDREVENT_BEGTEXTEDIT: {
     912           0 :             if (!IsObjMarked(rVEvt.pObj)) {
     913           0 :                 UnmarkAllObj();
     914           0 :                 MarkObj(rVEvt.pRootObj,rVEvt.pPV);
     915             :             }
     916             : 
     917           0 :             bRet = pActualOutDev && OUTDEV_WINDOW == pActualOutDev->GetOutDevType()&&
     918           0 :                  SdrBeginTextEdit(rVEvt.pObj, rVEvt.pPV, const_cast<vcl::Window*>(static_cast<const vcl::Window*>(pActualOutDev)), false, (SdrOutliner*)0L);
     919             : 
     920           0 :             if(bRet)
     921             :             {
     922           0 :                 MouseEvent aMEvt(pActualOutDev->LogicToPixel(aLogicPos),
     923           0 :                                  1,rVEvt.nMouseMode,rVEvt.nMouseCode,rVEvt.nMouseCode);
     924           0 :                 OutlinerView* pOLV=GetTextEditOutlinerView();
     925           0 :                 if (pOLV!=NULL) pOLV->MouseButtonDown(aMEvt); // event for the Outliner, but without double-click
     926             :             }
     927           0 :         } break;
     928           0 :         default: break;
     929             :     } // switch
     930           0 :     if (bRet && pActualOutDev!=NULL && pActualOutDev->GetOutDevType()==OUTDEV_WINDOW) {
     931           0 :         vcl::Window* pWin=const_cast<vcl::Window*>(static_cast<const vcl::Window*>(pActualOutDev));
     932             :         // left mouse button pressed?
     933           0 :         bool bLeftDown=(rVEvt.nMouseCode&MOUSE_LEFT)!=0 && rVEvt.bMouseDown;
     934             :         // left mouse button released?
     935           0 :         bool bLeftUp=(rVEvt.nMouseCode&MOUSE_LEFT)!=0 && rVEvt.bMouseUp;
     936             :         // left mouse button pressed or held?
     937           0 :         bool bLeftDown1=(rVEvt.nMouseCode&MOUSE_LEFT)!=0 && !rVEvt.bMouseUp;
     938             :         pWin->SetPointer(GetPreferredPointer(rVEvt.aLogicPos,pWin,
     939           0 :                 rVEvt.nMouseCode & (KEY_SHIFT|KEY_MOD1|KEY_MOD2),bLeftDown1));
     940           0 :         bool bAction=IsAction();
     941           0 :         if (bLeftDown && bAction)
     942           0 :             pWin->CaptureMouse();
     943           0 :         else if (bLeftUp || (rVEvt.bIsAction && !bAction))
     944           0 :             pWin->ReleaseMouse();
     945             :     }
     946           0 :     return bRet;
     947             : }
     948             : #include <editeng/outlobj.hxx>
     949             : 
     950         550 : Pointer SdrView::GetPreferredPointer(const Point& rMousePos, const OutputDevice* pOut, sal_uInt16 nModifier, bool bLeftDown) const
     951             : {
     952             :     // Actions
     953         550 :     if (IsCreateObj())
     954             :     {
     955           0 :         return pAktCreate->GetCreatePointer();
     956             :     }
     957         550 :     if (mpCurrentSdrDragMethod)
     958             :     {
     959           0 :         if ((IsDraggingPoints() || IsDraggingGluePoints()) && IsMouseHideWhileDraggingPoints())
     960           0 :             return Pointer(POINTER_NULL);
     961             : 
     962           0 :         return mpCurrentSdrDragMethod->GetSdrDragPointer();
     963             :     }
     964         550 :     if (IsMarkObj() || IsMarkPoints() || IsMarkGluePoints() || IsSetPageOrg()) return Pointer(POINTER_ARROW);
     965         550 :     if (IsDragHelpLine()) return GetDraggedHelpLinePointer();
     966         550 :     if (IsMacroObj()) {
     967           0 :         SdrObjMacroHitRec aHitRec;
     968           0 :         aHitRec.aPos=pOut->LogicToPixel(rMousePos);
     969           0 :         aHitRec.aDownPos=aMacroDownPos;
     970           0 :         aHitRec.nTol=nMacroTol;
     971           0 :         aHitRec.pVisiLayer=&pMacroPV->GetVisibleLayers();
     972           0 :         aHitRec.pPageView=pMacroPV;
     973           0 :         aHitRec.pOut=pMacroWin;
     974           0 :         aHitRec.bDown=bMacroDown;
     975           0 :         return pMacroObj->GetMacroPointer(aHitRec);
     976             :     }
     977             : 
     978             :     // TextEdit, ObjEdit, Macro
     979         550 :     if (IsTextEdit() && (IsTextEditInSelectionMode() || IsTextEditHit(rMousePos,0/*nTol*/)))
     980             :     {
     981           0 :         if(!pOut || IsTextEditInSelectionMode())
     982             :         {
     983           0 :             if(pTextEditOutliner->IsVertical())
     984           0 :                 return Pointer(POINTER_TEXT_VERTICAL);
     985             :             else
     986           0 :                 return Pointer(POINTER_TEXT);
     987             :         }
     988             :         // Outliner should return something here...
     989           0 :         Point aPos(pOut->LogicToPixel(rMousePos));
     990           0 :         Pointer aPointer(pTextEditOutlinerView->GetPointer(aPos));
     991           0 :         if (aPointer==POINTER_ARROW)
     992             :         {
     993           0 :             if(pTextEditOutliner->IsVertical())
     994           0 :                 aPointer = POINTER_TEXT_VERTICAL;
     995             :             else
     996           0 :                 aPointer = POINTER_TEXT;
     997             :         }
     998           0 :         return aPointer;
     999             :     }
    1000             : 
    1001         550 :     SdrViewEvent aVEvt;
    1002         550 :     aVEvt.nMouseCode=(nModifier&(KEY_SHIFT|KEY_MOD1|KEY_MOD2))|MOUSE_LEFT; // to see what would happen on MouseLeftDown
    1003         550 :     aVEvt.bMouseDown=!bLeftDown; // What if ..?
    1004         550 :     aVEvt.bMouseUp=bLeftDown;    // What if ..?
    1005         550 :     if (pOut!=NULL)
    1006         550 :         ((SdrView*)this)->SetActualWin(pOut);
    1007         550 :     SdrHitKind eHit=PickAnything(rMousePos,aVEvt);
    1008         550 :     SdrEventKind eEvent=aVEvt.eEvent;
    1009         550 :     switch (eEvent)
    1010             :     {
    1011             :         case SDREVENT_BEGCREATEOBJ:
    1012           0 :             return aAktCreatePointer;
    1013             :         case SDREVENT_MARKOBJ:
    1014             :         case SDREVENT_BEGMARK:
    1015         550 :             return Pointer(POINTER_ARROW);
    1016             :         case SDREVENT_MARKPOINT:
    1017             :         case SDREVENT_MARKGLUEPOINT:
    1018           0 :             return Pointer(POINTER_MOVEPOINT);
    1019             :         case SDREVENT_BEGINSOBJPOINT:
    1020             :         case SDREVENT_BEGINSGLUEPOINT:
    1021           0 :             return Pointer(POINTER_CROSS);
    1022             :         case SDREVENT_EXECUTEURL:
    1023           0 :             return Pointer(POINTER_REFHAND);
    1024             :         case SDREVENT_BEGMACROOBJ:
    1025             :         {
    1026           0 :             SdrObjMacroHitRec aHitRec;
    1027           0 :             aHitRec.aPos=aVEvt.aLogicPos;
    1028           0 :             aHitRec.aDownPos=aHitRec.aPos;
    1029           0 :             aHitRec.nTol=nHitTolLog;
    1030           0 :             aHitRec.pVisiLayer=&aVEvt.pPV->GetVisibleLayers();
    1031           0 :             aHitRec.pPageView=aVEvt.pPV;
    1032           0 :             aHitRec.pOut=(OutputDevice*)pOut;
    1033           0 :             return aVEvt.pObj->GetMacroPointer(aHitRec);
    1034             :         }
    1035           0 :         default: break;
    1036             :     } // switch
    1037             : 
    1038           0 :     switch(eHit)
    1039             :     {
    1040             :         case SDRHIT_CELL:
    1041           0 :             return Pointer(POINTER_ARROW);
    1042             :         case SDRHIT_HELPLINE :
    1043           0 :             return aVEvt.pPV->GetHelpLines()[aVEvt.nHlplIdx].GetPointer();
    1044             :         case SDRHIT_GLUEPOINT:
    1045           0 :             return Pointer(POINTER_MOVEPOINT);
    1046             :         case SDRHIT_TEXTEDIT :
    1047             :         case SDRHIT_TEXTEDITOBJ:
    1048             :         {
    1049           0 :             SdrTextObj* pText = dynamic_cast< SdrTextObj* >( aVEvt.pObj );
    1050           0 :             if(pText && pText->HasText())
    1051             :             {
    1052           0 :                 OutlinerParaObject* pParaObj = pText->GetOutlinerParaObject();
    1053           0 :                 if(pParaObj && pParaObj->IsVertical())
    1054           0 :                     return Pointer(POINTER_TEXT_VERTICAL);
    1055             :             }
    1056           0 :             return Pointer(POINTER_TEXT);
    1057             :         }
    1058           0 :         default: break;
    1059             :     }
    1060             : 
    1061           0 :     bool bMarkHit=eHit==SDRHIT_MARKEDOBJECT;
    1062           0 :     SdrHdl* pHdl=aVEvt.pHdl;
    1063             :     // now check the pointers for dragging
    1064           0 :     if (pHdl!=NULL || bMarkHit) {
    1065           0 :         SdrHdlKind eHdl= pHdl!=NULL ? pHdl->GetKind() : HDL_MOVE;
    1066           0 :         bool bCorner=pHdl!=NULL && pHdl->IsCornerHdl();
    1067           0 :         bool bVertex=pHdl!=NULL && pHdl->IsVertexHdl();
    1068           0 :         bool bMov=eHdl==HDL_MOVE;
    1069           0 :         if (bMov && (eDragMode==SDRDRAG_MOVE || eDragMode==SDRDRAG_RESIZE || bMarkedHitMovesAlways)) {
    1070           0 :             if (!IsMoveAllowed()) return Pointer(POINTER_ARROW); // because double click or drag & drop is possible
    1071           0 :             return Pointer(POINTER_MOVE);
    1072             :         }
    1073           0 :         switch (eDragMode) {
    1074             :             case SDRDRAG_ROTATE: {
    1075           0 :                 if ((bCorner || bMov) && !IsRotateAllowed(true))
    1076           0 :                     return Pointer(POINTER_NOTALLOWED);
    1077             : 
    1078             :                 // are 3D objects selected?
    1079           0 :                 bool b3DObjSelected = false;
    1080           0 :                 for (size_t a=0; !b3DObjSelected && a<GetMarkedObjectCount(); ++a) {
    1081           0 :                     SdrObject* pObj = GetMarkedObjectByIndex(a);
    1082           0 :                     if(pObj && pObj->ISA(E3dObject))
    1083           0 :                         b3DObjSelected = true;
    1084             :                 }
    1085             :                 // If we have a 3D object, go on despite !IsShearAllowed,
    1086             :                 // because then we have a rotation instead of a shear.
    1087           0 :                 if (bVertex && !IsShearAllowed() && !b3DObjSelected)
    1088           0 :                     return Pointer(POINTER_NOTALLOWED);
    1089           0 :                 if (bMov)
    1090           0 :                     return Pointer(POINTER_ROTATE);
    1091           0 :             } break;
    1092             :             case SDRDRAG_SHEAR: case SDRDRAG_DISTORT: {
    1093           0 :                 if (bCorner) {
    1094           0 :                     if (!IsDistortAllowed(true) && !IsDistortAllowed(false)) return Pointer(POINTER_NOTALLOWED);
    1095           0 :                     else return Pointer(POINTER_REFHAND);
    1096             :                 }
    1097           0 :                 if (bVertex && !IsShearAllowed()) return Pointer(POINTER_NOTALLOWED);
    1098           0 :                 if (bMov) {
    1099           0 :                     if (!IsMoveAllowed()) return Pointer(POINTER_ARROW); // because double click or drag & drop is possible
    1100           0 :                     return Pointer(POINTER_MOVE);
    1101             :                 }
    1102           0 :             } break;
    1103             :             case SDRDRAG_MIRROR: {
    1104           0 :                 if (bCorner || bVertex || bMov) {
    1105           0 :                     SdrHdl* pH1=aHdl.GetHdl(HDL_REF1);
    1106           0 :                     SdrHdl* pH2=aHdl.GetHdl(HDL_REF2);
    1107           0 :                     bool b90=false;
    1108           0 :                     bool b45=false;
    1109           0 :                     Point aDif;
    1110           0 :                     if (pH1!=NULL && pH2!=NULL) {
    1111           0 :                         aDif=pH2->GetPos()-pH1->GetPos();
    1112           0 :                         b90=(aDif.X()==0) || aDif.Y()==0;
    1113           0 :                         b45=b90 || (std::abs(aDif.X())==std::abs(aDif.Y()));
    1114             :                     }
    1115           0 :                     bool bNo=false;
    1116           0 :                     if (!IsMirrorAllowed(true,true)) bNo=true; // any mirroring is forbidden
    1117           0 :                     if (!IsMirrorAllowed(false,false) && !b45) bNo=true; // mirroring freely is forbidden
    1118           0 :                     if (!IsMirrorAllowed(true,false) && !b90) bNo=true;  // mirroring horizontally/vertically is allowed
    1119           0 :                     if (bNo) return Pointer(POINTER_NOTALLOWED);
    1120           0 :                     if (b90) {
    1121           0 :                         return Pointer(POINTER_MIRROR);
    1122             :                     }
    1123           0 :                     return Pointer(POINTER_MIRROR);
    1124             :                 }
    1125           0 :             } break;
    1126             : 
    1127             :             case SDRDRAG_TRANSPARENCE:
    1128             :             {
    1129           0 :                 if(!IsTransparenceAllowed())
    1130           0 :                     return Pointer(POINTER_NOTALLOWED);
    1131             : 
    1132           0 :                 return Pointer(POINTER_REFHAND);
    1133             :             }
    1134             : 
    1135             :             case SDRDRAG_GRADIENT:
    1136             :             {
    1137           0 :                 if(!IsGradientAllowed())
    1138           0 :                     return Pointer(POINTER_NOTALLOWED);
    1139             : 
    1140           0 :                 return Pointer(POINTER_REFHAND);
    1141             :             }
    1142             : 
    1143             :             case SDRDRAG_CROOK: {
    1144           0 :                 if (bCorner || bVertex || bMov) {
    1145           0 :                     if (!IsCrookAllowed(true) && !IsCrookAllowed(false)) return Pointer(POINTER_NOTALLOWED);
    1146           0 :                     return Pointer(POINTER_CROOK);
    1147             :                 }
    1148             :             }
    1149             : 
    1150             :             case SDRDRAG_CROP:
    1151             :             {
    1152           0 :                 return Pointer(POINTER_CROP);
    1153             :             }
    1154             : 
    1155             :             default: {
    1156           0 :                 if ((bCorner || bVertex) && !IsResizeAllowed(true)) return Pointer(POINTER_NOTALLOWED);
    1157             :             }
    1158             :         }
    1159           0 :         if (pHdl!=NULL) return pHdl->GetPointer();
    1160           0 :         if (bMov) {
    1161           0 :             if (!IsMoveAllowed()) return Pointer(POINTER_ARROW); // because double click or drag & drop is possible
    1162           0 :             return Pointer(POINTER_MOVE);
    1163             :         }
    1164             :     }
    1165           0 :     if (eEditMode==SDREDITMODE_CREATE) return aAktCreatePointer;
    1166           0 :     return Pointer(POINTER_ARROW);
    1167             : }
    1168             : 
    1169             : #define STR_NOTHING "nothing"
    1170         207 : OUString SdrView::GetStatusText()
    1171             : {
    1172         207 :     OUString aStr;
    1173         414 :     OUString aName;
    1174             : 
    1175         207 :     aStr += STR_NOTHING;
    1176             : 
    1177         207 :     if (pAktCreate!=NULL)
    1178             :     {
    1179           0 :         aStr=pAktCreate->getSpecialDragComment(aDragStat);
    1180             : 
    1181           0 :         if(aStr.isEmpty())
    1182             :         {
    1183           0 :             aName = pAktCreate->TakeObjNameSingul();
    1184           0 :             aStr = ImpGetResStr(STR_ViewCreateObj);
    1185             :         }
    1186             :     }
    1187         207 :     else if (mpCurrentSdrDragMethod)
    1188             :     {
    1189           0 :         if (bInsPolyPoint || IsInsertGluePoint())
    1190             :         {
    1191           0 :             aStr=aInsPointUndoStr;
    1192             :         }
    1193             :         else
    1194             :         {
    1195           0 :             if (aDragStat.IsMinMoved())
    1196             :             {
    1197             :                 OSL_TRACE("SdrView::GetStatusText(%lx) %lx", this, mpCurrentSdrDragMethod);
    1198           0 :                 mpCurrentSdrDragMethod->TakeSdrDragComment(aStr);
    1199             :             }
    1200             :         }
    1201             :     }
    1202         207 :     else if(IsMarkObj())
    1203             :     {
    1204           0 :         if(AreObjectsMarked())
    1205             :         {
    1206           0 :             aStr = ImpGetResStr(STR_ViewMarkMoreObjs);
    1207             :         }
    1208             :         else
    1209             :         {
    1210           0 :             aStr = ImpGetResStr(STR_ViewMarkObjs);
    1211             :         }
    1212             :     }
    1213         207 :     else if(IsMarkPoints())
    1214             :     {
    1215           0 :         if(HasMarkedPoints())
    1216             :         {
    1217           0 :             aStr = ImpGetResStr(STR_ViewMarkMorePoints);
    1218             :         }
    1219             :         else
    1220             :         {
    1221           0 :             aStr = ImpGetResStr(STR_ViewMarkPoints);
    1222             :         }
    1223         207 :     } else if (IsMarkGluePoints())
    1224             :     {
    1225           0 :         if(HasMarkedGluePoints())
    1226             :         {
    1227           0 :             aStr = ImpGetResStr(STR_ViewMarkMoreGluePoints);
    1228             :         }
    1229             :         else
    1230             :         {
    1231           0 :             aStr = ImpGetResStr(STR_ViewMarkGluePoints);
    1232             :         }
    1233             :     }
    1234         207 :     else if (IsTextEdit() && pTextEditOutlinerView!=NULL) {
    1235           0 :         aStr=ImpGetResStr(STR_ViewTextEdit); // "TextEdit - Row y, Column x";
    1236           0 :         ESelection aSel(pTextEditOutlinerView->GetSelection());
    1237           0 :         long nPar=aSel.nEndPara,nLin=0,nCol=aSel.nEndPos;
    1238           0 :         if (aSel.nEndPara>0) {
    1239           0 :             for (sal_Int32 nParaNum=0; nParaNum<aSel.nEndPara; nParaNum++) {
    1240           0 :                 nLin+=pTextEditOutliner->GetLineCount(nParaNum);
    1241             :             }
    1242             :         }
    1243             :         // A little imperfection:
    1244             :         // At the end of a line of any multi-line paragraph, we display the
    1245             :         // position of the next line of the same paragraph, if there is one.
    1246           0 :         sal_uInt16 nParaLine=0;
    1247           0 :         sal_uIntPtr nParaLineAnz=pTextEditOutliner->GetLineCount(aSel.nEndPara);
    1248           0 :         bool bBrk=false;
    1249           0 :         while (!bBrk) {
    1250           0 :             sal_uInt16 nLen=pTextEditOutliner->GetLineLen(aSel.nEndPara,nParaLine);
    1251           0 :             bool bLastLine=(nParaLine==nParaLineAnz-1);
    1252           0 :             if (nCol>nLen || (!bLastLine && nCol==nLen)) {
    1253           0 :                 nCol-=nLen;
    1254           0 :                 nLin++;
    1255           0 :                 nParaLine++;
    1256           0 :             } else bBrk=true;
    1257           0 :             if (nLen==0) bBrk=true; // to be sure
    1258             :         }
    1259             : 
    1260           0 :         aStr = aStr.replaceFirst("%1", OUString::number(nPar + 1));
    1261           0 :         aStr = aStr.replaceFirst("%2", OUString::number(nLin + 1));
    1262           0 :         aStr = aStr.replaceFirst("%3", OUString::number(nCol + 1));
    1263             : 
    1264             : #ifdef DBG_UTIL
    1265             :         aStr +=  ", Level " ;
    1266             :         aStr += OUString::number( pTextEditOutliner->GetDepth( aSel.nEndPara ) );
    1267             : #endif
    1268             :     }
    1269             : 
    1270         207 :     if(aStr == STR_NOTHING)
    1271             :     {
    1272         207 :         if (AreObjectsMarked()) {
    1273           0 :             ImpTakeDescriptionStr(STR_ViewMarked,aStr);
    1274           0 :             if (IsGluePointEditMode()) {
    1275           0 :                 if (HasMarkedGluePoints()) {
    1276           0 :                     ImpTakeDescriptionStr(STR_ViewMarked,aStr,0,IMPSDR_GLUEPOINTSDESCRIPTION);
    1277             :                 }
    1278             :             } else {
    1279           0 :                 if (HasMarkedPoints()) {
    1280           0 :                     ImpTakeDescriptionStr(STR_ViewMarked,aStr,0,IMPSDR_POINTSDESCRIPTION);
    1281             :                 }
    1282             :             }
    1283             :         } else {
    1284         207 :             aStr = "";
    1285             :         }
    1286             :     }
    1287           0 :     else if(!aName.isEmpty())
    1288             :     {
    1289           0 :         aStr = aStr.replaceFirst("%1", aName);
    1290             :     }
    1291             : 
    1292         207 :     if(!aStr.isEmpty())
    1293             :     {
    1294             :         // capitalize first letter
    1295           0 :         aStr = aStr.replaceAt(0, 1, OUString(aStr[0]).toAsciiUpperCase());
    1296             :     }
    1297         414 :     return aStr;
    1298             : }
    1299             : 
    1300        1702 : SdrViewContext SdrView::GetContext() const
    1301             : {
    1302        1702 :     if( IsGluePointEditMode() )
    1303           0 :         return SDRCONTEXT_GLUEPOINTEDIT;
    1304             : 
    1305        1702 :     const size_t nMarkAnz = GetMarkedObjectCount();
    1306             : 
    1307        1702 :     if( HasMarkablePoints() && !IsFrameHandles() )
    1308             :     {
    1309           0 :         bool bPath=true;
    1310           0 :         for( size_t nMarkNum = 0; nMarkNum < nMarkAnz && bPath; ++nMarkNum )
    1311           0 :             if (!GetMarkedObjectByIndex(nMarkNum)->ISA(SdrPathObj))
    1312           0 :                 bPath=false;
    1313             : 
    1314           0 :         if( bPath )
    1315           0 :             return SDRCONTEXT_POINTEDIT;
    1316             :     }
    1317             : 
    1318        1702 :     if( GetMarkedObjectCount() )
    1319             :     {
    1320           6 :         bool bGraf = true, bMedia = true, bTable = true;
    1321             : 
    1322          12 :         for( size_t nMarkNum = 0; nMarkNum < nMarkAnz && ( bGraf || bMedia ); ++nMarkNum )
    1323             :         {
    1324           6 :             const SdrObject* pMarkObj = GetMarkedObjectByIndex( nMarkNum );
    1325             :             DBG_ASSERT( pMarkObj, "SdrView::GetContext(), null pointer in mark list!" );
    1326             : 
    1327           6 :             if( !pMarkObj )
    1328           0 :                 continue;
    1329             : 
    1330           6 :             if( !pMarkObj->ISA( SdrGrafObj ) )
    1331           6 :                 bGraf = false;
    1332             : 
    1333           6 :             if( !pMarkObj->ISA( SdrMediaObj ) )
    1334           6 :                 bMedia = false;
    1335             : 
    1336           6 :             if( !pMarkObj->ISA( ::sdr::table::SdrTableObj ) )
    1337           6 :                 bTable = false;
    1338             :         }
    1339             : 
    1340           6 :         if( bGraf )
    1341           0 :             return SDRCONTEXT_GRAPHIC;
    1342           6 :         else if( bMedia )
    1343           0 :             return SDRCONTEXT_MEDIA;
    1344           6 :         else if( bTable )
    1345           0 :             return SDRCONTEXT_TABLE;
    1346             :     }
    1347             : 
    1348        1702 :     return SDRCONTEXT_STANDARD;
    1349             : }
    1350             : 
    1351           0 : void SdrView::MarkAll()
    1352             : {
    1353           0 :     if (IsTextEdit()) {
    1354           0 :         GetTextEditOutlinerView()->SetSelection(ESelection(0,0,EE_PARA_ALL,EE_TEXTPOS_ALL));
    1355             : #ifdef DBG_UTIL
    1356             :         if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
    1357             : #endif
    1358           0 :     } else if (IsGluePointEditMode()) MarkAllGluePoints();
    1359           0 :     else if (HasMarkablePoints()) MarkAllPoints();
    1360           0 :     else MarkAllObj();
    1361           0 : }
    1362             : 
    1363        3018 : void SdrView::UnmarkAll()
    1364             : {
    1365        3018 :     if (IsTextEdit()) {
    1366           0 :         ESelection eSel=GetTextEditOutlinerView()->GetSelection();
    1367           0 :         eSel.nStartPara=eSel.nEndPara;
    1368           0 :         eSel.nStartPos=eSel.nEndPos;
    1369           0 :         GetTextEditOutlinerView()->SetSelection(eSel);
    1370             : #ifdef DBG_UTIL
    1371             :         if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
    1372             : #endif
    1373        3018 :     } else if (HasMarkedGluePoints()) UnmarkAllGluePoints();
    1374        3018 :     else if (HasMarkedPoints()) UnmarkAllPoints(); // Marked, not Markable!
    1375        3018 :     else UnmarkAllObj();
    1376        3018 : }
    1377             : 
    1378           0 : const Rectangle& SdrView::GetMarkedRect() const
    1379             : {
    1380           0 :     if (IsGluePointEditMode() && HasMarkedGluePoints()) {
    1381           0 :         return GetMarkedGluePointsRect();
    1382             :     }
    1383           0 :     if (HasMarkedPoints()) {
    1384           0 :         return GetMarkedPointsRect();
    1385             :     }
    1386           0 :     return GetMarkedObjRect();
    1387             : }
    1388             : 
    1389           2 : void SdrView::DeleteMarked()
    1390             : {
    1391           2 :     if (IsTextEdit())
    1392             :     {
    1393           0 :         SdrObjEditView::KeyInput(KeyEvent(0,vcl::KeyCode(KeyFuncType::DELETE)),pTextEditWin);
    1394             :     }
    1395             :     else
    1396             :     {
    1397           2 :         if( mxSelectionController.is() && mxSelectionController->DeleteMarked() )
    1398             :         {
    1399             :             // action already performed by current selection controller, do nothing
    1400             :         }
    1401           2 :         else if (IsGluePointEditMode() && HasMarkedGluePoints())
    1402             :         {
    1403           0 :             DeleteMarkedGluePoints();
    1404             :         }
    1405           2 :         else if (GetContext()==SDRCONTEXT_POINTEDIT && HasMarkedPoints())
    1406             :         {
    1407           0 :             DeleteMarkedPoints();
    1408             :         }
    1409             :         else
    1410             :         {
    1411           2 :             DeleteMarkedObj();
    1412             :         }
    1413             :     }
    1414           2 : }
    1415             : 
    1416           0 : bool SdrView::BegMark(const Point& rPnt, bool bAddMark, bool bUnmark)
    1417             : {
    1418           0 :     if (bUnmark) bAddMark=true;
    1419           0 :     if (IsGluePointEditMode()) {
    1420           0 :         if (!bAddMark) UnmarkAllGluePoints();
    1421           0 :         return BegMarkGluePoints(rPnt,bUnmark);
    1422           0 :     } else if (HasMarkablePoints()) {
    1423           0 :         if (!bAddMark) UnmarkAllPoints();
    1424           0 :         return BegMarkPoints(rPnt,bUnmark);
    1425             :     } else {
    1426           0 :         if (!bAddMark) UnmarkAllObj();
    1427           0 :         return BegMarkObj(rPnt,bUnmark);
    1428             :     }
    1429             : }
    1430             : 
    1431         328 : void SdrView::ConfigurationChanged( ::utl::ConfigurationBroadcaster*p, sal_uInt32 nHint)
    1432             : {
    1433         328 :     onAccessibilityOptionsChanged();
    1434         328 :      SdrCreateView::ConfigurationChanged(p, nHint);
    1435         328 : }
    1436             : 
    1437             : 
    1438             : /** method is called whenever the global SvtAccessibilityOptions is changed */
    1439       16313 : void SdrView::onAccessibilityOptionsChanged()
    1440             : {
    1441       16313 : }
    1442             : 
    1443         596 : void SdrView::SetMasterPagePaintCaching(bool bOn)
    1444             : {
    1445         596 :     if(mbMasterPagePaintCaching != bOn)
    1446             :     {
    1447         596 :         mbMasterPagePaintCaching = bOn;
    1448             : 
    1449             :         // reset at all SdrPageWindows
    1450         596 :         SdrPageView* pPageView = GetSdrPageView();
    1451             : 
    1452         596 :         if(pPageView)
    1453             :         {
    1454           0 :             for(sal_uInt32 b(0L); b < pPageView->PageWindowCount(); b++)
    1455             :             {
    1456           0 :                 SdrPageWindow* pPageWindow = pPageView->GetPageWindow(b);
    1457             :                 assert(pPageWindow && "SdrView::SetMasterPagePaintCaching: Corrupt SdrPageWindow list (!)");
    1458             : 
    1459             :                 // force deletion of ObjectContact, so at re-display all VOCs
    1460             :                 // will be re-created with updated flag setting
    1461           0 :                 pPageWindow->ResetObjectContact();
    1462             :             }
    1463             : 
    1464             :             // force redraw of this view
    1465           0 :             pPageView->InvalidateAllWin();
    1466             :         }
    1467             :     }
    1468        1247 : }
    1469             : 
    1470             : 
    1471             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10