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

Generated by: LCOV version 1.10