1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26
27 #include <svx/svdsnpv.hxx>
28 #include <math.h>
29
30 #include <svx/svdetc.hxx>
31 #include <svx/svdobj.hxx>
32 #include <svx/svdpagv.hxx>
33 #include <svx/svdpage.hxx>
34 #include "svx/svditer.hxx"
35 #include <svx/sdr/overlay/overlayobjectlist.hxx>
36 #include <svx/sdr/overlay/overlaycrosshair.hxx>
37 #include <svx/sdr/overlay/overlayhelpline.hxx>
38 #include <svx/sdr/overlay/overlaymanager.hxx>
39 #include <basegfx/matrix/b2dhommatrix.hxx>
40 #include <svx/sdrpaintwindow.hxx>
41
42 ////////////////////////////////////////////////////////////////////////////////////////////////////
43 // #114409#-1 Migrate PageOrigin
44 class ImplPageOriginOverlay
45 {
46 // The OverlayObjects
47 ::sdr::overlay::OverlayObjectList maObjects;
48
49 // The current position in logical coodinates
50 basegfx::B2DPoint maPosition;
51
52 public:
53 ImplPageOriginOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos);
54 ~ImplPageOriginOverlay();
55
56 void SetPosition(const basegfx::B2DPoint& rNewPosition);
57 };
58
ImplPageOriginOverlay(const SdrPaintView & rView,const basegfx::B2DPoint & rStartPos)59 ImplPageOriginOverlay::ImplPageOriginOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos)
60 : maPosition(rStartPos)
61 {
62 for(sal_uInt32 a(0L); a < rView.PaintWindowCount(); a++)
63 {
64 SdrPaintWindow* pCandidate = rView.GetPaintWindow(a);
65 ::sdr::overlay::OverlayManager* pTargetOverlay = pCandidate->GetOverlayManager();
66
67 if(pTargetOverlay)
68 {
69 ::sdr::overlay::OverlayCrosshairStriped* aNew = new ::sdr::overlay::OverlayCrosshairStriped(
70 maPosition);
71 pTargetOverlay->add(*aNew);
72 maObjects.append(*aNew);
73 }
74 }
75 }
76
~ImplPageOriginOverlay()77 ImplPageOriginOverlay::~ImplPageOriginOverlay()
78 {
79 // The OverlayObjects are cleared using the destructor of OverlayObjectList.
80 // That destructor calls clear() at the list which removes all objects from the
81 // OverlayManager and deletes them.
82 }
83
SetPosition(const basegfx::B2DPoint & rNewPosition)84 void ImplPageOriginOverlay::SetPosition(const basegfx::B2DPoint& rNewPosition)
85 {
86 if(rNewPosition != maPosition)
87 {
88 // apply to OverlayObjects
89 for(sal_uInt32 a(0); a < maObjects.count(); a++)
90 {
91 sdr::overlay::OverlayCrosshairStriped* pCandidate =
92 static_cast< sdr::overlay::OverlayCrosshairStriped* >(&maObjects.getOverlayObject(a));
93
94 if(pCandidate)
95 {
96 pCandidate->setBasePosition(rNewPosition);
97 }
98 }
99
100 // remember new position
101 maPosition = rNewPosition;
102 }
103 }
104
105 ////////////////////////////////////////////////////////////////////////////////////////////////////
106 // #114409#-2 Migrate HelpLine
107 class ImplHelpLineOverlay
108 {
109 // The OverlayObjects
110 ::sdr::overlay::OverlayObjectList maObjects;
111
112 // The current position in logical coodinates
113 basegfx::B2DPoint maPosition;
114
115 // HelpLine specific stuff
116 SdrPageView* mpPageView;
117 sal_uInt16 mnHelpLineNumber;
118 SdrHelpLineKind meHelpLineKind;
119
120 public:
121 ImplHelpLineOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos,
122 SdrPageView* pPageView, sal_uInt16 nHelpLineNumber, SdrHelpLineKind eKind);
123 ~ImplHelpLineOverlay();
124
125 void SetPosition(const basegfx::B2DPoint& rNewPosition);
126
127 // access to HelpLine specific stuff
GetPageView() const128 SdrPageView* GetPageView() const { return mpPageView; }
GetHelpLineNumber() const129 sal_uInt16 GetHelpLineNumber() const { return mnHelpLineNumber; }
GetHelpLineKind() const130 SdrHelpLineKind GetHelpLineKind() const { return meHelpLineKind; }
131 };
132
ImplHelpLineOverlay(const SdrPaintView & rView,const basegfx::B2DPoint & rStartPos,SdrPageView * pPageView,sal_uInt16 nHelpLineNumber,SdrHelpLineKind eKind)133 ImplHelpLineOverlay::ImplHelpLineOverlay(
134 const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos,
135 SdrPageView* pPageView, sal_uInt16 nHelpLineNumber, SdrHelpLineKind eKind)
136 : maPosition(rStartPos),
137 mpPageView(pPageView),
138 mnHelpLineNumber(nHelpLineNumber),
139 meHelpLineKind(eKind)
140 {
141 for(sal_uInt32 a(0L); a < rView.PaintWindowCount(); a++)
142 {
143 SdrPaintWindow* pCandidate = rView.GetPaintWindow(a);
144 ::sdr::overlay::OverlayManager* pTargetOverlay = pCandidate->GetOverlayManager();
145
146 if(pTargetOverlay)
147 {
148 ::sdr::overlay::OverlayHelplineStriped* aNew = new ::sdr::overlay::OverlayHelplineStriped(
149 maPosition, meHelpLineKind);
150 pTargetOverlay->add(*aNew);
151 maObjects.append(*aNew);
152 }
153 }
154 }
155
~ImplHelpLineOverlay()156 ImplHelpLineOverlay::~ImplHelpLineOverlay()
157 {
158 // The OverlayObjects are cleared using the destructor of OverlayObjectList.
159 // That destructor calls clear() at the list which removes all objects from the
160 // OverlayManager and deletes them.
161 }
162
SetPosition(const basegfx::B2DPoint & rNewPosition)163 void ImplHelpLineOverlay::SetPosition(const basegfx::B2DPoint& rNewPosition)
164 {
165 if(rNewPosition != maPosition)
166 {
167 // apply to OverlayObjects
168 // apply to OverlayObjects
169 for(sal_uInt32 a(0); a < maObjects.count(); a++)
170 {
171 sdr::overlay::OverlayHelplineStriped* pCandidate =
172 static_cast< sdr::overlay::OverlayHelplineStriped* >(&maObjects.getOverlayObject(a));
173
174 if(pCandidate)
175 {
176 pCandidate->setBasePosition(rNewPosition);
177 }
178 }
179
180 // remember new position
181 maPosition = rNewPosition;
182 }
183 }
184
185 ////////////////////////////////////////////////////////////////////////////////////////////////////
186 ////////////////////////////////////////////////////////////////////////////////////////////////////
187 //
188 // @@@@ @@ @@ @@@@ @@@@@ @@ @@ @@ @@@@@ @@ @@
189 // @@ @@ @@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
190 // @@ @@@@@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @ @@
191 // @@@@ @@@@@@ @@@@@@ @@@@@ @@@@@ @@ @@@@ @@@@@@@
192 // @@ @@ @@@ @@ @@ @@ @@@ @@ @@ @@@@@@@
193 // @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@ @@@
194 // @@@@ @@ @@ @@ @@ @@ @ @@ @@@@@ @@ @@
195 //
196 ////////////////////////////////////////////////////////////////////////////////////////////////////
197 ////////////////////////////////////////////////////////////////////////////////////////////////////
198
ClearVars()199 void SdrSnapView::ClearVars()
200 {
201 nMagnSizPix=4;
202 bSnapEnab=sal_True;
203 bGridSnap=sal_True;
204 bSnapTo1Pix=sal_True;
205 bBordSnap=sal_True;
206 bHlplSnap=sal_True;
207 bOFrmSnap=sal_True;
208 bOPntSnap=sal_False;
209 bOConSnap=sal_True;
210 bMoveMFrmSnap=sal_True;
211 bMoveOFrmSnap=sal_True;
212 bMoveOPntSnap=sal_True;
213 bMoveOConSnap=sal_True;
214 bMoveSnapOnlyTopLeft=sal_False;
215 bOrtho=sal_False;
216 bBigOrtho=sal_True;
217 nSnapAngle=1500;
218 bAngleSnapEnab=sal_False;
219 bMoveOnlyDragging=sal_False;
220 bSlantButShear=sal_False;
221 bCrookNoContortion=sal_False;
222 eCrookMode=SDRCROOK_ROTATE;
223 bHlplFixed=sal_False;
224 bEliminatePolyPoints=sal_False;
225 nEliminatePolyPointLimitAngle=0;
226
227 // #114409#-1 Migrate PageOrigin
228 BrkSetPageOrg();
229
230 // #114409#-2 Migrate HelpLine
231 BrkDragHelpLine();
232 }
233
SdrSnapView(SdrModel * pModel1,OutputDevice * pOut)234 SdrSnapView::SdrSnapView(SdrModel* pModel1, OutputDevice* pOut):
235 SdrPaintView(pModel1,pOut),
236 // #114409#-1 Migrate PageOrigin
237 mpPageOriginOverlay(0L),
238 // #114409#-2 Migrate HelpLine
239 mpHelpLineOverlay(0L)
240 {
241 ClearVars();
242 }
243
244 // #114409#-1 Migrate PageOrigin
~SdrSnapView()245 SdrSnapView::~SdrSnapView()
246 {
247 // #114409#-1 Migrate PageOrigin
248 BrkSetPageOrg();
249
250 // #114409#-2 Migrate HelpLine
251 BrkDragHelpLine();
252 }
253
254 ////////////////////////////////////////////////////////////////////////////////////////////////////
255
IsAction() const256 sal_Bool SdrSnapView::IsAction() const
257 {
258 return IsSetPageOrg() || IsDragHelpLine() || SdrPaintView::IsAction();
259 }
260
MovAction(const Point & rPnt)261 void SdrSnapView::MovAction(const Point& rPnt)
262 {
263 SdrPaintView::MovAction(rPnt);
264 if (IsSetPageOrg()) {
265 MovSetPageOrg(rPnt);
266 }
267 if (IsDragHelpLine()) {
268 MovDragHelpLine(rPnt);
269 }
270 }
271
EndAction()272 void SdrSnapView::EndAction()
273 {
274 if (IsSetPageOrg()) {
275 EndSetPageOrg();
276 }
277 if (IsDragHelpLine()) {
278 EndDragHelpLine();
279 }
280 SdrPaintView::EndAction();
281 }
282
BckAction()283 void SdrSnapView::BckAction()
284 {
285 BrkSetPageOrg();
286 BrkDragHelpLine();
287 SdrPaintView::BckAction();
288 }
289
BrkAction()290 void SdrSnapView::BrkAction()
291 {
292 BrkSetPageOrg();
293 BrkDragHelpLine();
294 SdrPaintView::BrkAction();
295 }
296
TakeActionRect(Rectangle & rRect) const297 void SdrSnapView::TakeActionRect(Rectangle& rRect) const
298 {
299 if (IsSetPageOrg() || IsDragHelpLine()) {
300 rRect=Rectangle(aDragStat.GetNow(),aDragStat.GetNow());
301 } else {
302 SdrPaintView::TakeActionRect(rRect);
303 }
304 }
305
306 ////////////////////////////////////////////////////////////////////////////////////////////////////
307
GetSnapPos(const Point & rPnt,const SdrPageView * pPV) const308 Point SdrSnapView::GetSnapPos(const Point& rPnt, const SdrPageView* pPV) const
309 {
310 Point aPt(rPnt);
311 SnapPos(aPt,pPV);
312 return aPt;
313 }
314
315 #define NOT_SNAPPED 0x7FFFFFFF
SnapPos(Point & rPnt,const SdrPageView * pPV) const316 sal_uInt16 SdrSnapView::SnapPos(Point& rPnt, const SdrPageView* pPV) const
317 {
318 if (!bSnapEnab) return SDRSNAP_NOTSNAPPED;
319 sal_Bool bPVOfs=sal_False;
320 long x=rPnt.X();
321 long y=rPnt.Y();
322 if (pPV==NULL) {
323 bPVOfs=sal_True;
324 pPV=GetSdrPageView();
325 if (pPV==NULL) return SDRSNAP_NOTSNAPPED;
326 }
327
328 long dx=NOT_SNAPPED;
329 long dy=NOT_SNAPPED;
330 long dx1,dy1;
331 long mx=aMagnSiz.Width();
332 long my=aMagnSiz.Height();
333 if (bHlplVisible && bHlplSnap && !IsDragHelpLine())
334 {
335 const SdrHelpLineList& rHLL=pPV->GetHelpLines();
336 sal_uInt16 nAnz=rHLL.GetCount();
337 for (sal_uInt16 i=nAnz; i>0;) {
338 i--;
339 const SdrHelpLine& rHL=rHLL[i];
340 const Point& rPos=rHL.GetPos();
341 switch (rHL.GetKind()) {
342 case SDRHELPLINE_VERTICAL: {
343 long a=x-rPos.X();
344 if (Abs(a)<=mx) { dx1=-a; if (Abs(dx1)<Abs(dx)) dx=dx1; }
345 } break;
346 case SDRHELPLINE_HORIZONTAL: {
347 long b=y-rPos.Y();
348 if (Abs(b)<=my) { dy1=-b; if (Abs(dy1)<Abs(dy)) dy=dy1; }
349 } break;
350 case SDRHELPLINE_POINT: {
351 long a=x-rPos.X();
352 long b=y-rPos.Y();
353 if (Abs(a)<=mx && Abs(b)<=my) {
354 dx1=-a; dy1=-b;
355 if (Abs(dx1)<Abs(dx) && Abs(dy1)<Abs(dy)) { dx=dx1; dy=dy1; }
356 }
357 } break;
358 } // switch
359 }
360 }
361 if (bBordVisible && bBordSnap) {
362 SdrPage* pPage=pPV->GetPage();
363 long xs=pPage->GetWdt();
364 long ys=pPage->GetHgt();
365 long lft=pPage->GetLftBorder();
366 long rgt=pPage->GetRgtBorder();
367 long upp=pPage->GetUppBorder();
368 long lwr=pPage->GetLwrBorder();
369 long a;
370 a=x- lft ; if (Abs(a)<=mx) { dx1=-a; if (Abs(dx1)<Abs(dx)) dx=dx1; } // linker Rand
371 a=x-(xs-rgt); if (Abs(a)<=mx) { dx1=-a; if (Abs(dx1)<Abs(dx)) dx=dx1; } // rechter Rand
372 a=x ; if (Abs(a)<=mx) { dx1=-a; if (Abs(dx1)<Abs(dx)) dx=dx1; } // linke Papierkante
373 a=x- xs ; if (Abs(a)<=mx) { dx1=-a; if (Abs(dx1)<Abs(dx)) dx=dx1; } // rechte Papierkante
374 a=y- upp ; if (Abs(a)<=my) { dy1=-a; if (Abs(dy1)<Abs(dy)) dy=dy1; } // linker Rand
375 a=y-(ys-lwr); if (Abs(a)<=my) { dy1=-a; if (Abs(dy1)<Abs(dy)) dy=dy1; } // rechter Rand
376 a=y ; if (Abs(a)<=my) { dy1=-a; if (Abs(dy1)<Abs(dy)) dy=dy1; } // linke Papierkante
377 a=y- ys ; if (Abs(a)<=my) { dy1=-a; if (Abs(dy1)<Abs(dy)) dy=dy1; } // rechte Papierkante
378 }
379 if (bOFrmSnap || bOPntSnap /*|| (bConnVisible && bOConSnap)*/) {
380 sal_uIntPtr nMaxPointSnapCount=200;
381 sal_uIntPtr nMaxFrameSnapCount=200;
382
383 // #97981# go back to IM_DEEPNOGROUPS runthrough for snap to object comparisons
384 SdrObjListIter aIter(*pPV->GetPage(),/*IM_FLAT*/IM_DEEPNOGROUPS,sal_True);
385
386 while (aIter.IsMore() && (nMaxPointSnapCount>0 || nMaxFrameSnapCount>0)) {
387 SdrObject* pO=aIter.Next();
388 Rectangle aRect(pO->GetCurrentBoundRect());
389 aRect.Left ()-=mx;
390 aRect.Right ()+=mx;
391 aRect.Top ()-=my;
392 aRect.Bottom()+=my;
393 if (aRect.IsInside(rPnt)) {
394 if (bOPntSnap && nMaxPointSnapCount>0)
395 {
396 sal_uInt32 nAnz(pO->GetSnapPointCount());
397 for (sal_uInt32 i(0L); i < nAnz && nMaxPointSnapCount > 0L; i++)
398 {
399 Point aP(pO->GetSnapPoint(i));
400 dx1=x-aP.X();
401 dy1=y-aP.Y();
402 if (Abs(dx1)<=mx && Abs(dy1)<=my && Abs(dx1)<Abs(dx) && Abs(dy1)<Abs(dy)) {
403 dx=-dx1;
404 dy=-dy1;
405 }
406 nMaxPointSnapCount--;
407 }
408 }
409 if (bOFrmSnap && nMaxFrameSnapCount>0) {
410 Rectangle aLog(pO->GetSnapRect());
411 Rectangle aR1(aLog);
412 aR1.Left ()-=mx;
413 aR1.Right ()+=mx;
414 aR1.Top ()-=my;
415 aR1.Bottom()+=my;
416 if (aR1.IsInside(rPnt)) {
417 if (Abs(x-aLog.Left ())<=mx) { dx1=-(x-aLog.Left ()); if (Abs(dx1)<Abs(dx)) dx=dx1; }
418 if (Abs(x-aLog.Right ())<=mx) { dx1=-(x-aLog.Right ()); if (Abs(dx1)<Abs(dx)) dx=dx1; }
419 if (Abs(y-aLog.Top ())<=my) { dy1=-(y-aLog.Top ()); if (Abs(dy1)<Abs(dy)) dy=dy1; }
420 if (Abs(y-aLog.Bottom())<=my) { dy1=-(y-aLog.Bottom()); if (Abs(dy1)<Abs(dy)) dy=dy1; }
421 }
422 nMaxFrameSnapCount--;
423 }
424 }
425 }
426 }
427 if(bGridSnap)
428 {
429 double fSnapWidth = aSnapWdtX;
430 if(dx == NOT_SNAPPED && fSnapWidth != 0.0)
431 {
432 double fx = (double)x;
433
434 // round statt trunc
435 if(fx - (double)pPV->GetPageOrigin().X() >= 0.0)
436 fx += fSnapWidth / 2.0;
437 else
438 fx -= fSnapWidth / 2.0;
439
440 x = (long)((fx - (double)pPV->GetPageOrigin().X()) / fSnapWidth);
441 x = (long)((double)x * fSnapWidth + (double)pPV->GetPageOrigin().X());
442 dx = 0;
443 }
444 fSnapWidth = aSnapWdtY;
445 if(dy == NOT_SNAPPED && fSnapWidth)
446 {
447 double fy = (double)y;
448
449 // round statt trunc
450 if(fy - (double)pPV->GetPageOrigin().Y() >= 0.0)
451 fy += fSnapWidth / 2.0;
452 else
453 fy -= fSnapWidth / 2.0;
454
455 y = (long)((fy - (double)pPV->GetPageOrigin().Y()) / fSnapWidth);
456 y = (long)((double)y * fSnapWidth + (double)pPV->GetPageOrigin().Y());
457 dy = 0;
458 }
459 }
460 sal_Bool bRet=SDRSNAP_NOTSNAPPED;
461 if (dx==NOT_SNAPPED) dx=0; else bRet|=SDRSNAP_XSNAPPED;
462 if (dy==NOT_SNAPPED) dy=0; else bRet|=SDRSNAP_YSNAPPED;
463 rPnt.X()=x+dx;
464 rPnt.Y()=y+dy;
465 return bRet;
466 }
467
CheckSnap(const Point & rPt,const SdrPageView * pPV,long & nBestXSnap,long & nBestYSnap,bool & bXSnapped,bool & bYSnapped) const468 void SdrSnapView::CheckSnap(const Point& rPt, const SdrPageView* pPV, long& nBestXSnap, long& nBestYSnap, bool& bXSnapped, bool& bYSnapped) const
469 {
470 Point aPt(rPt);
471 sal_uInt16 nRet=SnapPos(aPt,pPV);
472 aPt-=rPt;
473 if ((nRet & SDRSNAP_XSNAPPED) !=0) {
474 if (bXSnapped) {
475 if (Abs(aPt.X())<Abs(nBestXSnap)) {
476 nBestXSnap=aPt.X();
477 }
478 } else {
479 nBestXSnap=aPt.X();
480 bXSnapped=sal_True;
481 }
482 }
483 if ((nRet & SDRSNAP_YSNAPPED) !=0) {
484 if (bYSnapped) {
485 if (Abs(aPt.Y())<Abs(nBestYSnap)) {
486 nBestYSnap=aPt.Y();
487 }
488 } else {
489 nBestYSnap=aPt.Y();
490 bYSnapped=sal_True;
491 }
492 }
493 }
494
SnapRect(const Rectangle & rRect,const SdrPageView * pPV,long & rDX,long & rDY) const495 sal_uInt16 SdrSnapView::SnapRect(const Rectangle& rRect, const SdrPageView* pPV, long& rDX, long& rDY) const
496 {
497 long nBestXSnap=0;
498 long nBestYSnap=0;
499 bool bXSnapped=sal_False;
500 bool bYSnapped=sal_False;
501 CheckSnap(rRect.TopLeft() ,pPV,nBestXSnap,nBestYSnap,bXSnapped,bYSnapped);
502 if (!bMoveSnapOnlyTopLeft) {
503 CheckSnap(rRect.TopRight() ,pPV,nBestXSnap,nBestYSnap,bXSnapped,bYSnapped);
504 CheckSnap(rRect.BottomLeft() ,pPV,nBestXSnap,nBestYSnap,bXSnapped,bYSnapped);
505 CheckSnap(rRect.BottomRight(),pPV,nBestXSnap,nBestYSnap,bXSnapped,bYSnapped);
506 }
507 rDX=nBestXSnap;
508 rDY=nBestYSnap;
509 sal_uInt16 nRet=0;
510 if (bXSnapped) nRet+=SDRSNAP_XSNAPPED;
511 if (bYSnapped) nRet+=SDRSNAP_YSNAPPED;
512 return nRet;
513 }
514
515 ////////////////////////////////////////////////////////////////////////////////////////////////////
516
BegSetPageOrg(const Point & rPnt)517 sal_Bool SdrSnapView::BegSetPageOrg(const Point& rPnt)
518 {
519 BrkAction();
520
521 DBG_ASSERT(0L == mpPageOriginOverlay, "SdrSnapView::BegSetPageOrg: There exists a ImplPageOriginOverlay (!)");
522 basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y());
523 mpPageOriginOverlay = new ImplPageOriginOverlay(*this, aStartPos);
524 aDragStat.Reset(GetSnapPos(rPnt,NULL));
525
526 return sal_True;
527 }
528
MovSetPageOrg(const Point & rPnt)529 void SdrSnapView::MovSetPageOrg(const Point& rPnt)
530 {
531 if(IsSetPageOrg())
532 {
533 aDragStat.NextMove(GetSnapPos(rPnt,NULL));
534 DBG_ASSERT(mpPageOriginOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
535 basegfx::B2DPoint aNewPos(aDragStat.GetNow().X(), aDragStat.GetNow().Y());
536 mpPageOriginOverlay->SetPosition(aNewPos);
537 }
538 }
539
EndSetPageOrg()540 sal_Bool SdrSnapView::EndSetPageOrg()
541 {
542 sal_Bool bRet(sal_False);
543
544 if(IsSetPageOrg())
545 {
546 SdrPageView* pPV = GetSdrPageView();
547
548 if(pPV)
549 {
550 Point aPnt(aDragStat.GetNow());
551 pPV->SetPageOrigin(aPnt);
552 bRet = sal_True;
553 }
554
555 // cleanup
556 BrkSetPageOrg();
557 }
558
559 return bRet;
560 }
561
BrkSetPageOrg()562 void SdrSnapView::BrkSetPageOrg()
563 {
564 if(IsSetPageOrg())
565 {
566 DBG_ASSERT(mpPageOriginOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
567 delete mpPageOriginOverlay;
568 mpPageOriginOverlay = 0L;
569 }
570 }
571
572 ////////////////////////////////////////////////////////////////////////////////////////////////////
573
PickHelpLine(const Point & rPnt,short nTol,const OutputDevice & rOut,sal_uInt16 & rnHelpLineNum,SdrPageView * & rpPV) const574 sal_Bool SdrSnapView::PickHelpLine(const Point& rPnt, short nTol, const OutputDevice& rOut, sal_uInt16& rnHelpLineNum, SdrPageView*& rpPV) const
575 {
576 rpPV=NULL;
577 nTol=ImpGetHitTolLogic(nTol,&rOut);
578 SdrPageView* pPV = GetSdrPageView();
579
580 if(pPV)
581 {
582 Point aPnt(rPnt);
583 sal_uInt16 nIndex=pPV->GetHelpLines().HitTest(aPnt,sal_uInt16(nTol),rOut);
584 if (nIndex!=SDRHELPLINE_NOTFOUND) {
585 rpPV=pPV;
586 rnHelpLineNum=nIndex;
587 return sal_True;
588 }
589 }
590 return sal_False;
591 }
592
593 // start HelpLine drag for new HelpLine
BegDragHelpLine(sal_uInt16 nHelpLineNum,SdrPageView * pPV)594 sal_Bool SdrSnapView::BegDragHelpLine(sal_uInt16 nHelpLineNum, SdrPageView* pPV)
595 {
596 sal_Bool bRet(sal_False);
597
598 if(!bHlplFixed)
599 {
600 BrkAction();
601
602 if(pPV && nHelpLineNum < pPV->GetHelpLines().GetCount())
603 {
604 const SdrHelpLineList& rHelpLines = pPV->GetHelpLines();
605 const SdrHelpLine& rHelpLine = rHelpLines[nHelpLineNum];
606 Point aHelpLinePos = rHelpLine.GetPos(); // + pPV->GetOffset();
607 basegfx::B2DPoint aStartPos(aHelpLinePos.X(), aHelpLinePos.Y());
608
609 DBG_ASSERT(0L == mpHelpLineOverlay, "SdrSnapView::BegDragHelpLine: There exists a ImplHelpLineOverlay (!)");
610 mpHelpLineOverlay = new ImplHelpLineOverlay(*this, aStartPos, pPV, nHelpLineNum, rHelpLine.GetKind());
611
612 aDragStat.Reset(GetSnapPos(aHelpLinePos, pPV));
613 aDragStat.SetMinMove(ImpGetMinMovLogic(-3, 0L));
614
615 bRet = sal_True;
616 }
617 }
618
619 return bRet;
620 }
621
622 // start HelpLine drag with existing HelpLine
BegDragHelpLine(const Point & rPnt,SdrHelpLineKind eNewKind)623 sal_Bool SdrSnapView::BegDragHelpLine(const Point& rPnt, SdrHelpLineKind eNewKind)
624 {
625 sal_Bool bRet(sal_False);
626
627 BrkAction();
628
629 if(GetSdrPageView())
630 {
631 DBG_ASSERT(0L == mpHelpLineOverlay, "SdrSnapView::BegDragHelpLine: There exists a ImplHelpLineOverlay (!)");
632 basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y());
633 mpHelpLineOverlay = new ImplHelpLineOverlay(*this, aStartPos, 0L, 0, eNewKind);
634 aDragStat.Reset(GetSnapPos(rPnt, 0L));
635 bRet = sal_True;
636 }
637
638 return bRet;
639 }
640
GetDraggedHelpLinePointer() const641 Pointer SdrSnapView::GetDraggedHelpLinePointer() const
642 {
643 if(IsDragHelpLine())
644 {
645 switch(mpHelpLineOverlay->GetHelpLineKind())
646 {
647 case SDRHELPLINE_VERTICAL : return Pointer(POINTER_ESIZE);
648 case SDRHELPLINE_HORIZONTAL: return Pointer(POINTER_SSIZE);
649 default : return Pointer(POINTER_MOVE);
650 }
651 }
652
653 return Pointer(POINTER_MOVE);
654 }
655
MovDragHelpLine(const Point & rPnt)656 void SdrSnapView::MovDragHelpLine(const Point& rPnt)
657 {
658 if(IsDragHelpLine() && aDragStat.CheckMinMoved(rPnt))
659 {
660 Point aPnt(GetSnapPos(rPnt, 0L));
661
662 if(aPnt != aDragStat.GetNow())
663 {
664 aDragStat.NextMove(aPnt);
665 DBG_ASSERT(mpHelpLineOverlay, "SdrSnapView::MovDragHelpLine: no ImplHelpLineOverlay (!)");
666 basegfx::B2DPoint aNewPos(aDragStat.GetNow().X(), aDragStat.GetNow().Y());
667 mpHelpLineOverlay->SetPosition(aNewPos);
668 }
669 }
670 }
671
EndDragHelpLine()672 sal_Bool SdrSnapView::EndDragHelpLine()
673 {
674 sal_Bool bRet(sal_False);
675
676 if(IsDragHelpLine())
677 {
678 if(aDragStat.IsMinMoved())
679 {
680 SdrPageView* pPageView = mpHelpLineOverlay->GetPageView();
681
682 if(pPageView)
683 {
684 // moved existing one
685 Point aPnt(aDragStat.GetNow());
686 const SdrHelpLineList& rHelpLines = pPageView->GetHelpLines();
687 SdrHelpLine aChangedHelpLine = rHelpLines[mpHelpLineOverlay->GetHelpLineNumber()];
688 aChangedHelpLine.SetPos(aPnt);
689 pPageView->SetHelpLine(mpHelpLineOverlay->GetHelpLineNumber(), aChangedHelpLine);
690
691 bRet = sal_True;
692 }
693 else
694 {
695 // create new one
696 pPageView = GetSdrPageView();
697
698 if(pPageView)
699 {
700 Point aPnt(aDragStat.GetNow());
701 SdrHelpLine aNewHelpLine(mpHelpLineOverlay->GetHelpLineKind(), aPnt);
702 pPageView->InsertHelpLine(aNewHelpLine);
703
704 bRet = sal_True;
705 }
706 }
707 }
708
709 // cleanup
710 BrkDragHelpLine();
711 }
712
713 return bRet;
714 }
715
BrkDragHelpLine()716 void SdrSnapView::BrkDragHelpLine()
717 {
718 if(IsDragHelpLine())
719 {
720 DBG_ASSERT(mpHelpLineOverlay, "SdrSnapView::EndDragHelpLine: no ImplHelpLineOverlay (!)");
721 delete mpHelpLineOverlay;
722 mpHelpLineOverlay = 0L;
723 }
724 }
725
726 // eof
727