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