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