LCOV - code coverage report
Current view: top level - svx/source/svdraw - svdview.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 795 0.0 %
Date: 2014-04-14 Functions: 0 37 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <editeng/eeitem.hxx>
      21             : 
      22             : #include "svx/svdstr.hrc"
      23             : #include "svx/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           0 : 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           0 :       bReleaseMouse(false)
      84             : {
      85           0 : }
      86             : 
      87           0 : SdrViewEvent::~SdrViewEvent()
      88             : {
      89           0 : }
      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           0 : TYPEINIT1(SdrView,SdrCreateView);
     158             : 
     159           0 : SdrView::SdrView(SdrModel* pModel1, OutputDevice* pOut)
     160             : :   SdrCreateView(pModel1,pOut),
     161             :     bNoExtendedMouseDispatcher(false),
     162             :     bNoExtendedKeyDispatcher(false),
     163             :     bNoExtendedCommandDispatcher(false),
     164           0 :     mbMasterPagePaintCaching(false)
     165             : {
     166           0 :     bTextEditOnObjectsWithoutTextIfTextTool=false;
     167             : 
     168           0 :     maAccessibilityOptions.AddListener(this);
     169             : 
     170           0 :     onAccessibilityOptionsChanged();
     171           0 : }
     172             : 
     173           0 : SdrView::~SdrView()
     174             : {
     175           0 :     maAccessibilityOptions.RemoveListener(this);
     176           0 : }
     177             : 
     178           0 : bool SdrView::KeyInput(const KeyEvent& rKEvt, 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 KEYFUNC_CUT   : Cut(); break;
     186           0 :             case KEYFUNC_COPY  : Yank(); break;
     187           0 :             case KEYFUNC_PASTE : Paste(pWin); break;
     188           0 :             case KEYFUNC_DELETE: DeleteMarked(); break;
     189           0 :             case KEYFUNC_UNDO: pMod->Undo(); break;
     190           0 :             case KEYFUNC_REDO: pMod->Redo(); break;
     191           0 :             case KEYFUNC_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, 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, 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, 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, Window* pWin)
     263             : {
     264           0 :     SetActualWin(pWin);
     265           0 :     bool bRet = SdrCreateView::Command(rCEvt,pWin);
     266           0 :     return bRet;
     267             : }
     268             : 
     269           0 : bool SdrView::GetAttributes(SfxItemSet& rTargetSet, bool bOnlyHardAttr) const
     270             : {
     271           0 :     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           0 : SdrHitKind SdrView::PickAnything(const Point& rLogicPos, SdrViewEvent& rVEvt) const
     321             : {
     322           0 :     const OutputDevice* pOut=pActualOutDev;
     323           0 :     if (pOut==NULL)
     324             :     {
     325           0 :         pOut = GetFirstOutputDevice();
     326             :     }
     327             : 
     328             :     // #i73628# Use a non-changeable copy of he logic position
     329           0 :     const Point aLocalLogicPosition(rLogicPos);
     330             : 
     331           0 :     bool bEditMode=IsEditMode();
     332           0 :     bool bPointMode=bEditMode && HasMarkablePoints();
     333           0 :     bool bGluePointMode=IsGluePointEditMode();
     334           0 :     bool bInsPolyPt=bPointMode && IsInsObjPointMode() && IsInsObjPointPossible();
     335           0 :     bool bInsGluePt=bGluePointMode && IsInsGluePointMode() && IsInsGluePointPossible();
     336           0 :     bool bIsTextEdit=IsTextEdit();
     337           0 :     bool bTextEditHit=IsTextEditHit(aLocalLogicPosition,0/*nHitTolLog*/);
     338           0 :     bool bTextEditSel=IsTextEditInSelectionMode();
     339           0 :     bool bShift=(rVEvt.nMouseCode & KEY_SHIFT) !=0;
     340           0 :     bool bCtrl=(rVEvt.nMouseCode & KEY_MOD1) !=0;
     341           0 :     bool bAlt=(rVEvt.nMouseCode & KEY_MOD2) !=0;
     342           0 :     SdrHitKind eHit=SDRHIT_NONE;
     343           0 :     SdrHdl* pHdl=pOut!=NULL && !bTextEditSel ? PickHandle(aLocalLogicPosition) : NULL;
     344           0 :     SdrPageView* pPV=NULL;
     345           0 :     SdrObject* pObj=NULL;
     346           0 :     SdrObject* pHitObj=NULL;
     347           0 :     sal_uInt16 nHitPassNum=0;
     348           0 :     sal_uInt16 nHlplIdx=0;
     349           0 :     sal_uInt16 nGlueId=0;
     350           0 :     if (bTextEditHit || bTextEditSel)
     351             :     {
     352           0 :         eHit=SDRHIT_TEXTEDIT;
     353           0 :         bTextEditHit=true;
     354             :     }
     355           0 :     else if (pHdl!=NULL)
     356             :     {
     357           0 :         eHit=SDRHIT_HANDLE; // handle is hit: highest priority
     358             :     }
     359           0 :     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           0 :     else if (bGluePointMode && PickGluePoint(aLocalLogicPosition,pObj,nGlueId,pPV))
     364             :     {
     365           0 :         eHit=SDRHIT_GLUEPOINT; // deselected glue point hit
     366             :     }
     367           0 :     else if (PickObj(aLocalLogicPosition,nHitTolLog,pHitObj,pPV,SDRSEARCH_DEEP|SDRSEARCH_MARKED,&pObj,NULL,&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           0 :     else if (PickObj(aLocalLogicPosition,nHitTolLog,pHitObj,pPV,SDRSEARCH_DEEP|SDRSEARCH_ALSOONMASTER|SDRSEARCH_WHOLEPAGE,&pObj,NULL,&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           0 :     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           0 :     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           0 :     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.nDrehWink!=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, (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           0 :     if (nHitPassNum==SDRSEARCHPASS_DIRECT &&
     508           0 :         (eHit==SDRHIT_MARKEDOBJECT || eHit==SDRHIT_UNMARKEDOBJECT) &&
     509           0 :         (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) && ((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           0 :     if (nHitPassNum!=SDRSEARCHPASS_DIRECT && eHit==SDRHIT_UNMARKEDOBJECT) {
     556           0 :         eHit=SDRHIT_NONE;
     557           0 :         pObj=NULL;
     558           0 :         pPV=NULL;
     559             :     }
     560           0 :     bool bMouseLeft=(rVEvt.nMouseCode&MOUSE_LEFT)!=0;
     561           0 :     bool bMouseRight=(rVEvt.nMouseCode&MOUSE_RIGHT)!=0;
     562           0 :     bool bMouseDown=rVEvt.bMouseDown;
     563           0 :     bool bMouseUp=rVEvt.bMouseUp;
     564           0 :     SdrEventKind eEvent=SDREVENT_NONE;
     565           0 :     bool bIsAction=IsAction();
     566             : 
     567           0 :     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           0 :     else if (eHit==SDRHIT_TEXTEDIT)
     607             :     {
     608           0 :         eEvent=SDREVENT_TEXTEDIT;
     609             :     }
     610           0 :     else if (bMouseDown && bMouseLeft)
     611             :     {
     612           0 :         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           0 :         else if (MODKEY_ForceMark && eHit!=SDRHIT_URLFIELD)
     619             :         {
     620           0 :             eEvent=SDREVENT_BEGMARK; // AddMark,Unmark */
     621             :         }
     622           0 :         else if (eHit==SDRHIT_HELPLINE)
     623             :         {
     624           0 :             eEvent=SDREVENT_BEGDRAGHELPLINE; // nothing, actually
     625             :         }
     626           0 :         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           0 :         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           0 :         else if (bInsPolyPt && (MODKEY_PolyPoly || (!MODKEY_MultiMark && !MODKEY_DeepMark)))
     663             :         {
     664           0 :             eEvent=SDREVENT_BEGINSOBJPOINT;
     665           0 :             rVEvt.bInsPointNewObj=MODKEY_PolyPoly;
     666             :         }
     667           0 :         else if (bInsGluePt && !MODKEY_MultiMark && !MODKEY_DeepMark)
     668             :         {
     669           0 :             eEvent=SDREVENT_BEGINSGLUEPOINT;
     670             :         }
     671           0 :         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           0 :         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           0 :         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           0 :         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           0 :         else if (IsCreateMode())
     705             :         {
     706           0 :             eEvent=SDREVENT_BEGCREATEOBJ;          // nothing, actually
     707             :         }
     708           0 :         else if (eHit==SDRHIT_UNMARKEDOBJECT)
     709             :         {
     710           0 :             eEvent=SDREVENT_MARKOBJ;  // AddMark+Drag
     711             :         }
     712             :         else
     713             :         {
     714           0 :             eEvent=SDREVENT_BEGMARK;
     715             :         }
     716             : 
     717           0 :         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           0 :         if (eEvent==SDREVENT_BEGMARK)
     724             :         {
     725           0 :             rVEvt.bAddMark=MODKEY_MultiMark;
     726           0 :             rVEvt.bUnmark=MODKEY_Unmark;
     727             :         }
     728             :     }
     729           0 :     rVEvt.bIsAction=bIsAction;
     730           0 :     rVEvt.bIsTextEdit=bIsTextEdit;
     731           0 :     rVEvt.bTextEditHit=bTextEditHit;
     732           0 :     rVEvt.aLogicPos=aLocalLogicPosition;
     733           0 :     rVEvt.pHdl=pHdl;
     734           0 :     rVEvt.pObj=pObj;
     735           0 :     if(rVEvt.pRootObj==NULL)
     736           0 :         rVEvt.pRootObj=pObj;
     737           0 :     rVEvt.pPV=pPV;
     738           0 :     rVEvt.nHlplIdx=nHlplIdx;
     739           0 :     rVEvt.nGlueId=nGlueId;
     740           0 :     rVEvt.eHit=eHit;
     741           0 :     rVEvt.eEvent=eEvent;
     742           0 :     rVEvt.bCaptureMouse=bMouseLeft && bMouseDown && eEvent!=SDREVENT_NONE;
     743           0 :     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           0 :     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, (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 :                 sal_uIntPtr nAnz0=GetMarkedObjectCount();
     855           0 :                 bRet=MarkObj(aLogicPos,nHitTolLog,rVEvt.bAddMark);
     856           0 :                 SortMarkedObjects();
     857           0 :                 sal_uIntPtr 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           0 :         case SDREVENT_BEGMACROOBJ: bRet=BegMacroObj(aLogicPos,nHitTolLog,rVEvt.pObj,rVEvt.pPV,(Window*)pActualOutDev); break;
     909             :         case SDREVENT_BEGTEXTEDIT: {
     910           0 :             if (!IsObjMarked(rVEvt.pObj)) {
     911           0 :                 UnmarkAllObj();
     912           0 :                 MarkObj(rVEvt.pRootObj,rVEvt.pPV);
     913             :             }
     914             : 
     915           0 :             bRet = pActualOutDev && OUTDEV_WINDOW == pActualOutDev->GetOutDevType()&&
     916           0 :                  SdrBeginTextEdit(rVEvt.pObj, rVEvt.pPV, (Window*)pActualOutDev, false, (SdrOutliner*)0L);
     917             : 
     918           0 :             if(bRet)
     919             :             {
     920           0 :                 MouseEvent aMEvt(pActualOutDev->LogicToPixel(aLogicPos),
     921           0 :                                  1,rVEvt.nMouseMode,rVEvt.nMouseCode,rVEvt.nMouseCode);
     922           0 :                 OutlinerView* pOLV=GetTextEditOutlinerView();
     923           0 :                 if (pOLV!=NULL) pOLV->MouseButtonDown(aMEvt); // event for the Outliner, but without double-click
     924             :             }
     925           0 :         } break;
     926           0 :         default: break;
     927             :     } // switch
     928           0 :     if (bRet && pActualOutDev!=NULL && pActualOutDev->GetOutDevType()==OUTDEV_WINDOW) {
     929           0 :         Window* pWin=(Window*)pActualOutDev;
     930             :         // left mouse button pressed?
     931           0 :         bool bLeftDown=(rVEvt.nMouseCode&MOUSE_LEFT)!=0 && rVEvt.bMouseDown;
     932             :         // left mouse button released?
     933           0 :         bool bLeftUp=(rVEvt.nMouseCode&MOUSE_LEFT)!=0 && rVEvt.bMouseUp;
     934             :         // left mouse button pressed or held?
     935           0 :         bool bLeftDown1=(rVEvt.nMouseCode&MOUSE_LEFT)!=0 && !rVEvt.bMouseUp;
     936             :         pWin->SetPointer(GetPreferredPointer(rVEvt.aLogicPos,pWin,
     937           0 :                 rVEvt.nMouseCode & (KEY_SHIFT|KEY_MOD1|KEY_MOD2),bLeftDown1));
     938           0 :         bool bAction=IsAction();
     939           0 :         if (bLeftDown && bAction) pWin->CaptureMouse();
     940           0 :         else if (bLeftUp || (rVEvt.bIsAction && !bAction)) pWin->ReleaseMouse();
     941             :     }
     942           0 :     return bRet;
     943             : }
     944             : #include <editeng/outlobj.hxx>
     945             : 
     946           0 : Pointer SdrView::GetPreferredPointer(const Point& rMousePos, const OutputDevice* pOut, sal_uInt16 nModifier, bool bLeftDown) const
     947             : {
     948             :     // Actions
     949           0 :     if (IsCreateObj())
     950             :     {
     951           0 :         return pAktCreate->GetCreatePointer();
     952             :     }
     953           0 :     if (mpCurrentSdrDragMethod)
     954             :     {
     955           0 :         if ((IsDraggingPoints() || IsDraggingGluePoints()) && IsMouseHideWhileDraggingPoints())
     956           0 :             return Pointer(POINTER_NULL);
     957             : 
     958           0 :         return mpCurrentSdrDragMethod->GetSdrDragPointer();
     959             :     }
     960           0 :     if (IsMarkObj() || IsMarkPoints() || IsMarkGluePoints() || IsSetPageOrg()) return Pointer(POINTER_ARROW);
     961           0 :     if (IsDragHelpLine()) return GetDraggedHelpLinePointer();
     962           0 :     if (IsMacroObj()) {
     963           0 :         SdrObjMacroHitRec aHitRec;
     964           0 :         aHitRec.aPos=pOut->LogicToPixel(rMousePos);
     965           0 :         aHitRec.aDownPos=aMacroDownPos;
     966           0 :         aHitRec.nTol=nMacroTol;
     967           0 :         aHitRec.pVisiLayer=&pMacroPV->GetVisibleLayers();
     968           0 :         aHitRec.pPageView=pMacroPV;
     969           0 :         aHitRec.pOut=pMacroWin;
     970           0 :         aHitRec.bDown=bMacroDown;
     971           0 :         return pMacroObj->GetMacroPointer(aHitRec);
     972             :     }
     973             : 
     974             :     // TextEdit, ObjEdit, Macro
     975           0 :     if (IsTextEdit() && (IsTextEditInSelectionMode() || IsTextEditHit(rMousePos,0/*nTol*/)))
     976             :     {
     977           0 :         if(!pOut || IsTextEditInSelectionMode())
     978             :         {
     979           0 :             if(pTextEditOutliner->IsVertical())
     980           0 :                 return Pointer(POINTER_TEXT_VERTICAL);
     981             :             else
     982           0 :                 return Pointer(POINTER_TEXT);
     983             :         }
     984             :         // Outliner should return something here...
     985           0 :         Point aPos(pOut->LogicToPixel(rMousePos));
     986           0 :         Pointer aPointer(pTextEditOutlinerView->GetPointer(aPos));
     987           0 :         if (aPointer==POINTER_ARROW)
     988             :         {
     989           0 :             if(pTextEditOutliner->IsVertical())
     990           0 :                 aPointer = POINTER_TEXT_VERTICAL;
     991             :             else
     992           0 :                 aPointer = POINTER_TEXT;
     993             :         }
     994           0 :         return aPointer;
     995             :     }
     996             : 
     997           0 :     SdrViewEvent aVEvt;
     998           0 :     aVEvt.nMouseCode=(nModifier&(KEY_SHIFT|KEY_MOD1|KEY_MOD2))|MOUSE_LEFT; // to see what would happen on MouseLeftDown
     999           0 :     aVEvt.bMouseDown=!bLeftDown; // What if ..?
    1000           0 :     aVEvt.bMouseUp=bLeftDown;    // What if ..?
    1001           0 :     if (pOut!=NULL)
    1002           0 :         ((SdrView*)this)->SetActualWin(pOut);
    1003           0 :     SdrHitKind eHit=PickAnything(rMousePos,aVEvt);
    1004           0 :     SdrEventKind eEvent=aVEvt.eEvent;
    1005           0 :     switch (eEvent)
    1006             :     {
    1007             :         case SDREVENT_BEGCREATEOBJ:
    1008           0 :             return aAktCreatePointer;
    1009             :         case SDREVENT_MARKOBJ:
    1010             :         case SDREVENT_BEGMARK:
    1011           0 :             return Pointer(POINTER_ARROW);
    1012             :         case SDREVENT_MARKPOINT:
    1013             :         case SDREVENT_MARKGLUEPOINT:
    1014           0 :             return Pointer(POINTER_MOVEPOINT);
    1015             :         case SDREVENT_BEGINSOBJPOINT:
    1016             :         case SDREVENT_BEGINSGLUEPOINT:
    1017           0 :             return Pointer(POINTER_CROSS);
    1018             :         case SDREVENT_EXECUTEURL:
    1019           0 :             return Pointer(POINTER_REFHAND);
    1020             :         case SDREVENT_BEGMACROOBJ:
    1021             :         {
    1022           0 :             SdrObjMacroHitRec aHitRec;
    1023           0 :             aHitRec.aPos=aVEvt.aLogicPos;
    1024           0 :             aHitRec.aDownPos=aHitRec.aPos;
    1025           0 :             aHitRec.nTol=nHitTolLog;
    1026           0 :             aHitRec.pVisiLayer=&aVEvt.pPV->GetVisibleLayers();
    1027           0 :             aHitRec.pPageView=aVEvt.pPV;
    1028           0 :             aHitRec.pOut=(OutputDevice*)pOut;
    1029           0 :             return aVEvt.pObj->GetMacroPointer(aHitRec);
    1030             :         }
    1031           0 :         default: break;
    1032             :     } // switch
    1033             : 
    1034           0 :     switch(eHit)
    1035             :     {
    1036             :         case SDRHIT_CELL:
    1037           0 :             return Pointer(POINTER_ARROW);
    1038             :         case SDRHIT_HELPLINE :
    1039           0 :             return aVEvt.pPV->GetHelpLines()[aVEvt.nHlplIdx].GetPointer();
    1040             :         case SDRHIT_GLUEPOINT:
    1041           0 :             return Pointer(POINTER_MOVEPOINT);
    1042             :         case SDRHIT_TEXTEDIT :
    1043             :         case SDRHIT_TEXTEDITOBJ:
    1044             :         {
    1045           0 :             SdrTextObj* pText = dynamic_cast< SdrTextObj* >( aVEvt.pObj );
    1046           0 :             if(pText && pText->HasText())
    1047             :             {
    1048           0 :                 OutlinerParaObject* pParaObj = pText->GetOutlinerParaObject();
    1049           0 :                 if(pParaObj && pParaObj->IsVertical())
    1050           0 :                     return Pointer(POINTER_TEXT_VERTICAL);
    1051             :             }
    1052           0 :             return Pointer(POINTER_TEXT);
    1053             :         }
    1054           0 :         default: break;
    1055             :     }
    1056             : 
    1057           0 :     bool bMarkHit=eHit==SDRHIT_MARKEDOBJECT;
    1058           0 :     SdrHdl* pHdl=aVEvt.pHdl;
    1059             :     // now check the pointers for dragging
    1060           0 :     if (pHdl!=NULL || bMarkHit) {
    1061           0 :         SdrHdlKind eHdl= pHdl!=NULL ? pHdl->GetKind() : HDL_MOVE;
    1062           0 :         bool bCorner=pHdl!=NULL && pHdl->IsCornerHdl();
    1063           0 :         bool bVertex=pHdl!=NULL && pHdl->IsVertexHdl();
    1064           0 :         bool bMov=eHdl==HDL_MOVE;
    1065           0 :         if (bMov && (eDragMode==SDRDRAG_MOVE || eDragMode==SDRDRAG_RESIZE || bMarkedHitMovesAlways)) {
    1066           0 :             if (!IsMoveAllowed()) return Pointer(POINTER_ARROW); // because double click or drag & drop is possible
    1067           0 :             return Pointer(POINTER_MOVE);
    1068             :         }
    1069           0 :         switch (eDragMode) {
    1070             :             case SDRDRAG_ROTATE: {
    1071           0 :                 if ((bCorner || bMov) && !IsRotateAllowed(true))
    1072           0 :                     return Pointer(POINTER_NOTALLOWED);
    1073             : 
    1074             :                 // are 3D objects selected?
    1075           0 :                 bool b3DObjSelected = false;
    1076           0 :                 for (sal_uInt32 a=0; !b3DObjSelected && a<GetMarkedObjectCount(); a++) {
    1077           0 :                     SdrObject* pObj = GetMarkedObjectByIndex(a);
    1078           0 :                     if(pObj && pObj->ISA(E3dObject))
    1079           0 :                         b3DObjSelected = true;
    1080             :                 }
    1081             :                 // If we have a 3D object, go on despite !IsShearAllowed,
    1082             :                 // because then we have a rotation instead of a shear.
    1083           0 :                 if (bVertex && !IsShearAllowed() && !b3DObjSelected)
    1084           0 :                     return Pointer(POINTER_NOTALLOWED);
    1085           0 :                 if (bMov)
    1086           0 :                     return Pointer(POINTER_ROTATE);
    1087           0 :             } break;
    1088             :             case SDRDRAG_SHEAR: case SDRDRAG_DISTORT: {
    1089           0 :                 if (bCorner) {
    1090           0 :                     if (!IsDistortAllowed(true) && !IsDistortAllowed(false)) return Pointer(POINTER_NOTALLOWED);
    1091           0 :                     else return Pointer(POINTER_REFHAND);
    1092             :                 }
    1093           0 :                 if (bVertex && !IsShearAllowed()) return Pointer(POINTER_NOTALLOWED);
    1094           0 :                 if (bMov) {
    1095           0 :                     if (!IsMoveAllowed()) return Pointer(POINTER_ARROW); // because double click or drag & drop is possible
    1096           0 :                     return Pointer(POINTER_MOVE);
    1097             :                 }
    1098           0 :             } break;
    1099             :             case SDRDRAG_MIRROR: {
    1100           0 :                 if (bCorner || bVertex || bMov) {
    1101           0 :                     SdrHdl* pH1=aHdl.GetHdl(HDL_REF1);
    1102           0 :                     SdrHdl* pH2=aHdl.GetHdl(HDL_REF2);
    1103           0 :                     bool b90=false;
    1104           0 :                     bool b45=false;
    1105           0 :                     Point aDif;
    1106           0 :                     if (pH1!=NULL && pH2!=NULL) {
    1107           0 :                         aDif=pH2->GetPos()-pH1->GetPos();
    1108           0 :                         b90=(aDif.X()==0) || aDif.Y()==0;
    1109           0 :                         b45=b90 || (std::abs(aDif.X())==std::abs(aDif.Y()));
    1110             :                     }
    1111           0 :                     bool bNo=false;
    1112           0 :                     if (!IsMirrorAllowed(true,true)) bNo=true; // any mirroring is forbidden
    1113           0 :                     if (!IsMirrorAllowed(false,false) && !b45) bNo=true; // mirroring freely is forbidden
    1114           0 :                     if (!IsMirrorAllowed(true,false) && !b90) bNo=true;  // mirroring horizontally/vertically is allowed
    1115           0 :                     if (bNo) return Pointer(POINTER_NOTALLOWED);
    1116           0 :                     if (b90) {
    1117           0 :                         return Pointer(POINTER_MIRROR);
    1118             :                     }
    1119           0 :                     return Pointer(POINTER_MIRROR);
    1120             :                 }
    1121           0 :             } break;
    1122             : 
    1123             :             case SDRDRAG_TRANSPARENCE:
    1124             :             {
    1125           0 :                 if(!IsTransparenceAllowed())
    1126           0 :                     return Pointer(POINTER_NOTALLOWED);
    1127             : 
    1128           0 :                 return Pointer(POINTER_REFHAND);
    1129             :             }
    1130             : 
    1131             :             case SDRDRAG_GRADIENT:
    1132             :             {
    1133           0 :                 if(!IsGradientAllowed())
    1134           0 :                     return Pointer(POINTER_NOTALLOWED);
    1135             : 
    1136           0 :                 return Pointer(POINTER_REFHAND);
    1137             :             }
    1138             : 
    1139             :             case SDRDRAG_CROOK: {
    1140           0 :                 if (bCorner || bVertex || bMov) {
    1141           0 :                     if (!IsCrookAllowed(true) && !IsCrookAllowed(false)) return Pointer(POINTER_NOTALLOWED);
    1142           0 :                     return Pointer(POINTER_CROOK);
    1143             :                 }
    1144             :             }
    1145             : 
    1146             :             case SDRDRAG_CROP:
    1147             :             {
    1148           0 :                 return Pointer(POINTER_CROP);
    1149             :             }
    1150             : 
    1151             :             default: {
    1152           0 :                 if ((bCorner || bVertex) && !IsResizeAllowed(true)) return Pointer(POINTER_NOTALLOWED);
    1153             :             }
    1154             :         }
    1155           0 :         if (pHdl!=NULL) return pHdl->GetPointer();
    1156           0 :         if (bMov) {
    1157           0 :             if (!IsMoveAllowed()) return Pointer(POINTER_ARROW); // because double click or drag & drop is possible
    1158           0 :             return Pointer(POINTER_MOVE);
    1159             :         }
    1160             :     }
    1161           0 :     if (eEditMode==SDREDITMODE_CREATE) return aAktCreatePointer;
    1162           0 :     return Pointer(POINTER_ARROW);
    1163             : }
    1164             : 
    1165             : #define STR_NOTHING "nothing"
    1166           0 : OUString SdrView::GetStatusText()
    1167             : {
    1168           0 :     OUString aStr;
    1169           0 :     OUString aName;
    1170             : 
    1171           0 :     aStr += STR_NOTHING;
    1172             : 
    1173           0 :     if (pAktCreate!=NULL)
    1174             :     {
    1175           0 :         aStr=pAktCreate->getSpecialDragComment(aDragStat);
    1176             : 
    1177           0 :         if(aStr.isEmpty())
    1178             :         {
    1179           0 :             aName = pAktCreate->TakeObjNameSingul();
    1180           0 :             aStr = ImpGetResStr(STR_ViewCreateObj);
    1181             :         }
    1182             :     }
    1183           0 :     else if (mpCurrentSdrDragMethod)
    1184             :     {
    1185           0 :         if (bInsPolyPoint || IsInsertGluePoint())
    1186             :         {
    1187           0 :             aStr=aInsPointUndoStr;
    1188             :         }
    1189             :         else
    1190             :         {
    1191           0 :             if (aDragStat.IsMinMoved())
    1192             :             {
    1193             :                 OSL_TRACE("SdrView::GetStatusText(%lx) %lx", this, mpCurrentSdrDragMethod);
    1194           0 :                 mpCurrentSdrDragMethod->TakeSdrDragComment(aStr);
    1195             :             }
    1196             :         }
    1197             :     }
    1198           0 :     else if(IsMarkObj())
    1199             :     {
    1200           0 :         if(AreObjectsMarked())
    1201             :         {
    1202           0 :             aStr = ImpGetResStr(STR_ViewMarkMoreObjs);
    1203             :         }
    1204             :         else
    1205             :         {
    1206           0 :             aStr = ImpGetResStr(STR_ViewMarkObjs);
    1207             :         }
    1208             :     }
    1209           0 :     else if(IsMarkPoints())
    1210             :     {
    1211           0 :         if(HasMarkedPoints())
    1212             :         {
    1213           0 :             aStr = ImpGetResStr(STR_ViewMarkMorePoints);
    1214             :         }
    1215             :         else
    1216             :         {
    1217           0 :             aStr = ImpGetResStr(STR_ViewMarkPoints);
    1218             :         }
    1219           0 :     } else if (IsMarkGluePoints())
    1220             :     {
    1221           0 :         if(HasMarkedGluePoints())
    1222             :         {
    1223           0 :             aStr = ImpGetResStr(STR_ViewMarkMoreGluePoints);
    1224             :         }
    1225             :         else
    1226             :         {
    1227           0 :             aStr = ImpGetResStr(STR_ViewMarkGluePoints);
    1228             :         }
    1229             :     }
    1230           0 :     else if (IsTextEdit() && pTextEditOutlinerView!=NULL) {
    1231           0 :         aStr=ImpGetResStr(STR_ViewTextEdit); // "TextEdit - Row y, Column x";
    1232           0 :         ESelection aSel(pTextEditOutlinerView->GetSelection());
    1233           0 :         long nPar=aSel.nEndPara,nLin=0,nCol=aSel.nEndPos;
    1234           0 :         if (aSel.nEndPara>0) {
    1235           0 :             for (sal_Int32 nParaNum=0; nParaNum<aSel.nEndPara; nParaNum++) {
    1236           0 :                 nLin+=pTextEditOutliner->GetLineCount(nParaNum);
    1237             :             }
    1238             :         }
    1239             :         // A little imperfection:
    1240             :         // At the end of a line of any multi-line paragraph, we display the
    1241             :         // position of the next line of the same paragraph, if there is one.
    1242           0 :         sal_uInt16 nParaLine=0;
    1243           0 :         sal_uIntPtr nParaLineAnz=pTextEditOutliner->GetLineCount(aSel.nEndPara);
    1244           0 :         bool bBrk=false;
    1245           0 :         while (!bBrk) {
    1246           0 :             sal_uInt16 nLen=pTextEditOutliner->GetLineLen(aSel.nEndPara,nParaLine);
    1247           0 :             bool bLastLine=(nParaLine==nParaLineAnz-1);
    1248           0 :             if (nCol>nLen || (!bLastLine && nCol==nLen)) {
    1249           0 :                 nCol-=nLen;
    1250           0 :                 nLin++;
    1251           0 :                 nParaLine++;
    1252           0 :             } else bBrk=true;
    1253           0 :             if (nLen==0) bBrk=true; // to be sure
    1254             :         }
    1255             : 
    1256           0 :         aStr = aStr.replaceFirst("%1", OUString::number(nPar + 1));
    1257           0 :         aStr = aStr.replaceFirst("%2", OUString::number(nLin + 1));
    1258           0 :         aStr = aStr.replaceFirst("%3", OUString::number(nCol + 1));
    1259             : 
    1260             : #ifdef DBG_UTIL
    1261             :         aStr +=  ", Level " ;
    1262             :         aStr += OUString::number( pTextEditOutliner->GetDepth( aSel.nEndPara ) );
    1263             : #endif
    1264             :     }
    1265             : 
    1266           0 :     if(aStr == STR_NOTHING)
    1267             :     {
    1268           0 :         if (AreObjectsMarked()) {
    1269           0 :             ImpTakeDescriptionStr(STR_ViewMarked,aStr);
    1270           0 :             if (IsGluePointEditMode()) {
    1271           0 :                 if (HasMarkedGluePoints()) {
    1272           0 :                     ImpTakeDescriptionStr(STR_ViewMarked,aStr,0,IMPSDR_GLUEPOINTSDESCRIPTION);
    1273             :                 }
    1274             :             } else {
    1275           0 :                 if (HasMarkedPoints()) {
    1276           0 :                     ImpTakeDescriptionStr(STR_ViewMarked,aStr,0,IMPSDR_POINTSDESCRIPTION);
    1277             :                 }
    1278             :             }
    1279             :         } else {
    1280           0 :             aStr = "";
    1281             :         }
    1282             :     }
    1283           0 :     else if(!aName.isEmpty())
    1284             :     {
    1285           0 :         aStr = aStr.replaceFirst("%1", aName);
    1286             :     }
    1287             : 
    1288           0 :     if(!aStr.isEmpty())
    1289             :     {
    1290             :         // capitalize first letter
    1291           0 :         aStr = aStr.replaceAt(0, 1, OUString(aStr[0]).toAsciiUpperCase());
    1292             :     }
    1293           0 :     return aStr;
    1294             : }
    1295             : 
    1296           0 : SdrViewContext SdrView::GetContext() const
    1297             : {
    1298           0 :     if( IsGluePointEditMode() )
    1299           0 :         return SDRCONTEXT_GLUEPOINTEDIT;
    1300             : 
    1301           0 :     const sal_uIntPtr nMarkAnz = GetMarkedObjectCount();
    1302             : 
    1303           0 :     if( HasMarkablePoints() && !IsFrameHandles() )
    1304             :     {
    1305           0 :         bool bPath=true;
    1306           0 :         for( sal_uIntPtr nMarkNum = 0; nMarkNum < nMarkAnz && bPath; nMarkNum++ )
    1307           0 :             if (!GetMarkedObjectByIndex(nMarkNum)->ISA(SdrPathObj))
    1308           0 :                 bPath=false;
    1309             : 
    1310           0 :         if( bPath )
    1311           0 :             return SDRCONTEXT_POINTEDIT;
    1312             :     }
    1313             : 
    1314           0 :     if( GetMarkedObjectCount() )
    1315             :     {
    1316           0 :         bool bGraf = true, bMedia = true, bTable = true;
    1317             : 
    1318           0 :         for( sal_uIntPtr nMarkNum = 0; nMarkNum < nMarkAnz && ( bGraf || bMedia ); nMarkNum++ )
    1319             :         {
    1320           0 :             const SdrObject* pMarkObj = GetMarkedObjectByIndex( nMarkNum );
    1321             :             DBG_ASSERT( pMarkObj, "SdrView::GetContext(), null pointer in mark list!" );
    1322             : 
    1323           0 :             if( !pMarkObj )
    1324           0 :                 continue;
    1325             : 
    1326           0 :             if( !pMarkObj->ISA( SdrGrafObj ) )
    1327           0 :                 bGraf = false;
    1328             : 
    1329           0 :             if( !pMarkObj->ISA( SdrMediaObj ) )
    1330           0 :                 bMedia = false;
    1331             : 
    1332           0 :             if( !pMarkObj->ISA( ::sdr::table::SdrTableObj ) )
    1333           0 :                 bTable = false;
    1334             :         }
    1335             : 
    1336           0 :         if( bGraf )
    1337           0 :             return SDRCONTEXT_GRAPHIC;
    1338           0 :         else if( bMedia )
    1339           0 :             return SDRCONTEXT_MEDIA;
    1340           0 :         else if( bTable )
    1341           0 :             return SDRCONTEXT_TABLE;
    1342             :     }
    1343             : 
    1344           0 :     return SDRCONTEXT_STANDARD;
    1345             : }
    1346             : 
    1347           0 : void SdrView::MarkAll()
    1348             : {
    1349           0 :     if (IsTextEdit()) {
    1350           0 :         GetTextEditOutlinerView()->SetSelection(ESelection(0,0,EE_PARA_ALL,EE_TEXTPOS_ALL));
    1351             : #ifdef DBG_UTIL
    1352             :         if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
    1353             : #endif
    1354           0 :     } else if (IsGluePointEditMode()) MarkAllGluePoints();
    1355           0 :     else if (HasMarkablePoints()) MarkAllPoints();
    1356           0 :     else MarkAllObj();
    1357           0 : }
    1358             : 
    1359           0 : void SdrView::UnmarkAll()
    1360             : {
    1361           0 :     if (IsTextEdit()) {
    1362           0 :         ESelection eSel=GetTextEditOutlinerView()->GetSelection();
    1363           0 :         eSel.nStartPara=eSel.nEndPara;
    1364           0 :         eSel.nStartPos=eSel.nEndPos;
    1365           0 :         GetTextEditOutlinerView()->SetSelection(eSel);
    1366             : #ifdef DBG_UTIL
    1367             :         if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
    1368             : #endif
    1369           0 :     } else if (HasMarkedGluePoints()) UnmarkAllGluePoints();
    1370           0 :     else if (HasMarkedPoints()) UnmarkAllPoints(); // Marked, not Markable!
    1371           0 :     else UnmarkAllObj();
    1372           0 : }
    1373             : 
    1374           0 : const Rectangle& SdrView::GetMarkedRect() const
    1375             : {
    1376           0 :     if (IsGluePointEditMode() && HasMarkedGluePoints()) {
    1377           0 :         return GetMarkedGluePointsRect();
    1378             :     }
    1379           0 :     if (HasMarkedPoints()) {
    1380           0 :         return GetMarkedPointsRect();
    1381             :     }
    1382           0 :     return GetMarkedObjRect();
    1383             : }
    1384             : 
    1385           0 : void SdrView::DeleteMarked()
    1386             : {
    1387           0 :     if (IsTextEdit())
    1388             :     {
    1389           0 :         SdrObjEditView::KeyInput(KeyEvent(0,KeyCode(KEYFUNC_DELETE)),pTextEditWin);
    1390             :     }
    1391             :     else
    1392             :     {
    1393           0 :         if( mxSelectionController.is() && mxSelectionController->DeleteMarked() )
    1394             :         {
    1395             :             // action already performed by current selection controller, do nothing
    1396             :         }
    1397           0 :         else if (IsGluePointEditMode() && HasMarkedGluePoints())
    1398             :         {
    1399           0 :             DeleteMarkedGluePoints();
    1400             :         }
    1401           0 :         else if (GetContext()==SDRCONTEXT_POINTEDIT && HasMarkedPoints())
    1402             :         {
    1403           0 :             DeleteMarkedPoints();
    1404             :         }
    1405             :         else
    1406             :         {
    1407           0 :             DeleteMarkedObj();
    1408             :         }
    1409             :     }
    1410           0 : }
    1411             : 
    1412           0 : bool SdrView::BegMark(const Point& rPnt, bool bAddMark, bool bUnmark)
    1413             : {
    1414           0 :     if (bUnmark) bAddMark=true;
    1415           0 :     if (IsGluePointEditMode()) {
    1416           0 :         if (!bAddMark) UnmarkAllGluePoints();
    1417           0 :         return BegMarkGluePoints(rPnt,bUnmark);
    1418           0 :     } else if (HasMarkablePoints()) {
    1419           0 :         if (!bAddMark) UnmarkAllPoints();
    1420           0 :         return BegMarkPoints(rPnt,bUnmark);
    1421             :     } else {
    1422           0 :         if (!bAddMark) UnmarkAllObj();
    1423           0 :         return BegMarkObj(rPnt,bUnmark);
    1424             :     }
    1425             : }
    1426             : 
    1427           0 : void SdrView::ConfigurationChanged( ::utl::ConfigurationBroadcaster*p, sal_uInt32 nHint)
    1428             : {
    1429           0 :     onAccessibilityOptionsChanged();
    1430           0 :      SdrCreateView::ConfigurationChanged(p, nHint);
    1431           0 : }
    1432             : 
    1433           0 : SvtAccessibilityOptions& SdrView::getAccessibilityOptions()
    1434             : {
    1435           0 :     return maAccessibilityOptions;
    1436             : }
    1437             : 
    1438             : /** method is called whenever the global SvtAccessibilityOptions is changed */
    1439           0 : void SdrView::onAccessibilityOptionsChanged()
    1440             : {
    1441           0 : }
    1442             : 
    1443           0 : void SdrView::SetMasterPagePaintCaching(bool bOn)
    1444             : {
    1445           0 :     if(mbMasterPagePaintCaching != bOn)
    1446             :     {
    1447           0 :         mbMasterPagePaintCaching = bOn;
    1448             : 
    1449             :         // reset at all SdrPageWindows
    1450           0 :         SdrPageView* pPageView = GetSdrPageView();
    1451             : 
    1452           0 :         if(pPageView)
    1453             :         {
    1454           0 :             for(sal_uInt32 b(0L); b < pPageView->PageWindowCount(); b++)
    1455             :             {
    1456           0 :                 SdrPageWindow* pPageWindow = pPageView->GetPageWindow(b);
    1457             :                 DBG_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           0 : }
    1469             : 
    1470             : 
    1471             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10