xref: /aoo4110/main/svx/source/svdraw/svddrgv.cxx (revision b1cdbd2c)
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/svddrgv.hxx>
28 #include "svx/xattr.hxx"
29 #include <svx/xpoly.hxx>
30 #include <svx/svdetc.hxx>
31 #include <svx/svdtrans.hxx>
32 #include <svx/svdundo.hxx>
33 #include <svx/svdocapt.hxx>
34 #include <svx/svdpagv.hxx>
35 #include <svx/svdopath.hxx>
36 #include <svx/svdoedge.hxx>
37 #include "svx/svdstr.hrc"
38 #include "svx/svdglob.hxx"
39 #include "svddrgm1.hxx"
40 #include <svx/obj3d.hxx>
41 #include <svx/svdoashp.hxx>
42 #include <svx/sdrpaintwindow.hxx>
43 #include <basegfx/polygon/b2dpolypolygontools.hxx>
44 #include <basegfx/polygon/b2dpolygontools.hxx>
45 #include <svx/polypolygoneditor.hxx>
46 #include <basegfx/matrix/b2dhommatrix.hxx>
47 #include <svx/sdr/overlay/overlaymanager.hxx>
48 
49 using namespace sdr;
50 
51 ////////////////////////////////////////////////////////////////////////////////////////////////////
52 ////////////////////////////////////////////////////////////////////////////////////////////////////
53 //
54 //  @@@@@  @@@@@   @@@@   @@@@   @@ @@ @@ @@@@@ @@   @@
55 //  @@  @@ @@  @@ @@  @@ @@  @@  @@ @@ @@ @@    @@   @@
56 //  @@  @@ @@  @@ @@  @@ @@      @@ @@ @@ @@    @@ @ @@
57 //  @@  @@ @@@@@  @@@@@@ @@ @@@  @@@@@ @@ @@@@  @@@@@@@
58 //  @@  @@ @@  @@ @@  @@ @@  @@   @@@  @@ @@    @@@@@@@
59 //  @@  @@ @@  @@ @@  @@ @@  @@   @@@  @@ @@    @@@ @@@
60 //  @@@@@  @@  @@ @@  @@  @@@@@    @   @@ @@@@@ @@   @@
61 //
62 ////////////////////////////////////////////////////////////////////////////////////////////////////
63 ////////////////////////////////////////////////////////////////////////////////////////////////////
64 
ImpClearVars()65 void SdrDragView::ImpClearVars()
66 {
67 	bFramDrag=sal_False;
68 	eDragMode=SDRDRAG_MOVE;
69 	bDragLimit=sal_False;
70 	bMarkedHitMovesAlways=sal_False;
71 	eDragHdl=HDL_MOVE;
72 	pDragHdl=NULL;
73 	bDragHdl=sal_False;
74 	bDragSpecial=sal_False;
75 	mpCurrentSdrDragMethod=NULL;
76 	bDragStripes=sal_False;
77 	bMirrRefDragObj=sal_True;
78 	bDragWithCopy=sal_False;
79 	pInsPointUndo=NULL;
80 	bInsGluePoint=sal_False;
81 	bInsObjPointMode=sal_False;
82 	bInsGluePointMode=sal_False;
83 	nDragXorPolyLimit=100;
84 	nDragXorPointLimit=500;
85 	bNoDragXorPolys=sal_False;
86 	bAutoVertexCon=sal_True;
87 	bAutoCornerCon=sal_False;
88 	bRubberEdgeDragging=sal_True;
89 	nRubberEdgeDraggingLimit=100;
90 	bDetailedEdgeDragging=sal_True;
91 	nDetailedEdgeDraggingLimit=10;
92 	bResizeAtCenter=sal_False;
93 	bCrookAtCenter=sal_False;
94 	bMouseHideWhileDraggingPoints=sal_False;
95 
96 	// init using default
97 	mbSolidDragging = getOptionsDrawinglayer().IsSolidDragCreate();
98 }
99 
ImpMakeDragAttr()100 void SdrDragView::ImpMakeDragAttr()
101 {
102 	ImpDelDragAttr();
103 }
104 
SdrDragView(SdrModel * pModel1,OutputDevice * pOut)105 SdrDragView::SdrDragView(SdrModel* pModel1, OutputDevice* pOut)
106 :	SdrExchangeView(pModel1,pOut)
107 {
108 	ImpClearVars();
109 	ImpMakeDragAttr();
110 }
111 
~SdrDragView()112 SdrDragView::~SdrDragView()
113 {
114 	ImpDelDragAttr();
115 }
116 
ImpDelDragAttr()117 void SdrDragView::ImpDelDragAttr()
118 {
119 }
120 
IsAction() const121 sal_Bool SdrDragView::IsAction() const
122 {
123 	return (mpCurrentSdrDragMethod || SdrExchangeView::IsAction());
124 }
125 
MovAction(const Point & rPnt)126 void SdrDragView::MovAction(const Point& rPnt)
127 {
128 	SdrExchangeView::MovAction(rPnt);
129 	if (mpCurrentSdrDragMethod)
130 	{
131 		MovDragObj(rPnt);
132 	}
133 }
134 
EndAction()135 void SdrDragView::EndAction()
136 {
137 	if (mpCurrentSdrDragMethod)
138 	{
139 		EndDragObj(sal_False);
140 	}
141 	SdrExchangeView::EndAction();
142 }
143 
BckAction()144 void SdrDragView::BckAction()
145 {
146 	SdrExchangeView::BckAction();
147 	BrkDragObj();
148 }
149 
BrkAction()150 void SdrDragView::BrkAction()
151 {
152 	SdrExchangeView::BrkAction();
153 	BrkDragObj();
154 }
155 
TakeActionRect(Rectangle & rRect) const156 void SdrDragView::TakeActionRect(Rectangle& rRect) const
157 {
158 	if (mpCurrentSdrDragMethod)
159 	{
160 		rRect=aDragStat.GetActionRect();
161 		if (rRect.IsEmpty())
162 		{
163 			SdrPageView* pPV = GetSdrPageView();
164 
165 			if(pPV&& pPV->HasMarkedObjPageView())
166 			{
167                 // #i95646# is this used..?
168                 const basegfx::B2DRange aBoundRange(mpCurrentSdrDragMethod->getCurrentRange());
169 				rRect = Rectangle(
170                     basegfx::fround(aBoundRange.getMinX()), basegfx::fround(aBoundRange.getMinY()),
171                     basegfx::fround(aBoundRange.getMaxX()), basegfx::fround(aBoundRange.getMaxY()));
172 			}
173 		}
174 		if (rRect.IsEmpty())
175 		{
176 			rRect=Rectangle(aDragStat.GetNow(),aDragStat.GetNow());
177 		}
178 	}
179 	else
180 	{
181 		SdrExchangeView::TakeActionRect(rRect);
182 	}
183 }
184 
TakeDragObjAnchorPos(Point & rPos,sal_Bool bTR) const185 sal_Bool SdrDragView::TakeDragObjAnchorPos(Point& rPos, sal_Bool bTR ) const
186 {
187 	Rectangle aR;
188 	TakeActionRect(aR);
189 	rPos = bTR ? aR.TopRight() : aR.TopLeft();
190 	if (GetMarkedObjectCount()==1 && IsDragObj() && // nur bei Einzelselektion
191 		!IsDraggingPoints() && !IsDraggingGluePoints() && // nicht beim Punkteschieben
192 		!mpCurrentSdrDragMethod->ISA(SdrDragMovHdl)) // nicht beim Handlesschieben
193 	{
194 		SdrObject* pObj=GetMarkedObjectByIndex(0);
195 		if (pObj->ISA(SdrCaptionObj))
196 		{
197 			Point aPt(((SdrCaptionObj*)pObj)->GetTailPos());
198 			sal_Bool bTail=eDragHdl==HDL_POLY; // Schwanz wird gedraggt (nicht so ganz feine Abfrage hier)
199 			sal_Bool bOwn=mpCurrentSdrDragMethod->ISA(SdrDragObjOwn); // Objektspeziefisch
200 			if (!bTail)
201 			{ // bei bTail liefert TakeActionRect schon das richtige
202 				if (bOwn)
203 				{ // bOwn kann sein MoveTextFrame, ResizeTextFrame aber eben nicht mehr DragTail
204 					rPos=aPt;
205 				}
206 				else
207 				{
208 					// drag the whole Object (Move, Resize, ...)
209 					const basegfx::B2DPoint aTransformed(mpCurrentSdrDragMethod->getCurrentTransformation() * basegfx::B2DPoint(aPt.X(), aPt.Y()));
210 					rPos.X() = basegfx::fround(aTransformed.getX());
211 					rPos.Y() = basegfx::fround(aTransformed.getY());
212 				}
213 			}
214 		}
215 		return sal_True;
216 	}
217 	return sal_False;
218 }
219 
220 ////////////////////////////////////////////////////////////////////////////////////////////////////
221 
TakeDragLimit(SdrDragMode,Rectangle &) const222 sal_Bool SdrDragView::TakeDragLimit(SdrDragMode /*eMode*/, Rectangle& /*rRect*/) const
223 {
224 	return sal_False;
225 }
226 
BegDragObj(const Point & rPnt,OutputDevice * pOut,SdrHdl * pHdl,short nMinMov,SdrDragMethod * pForcedMeth)227 sal_Bool SdrDragView::BegDragObj(const Point& rPnt, OutputDevice* pOut, SdrHdl* pHdl, short nMinMov, SdrDragMethod* pForcedMeth)
228 {
229 	BrkAction();
230 
231 	bool bRet=false;
232 	{
233 		SetDragWithCopy(sal_False);
234 		//ForceEdgesOfMarkedNodes();
235 		//TODO: aAni.Reset();
236 		mpCurrentSdrDragMethod=NULL;
237 		bDragSpecial=sal_False;
238 		bDragLimit=sal_False;
239 		SdrDragMode eTmpMode=eDragMode;
240 		if (eTmpMode==SDRDRAG_MOVE && pHdl!=NULL && pHdl->GetKind()!=HDL_MOVE) {
241 			eTmpMode=SDRDRAG_RESIZE;
242 		}
243 		bDragLimit=TakeDragLimit(eTmpMode,aDragLimit);
244 		bFramDrag=ImpIsFrameHandles();
245 		if (!bFramDrag &&
246 			(pMarkedObj==NULL || !pMarkedObj->hasSpecialDrag()) &&
247 			(pHdl==NULL || pHdl->GetObj()==NULL)) {
248 			bFramDrag=sal_True;
249 		}
250 
251 		Point aPnt(rPnt);
252 		if(pHdl == NULL
253 			|| pHdl->GetKind() == HDL_MOVE
254 			|| pHdl->GetKind() == HDL_MIRX
255 			|| pHdl->GetKind() == HDL_TRNS
256 			|| pHdl->GetKind() == HDL_GRAD)
257 		{
258 			aDragStat.Reset(aPnt);
259 		}
260 		else
261 		{
262 			aDragStat.Reset(pHdl->GetPos());
263 		}
264 
265 		aDragStat.SetView((SdrView*)this);
266 		aDragStat.SetPageView(pMarkedPV);  // <<-- hier muss die DragPV rein!!!
267 		aDragStat.SetMinMove(ImpGetMinMovLogic(nMinMov,pOut));
268 		aDragStat.SetHdl(pHdl);
269 		aDragStat.NextPoint();
270 		pDragWin=pOut;
271 		pDragHdl=pHdl;
272 		eDragHdl= pHdl==NULL ? HDL_MOVE : pHdl->GetKind();
273 		bDragHdl=eDragHdl==HDL_REF1 || eDragHdl==HDL_REF2 || eDragHdl==HDL_MIRX;
274 
275 		// #103894# Expand test for HDL_ANCHOR_TR
276 		sal_Bool bNotDraggable = (HDL_ANCHOR == eDragHdl || HDL_ANCHOR_TR == eDragHdl);
277 
278 		if(pHdl && (pHdl->GetKind() == HDL_SMARTTAG) && pForcedMeth )
279 		{
280 			// just use the forced method for smart tags
281 		}
282 		else if(bDragHdl)
283 		{
284 			mpCurrentSdrDragMethod = new SdrDragMovHdl(*this);
285 		}
286 		else if(!bNotDraggable)
287 		{
288 			switch (eDragMode)
289 			{
290 				case SDRDRAG_ROTATE: case SDRDRAG_SHEAR: case SDRDRAG_DISTORT:
291 				{
292 					switch (eDragHdl)
293 					{
294 						case HDL_LEFT:  case HDL_RIGHT:
295 						case HDL_UPPER: case HDL_LOWER:
296 						{
297 							// Sind 3D-Objekte selektiert?
298 							sal_Bool b3DObjSelected = sal_False;
299 							for(sal_uInt32 a=0;!b3DObjSelected && a<GetMarkedObjectCount();a++)
300 							{
301 								SdrObject* pObj = GetMarkedObjectByIndex(a);
302 								if(pObj && pObj->ISA(E3dObject))
303 									b3DObjSelected = sal_True;
304 							}
305 							// Falls ja, Shear auch bei !IsShearAllowed zulassen,
306 							// da es sich bei 3D-Objekten um eingeschraenkte
307 							// Rotationen handelt
308 							if (!b3DObjSelected && !IsShearAllowed())
309 								return sal_False;
310 							mpCurrentSdrDragMethod = new SdrDragShear(*this,eDragMode==SDRDRAG_ROTATE);
311 						} break;
312 						case HDL_UPLFT: case HDL_UPRGT:
313 						case HDL_LWLFT: case HDL_LWRGT:
314 						{
315 							if (eDragMode==SDRDRAG_SHEAR || eDragMode==SDRDRAG_DISTORT)
316 							{
317 								if (!IsDistortAllowed(sal_True) && !IsDistortAllowed(sal_False)) return sal_False;
318 								mpCurrentSdrDragMethod = new SdrDragDistort(*this);
319 							}
320 							else
321 							{
322 								if (!IsRotateAllowed(sal_True)) return sal_False;
323 								mpCurrentSdrDragMethod = new SdrDragRotate(*this);
324 							}
325 						} break;
326 						default:
327 						{
328 							if (IsMarkedHitMovesAlways() && eDragHdl==HDL_MOVE)
329 							{ // HDL_MOVE ist auch wenn Obj direkt getroffen
330 								if (!IsMoveAllowed()) return sal_False;
331 								mpCurrentSdrDragMethod = new SdrDragMove(*this);
332 							}
333 							else
334 							{
335 								if (!IsRotateAllowed(sal_True)) return sal_False;
336 								mpCurrentSdrDragMethod = new SdrDragRotate(*this);
337 							}
338 						}
339 					}
340 				} break;
341 				case SDRDRAG_MIRROR:
342 				{
343 					if (eDragHdl==HDL_MOVE && IsMarkedHitMovesAlways())
344 					{
345 						if (!IsMoveAllowed()) return sal_False;
346 						mpCurrentSdrDragMethod = new SdrDragMove(*this);
347 					}
348 					else
349 					{
350 						if (!IsMirrorAllowed(sal_True,sal_True)) return sal_False;
351 						mpCurrentSdrDragMethod = new SdrDragMirror(*this);
352 					}
353 				} break;
354 
355 				case SDRDRAG_CROP:
356 				{
357 					if (eDragHdl==HDL_MOVE && IsMarkedHitMovesAlways())
358 					{
359 						if (!IsMoveAllowed())
360 							return sal_False;
361 						mpCurrentSdrDragMethod = new SdrDragMove(*this);
362 					}
363 					else
364 					{
365 						if (!IsCrookAllowed(sal_True) && !IsCrookAllowed(sal_False))
366 							return sal_False;
367 						mpCurrentSdrDragMethod = new SdrDragCrop(*this);
368 					}
369 				}
370 				break;
371 
372 				case SDRDRAG_TRANSPARENCE:
373 				{
374 					if(eDragHdl == HDL_MOVE && IsMarkedHitMovesAlways())
375 					{
376 						if(!IsMoveAllowed())
377 							return sal_False;
378 						mpCurrentSdrDragMethod = new SdrDragMove(*this);
379 					}
380 					else
381 					{
382 						if(!IsTransparenceAllowed())
383 							return sal_False;
384 
385 						mpCurrentSdrDragMethod = new SdrDragGradient(*this, sal_False);
386 					}
387 					break;
388 				}
389 				case SDRDRAG_GRADIENT:
390 				{
391 					if(eDragHdl == HDL_MOVE && IsMarkedHitMovesAlways())
392 					{
393 						if(!IsMoveAllowed())
394 							return sal_False;
395 						mpCurrentSdrDragMethod = new SdrDragMove(*this);
396 					}
397 					else
398 					{
399 						if(!IsGradientAllowed())
400 							return sal_False;
401 
402 						mpCurrentSdrDragMethod = new SdrDragGradient(*this);
403 					}
404 					break;
405 				}
406 
407 				case SDRDRAG_CROOK :
408 				{
409 					if (eDragHdl==HDL_MOVE && IsMarkedHitMovesAlways())
410 					{
411 						if (!IsMoveAllowed()) return sal_False;
412 						mpCurrentSdrDragMethod = new SdrDragMove(*this);
413 					}
414 					else
415 					{
416 						if (!IsCrookAllowed(sal_True) && !IsCrookAllowed(sal_False)) return sal_False;
417 						mpCurrentSdrDragMethod = new SdrDragCrook(*this);
418 					}
419 				} break;
420 
421 				default:
422 				{
423 					// SDRDRAG_MOVE
424 					if((eDragHdl == HDL_MOVE) && !IsMoveAllowed())
425 					{
426 						return sal_False;
427 					}
428 					else if(eDragHdl == HDL_GLUE)
429 					{
430 						mpCurrentSdrDragMethod = new SdrDragMove(*this);
431 					}
432 					else
433 					{
434 						if(bFramDrag)
435 						{
436 							if(eDragHdl == HDL_MOVE)
437 							{
438 								mpCurrentSdrDragMethod = new SdrDragMove(*this);
439 							}
440 							else
441 							{
442 								if(!IsResizeAllowed(sal_True))
443 								{
444 									return sal_False;
445 								}
446 
447 								sal_Bool bSingleTextObjMark = sal_False;	// SJ: #i100490#
448 								if ( GetMarkedObjectCount() == 1 )
449 								{
450 									pMarkedObj=GetMarkedObjectByIndex(0);
451 									if ( pMarkedObj &&
452 										pMarkedObj->ISA( SdrTextObj ) &&
453 										static_cast<SdrTextObj*>(pMarkedObj)->IsTextFrame() )
454 										bSingleTextObjMark = sal_True;
455 								}
456 								if ( bSingleTextObjMark )
457 									mpCurrentSdrDragMethod = new SdrDragObjOwn(*this);
458 								else
459 									mpCurrentSdrDragMethod = new SdrDragResize(*this);
460 							}
461 						}
462 						else
463 						{
464 							if(HDL_MOVE == eDragHdl)
465 							{
466                                 const bool bCustomShapeSelected(1 == GetMarkedObjectCount() && GetMarkedObjectByIndex(0)->ISA(SdrObjCustomShape));
467 
468                                 if(bCustomShapeSelected)
469                                 {
470     								mpCurrentSdrDragMethod = new SdrDragMove( *this );
471                                 }
472 							}
473 							else if(HDL_POLY == eDragHdl)
474                             {
475                                 const bool bConnectorSelected(1 == GetMarkedObjectCount() && GetMarkedObjectByIndex(0)->ISA(SdrEdgeObj));
476 
477                                 if(bConnectorSelected)
478                                 {
479                                     // #i97784#
480                                     // fallback to old behaviour for connectors (see
481                                     // text in task description for more details)
482                                 }
483                                 else if(!IsMoveAllowed() || !IsResizeAllowed())
484     							{
485 	    							// #i77187#
486                                     // do not allow move of polygon points if object is move or size protected
487 		    						return sal_False;
488                                 }
489                             }
490 
491                             if(!mpCurrentSdrDragMethod)
492                             {
493                                 // fallback to DragSpecial if no interaction defined
494                                 bDragSpecial = sal_True;
495 								mpCurrentSdrDragMethod = new SdrDragObjOwn(*this);
496 							}
497 						}
498 					}
499 				}
500 			}
501 		}
502 		if (pForcedMeth!=NULL)
503 		{
504             delete mpCurrentSdrDragMethod;
505 			mpCurrentSdrDragMethod = pForcedMeth;
506 		}
507 		aDragStat.SetDragMethod(mpCurrentSdrDragMethod);
508 		if (mpCurrentSdrDragMethod)
509 		{
510 			bRet = mpCurrentSdrDragMethod->BeginSdrDrag();
511 			if (!bRet)
512 			{
513 				if (pHdl==NULL && IS_TYPE(SdrDragObjOwn,mpCurrentSdrDragMethod))
514 				{
515 					// Aha, Obj kann nicht Move SpecialDrag, also MoveFrameDrag versuchen
516                     delete mpCurrentSdrDragMethod;
517                     mpCurrentSdrDragMethod = 0;
518 					bDragSpecial=sal_False;
519 
520                     if (!IsMoveAllowed())
521                         return sal_False;
522 
523                     bFramDrag=sal_True;
524 					mpCurrentSdrDragMethod = new SdrDragMove(*this);
525 					aDragStat.SetDragMethod(mpCurrentSdrDragMethod);
526 					bRet = mpCurrentSdrDragMethod->BeginSdrDrag();
527 				}
528 			}
529 			if (!bRet)
530 			{
531                 delete mpCurrentSdrDragMethod;
532                 mpCurrentSdrDragMethod = 0;
533 				aDragStat.SetDragMethod(mpCurrentSdrDragMethod);
534 			}
535 		}
536 	}
537 
538 	return bRet;
539 }
540 
MovDragObj(const Point & rPnt)541 void SdrDragView::MovDragObj(const Point& rPnt)
542 {
543 	if (mpCurrentSdrDragMethod)
544 	{
545 		Point aPnt(rPnt);
546 		ImpLimitToWorkArea(aPnt);
547 		mpCurrentSdrDragMethod->MoveSdrDrag(aPnt); // this call already makes a Hide()/Show combination
548 	}
549 }
550 
EndDragObj(sal_Bool bCopy)551 sal_Bool SdrDragView::EndDragObj(sal_Bool bCopy)
552 {
553 	bool bRet(false);
554 
555 	// #i73341# If insert GluePoint, do not insist on last points being different
556 	if(mpCurrentSdrDragMethod && aDragStat.IsMinMoved() && (IsInsertGluePoint() || aDragStat.GetNow() != aDragStat.GetPrev()))
557 	{
558 		sal_uIntPtr nHdlAnzMerk=0;
559 
560 		if (bEliminatePolyPoints)
561 		{ // IBM Special
562 			nHdlAnzMerk=GetMarkablePointCount();
563 		}
564 
565 		const bool bUndo = IsUndoEnabled();
566         if (IsInsertGluePoint() && bUndo)
567 		{
568 			BegUndo(aInsPointUndoStr);
569 			AddUndo(pInsPointUndo);
570 		}
571 
572         bRet = mpCurrentSdrDragMethod->EndSdrDrag(bCopy);
573 
574         if( IsInsertGluePoint() && bUndo)
575             EndUndo();
576 
577         delete mpCurrentSdrDragMethod;
578         mpCurrentSdrDragMethod = 0;
579 
580         if (bEliminatePolyPoints)
581 		{ // IBM Special
582 			if (nHdlAnzMerk!=GetMarkablePointCount())
583 			{
584 				UnmarkAllPoints();
585 			}
586 		}
587 
588         if (bInsPolyPoint)
589 		{
590 			SetMarkHandles();
591 			bInsPolyPoint=sal_False;
592 			if( bUndo )
593 			{
594 				BegUndo(aInsPointUndoStr);
595 				AddUndo(pInsPointUndo);
596 				EndUndo();
597 			}
598 		}
599 
600 		eDragHdl=HDL_MOVE;
601 		pDragHdl=NULL;
602 
603 		if (!bSomeObjChgdFlag)
604 		{
605 			// Aha, Obj hat nicht gebroadcastet (z.B. Writer FlyFrames)
606 			if(!bDragHdl)
607 			{
608 				AdjustMarkHdl();
609 			}
610 		}
611 	}
612 	else
613 	{
614 		BrkDragObj();
615 	}
616 
617     bInsPolyPoint=sal_False;
618 	SetInsertGluePoint(sal_False);
619 
620 	return bRet;
621 }
622 
BrkDragObj()623 void SdrDragView::BrkDragObj()
624 {
625 	if (mpCurrentSdrDragMethod)
626 	{
627 		mpCurrentSdrDragMethod->CancelSdrDrag();
628 
629         delete mpCurrentSdrDragMethod;
630         mpCurrentSdrDragMethod = 0;
631 
632         if (bInsPolyPoint)
633 		{
634 			pInsPointUndo->Undo(); // Den eingefuegten Punkt wieder raus
635 			delete pInsPointUndo;
636 			pInsPointUndo=NULL;
637 			SetMarkHandles();
638 			bInsPolyPoint=sal_False;
639 		}
640 
641         if (IsInsertGluePoint())
642 		{
643 			pInsPointUndo->Undo(); // Den eingefuegten Klebepunkt wieder raus
644 			delete pInsPointUndo;
645 			pInsPointUndo=NULL;
646 			SetInsertGluePoint(sal_False);
647 		}
648 
649         eDragHdl=HDL_MOVE;
650 		pDragHdl=NULL;
651 	}
652 }
653 
IsInsObjPointPossible() const654 sal_Bool SdrDragView::IsInsObjPointPossible() const
655 {
656 	return pMarkedObj!=NULL && pMarkedObj->IsPolyObj();
657 }
658 
ImpBegInsObjPoint(sal_Bool bIdxZwang,sal_uInt32 nIdx,const Point & rPnt,sal_Bool bNewObj,OutputDevice * pOut)659 sal_Bool SdrDragView::ImpBegInsObjPoint(sal_Bool bIdxZwang, sal_uInt32 nIdx, const Point& rPnt, sal_Bool bNewObj, OutputDevice* pOut)
660 {
661 	sal_Bool bRet(sal_False);
662 
663 	if(pMarkedObj && pMarkedObj->ISA(SdrPathObj))
664 	{
665 		SdrPathObj* pMarkedPath = (SdrPathObj*)pMarkedObj;
666 		BrkAction();
667 		pInsPointUndo = dynamic_cast< SdrUndoGeoObj* >( GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pMarkedObj) );
668 		DBG_ASSERT( pInsPointUndo, "svx::SdrDragView::BegInsObjPoint(), could not create correct undo object!" );
669 
670 		XubString aStr(ImpGetResStr(STR_DragInsertPoint));
671 		XubString aName;
672         pMarkedObj->TakeObjNameSingul(aName);
673 		xub_StrLen nPos(aStr.SearchAscii("%1"));
674 
675 		if(STRING_NOTFOUND != nPos)
676 		{
677 			aStr.Erase(nPos, 2);
678 			aStr.Insert(aName, nPos);
679 		}
680 
681 		aInsPointUndoStr = aStr;
682 		Point aPt(rPnt);
683 
684 		if(bNewObj)
685 			aPt = GetSnapPos(aPt,pMarkedPV);
686 
687 		sal_Bool bClosed0(pMarkedPath->IsClosedObj());
688 
689 		if(bIdxZwang)
690 		{
691 			mnInsPointNum = pMarkedPath->NbcInsPoint(nIdx, aPt, bNewObj, sal_True);
692 		}
693 		else
694 		{
695 			mnInsPointNum = pMarkedPath->NbcInsPointOld(aPt, bNewObj, sal_True);
696 		}
697 
698 		if(bClosed0 != pMarkedPath->IsClosedObj())
699 		{
700 			// Obj was closed implicit
701 			// object changed
702 			pMarkedPath->SetChanged();
703 			pMarkedPath->BroadcastObjectChange();
704 		}
705 
706 		if(0xffffffff != mnInsPointNum)
707 		{
708 			bInsPolyPoint = sal_True;
709 			UnmarkAllPoints();
710 			AdjustMarkHdl();
711 
712 			bRet = BegDragObj(rPnt, pOut, aHdl.GetHdl(mnInsPointNum), 0);
713 
714 			if (bRet)
715 			{
716 				aDragStat.SetMinMoved();
717 				MovDragObj(rPnt);
718 			}
719 		}
720 		else
721 		{
722 			delete pInsPointUndo;
723 			pInsPointUndo = NULL;
724 		}
725 	}
726 
727 	return bRet;
728 }
729 
EndInsObjPoint(SdrCreateCmd eCmd)730 sal_Bool SdrDragView::EndInsObjPoint(SdrCreateCmd eCmd)
731 {
732 	if(IsInsObjPoint())
733 	{
734 		sal_uInt32 nNextPnt(mnInsPointNum);
735 		Point aPnt(aDragStat.GetNow());
736 		sal_Bool bOk=EndDragObj(sal_False);
737 		if (bOk==sal_True && eCmd!=SDRCREATE_FORCEEND)
738 		{
739 			// Ret=True bedeutet: Action ist vorbei.
740 			bOk=!(ImpBegInsObjPoint(sal_True, nNextPnt, aPnt, eCmd == SDRCREATE_NEXTOBJECT, pDragWin));
741 		}
742 
743 		return bOk;
744 	} else return sal_False;
745 }
746 
IsInsGluePointPossible() const747 sal_Bool SdrDragView::IsInsGluePointPossible() const
748 {
749 	sal_Bool bRet=sal_False;
750 	if (IsInsGluePointMode() && AreObjectsMarked())
751 	{
752 		if (GetMarkedObjectCount()==1)
753 		{
754 			// sal_False liefern, wenn 1 Objekt und dieses ein Verbinder ist.
755 			const SdrObject* pObj=GetMarkedObjectByIndex(0);
756 			if (!HAS_BASE(SdrEdgeObj,pObj))
757 			{
758 			   bRet=sal_True;
759 			}
760 		}
761 		else
762 		{
763 			bRet=sal_True;
764 		}
765 	}
766 	return bRet;
767 }
768 
BegInsGluePoint(const Point & rPnt)769 sal_Bool SdrDragView::BegInsGluePoint(const Point& rPnt)
770 {
771 	sal_Bool bRet=sal_False;
772 	SdrObject* pObj;
773 	SdrPageView* pPV;
774 	sal_uIntPtr nMarkNum;
775 	if (PickMarkedObj(rPnt,pObj,pPV,&nMarkNum,SDRSEARCH_PASS2BOUND))
776 	{
777 		BrkAction();
778 		UnmarkAllGluePoints();
779 		pInsPointUndo= dynamic_cast< SdrUndoGeoObj* >( GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj) );
780 		DBG_ASSERT( pInsPointUndo, "svx::SdrDragView::BegInsObjPoint(), could not create correct undo object!" );
781 		XubString aStr(ImpGetResStr(STR_DragInsertGluePoint));
782 		XubString aName; pObj->TakeObjNameSingul(aName);
783 
784 		aStr.SearchAndReplaceAscii("%1", aName);
785 
786 		aInsPointUndoStr=aStr;
787 		SdrGluePointList* pGPL=pObj->ForceGluePointList();
788 		if (pGPL!=NULL)
789 		{
790 			sal_uInt16 nGlueIdx=pGPL->Insert(SdrGluePoint());
791 			SdrGluePoint& rGP=(*pGPL)[nGlueIdx];
792 			sal_uInt16 nGlueId=rGP.GetId();
793 			rGP.SetAbsolutePos(rPnt,*pObj);
794 
795 			SdrHdl* pHdl=NULL;
796 			if (MarkGluePoint(pObj,nGlueId,pPV))
797 			{
798 				pHdl=GetGluePointHdl(pObj,nGlueId);
799 			}
800 			if (pHdl!=NULL && pHdl->GetKind()==HDL_GLUE && pHdl->GetObj()==pObj && pHdl->GetObjHdlNum()==nGlueId)
801 			{
802 				SetInsertGluePoint(sal_True);
803 				bRet=BegDragObj(rPnt,NULL,pHdl,0);
804 				if (bRet)
805 				{
806 					aDragStat.SetMinMoved();
807 					MovDragObj(rPnt);
808 				}
809 				else
810 				{
811 					SetInsertGluePoint(sal_False);
812 					delete pInsPointUndo;
813 					pInsPointUndo=NULL;
814 				}
815 			}
816 			else
817 			{
818 				DBG_ERROR("BegInsGluePoint(): GluePoint-Handle nicht gefunden");
819 			}
820 		}
821 		else
822 		{
823 			// Keine Klebepunkte moeglich bei diesem Objekt (z.B. Edge)
824 			SetInsertGluePoint(sal_False);
825 			delete pInsPointUndo;
826 			pInsPointUndo=NULL;
827 		}
828 	}
829 
830 	return bRet;
831 }
832 
ShowDragObj()833 void SdrDragView::ShowDragObj()
834 {
835 	if(mpCurrentSdrDragMethod && !aDragStat.IsShown())
836 	{
837         for(sal_uInt32 a(0); a < PaintWindowCount(); a++)
838         {
839 	        SdrPaintWindow* pCandidate = GetPaintWindow(a);
840 	        sdr::overlay::OverlayManager* pOverlayManager = pCandidate->GetOverlayManager();
841 
842 	        if(pOverlayManager)
843 	        {
844 		        mpCurrentSdrDragMethod->CreateOverlayGeometry(*pOverlayManager);
845 
846 				// #i101679# Force changed overlay to be shown
847 				pOverlayManager->flush();
848 	        }
849         }
850 
851 		aDragStat.SetShown(sal_True);
852 	}
853 }
854 
HideDragObj()855 void SdrDragView::HideDragObj()
856 {
857 	if(mpCurrentSdrDragMethod && aDragStat.IsShown())
858 	{
859         mpCurrentSdrDragMethod->destroyOverlayGeometry();
860 		aDragStat.SetShown(sal_False);
861 	}
862 }
863 
864 ////////////////////////////////////////////////////////////////////////////////////////////////////
865 
SetNoDragXorPolys(sal_Bool bOn)866 void SdrDragView::SetNoDragXorPolys(sal_Bool bOn)
867 {
868 	if (IsNoDragXorPolys()!=bOn)
869 	{
870 		const bool bDragging(mpCurrentSdrDragMethod);
871 		const bool bShown(bDragging && aDragStat.IsShown());
872 
873         if(bShown)
874         {
875             HideDragObj();
876         }
877 
878 		bNoDragXorPolys = bOn;
879 
880 		if(bDragging)
881 		{
882             // force recreation of drag content
883             mpCurrentSdrDragMethod->resetSdrDragEntries();
884 		}
885 
886 		if(bShown)
887         {
888 			ShowDragObj();
889         }
890 	}
891 }
892 
SetDragStripes(sal_Bool bOn)893 void SdrDragView::SetDragStripes(sal_Bool bOn)
894 {
895 	if (mpCurrentSdrDragMethod && aDragStat.IsShown())
896 	{
897 		HideDragObj();
898 		bDragStripes=bOn;
899 		ShowDragObj();
900 	}
901 	else
902 	{
903 		bDragStripes=bOn;
904 	}
905 }
906 
IsOrthoDesired() const907 sal_Bool SdrDragView::IsOrthoDesired() const
908 {
909 	if(mpCurrentSdrDragMethod && (IS_TYPE(SdrDragObjOwn, mpCurrentSdrDragMethod) || IS_TYPE(SdrDragResize, mpCurrentSdrDragMethod)))
910 	{
911 		return bOrthoDesiredOnMarked;
912 	}
913 
914     return sal_False;
915 }
916 
917 ////////////////////////////////////////////////////////////////////////////////////////////////////
918 
SetRubberEdgeDragging(sal_Bool bOn)919 void SdrDragView::SetRubberEdgeDragging(sal_Bool bOn)
920 {
921 	if (bOn!=IsRubberEdgeDragging())
922 	{
923 		sal_uIntPtr nAnz = GetEdgesOfMarkedNodes().GetMarkCount();
924 		sal_Bool bShowHide=nAnz!=0 && IsDragObj() &&
925 				 (nRubberEdgeDraggingLimit>=nAnz);
926 		if (bShowHide)
927 			HideDragObj();
928 		bRubberEdgeDragging=bOn;
929 		if (bShowHide)
930 			ShowDragObj();
931 	}
932 }
933 
SetRubberEdgeDraggingLimit(sal_uInt16 nEdgeObjAnz)934 void SdrDragView::SetRubberEdgeDraggingLimit(sal_uInt16 nEdgeObjAnz)
935 {
936 	if (nEdgeObjAnz!=nRubberEdgeDraggingLimit)
937 	{
938 		sal_uIntPtr nAnz = GetEdgesOfMarkedNodes().GetMarkCount();
939 		sal_Bool bShowHide=IsRubberEdgeDragging() && nAnz!=0 && IsDragObj() &&
940 				 (nEdgeObjAnz>=nAnz)!=(nRubberEdgeDraggingLimit>=nAnz);
941 		if (bShowHide)
942 			HideDragObj();
943 		nRubberEdgeDraggingLimit=nEdgeObjAnz;
944 		if (bShowHide)
945 			ShowDragObj();
946 	}
947 }
948 
SetDetailedEdgeDragging(sal_Bool bOn)949 void SdrDragView::SetDetailedEdgeDragging(sal_Bool bOn)
950 {
951 	if (bOn!=IsDetailedEdgeDragging())
952 	{
953 		sal_uIntPtr nAnz = GetEdgesOfMarkedNodes().GetMarkCount();
954 		sal_Bool bShowHide=nAnz!=0 && IsDragObj() &&
955 				 (nDetailedEdgeDraggingLimit>=nAnz);
956 		if (bShowHide)
957 			HideDragObj();
958 		bDetailedEdgeDragging=bOn;
959 		if (bShowHide)
960 			ShowDragObj();
961 	}
962 }
963 
SetDetailedEdgeDraggingLimit(sal_uInt16 nEdgeObjAnz)964 void SdrDragView::SetDetailedEdgeDraggingLimit(sal_uInt16 nEdgeObjAnz)
965 {
966 	if (nEdgeObjAnz!=nDetailedEdgeDraggingLimit)
967 	{
968 		sal_uIntPtr nAnz = GetEdgesOfMarkedNodes().GetMarkCount();
969 		sal_Bool bShowHide=IsDetailedEdgeDragging() && nAnz!=0 && IsDragObj() &&
970 				 (nEdgeObjAnz>=nAnz)!=(nDetailedEdgeDraggingLimit>=nAnz);
971 		if (bShowHide)
972 			HideDragObj();
973 		nDetailedEdgeDraggingLimit=nEdgeObjAnz;
974 		if (bShowHide)
975 			ShowDragObj();
976 	}
977 }
978 
SetMarkHandles()979 void SdrDragView::SetMarkHandles()
980 {
981 	if( pDragHdl )
982 		pDragHdl = 0;
983 
984 	SdrExchangeView::SetMarkHandles();
985 }
986 
SetSolidDragging(bool bOn)987 void SdrDragView::SetSolidDragging(bool bOn)
988 {
989 	if((bool)mbSolidDragging != bOn)
990 	{
991 		mbSolidDragging = bOn;
992 	}
993 }
994 
IsSolidDragging() const995 bool SdrDragView::IsSolidDragging() const
996 {
997 	// allow each user to disable by having a local setting, but using AND for
998 	// checking allowance
999 	return mbSolidDragging && getOptionsDrawinglayer().IsSolidDragCreate();
1000 }
1001 
1002 // eof
1003