Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <editeng/eeitem.hxx>
21 :
22 : #include "svx/svdstr.hrc"
23 : #include "svdglob.hxx"
24 : #include <svx/svdpagv.hxx>
25 : #include <svx/svdmrkv.hxx>
26 : #include <svx/svdedxv.hxx>
27 : #include <svx/svdobj.hxx>
28 : #include <svx/svdopath.hxx>
29 : #include <svx/svdograf.hxx>
30 : #include <svx/svdomedia.hxx>
31 : #include <svx/svdetc.hxx>
32 :
33 : #ifdef DBG_UTIL
34 : #include <svdibrow.hxx>
35 : #endif
36 :
37 : #include "svx/svdoutl.hxx"
38 : #include "svx/svdview.hxx"
39 : #include "editeng/editview.hxx"
40 : #include "editeng/flditem.hxx"
41 : #include "svx/obj3d.hxx"
42 : #include "svx/svddrgmt.hxx"
43 : #include "svx/svdotable.hxx"
44 : #include <tools/tenccvt.hxx>
45 : #include <svx/sdr/overlay/overlaypolypolygon.hxx>
46 : #include <svx/sdr/overlay/overlaymanager.hxx>
47 : #include <svx/sdrpaintwindow.hxx>
48 : #include <svx/sdrpagewindow.hxx>
49 : #include <svx/sdrhittesthelper.hxx>
50 : #include <svx/sdr/contact/viewcontact.hxx>
51 : #include <drawinglayer/processor2d/contourextractor2d.hxx>
52 :
53 :
54 :
55 700 : 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(MouseEventModifiers::NONE),
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 700 : bReleaseMouse(false)
84 : {
85 700 : }
86 :
87 700 : SdrViewEvent::~SdrViewEvent()
88 : {
89 700 : }
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 1488353 : TYPEINIT1(SdrView,SdrCreateView);
158 :
159 9504 : SdrView::SdrView(SdrModel* pModel1, OutputDevice* pOut)
160 : : SdrCreateView(pModel1,pOut),
161 : bNoExtendedMouseDispatcher(false),
162 : bNoExtendedKeyDispatcher(false),
163 : bNoExtendedCommandDispatcher(false),
164 9504 : mbMasterPagePaintCaching(false)
165 : {
166 9504 : bTextEditOnObjectsWithoutTextIfTextTool=false;
167 :
168 9504 : maAccessibilityOptions.AddListener(this);
169 :
170 9504 : onAccessibilityOptionsChanged();
171 9504 : }
172 :
173 24029 : SdrView::~SdrView()
174 : {
175 9438 : maAccessibilityOptions.RemoveListener(this);
176 14591 : }
177 :
178 2 : bool SdrView::KeyInput(const KeyEvent& rKEvt, vcl::Window* pWin)
179 : {
180 2 : SetActualWin(pWin);
181 2 : bool bRet = SdrCreateView::KeyInput(rKEvt,pWin);
182 2 : if (!bRet && !IsExtendedKeyInputDispatcherEnabled()) {
183 0 : bRet = true;
184 0 : switch (rKEvt.GetKeyCode().GetFullFunction()) {
185 0 : case KeyFuncType::CUT : Cut(); break;
186 0 : case KeyFuncType::COPY : Yank(); break;
187 0 : case KeyFuncType::PASTE : Paste(pWin); break;
188 0 : case KeyFuncType::DELETE: DeleteMarked(); break;
189 0 : case KeyFuncType::UNDO: pMod->Undo(); break;
190 0 : case KeyFuncType::REDO: pMod->Redo(); break;
191 0 : case KeyFuncType::REPEAT: pMod->Repeat(*this); break;
192 : default: {
193 0 : switch (rKEvt.GetKeyCode().GetFullCode()) {
194 : case KEY_ESCAPE: {
195 0 : if (IsTextEdit()) SdrEndTextEdit();
196 0 : if (IsAction()) BrkAction();
197 0 : if (pWin!=NULL) pWin->ReleaseMouse();
198 0 : } break;
199 0 : case KEY_DELETE: DeleteMarked(); break;
200 0 : case KEY_CUT: case KEY_DELETE+KEY_SHIFT: Cut(); break;
201 0 : case KEY_COPY: case KEY_INSERT+KEY_MOD1: Yank(); break;
202 0 : case KEY_PASTE: case KEY_INSERT+KEY_SHIFT: Paste(pWin); break;
203 0 : case KEY_UNDO: case KEY_BACKSPACE+KEY_MOD2: pMod->Undo(); break;
204 0 : case KEY_BACKSPACE+KEY_MOD2+KEY_SHIFT: pMod->Redo(); break;
205 0 : case KEY_REPEAT: case KEY_BACKSPACE+KEY_MOD2+KEY_MOD1: pMod->Repeat(*this); break;
206 0 : case KEY_MOD1+KEY_A: MarkAll(); break;
207 0 : default: bRet=false;
208 : } // switch
209 : }
210 : } // switch
211 0 : if (bRet && pWin!=NULL) {
212 : pWin->SetPointer(GetPreferredPointer(
213 0 : pWin->PixelToLogic(pWin->ScreenToOutputPixel( pWin->GetPointerPosPixel() ) ),
214 : pWin,
215 0 : rKEvt.GetKeyCode().GetModifier()));
216 : }
217 : }
218 2 : return bRet;
219 : }
220 :
221 3 : bool SdrView::MouseButtonDown(const MouseEvent& rMEvt, vcl::Window* pWin)
222 : {
223 3 : SetActualWin(pWin);
224 3 : if (rMEvt.IsLeft()) aDragStat.SetMouseDown(true);
225 3 : bool bRet = SdrCreateView::MouseButtonDown(rMEvt,pWin);
226 3 : if (!bRet && !IsExtendedMouseEventDispatcherEnabled()) {
227 0 : SdrViewEvent aVEvt;
228 0 : PickAnything(rMEvt,SdrMouseEventKind::BUTTONDOWN,aVEvt);
229 0 : bRet = DoMouseEvent(aVEvt);
230 : }
231 3 : return bRet;
232 : }
233 :
234 3 : bool SdrView::MouseButtonUp(const MouseEvent& rMEvt, vcl::Window* pWin)
235 : {
236 3 : SetActualWin(pWin);
237 3 : if (rMEvt.IsLeft()) aDragStat.SetMouseDown(false);
238 3 : bool bAction = IsAction();
239 3 : bool bRet = !bAction && SdrCreateView::MouseButtonUp(rMEvt,pWin);
240 3 : if (!bRet && !IsExtendedMouseEventDispatcherEnabled()) {
241 0 : SdrViewEvent aVEvt;
242 0 : PickAnything(rMEvt,SdrMouseEventKind::BUTTONUP,aVEvt);
243 0 : bRet = DoMouseEvent(aVEvt);
244 : }
245 3 : return bRet;
246 : }
247 :
248 4 : bool SdrView::MouseMove(const MouseEvent& rMEvt, vcl::Window* pWin)
249 : {
250 4 : SetActualWin(pWin);
251 4 : aDragStat.SetMouseDown(rMEvt.IsLeft());
252 4 : bool bRet = SdrCreateView::MouseMove(rMEvt,pWin);
253 4 : if (!IsExtendedMouseEventDispatcherEnabled() && !IsTextEditInSelectionMode()) {
254 0 : SdrViewEvent aVEvt;
255 0 : PickAnything(rMEvt,SdrMouseEventKind::MOVE,aVEvt);
256 0 : if (DoMouseEvent(aVEvt)) bRet=true;
257 : }
258 :
259 4 : return bRet;
260 : }
261 :
262 0 : bool SdrView::Command(const CommandEvent& rCEvt, vcl::Window* pWin)
263 : {
264 0 : SetActualWin(pWin);
265 0 : bool bRet = SdrCreateView::Command(rCEvt,pWin);
266 0 : return bRet;
267 : }
268 :
269 583 : bool SdrView::GetAttributes(SfxItemSet& rTargetSet, bool bOnlyHardAttr) const
270 : {
271 583 : return SdrCreateView::GetAttributes(rTargetSet, bOnlyHardAttr);
272 : }
273 :
274 0 : SfxStyleSheet* SdrView::GetStyleSheet() const
275 : {
276 0 : return SdrCreateView::GetStyleSheet();
277 : }
278 :
279 15 : SdrHitKind SdrView::PickAnything(const MouseEvent& rMEvt, SdrMouseEventKind nEventKind, SdrViewEvent& rVEvt) const
280 : {
281 15 : rVEvt.bMouseDown=nEventKind==SdrMouseEventKind::BUTTONDOWN;
282 15 : rVEvt.bMouseUp=nEventKind==SdrMouseEventKind::BUTTONUP;
283 15 : rVEvt.nMouseClicks=rMEvt.GetClicks();
284 15 : rVEvt.nMouseMode=rMEvt.GetMode();
285 15 : rVEvt.nMouseCode=rMEvt.GetButtons() | rMEvt.GetModifier();
286 15 : const OutputDevice* pOut=pActualOutDev;
287 15 : if (pOut==NULL)
288 : {
289 0 : pOut = GetFirstOutputDevice();
290 : }
291 15 : Point aPnt(rMEvt.GetPosPixel());
292 15 : if (pOut!=NULL) aPnt=pOut->PixelToLogic(aPnt);
293 15 : rVEvt.aLogicPos=aPnt;
294 15 : 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 360 : SdrHitKind SdrView::PickAnything(const Point& rLogicPos, SdrViewEvent& rVEvt) const
321 : {
322 360 : const OutputDevice* pOut=pActualOutDev;
323 360 : if (pOut==NULL)
324 : {
325 0 : pOut = GetFirstOutputDevice();
326 : }
327 :
328 : // #i73628# Use a non-changeable copy of he logic position
329 360 : const Point aLocalLogicPosition(rLogicPos);
330 :
331 360 : bool bEditMode=IsEditMode();
332 360 : bool bPointMode=bEditMode && HasMarkablePoints();
333 360 : bool bGluePointMode=IsGluePointEditMode();
334 360 : bool bInsPolyPt=bPointMode && IsInsObjPointMode() && IsInsObjPointPossible();
335 360 : bool bInsGluePt=bGluePointMode && IsInsGluePointMode() && IsInsGluePointPossible();
336 360 : bool bIsTextEdit=IsTextEdit();
337 360 : bool bTextEditHit=IsTextEditHit(aLocalLogicPosition,0/*nHitTolLog*/);
338 360 : bool bTextEditSel=IsTextEditInSelectionMode();
339 360 : bool bShift=(rVEvt.nMouseCode & KEY_SHIFT) !=0;
340 360 : bool bCtrl=(rVEvt.nMouseCode & KEY_MOD1) !=0;
341 360 : bool bAlt=(rVEvt.nMouseCode & KEY_MOD2) !=0;
342 360 : SdrHitKind eHit=SDRHIT_NONE;
343 360 : SdrHdl* pHdl=pOut!=NULL && !bTextEditSel ? PickHandle(aLocalLogicPosition) : NULL;
344 360 : SdrPageView* pPV=NULL;
345 360 : SdrObject* pObj=NULL;
346 360 : SdrObject* pHitObj=NULL;
347 360 : bool bHitPassDirect=true;
348 360 : sal_uInt16 nHlplIdx=0;
349 360 : sal_uInt16 nGlueId=0;
350 360 : if (bTextEditHit || bTextEditSel)
351 : {
352 3 : eHit=SDRHIT_TEXTEDIT;
353 3 : bTextEditHit=true;
354 : }
355 357 : else if (pHdl!=NULL)
356 : {
357 8 : eHit=SDRHIT_HANDLE; // handle is hit: highest priority
358 : }
359 349 : 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 349 : else if (bGluePointMode && PickGluePoint(aLocalLogicPosition,pObj,nGlueId,pPV))
364 : {
365 0 : eHit=SDRHIT_GLUEPOINT; // deselected glue point hit
366 : }
367 349 : else if (PickObj(aLocalLogicPosition,nHitTolLog,pHitObj,pPV,SdrSearchOptions::DEEP|SdrSearchOptions::MARKED,&pObj,&bHitPassDirect))
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 349 : else if (PickObj(aLocalLogicPosition,nHitTolLog,pHitObj,pPV,SdrSearchOptions::DEEP|SdrSearchOptions::ALSOONMASTER|SdrSearchOptions::WHOLEPAGE,&pObj,&bHitPassDirect))
388 : {
389 : // MasterPages and WholePage for Macro and URL
390 4 : eHit=SDRHIT_UNMARKEDOBJECT;
391 4 : sdr::table::SdrTableObj* pTableObj = dynamic_cast< sdr::table::SdrTableObj* >( pObj );
392 4 : 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 345 : 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 360 : if (IsMacroMode() && eHit==SDRHIT_UNMARKEDOBJECT)
413 : {
414 4 : bool bRoot=pObj->HasMacro();
415 4 : bool bDeep=pObj!=pHitObj && pHitObj->HasMacro();
416 4 : bool bMid=false; // Have we hit upon a grouped group with a macro?
417 4 : SdrObject* pMidObj=NULL;
418 4 : 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 4 : 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 0 : }
454 : }
455 : }
456 : // check for URL field
457 360 : if (IsMacroMode() && eHit==SDRHIT_UNMARKEDOBJECT)
458 : {
459 4 : SdrTextObj* pTextObj=PTR_CAST(SdrTextObj,pHitObj);
460 4 : if (pTextObj!=NULL && pTextObj->HasText())
461 : {
462 0 : bool bTEHit(pPV &&
463 0 : SdrObjectPrimitiveHit(*pTextObj, aLocalLogicPosition, 0, *pPV, &pPV->GetVisibleLayers(), true));
464 :
465 0 : if (bTEHit)
466 : {
467 0 : Rectangle aTextRect;
468 0 : Rectangle aAnchor;
469 0 : SdrOutliner* pOutliner = &pTextObj->ImpGetDrawOutliner();
470 0 : if( pTextObj->GetModel() )
471 0 : pOutliner = &pTextObj->GetModel()->GetHitTestOutliner();
472 :
473 0 : pTextObj->TakeTextRect( *pOutliner, aTextRect, false, &aAnchor, false );
474 :
475 : // #i73628# Use a text-relative position for hit test in hit test outliner
476 0 : Point aTemporaryTextRelativePosition(aLocalLogicPosition - aTextRect.TopLeft());
477 :
478 : // account for FitToSize
479 0 : bool bFitToSize(pTextObj->IsFitToSize());
480 0 : if (bFitToSize) {
481 0 : Fraction aX(aTextRect.GetWidth()-1,aAnchor.GetWidth()-1);
482 0 : Fraction aY(aTextRect.GetHeight()-1,aAnchor.GetHeight()-1);
483 0 : ResizePoint(aTemporaryTextRelativePosition,Point(),aX,aY);
484 : }
485 : // account for rotation
486 0 : const GeoStat& rGeo=pTextObj->GetGeoStat();
487 0 : if (rGeo.nRotationAngle!=0) RotatePoint(aTemporaryTextRelativePosition,Point(),-rGeo.nSin,rGeo.nCos); // -sin for Unrotate
488 : // we currently don't account for ticker text
489 0 : if(pActualOutDev && pActualOutDev->GetOutDevType() == OUTDEV_WINDOW)
490 : {
491 0 : OutlinerView aOLV(pOutliner, const_cast<vcl::Window*>(static_cast<const vcl::Window*>(pActualOutDev.get())));
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 386 : if (bHitPassDirect &&
508 30 : (eHit==SDRHIT_MARKEDOBJECT || eHit==SDRHIT_UNMARKEDOBJECT) &&
509 368 : (IsTextTool() || (IsEditMode() && IsQuickTextEditMode())) && pHitObj->HasTextEdit())
510 : {
511 : // Around the TextEditArea there's a border to select without going into text edit mode.
512 4 : Rectangle aBoundRect(pHitObj->GetCurrentBoundRect());
513 :
514 : // Force to SnapRect when Fontwork
515 4 : if(pHitObj->ISA(SdrTextObj) && static_cast<SdrTextObj*>(pHitObj)->IsFontwork())
516 : {
517 0 : aBoundRect = pHitObj->GetSnapRect();
518 : }
519 :
520 4 : sal_Int32 nTolerance(nHitTolLog);
521 4 : bool bBoundRectHit(false);
522 :
523 4 : if(pOut)
524 : {
525 4 : nTolerance = pOut->PixelToLogic(Size(2, 0)).Width();
526 : }
527 :
528 12 : if( (aLocalLogicPosition.X() >= aBoundRect.Left() - nTolerance && aLocalLogicPosition.X() <= aBoundRect.Left() + nTolerance)
529 4 : || (aLocalLogicPosition.X() >= aBoundRect.Right() - nTolerance && aLocalLogicPosition.X() <= aBoundRect.Right() + nTolerance)
530 4 : || (aLocalLogicPosition.Y() >= aBoundRect.Top() - nTolerance && aLocalLogicPosition.Y() <= aBoundRect.Top() + nTolerance)
531 8 : || (aLocalLogicPosition.Y() >= aBoundRect.Bottom() - nTolerance && aLocalLogicPosition.Y() <= aBoundRect.Bottom() + nTolerance))
532 : {
533 3 : bBoundRectHit = true;
534 : }
535 :
536 4 : if(!bBoundRectHit)
537 : {
538 2 : bool bTEHit(pPV &&
539 2 : SdrObjectPrimitiveHit(*pHitObj, aLocalLogicPosition, 0, *pPV, &pPV->GetVisibleLayers(), true));
540 :
541 : // TextEdit attached to an object in a locked layer
542 1 : if (pPV->GetLockedLayers().IsSet(pHitObj->GetLayer()))
543 : {
544 0 : bTEHit=false;
545 : }
546 :
547 1 : if (bTEHit)
548 : {
549 0 : rVEvt.pRootObj=pObj;
550 0 : pObj=pHitObj;
551 0 : eHit=SDRHIT_TEXTEDITOBJ;
552 : }
553 : }
554 : }
555 360 : if (!bHitPassDirect && eHit==SDRHIT_UNMARKEDOBJECT) {
556 0 : eHit=SDRHIT_NONE;
557 0 : pObj=NULL;
558 0 : pPV=NULL;
559 : }
560 360 : bool bMouseLeft=(rVEvt.nMouseCode&MOUSE_LEFT)!=0;
561 360 : bool bMouseRight=(rVEvt.nMouseCode&MOUSE_RIGHT)!=0;
562 360 : bool bMouseDown=rVEvt.bMouseDown;
563 360 : bool bMouseUp=rVEvt.bMouseUp;
564 360 : SdrEventKind eEvent=SDREVENT_NONE;
565 360 : bool bIsAction=IsAction();
566 :
567 360 : 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 360 : else if (eHit==SDRHIT_TEXTEDIT)
607 : {
608 3 : eEvent=SDREVENT_TEXTEDIT;
609 : }
610 357 : else if (bMouseDown && bMouseLeft)
611 : {
612 345 : 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 345 : else if (MODKEY_ForceMark && eHit!=SDRHIT_URLFIELD)
619 : {
620 0 : eEvent=SDREVENT_BEGMARK; // AddMark,Unmark */
621 : }
622 345 : else if (eHit==SDRHIT_HELPLINE)
623 : {
624 0 : eEvent=SDREVENT_BEGDRAGHELPLINE; // nothing, actually
625 : }
626 345 : 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 345 : else if (eHit==SDRHIT_HANDLE)
632 : {
633 3 : eEvent=SDREVENT_BEGDRAGOBJ; // Mark+Drag,AddMark+Drag,DeepMark+Drag,Unmark
634 3 : bool bGlue=pHdl->GetKind()==HDL_GLUE;
635 3 : bool bPoly=!bGlue && IsPointMarkable(*pHdl);
636 3 : bool bMarked=bGlue || (bPoly && pHdl->IsSelected());
637 3 : 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 342 : else if (bInsPolyPt && (MODKEY_PolyPoly || (!MODKEY_MultiMark && !MODKEY_DeepMark)))
663 : {
664 0 : eEvent=SDREVENT_BEGINSOBJPOINT;
665 0 : rVEvt.bInsPointNewObj=MODKEY_PolyPoly;
666 : }
667 342 : else if (bInsGluePt && !MODKEY_MultiMark && !MODKEY_DeepMark)
668 : {
669 0 : eEvent=SDREVENT_BEGINSGLUEPOINT;
670 : }
671 342 : 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 342 : 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 342 : 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 342 : 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 342 : else if (IsCreateMode())
705 : {
706 3 : eEvent=SDREVENT_BEGCREATEOBJ; // nothing, actually
707 : }
708 339 : else if (eHit==SDRHIT_UNMARKEDOBJECT)
709 : {
710 2 : eEvent=SDREVENT_MARKOBJ; // AddMark+Drag
711 : }
712 : else
713 : {
714 337 : eEvent=SDREVENT_BEGMARK;
715 : }
716 :
717 345 : if (eEvent==SDREVENT_MARKOBJ)
718 : {
719 2 : rVEvt.bAddMark=MODKEY_MultiMark || MODKEY_DeepMark; // if not hit with Deep
720 2 : rVEvt.bPrevNextMark=MODKEY_DeepMark;
721 2 : rVEvt.bMarkPrev=MODKEY_DeepMark && MODKEY_DeepBackw;
722 : }
723 345 : if (eEvent==SDREVENT_BEGMARK)
724 : {
725 337 : rVEvt.bAddMark=MODKEY_MultiMark;
726 337 : rVEvt.bUnmark=MODKEY_Unmark;
727 : }
728 : }
729 360 : rVEvt.bIsAction=bIsAction;
730 360 : rVEvt.bIsTextEdit=bIsTextEdit;
731 360 : rVEvt.bTextEditHit=bTextEditHit;
732 360 : rVEvt.aLogicPos=aLocalLogicPosition;
733 360 : rVEvt.pHdl=pHdl;
734 360 : rVEvt.pObj=pObj;
735 360 : if(rVEvt.pRootObj==NULL)
736 360 : rVEvt.pRootObj=pObj;
737 360 : rVEvt.pPV=pPV;
738 360 : rVEvt.nHlplIdx=nHlplIdx;
739 360 : rVEvt.nGlueId=nGlueId;
740 360 : rVEvt.eHit=eHit;
741 360 : rVEvt.eEvent=eEvent;
742 360 : rVEvt.bCaptureMouse=bMouseLeft && bMouseDown && eEvent!=SDREVENT_NONE;
743 360 : 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 360 : return eHit;
752 : }
753 :
754 0 : bool SdrView::DoMouseEvent(const SdrViewEvent& rVEvt)
755 : {
756 0 : bool bRet=false;
757 0 : SdrHitKind eHit=rVEvt.eHit;
758 0 : Point aLogicPos(rVEvt.aLogicPos);
759 :
760 0 : bool bShift=(rVEvt.nMouseCode & KEY_SHIFT) !=0;
761 0 : bool bCtrl=(rVEvt.nMouseCode & KEY_MOD1) !=0;
762 0 : bool bAlt=(rVEvt.nMouseCode & KEY_MOD2) !=0;
763 0 : bool bMouseLeft=(rVEvt.nMouseCode&MOUSE_LEFT)!=0;
764 0 : bool bMouseDown=rVEvt.bMouseDown;
765 0 : bool bMouseUp=rVEvt.bMouseUp;
766 0 : if (bMouseDown) {
767 0 : if (bMouseLeft) aDragStat.SetMouseDown(true);
768 0 : } else if (bMouseUp) {
769 0 : if (bMouseLeft) aDragStat.SetMouseDown(false);
770 : } else { // else, MouseMove
771 0 : aDragStat.SetMouseDown(bMouseLeft);
772 : }
773 :
774 : #ifdef MODKEY_NoSnap
775 0 : SetSnapEnabled(!MODKEY_NoSnap);
776 : #endif
777 : #ifdef MODKEY_Ortho
778 0 : SetOrtho(MODKEY_Ortho!=IsOrthoDesired());
779 : #endif
780 : #ifdef MODKEY_AngleSnap
781 0 : SetAngleSnapEnabled(MODKEY_AngleSnap);
782 : #endif
783 : #ifdef MODKEY_CopyDrag
784 0 : SetDragWithCopy(MODKEY_CopyDrag);
785 : #endif
786 : #ifdef MODKEY_Center
787 0 : SetCreate1stPointAsCenter(MODKEY_Center);
788 0 : SetResizeAtCenter(MODKEY_Center);
789 0 : SetCrookAtCenter(MODKEY_Center);
790 : #endif
791 0 : if (bMouseLeft && bMouseDown && rVEvt.bIsTextEdit && (eHit==SDRHIT_UNMARKEDOBJECT || eHit==SDRHIT_NONE)) {
792 0 : SdrEndTextEdit(); // User has clicked beneath object, exit edit mode.
793 : // pHdl is invalid, then, that shouldn't matter, though, as we expect
794 : // pHdl==NULL (because of eHit).
795 : }
796 0 : switch (rVEvt.eEvent) {
797 0 : case SDREVENT_NONE: bRet=false; break;
798 0 : case SDREVENT_TEXTEDIT: bRet=false; break; // Events handled by the OutlinerView are not taken into account here.
799 0 : case SDREVENT_MOVACTION: MovAction(aLogicPos); bRet=true; break;
800 0 : case SDREVENT_ENDACTION: EndAction(); bRet=true; break;
801 0 : case SDREVENT_BCKACTION: BckAction(); bRet=true; break;
802 0 : case SDREVENT_BRKACTION: BrkAction(); bRet=true; break;
803 0 : case SDREVENT_ENDMARK : EndAction(); bRet=true; break;
804 : case SDREVENT_BRKMARK : {
805 0 : BrkAction();
806 0 : if (!MarkObj(aLogicPos,nHitTolLog,rVEvt.bAddMark)) {
807 : // No object hit. Do the following:
808 : // 1. deselect any selected glue points
809 : // 2. deselect any selected polygon points
810 : // 3. deselect any selected objects
811 0 : if (!rVEvt.bAddMark) UnmarkAll();
812 : }
813 0 : bRet=true;
814 0 : } break;
815 : case SDREVENT_ENDCREATE: { // if necessary, MarkObj
816 0 : SdrCreateCmd eCmd=SDRCREATE_NEXTPOINT;
817 0 : if (MODKEY_PolyPoly) eCmd=SDRCREATE_NEXTOBJECT;
818 0 : if (rVEvt.nMouseClicks>1) eCmd=SDRCREATE_FORCEEND;
819 0 : if (!EndCreateObj(eCmd)) { // Don't evaluate event for Create? -> Select
820 0 : if (eHit==SDRHIT_UNMARKEDOBJECT || eHit==SDRHIT_TEXTEDIT) {
821 0 : MarkObj(rVEvt.pRootObj,rVEvt.pPV);
822 0 : if (eHit==SDRHIT_TEXTEDIT)
823 : {
824 0 : bool bRet2(pActualOutDev && OUTDEV_WINDOW == pActualOutDev->GetOutDevType() &&
825 0 : SdrBeginTextEdit(rVEvt.pObj, rVEvt.pPV, const_cast<vcl::Window*>(static_cast<const vcl::Window*>(pActualOutDev.get())), false, nullptr));
826 :
827 0 : if(bRet2)
828 : {
829 0 : MouseEvent aMEvt(pActualOutDev->LogicToPixel(aLogicPos),
830 0 : 1,rVEvt.nMouseMode,rVEvt.nMouseCode,rVEvt.nMouseCode);
831 :
832 0 : OutlinerView* pOLV=GetTextEditOutlinerView();
833 0 : if (pOLV!=NULL) {
834 0 : pOLV->MouseButtonDown(aMEvt); // event for the Outliner, but without double-click
835 0 : pOLV->MouseButtonUp(aMEvt); // event for the Outliner, but without double-click
836 : }
837 : }
838 : }
839 0 : bRet=true; // object is selected and (if necessary) TextEdit is started
840 0 : } else bRet=false; // canceled Create, nothing else
841 0 : } else bRet=true; // return true for EndCreate
842 0 : } break;
843 : case SDREVENT_ENDDRAG: {
844 0 : bRet=EndDragObj(IsDragWithCopy());
845 0 : ForceMarkedObjToAnotherPage(); // TODO: Undo+bracing missing!
846 0 : } break;
847 : case SDREVENT_MARKOBJ: { // + (if applicable) BegDrag
848 0 : if (!rVEvt.bAddMark) UnmarkAllObj();
849 0 : bool bUnmark=rVEvt.bUnmark;
850 0 : if (rVEvt.bPrevNextMark) {
851 0 : bRet=MarkNextObj(aLogicPos,nHitTolLog,rVEvt.bMarkPrev);
852 : } else {
853 0 : SortMarkedObjects();
854 0 : const size_t nCount0=GetMarkedObjectCount();
855 0 : bRet=MarkObj(aLogicPos,nHitTolLog,rVEvt.bAddMark);
856 0 : SortMarkedObjects();
857 0 : const size_t nCount1=GetMarkedObjectCount();
858 0 : bUnmark=nCount1<nCount0;
859 : }
860 0 : if (!bUnmark) {
861 0 : BegDragObj(aLogicPos,NULL,nullptr,nMinMovLog);
862 0 : bRet=true;
863 : }
864 0 : } break;
865 : case SDREVENT_MARKPOINT: { // + (if applicable) BegDrag
866 0 : if (!rVEvt.bAddMark) UnmarkAllPoints();
867 0 : if (rVEvt.bPrevNextMark) {
868 0 : bRet=MarkNextPoint(aLogicPos,rVEvt.bMarkPrev);
869 : } else {
870 0 : bRet=MarkPoint(*rVEvt.pHdl,rVEvt.bUnmark);
871 : }
872 0 : if (!rVEvt.bUnmark && !rVEvt.bPrevNextMark) {
873 0 : BegDragObj(aLogicPos,NULL,rVEvt.pHdl,nMinMovLog);
874 0 : bRet=true;
875 : }
876 0 : } break;
877 : case SDREVENT_MARKGLUEPOINT: { // + (if applicable) BegDrag
878 0 : if (!rVEvt.bAddMark) UnmarkAllGluePoints();
879 0 : if (rVEvt.bPrevNextMark) {
880 0 : bRet=MarkNextGluePoint(aLogicPos,rVEvt.bMarkPrev);
881 : } else {
882 0 : bRet=MarkGluePoint(rVEvt.pObj,rVEvt.nGlueId,rVEvt.pPV,rVEvt.bUnmark);
883 : }
884 0 : if (!rVEvt.bUnmark && !rVEvt.bPrevNextMark) {
885 0 : SdrHdl* pHdl=GetGluePointHdl(rVEvt.pObj,rVEvt.nGlueId);
886 0 : BegDragObj(aLogicPos,NULL,pHdl,nMinMovLog);
887 0 : bRet=true;
888 : }
889 0 : } break;
890 0 : case SDREVENT_BEGMARK: bRet=BegMark(aLogicPos,rVEvt.bAddMark,rVEvt.bUnmark); break;
891 0 : case SDREVENT_BEGINSOBJPOINT: bRet = BegInsObjPoint(aLogicPos, MODKEY_PolyPoly); break;
892 : case SDREVENT_ENDINSOBJPOINT: {
893 0 : SdrCreateCmd eCmd=SDRCREATE_NEXTPOINT;
894 0 : if (MODKEY_PolyPoly) eCmd=SDRCREATE_NEXTOBJECT;
895 0 : if (rVEvt.nMouseClicks>1) eCmd=SDRCREATE_FORCEEND;
896 0 : EndInsObjPoint(eCmd);
897 0 : bRet=true;
898 0 : } break;
899 0 : case SDREVENT_BEGINSGLUEPOINT: bRet=BegInsGluePoint(aLogicPos); break;
900 0 : case SDREVENT_BEGDRAGHELPLINE: bRet=BegDragHelpLine(rVEvt.nHlplIdx,rVEvt.pPV); break;
901 0 : case SDREVENT_BEGDRAGOBJ: bRet=BegDragObj(aLogicPos,NULL,rVEvt.pHdl,nMinMovLog); break;
902 : case SDREVENT_BEGCREATEOBJ: {
903 0 : if (nAktInvent==SdrInventor && nAktIdent==OBJ_CAPTION) {
904 0 : long nHgt=SdrEngineDefaults::GetFontHeight();
905 0 : bRet=BegCreateCaptionObj(aLogicPos,Size(5*nHgt,2*nHgt));
906 0 : } else bRet=BegCreateObj(aLogicPos);
907 0 : } break;
908 : case SDREVENT_BEGMACROOBJ: {
909 0 : bRet=BegMacroObj(aLogicPos,nHitTolLog,rVEvt.pObj,rVEvt.pPV,const_cast<vcl::Window*>(static_cast<const vcl::Window*>(pActualOutDev.get())));
910 0 : } break;
911 : case SDREVENT_BEGTEXTEDIT: {
912 0 : if (!IsObjMarked(rVEvt.pObj)) {
913 0 : UnmarkAllObj();
914 0 : MarkObj(rVEvt.pRootObj,rVEvt.pPV);
915 : }
916 :
917 0 : bRet = pActualOutDev && OUTDEV_WINDOW == pActualOutDev->GetOutDevType()&&
918 0 : SdrBeginTextEdit(rVEvt.pObj, rVEvt.pPV, const_cast<vcl::Window*>(static_cast<const vcl::Window*>(pActualOutDev.get())), false, nullptr);
919 :
920 0 : if(bRet)
921 : {
922 0 : MouseEvent aMEvt(pActualOutDev->LogicToPixel(aLogicPos),
923 0 : 1,rVEvt.nMouseMode,rVEvt.nMouseCode,rVEvt.nMouseCode);
924 0 : OutlinerView* pOLV=GetTextEditOutlinerView();
925 0 : if (pOLV!=NULL) pOLV->MouseButtonDown(aMEvt); // event for the Outliner, but without double-click
926 : }
927 0 : } break;
928 0 : default: break;
929 : } // switch
930 0 : if (bRet && pActualOutDev && pActualOutDev->GetOutDevType()==OUTDEV_WINDOW) {
931 0 : vcl::Window* pWin=const_cast<vcl::Window*>(static_cast<const vcl::Window*>(pActualOutDev.get()));
932 : // left mouse button pressed?
933 0 : bool bLeftDown=(rVEvt.nMouseCode&MOUSE_LEFT)!=0 && rVEvt.bMouseDown;
934 : // left mouse button released?
935 0 : bool bLeftUp=(rVEvt.nMouseCode&MOUSE_LEFT)!=0 && rVEvt.bMouseUp;
936 : // left mouse button pressed or held?
937 0 : bool bLeftDown1=(rVEvt.nMouseCode&MOUSE_LEFT)!=0 && !rVEvt.bMouseUp;
938 : pWin->SetPointer(GetPreferredPointer(rVEvt.aLogicPos,pWin,
939 0 : rVEvt.nMouseCode & (KEY_SHIFT|KEY_MOD1|KEY_MOD2),bLeftDown1));
940 0 : bool bAction=IsAction();
941 0 : if (bLeftDown && bAction)
942 0 : pWin->CaptureMouse();
943 0 : else if (bLeftUp || (rVEvt.bIsAction && !bAction))
944 0 : pWin->ReleaseMouse();
945 : }
946 0 : return bRet;
947 : }
948 : #include <editeng/outlobj.hxx>
949 :
950 351 : Pointer SdrView::GetPreferredPointer(const Point& rMousePos, const OutputDevice* pOut, sal_uInt16 nModifier, bool bLeftDown) const
951 : {
952 : // Actions
953 351 : if (IsCreateObj())
954 : {
955 0 : return pAktCreate->GetCreatePointer();
956 : }
957 351 : if (mpCurrentSdrDragMethod)
958 : {
959 5 : if ((IsDraggingPoints() || IsDraggingGluePoints()) && IsMouseHideWhileDraggingPoints())
960 0 : return Pointer(PointerStyle::Null);
961 :
962 5 : return mpCurrentSdrDragMethod->GetSdrDragPointer();
963 : }
964 346 : if (IsMarkObj() || IsMarkPoints() || IsMarkGluePoints() || IsSetPageOrg()) return Pointer(PointerStyle::Arrow);
965 346 : if (IsDragHelpLine()) return GetDraggedHelpLinePointer();
966 346 : if (IsMacroObj()) {
967 0 : SdrObjMacroHitRec aHitRec;
968 0 : aHitRec.aPos=pOut->LogicToPixel(rMousePos);
969 0 : aHitRec.aDownPos=aMacroDownPos;
970 0 : aHitRec.nTol=nMacroTol;
971 0 : aHitRec.pVisiLayer=&pMacroPV->GetVisibleLayers();
972 0 : aHitRec.pPageView=pMacroPV;
973 0 : aHitRec.pOut=pMacroWin.get();
974 0 : aHitRec.bDown=bMacroDown;
975 0 : return pMacroObj->GetMacroPointer(aHitRec);
976 : }
977 :
978 : // TextEdit, ObjEdit, Macro
979 346 : if (IsTextEdit() && (IsTextEditInSelectionMode() || IsTextEditHit(rMousePos,0/*nTol*/)))
980 : {
981 1 : if(!pOut || IsTextEditInSelectionMode())
982 : {
983 0 : if(pTextEditOutliner->IsVertical())
984 0 : return Pointer(PointerStyle::TextVertical);
985 : else
986 0 : return Pointer(PointerStyle::Text);
987 : }
988 : // Outliner should return something here...
989 1 : Point aPos(pOut->LogicToPixel(rMousePos));
990 1 : Pointer aPointer(pTextEditOutlinerView->GetPointer(aPos));
991 1 : if (aPointer==PointerStyle::Arrow)
992 : {
993 0 : if(pTextEditOutliner->IsVertical())
994 0 : aPointer = PointerStyle::TextVertical;
995 : else
996 0 : aPointer = PointerStyle::Text;
997 : }
998 1 : return aPointer;
999 : }
1000 :
1001 345 : SdrViewEvent aVEvt;
1002 345 : aVEvt.nMouseCode=(nModifier&(KEY_SHIFT|KEY_MOD1|KEY_MOD2))|MOUSE_LEFT; // to see what would happen on MouseLeftDown
1003 345 : aVEvt.bMouseDown=!bLeftDown; // What if ..?
1004 345 : aVEvt.bMouseUp=bLeftDown; // What if ..?
1005 345 : if (pOut!=NULL)
1006 345 : const_cast<SdrView*>(this)->SetActualWin(pOut);
1007 345 : SdrHitKind eHit=PickAnything(rMousePos,aVEvt);
1008 345 : SdrEventKind eEvent=aVEvt.eEvent;
1009 345 : switch (eEvent)
1010 : {
1011 : case SDREVENT_BEGCREATEOBJ:
1012 3 : return aAktCreatePointer;
1013 : case SDREVENT_MARKOBJ:
1014 1 : return Pointer(PointerStyle::Move);
1015 : case SDREVENT_BEGMARK:
1016 336 : return Pointer(PointerStyle::Arrow);
1017 : case SDREVENT_MARKPOINT:
1018 : case SDREVENT_MARKGLUEPOINT:
1019 0 : return Pointer(PointerStyle::MovePoint);
1020 : case SDREVENT_BEGINSOBJPOINT:
1021 : case SDREVENT_BEGINSGLUEPOINT:
1022 0 : return Pointer(PointerStyle::Cross);
1023 : case SDREVENT_EXECUTEURL:
1024 0 : return Pointer(PointerStyle::RefHand);
1025 : case SDREVENT_BEGMACROOBJ:
1026 : {
1027 0 : SdrObjMacroHitRec aHitRec;
1028 0 : aHitRec.aPos=aVEvt.aLogicPos;
1029 0 : aHitRec.aDownPos=aHitRec.aPos;
1030 0 : aHitRec.nTol=nHitTolLog;
1031 0 : aHitRec.pVisiLayer=&aVEvt.pPV->GetVisibleLayers();
1032 0 : aHitRec.pPageView=aVEvt.pPV;
1033 0 : aHitRec.pOut=const_cast<OutputDevice*>(pOut);
1034 0 : return aVEvt.pObj->GetMacroPointer(aHitRec);
1035 : }
1036 5 : default: break;
1037 : } // switch
1038 :
1039 5 : switch(eHit)
1040 : {
1041 : case SDRHIT_CELL:
1042 0 : return Pointer(PointerStyle::Arrow);
1043 : case SDRHIT_HELPLINE :
1044 0 : return aVEvt.pPV->GetHelpLines()[aVEvt.nHlplIdx].GetPointer();
1045 : case SDRHIT_GLUEPOINT:
1046 0 : return Pointer(PointerStyle::MovePoint);
1047 : case SDRHIT_TEXTEDIT :
1048 : case SDRHIT_TEXTEDITOBJ:
1049 : {
1050 0 : SdrTextObj* pText = dynamic_cast< SdrTextObj* >( aVEvt.pObj );
1051 0 : if(pText && pText->HasText())
1052 : {
1053 0 : OutlinerParaObject* pParaObj = pText->GetOutlinerParaObject();
1054 0 : if(pParaObj && pParaObj->IsVertical())
1055 0 : return Pointer(PointerStyle::TextVertical);
1056 : }
1057 0 : return Pointer(PointerStyle::Text);
1058 : }
1059 5 : default: break;
1060 : }
1061 :
1062 5 : bool bMarkHit=eHit==SDRHIT_MARKEDOBJECT;
1063 5 : SdrHdl* pHdl=aVEvt.pHdl;
1064 : // now check the pointers for dragging
1065 5 : if (pHdl!=NULL || bMarkHit) {
1066 4 : SdrHdlKind eHdl= pHdl!=NULL ? pHdl->GetKind() : HDL_MOVE;
1067 4 : bool bCorner=pHdl!=NULL && pHdl->IsCornerHdl();
1068 4 : bool bVertex=pHdl!=NULL && pHdl->IsVertexHdl();
1069 4 : bool bMov=eHdl==HDL_MOVE;
1070 4 : if (bMov && (eDragMode==SDRDRAG_MOVE || eDragMode==SDRDRAG_RESIZE || mbMarkedHitMovesAlways)) {
1071 0 : if (!IsMoveAllowed()) return Pointer(PointerStyle::Arrow); // because double click or drag & drop is possible
1072 0 : return Pointer(PointerStyle::Move);
1073 : }
1074 4 : switch (eDragMode) {
1075 : case SDRDRAG_ROTATE: {
1076 0 : if ((bCorner || bMov) && !IsRotateAllowed(true))
1077 0 : return Pointer(PointerStyle::NotAllowed);
1078 :
1079 : // are 3D objects selected?
1080 0 : bool b3DObjSelected = false;
1081 0 : for (size_t a=0; !b3DObjSelected && a<GetMarkedObjectCount(); ++a) {
1082 0 : SdrObject* pObj = GetMarkedObjectByIndex(a);
1083 0 : if(pObj && pObj->ISA(E3dObject))
1084 0 : b3DObjSelected = true;
1085 : }
1086 : // If we have a 3D object, go on despite !IsShearAllowed,
1087 : // because then we have a rotation instead of a shear.
1088 0 : if (bVertex && !IsShearAllowed() && !b3DObjSelected)
1089 0 : return Pointer(PointerStyle::NotAllowed);
1090 0 : if (bMov)
1091 0 : return Pointer(PointerStyle::Rotate);
1092 0 : } break;
1093 : case SDRDRAG_SHEAR: case SDRDRAG_DISTORT: {
1094 0 : if (bCorner) {
1095 0 : if (!IsDistortAllowed(true) && !IsDistortAllowed(false)) return Pointer(PointerStyle::NotAllowed);
1096 0 : else return Pointer(PointerStyle::RefHand);
1097 : }
1098 0 : if (bVertex && !IsShearAllowed()) return Pointer(PointerStyle::NotAllowed);
1099 0 : if (bMov) {
1100 0 : if (!IsMoveAllowed()) return Pointer(PointerStyle::Arrow); // because double click or drag & drop is possible
1101 0 : return Pointer(PointerStyle::Move);
1102 : }
1103 0 : } break;
1104 : case SDRDRAG_MIRROR: {
1105 0 : if (bCorner || bVertex || bMov) {
1106 0 : SdrHdl* pH1=maHdlList.GetHdl(HDL_REF1);
1107 0 : SdrHdl* pH2=maHdlList.GetHdl(HDL_REF2);
1108 0 : bool b90=false;
1109 0 : bool b45=false;
1110 0 : Point aDif;
1111 0 : if (pH1!=NULL && pH2!=NULL) {
1112 0 : aDif=pH2->GetPos()-pH1->GetPos();
1113 0 : b90=(aDif.X()==0) || aDif.Y()==0;
1114 0 : b45=b90 || (std::abs(aDif.X())==std::abs(aDif.Y()));
1115 : }
1116 0 : bool bNo=false;
1117 0 : if (!IsMirrorAllowed(true,true)) bNo=true; // any mirroring is forbidden
1118 0 : if (!IsMirrorAllowed(false,false) && !b45) bNo=true; // mirroring freely is forbidden
1119 0 : if (!IsMirrorAllowed(true,false) && !b90) bNo=true; // mirroring horizontally/vertically is allowed
1120 0 : if (bNo) return Pointer(PointerStyle::NotAllowed);
1121 0 : if (b90) {
1122 0 : return Pointer(PointerStyle::Mirror);
1123 : }
1124 0 : return Pointer(PointerStyle::Mirror);
1125 : }
1126 0 : } break;
1127 :
1128 : case SDRDRAG_TRANSPARENCE:
1129 : {
1130 0 : if(!IsTransparenceAllowed())
1131 0 : return Pointer(PointerStyle::NotAllowed);
1132 :
1133 0 : return Pointer(PointerStyle::RefHand);
1134 : }
1135 :
1136 : case SDRDRAG_GRADIENT:
1137 : {
1138 0 : if(!IsGradientAllowed())
1139 0 : return Pointer(PointerStyle::NotAllowed);
1140 :
1141 0 : return Pointer(PointerStyle::RefHand);
1142 : }
1143 :
1144 : case SDRDRAG_CROOK: {
1145 0 : if (bCorner || bVertex || bMov) {
1146 0 : if (!IsCrookAllowed(true) && !IsCrookAllowed(false)) return Pointer(PointerStyle::NotAllowed);
1147 0 : return Pointer(PointerStyle::Crook);
1148 : }
1149 : }
1150 :
1151 : case SDRDRAG_CROP:
1152 : {
1153 0 : return Pointer(PointerStyle::Crop);
1154 : }
1155 :
1156 : default: {
1157 4 : if ((bCorner || bVertex) && !IsResizeAllowed(true)) return Pointer(PointerStyle::NotAllowed);
1158 : }
1159 : }
1160 4 : if (pHdl!=NULL) return pHdl->GetPointer();
1161 0 : if (bMov) {
1162 0 : if (!IsMoveAllowed()) return Pointer(PointerStyle::Arrow); // because double click or drag & drop is possible
1163 0 : return Pointer(PointerStyle::Move);
1164 : }
1165 : }
1166 1 : if (eEditMode==SDREDITMODE_CREATE) return aAktCreatePointer;
1167 1 : return Pointer(PointerStyle::Arrow);
1168 : }
1169 :
1170 : #define STR_NOTHING "nothing"
1171 126 : OUString SdrView::GetStatusText()
1172 : {
1173 126 : OUString aStr;
1174 252 : OUString aName;
1175 :
1176 126 : aStr += STR_NOTHING;
1177 :
1178 126 : if (pAktCreate!=NULL)
1179 : {
1180 0 : aStr=pAktCreate->getSpecialDragComment(aDragStat);
1181 :
1182 0 : if(aStr.isEmpty())
1183 : {
1184 0 : aName = pAktCreate->TakeObjNameSingul();
1185 0 : aStr = ImpGetResStr(STR_ViewCreateObj);
1186 : }
1187 : }
1188 126 : else if (mpCurrentSdrDragMethod)
1189 : {
1190 2 : if (bInsPolyPoint || IsInsertGluePoint())
1191 : {
1192 0 : aStr=maInsPointUndoStr;
1193 : }
1194 : else
1195 : {
1196 2 : if (aDragStat.IsMinMoved())
1197 : {
1198 : SAL_INFO(
1199 : "svx.svdraw",
1200 : "(" << this << ") " << mpCurrentSdrDragMethod);
1201 1 : mpCurrentSdrDragMethod->TakeSdrDragComment(aStr);
1202 : }
1203 : }
1204 : }
1205 124 : else if(IsMarkObj())
1206 : {
1207 0 : if(AreObjectsMarked())
1208 : {
1209 0 : aStr = ImpGetResStr(STR_ViewMarkMoreObjs);
1210 : }
1211 : else
1212 : {
1213 0 : aStr = ImpGetResStr(STR_ViewMarkObjs);
1214 : }
1215 : }
1216 124 : else if(IsMarkPoints())
1217 : {
1218 0 : if(HasMarkedPoints())
1219 : {
1220 0 : aStr = ImpGetResStr(STR_ViewMarkMorePoints);
1221 : }
1222 : else
1223 : {
1224 0 : aStr = ImpGetResStr(STR_ViewMarkPoints);
1225 : }
1226 124 : } else if (IsMarkGluePoints())
1227 : {
1228 0 : if(HasMarkedGluePoints())
1229 : {
1230 0 : aStr = ImpGetResStr(STR_ViewMarkMoreGluePoints);
1231 : }
1232 : else
1233 : {
1234 0 : aStr = ImpGetResStr(STR_ViewMarkGluePoints);
1235 : }
1236 : }
1237 124 : else if (IsTextEdit() && pTextEditOutlinerView!=NULL) {
1238 0 : aStr=ImpGetResStr(STR_ViewTextEdit); // "TextEdit - Row y, Column x";
1239 0 : ESelection aSel(pTextEditOutlinerView->GetSelection());
1240 0 : long nPar=aSel.nEndPara,nLin=0,nCol=aSel.nEndPos;
1241 0 : if (aSel.nEndPara>0) {
1242 0 : for (sal_Int32 nParaNum=0; nParaNum<aSel.nEndPara; nParaNum++) {
1243 0 : nLin+=pTextEditOutliner->GetLineCount(nParaNum);
1244 : }
1245 : }
1246 : // A little imperfection:
1247 : // At the end of a line of any multi-line paragraph, we display the
1248 : // position of the next line of the same paragraph, if there is one.
1249 0 : sal_uInt16 nParaLine = 0;
1250 0 : sal_uIntPtr nParaLineCount = pTextEditOutliner->GetLineCount(aSel.nEndPara);
1251 0 : bool bBrk = false;
1252 0 : while (!bBrk)
1253 : {
1254 0 : sal_uInt16 nLen = pTextEditOutliner->GetLineLen(aSel.nEndPara, nParaLine);
1255 0 : bool bLastLine = (nParaLine == nParaLineCount - 1);
1256 0 : if (nCol>nLen || (!bLastLine && nCol == nLen))
1257 : {
1258 0 : nCol -= nLen;
1259 0 : nLin++;
1260 0 : nParaLine++;
1261 : }
1262 : else
1263 0 : bBrk = true;
1264 :
1265 0 : if (nLen == 0)
1266 0 : bBrk = true; // to be sure
1267 : }
1268 :
1269 0 : aStr = aStr.replaceFirst("%1", OUString::number(nPar + 1));
1270 0 : aStr = aStr.replaceFirst("%2", OUString::number(nLin + 1));
1271 0 : aStr = aStr.replaceFirst("%3", OUString::number(nCol + 1));
1272 :
1273 : #ifdef DBG_UTIL
1274 : aStr += ", Level " ;
1275 : aStr += OUString::number( pTextEditOutliner->GetDepth( aSel.nEndPara ) );
1276 : #endif
1277 : }
1278 :
1279 126 : if(aStr == STR_NOTHING)
1280 : {
1281 125 : if (AreObjectsMarked()) {
1282 1 : ImpTakeDescriptionStr(STR_ViewMarked,aStr);
1283 1 : if (IsGluePointEditMode()) {
1284 0 : if (HasMarkedGluePoints()) {
1285 0 : ImpTakeDescriptionStr(STR_ViewMarked,aStr,0,ImpTakeDescriptionOptions::GLUEPOINTS);
1286 : }
1287 : } else {
1288 1 : if (HasMarkedPoints()) {
1289 0 : ImpTakeDescriptionStr(STR_ViewMarked,aStr,0,ImpTakeDescriptionOptions::POINTS);
1290 : }
1291 : }
1292 : } else {
1293 124 : aStr.clear();
1294 : }
1295 : }
1296 1 : else if(!aName.isEmpty())
1297 : {
1298 0 : aStr = aStr.replaceFirst("%1", aName);
1299 : }
1300 :
1301 126 : if(!aStr.isEmpty())
1302 : {
1303 : // capitalize first letter
1304 2 : aStr = aStr.replaceAt(0, 1, OUString(aStr[0]).toAsciiUpperCase());
1305 : }
1306 252 : return aStr;
1307 : }
1308 :
1309 1067 : SdrViewContext SdrView::GetContext() const
1310 : {
1311 1067 : if( IsGluePointEditMode() )
1312 0 : return SDRCONTEXT_GLUEPOINTEDIT;
1313 :
1314 1067 : const size_t nMarkCount = GetMarkedObjectCount();
1315 :
1316 1067 : if( HasMarkablePoints() && !IsFrameHandles() )
1317 : {
1318 0 : bool bPath=true;
1319 0 : for( size_t nMarkNum = 0; nMarkNum < nMarkCount && bPath; ++nMarkNum )
1320 0 : if (!GetMarkedObjectByIndex(nMarkNum)->ISA(SdrPathObj))
1321 0 : bPath=false;
1322 :
1323 0 : if( bPath )
1324 0 : return SDRCONTEXT_POINTEDIT;
1325 : }
1326 :
1327 1067 : if( GetMarkedObjectCount() )
1328 : {
1329 11 : bool bGraf = true, bMedia = true, bTable = true;
1330 :
1331 22 : for( size_t nMarkNum = 0; nMarkNum < nMarkCount && ( bGraf || bMedia ); ++nMarkNum )
1332 : {
1333 11 : const SdrObject* pMarkObj = GetMarkedObjectByIndex( nMarkNum );
1334 : DBG_ASSERT( pMarkObj, "SdrView::GetContext(), null pointer in mark list!" );
1335 :
1336 11 : if( !pMarkObj )
1337 0 : continue;
1338 :
1339 11 : if( !pMarkObj->ISA( SdrGrafObj ) )
1340 11 : bGraf = false;
1341 :
1342 11 : if( !pMarkObj->ISA( SdrMediaObj ) )
1343 11 : bMedia = false;
1344 :
1345 11 : if( !pMarkObj->ISA( sdr::table::SdrTableObj ) )
1346 11 : bTable = false;
1347 : }
1348 :
1349 11 : if( bGraf )
1350 0 : return SDRCONTEXT_GRAPHIC;
1351 11 : else if( bMedia )
1352 0 : return SDRCONTEXT_MEDIA;
1353 11 : else if( bTable )
1354 0 : return SDRCONTEXT_TABLE;
1355 : }
1356 :
1357 1067 : return SDRCONTEXT_STANDARD;
1358 : }
1359 :
1360 0 : void SdrView::MarkAll()
1361 : {
1362 0 : if (IsTextEdit()) {
1363 0 : GetTextEditOutlinerView()->SetSelection(ESelection(0,0,EE_PARA_ALL,EE_TEXTPOS_ALL));
1364 : #ifdef DBG_UTIL
1365 : if (pItemBrowser!=nullptr) pItemBrowser->SetDirty();
1366 : #endif
1367 0 : } else if (IsGluePointEditMode()) MarkAllGluePoints();
1368 0 : else if (HasMarkablePoints()) MarkAllPoints();
1369 0 : else MarkAllObj();
1370 0 : }
1371 :
1372 3056 : void SdrView::UnmarkAll()
1373 : {
1374 3056 : if (IsTextEdit()) {
1375 1 : ESelection eSel=GetTextEditOutlinerView()->GetSelection();
1376 1 : eSel.nStartPara=eSel.nEndPara;
1377 1 : eSel.nStartPos=eSel.nEndPos;
1378 1 : GetTextEditOutlinerView()->SetSelection(eSel);
1379 : #ifdef DBG_UTIL
1380 : if (pItemBrowser!=nullptr) pItemBrowser->SetDirty();
1381 : #endif
1382 3055 : } else if (HasMarkedGluePoints()) UnmarkAllGluePoints();
1383 3055 : else if (HasMarkedPoints()) UnmarkAllPoints(); // Marked, not Markable!
1384 3055 : else UnmarkAllObj();
1385 3056 : }
1386 :
1387 0 : const Rectangle& SdrView::GetMarkedRect() const
1388 : {
1389 0 : if (IsGluePointEditMode() && HasMarkedGluePoints()) {
1390 0 : return GetMarkedGluePointsRect();
1391 : }
1392 0 : if (HasMarkedPoints()) {
1393 0 : return GetMarkedPointsRect();
1394 : }
1395 0 : return GetMarkedObjRect();
1396 : }
1397 :
1398 1 : void SdrView::DeleteMarked()
1399 : {
1400 1 : if (IsTextEdit())
1401 : {
1402 0 : SdrObjEditView::KeyInput(KeyEvent(0,vcl::KeyCode(KeyFuncType::DELETE)),pTextEditWin);
1403 : }
1404 : else
1405 : {
1406 1 : if( mxSelectionController.is() && mxSelectionController->DeleteMarked() )
1407 : {
1408 : // action already performed by current selection controller, do nothing
1409 : }
1410 1 : else if (IsGluePointEditMode() && HasMarkedGluePoints())
1411 : {
1412 0 : DeleteMarkedGluePoints();
1413 : }
1414 1 : else if (GetContext()==SDRCONTEXT_POINTEDIT && HasMarkedPoints())
1415 : {
1416 0 : DeleteMarkedPoints();
1417 : }
1418 : else
1419 : {
1420 1 : DeleteMarkedObj();
1421 : }
1422 : }
1423 1 : }
1424 :
1425 0 : bool SdrView::BegMark(const Point& rPnt, bool bAddMark, bool bUnmark)
1426 : {
1427 0 : if (bUnmark) bAddMark=true;
1428 0 : if (IsGluePointEditMode()) {
1429 0 : if (!bAddMark) UnmarkAllGluePoints();
1430 0 : return BegMarkGluePoints(rPnt,bUnmark);
1431 0 : } else if (HasMarkablePoints()) {
1432 0 : if (!bAddMark) UnmarkAllPoints();
1433 0 : return BegMarkPoints(rPnt,bUnmark);
1434 : } else {
1435 0 : if (!bAddMark) UnmarkAllObj();
1436 0 : return BegMarkObj(rPnt,bUnmark);
1437 : }
1438 : }
1439 :
1440 165 : void SdrView::ConfigurationChanged( ::utl::ConfigurationBroadcaster*p, sal_uInt32 nHint)
1441 : {
1442 165 : onAccessibilityOptionsChanged();
1443 165 : SdrCreateView::ConfigurationChanged(p, nHint);
1444 165 : }
1445 :
1446 :
1447 : /** method is called whenever the global SvtAccessibilityOptions is changed */
1448 9665 : void SdrView::onAccessibilityOptionsChanged()
1449 : {
1450 9665 : }
1451 :
1452 367 : void SdrView::SetMasterPagePaintCaching(bool bOn)
1453 : {
1454 367 : if(mbMasterPagePaintCaching != bOn)
1455 : {
1456 367 : mbMasterPagePaintCaching = bOn;
1457 :
1458 : // reset at all SdrPageWindows
1459 367 : SdrPageView* pPageView = GetSdrPageView();
1460 :
1461 367 : if(pPageView)
1462 : {
1463 0 : for(sal_uInt32 b(0L); b < pPageView->PageWindowCount(); b++)
1464 : {
1465 0 : SdrPageWindow* pPageWindow = pPageView->GetPageWindow(b);
1466 : assert(pPageWindow && "SdrView::SetMasterPagePaintCaching: Corrupt SdrPageWindow list (!)");
1467 :
1468 : // force deletion of ObjectContact, so at re-display all VOCs
1469 : // will be re-created with updated flag setting
1470 0 : pPageWindow->ResetObjectContact();
1471 : }
1472 :
1473 : // force redraw of this view
1474 0 : pPageView->InvalidateAllWin();
1475 : }
1476 : }
1477 802 : }
1478 :
1479 :
1480 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|