xref: /trunk/main/svx/source/svdraw/svdsnpv.cxx (revision f6e50924)
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