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