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