1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_svx.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include <svx/svdmrkv.hxx> 32*cdf0e10cSrcweir #include <svx/svdetc.hxx> 33*cdf0e10cSrcweir #include <svx/svdoedge.hxx> 34*cdf0e10cSrcweir #include "svx/svdglob.hxx" 35*cdf0e10cSrcweir #include "svx/svditext.hxx" 36*cdf0e10cSrcweir #include <svx/svdview.hxx> 37*cdf0e10cSrcweir #include <svx/svdpagv.hxx> 38*cdf0e10cSrcweir #include <svx/svdpage.hxx> 39*cdf0e10cSrcweir #include "svddrgm1.hxx" 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #ifdef DBG_UTIL 42*cdf0e10cSrcweir #include <svdibrow.hxx> 43*cdf0e10cSrcweir #endif 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir #include <svx/svdoole2.hxx> 46*cdf0e10cSrcweir #include <svx/xgrad.hxx> 47*cdf0e10cSrcweir #include <svx/xflgrit.hxx> 48*cdf0e10cSrcweir #include "gradtrns.hxx" 49*cdf0e10cSrcweir #include <svx/xflftrit.hxx> 50*cdf0e10cSrcweir #include <svx/dialmgr.hxx> 51*cdf0e10cSrcweir #include "svx/svdstr.hrc" 52*cdf0e10cSrcweir #include <svx/svdundo.hxx> 53*cdf0e10cSrcweir #include <svx/svdopath.hxx> 54*cdf0e10cSrcweir #include <svx/scene3d.hxx> 55*cdf0e10cSrcweir #include <svx/svdovirt.hxx> 56*cdf0e10cSrcweir #include <svx/sdr/overlay/overlayrollingrectangle.hxx> 57*cdf0e10cSrcweir #include <svx/sdr/overlay/overlaymanager.hxx> 58*cdf0e10cSrcweir #include <svx/sdrpaintwindow.hxx> 59*cdf0e10cSrcweir #include <svx/sdrpagewindow.hxx> 60*cdf0e10cSrcweir #include <svx/sdrhittesthelper.hxx> 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 63*cdf0e10cSrcweir // predefines 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir class SdrUnoControlList; 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 68*cdf0e10cSrcweir // #114409#-3 Migrate Marking of Objects, Points and GluePoints 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir class ImplMarkingOverlay 71*cdf0e10cSrcweir { 72*cdf0e10cSrcweir // The OverlayObjects 73*cdf0e10cSrcweir ::sdr::overlay::OverlayObjectList maObjects; 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir // The remembered second position in logical coodinates 76*cdf0e10cSrcweir basegfx::B2DPoint maSecondPosition; 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir // bitfield 79*cdf0e10cSrcweir // A flag to remember if the action is for unmarking. 80*cdf0e10cSrcweir unsigned mbUnmarking : 1; 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir public: 83*cdf0e10cSrcweir ImplMarkingOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos, sal_Bool bUnmarking = sal_False); 84*cdf0e10cSrcweir ~ImplMarkingOverlay(); 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir void SetSecondPosition(const basegfx::B2DPoint& rNewPosition); 87*cdf0e10cSrcweir sal_Bool IsUnmarking() const { return mbUnmarking; } 88*cdf0e10cSrcweir }; 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir ImplMarkingOverlay::ImplMarkingOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos, sal_Bool bUnmarking) 91*cdf0e10cSrcweir : maSecondPosition(rStartPos), 92*cdf0e10cSrcweir mbUnmarking(bUnmarking) 93*cdf0e10cSrcweir { 94*cdf0e10cSrcweir for(sal_uInt32 a(0L); a < rView.PaintWindowCount(); a++) 95*cdf0e10cSrcweir { 96*cdf0e10cSrcweir SdrPaintWindow* pCandidate = rView.GetPaintWindow(a); 97*cdf0e10cSrcweir ::sdr::overlay::OverlayManager* pTargetOverlay = pCandidate->GetOverlayManager(); 98*cdf0e10cSrcweir 99*cdf0e10cSrcweir if(pTargetOverlay) 100*cdf0e10cSrcweir { 101*cdf0e10cSrcweir ::sdr::overlay::OverlayRollingRectangleStriped* pNew = new ::sdr::overlay::OverlayRollingRectangleStriped( 102*cdf0e10cSrcweir rStartPos, rStartPos, false); 103*cdf0e10cSrcweir pTargetOverlay->add(*pNew); 104*cdf0e10cSrcweir maObjects.append(*pNew); 105*cdf0e10cSrcweir } 106*cdf0e10cSrcweir } 107*cdf0e10cSrcweir } 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir ImplMarkingOverlay::~ImplMarkingOverlay() 110*cdf0e10cSrcweir { 111*cdf0e10cSrcweir // The OverlayObjects are cleared using the destructor of OverlayObjectList. 112*cdf0e10cSrcweir // That destructor calls clear() at the list which removes all objects from the 113*cdf0e10cSrcweir // OverlayManager and deletes them. 114*cdf0e10cSrcweir } 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir void ImplMarkingOverlay::SetSecondPosition(const basegfx::B2DPoint& rNewPosition) 117*cdf0e10cSrcweir { 118*cdf0e10cSrcweir if(rNewPosition != maSecondPosition) 119*cdf0e10cSrcweir { 120*cdf0e10cSrcweir // apply to OverlayObjects 121*cdf0e10cSrcweir for(sal_uInt32 a(0L); a < maObjects.count(); a++) 122*cdf0e10cSrcweir { 123*cdf0e10cSrcweir ::sdr::overlay::OverlayRollingRectangleStriped& rCandidate = (::sdr::overlay::OverlayRollingRectangleStriped&)maObjects.getOverlayObject(a); 124*cdf0e10cSrcweir rCandidate.setSecondPosition(rNewPosition); 125*cdf0e10cSrcweir } 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir // remember new position 128*cdf0e10cSrcweir maSecondPosition = rNewPosition; 129*cdf0e10cSrcweir } 130*cdf0e10cSrcweir } 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 133*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 134*cdf0e10cSrcweir // 135*cdf0e10cSrcweir // @@ @@ @@@@ @@@@@ @@ @@ @@ @@ @@ @@@@@ @@ @@ 136*cdf0e10cSrcweir // @@@ @@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ 137*cdf0e10cSrcweir // @@@@@@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @ @@ 138*cdf0e10cSrcweir // @@@@@@@ @@@@@@ @@@@@ @@@@ @@@@@ @@ @@@@ @@@@@@@ 139*cdf0e10cSrcweir // @@ @ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@@@@@ 140*cdf0e10cSrcweir // @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@ @@@ 141*cdf0e10cSrcweir // @@ @@ @@ @@ @@ @@ @@ @@ @ @@ @@@@@ @@ @@ 142*cdf0e10cSrcweir // 143*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 144*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir void SdrMarkView::ImpClearVars() 147*cdf0e10cSrcweir { 148*cdf0e10cSrcweir eDragMode=SDRDRAG_MOVE; 149*cdf0e10cSrcweir //HMHbHdlShown=sal_False; 150*cdf0e10cSrcweir bRefHdlShownOnly=sal_False; 151*cdf0e10cSrcweir eEditMode=SDREDITMODE_EDIT; 152*cdf0e10cSrcweir eEditMode0=SDREDITMODE_EDIT; 153*cdf0e10cSrcweir bDesignMode=sal_False; 154*cdf0e10cSrcweir pMarkedObj=NULL; 155*cdf0e10cSrcweir pMarkedPV=NULL; 156*cdf0e10cSrcweir bForceFrameHandles=sal_False; 157*cdf0e10cSrcweir bPlusHdlAlways=sal_False; 158*cdf0e10cSrcweir nFrameHandlesLimit=50; 159*cdf0e10cSrcweir bInsPolyPoint=sal_False; 160*cdf0e10cSrcweir mnInsPointNum = 0L; 161*cdf0e10cSrcweir bMarkedObjRectDirty=sal_False; 162*cdf0e10cSrcweir bMarkedPointsRectsDirty=sal_False; 163*cdf0e10cSrcweir mbMarkHandlesHidden = false; 164*cdf0e10cSrcweir bMrkPntDirty=sal_False; 165*cdf0e10cSrcweir bMarkHdlWhenTextEdit=sal_False; 166*cdf0e10cSrcweir bMarkableObjCountDirty=sal_False; // noch nicht implementiert 167*cdf0e10cSrcweir nMarkableObjCount=0; // noch nicht implementiert 168*cdf0e10cSrcweir 169*cdf0e10cSrcweir // #114409#-3 Migrate selections 170*cdf0e10cSrcweir BrkMarkObj(); 171*cdf0e10cSrcweir BrkMarkPoints(); 172*cdf0e10cSrcweir BrkMarkGluePoints(); 173*cdf0e10cSrcweir } 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir SdrMarkView::SdrMarkView(SdrModel* pModel1, OutputDevice* pOut) 176*cdf0e10cSrcweir : SdrSnapView(pModel1,pOut), 177*cdf0e10cSrcweir mpMarkObjOverlay(0L), 178*cdf0e10cSrcweir mpMarkPointsOverlay(0L), 179*cdf0e10cSrcweir mpMarkGluePointsOverlay(0L), 180*cdf0e10cSrcweir aHdl(this), 181*cdf0e10cSrcweir mpSdrViewSelection(new sdr::ViewSelection()) 182*cdf0e10cSrcweir { 183*cdf0e10cSrcweir ImpClearVars(); 184*cdf0e10cSrcweir StartListening(*pModel1); 185*cdf0e10cSrcweir } 186*cdf0e10cSrcweir 187*cdf0e10cSrcweir SdrMarkView::~SdrMarkView() 188*cdf0e10cSrcweir { 189*cdf0e10cSrcweir // #114409#-3 Migrate selections 190*cdf0e10cSrcweir BrkMarkObj(); 191*cdf0e10cSrcweir BrkMarkPoints(); 192*cdf0e10cSrcweir BrkMarkGluePoints(); 193*cdf0e10cSrcweir delete mpSdrViewSelection; 194*cdf0e10cSrcweir } 195*cdf0e10cSrcweir 196*cdf0e10cSrcweir void __EXPORT SdrMarkView::Notify(SfxBroadcaster& rBC, const SfxHint& rHint) 197*cdf0e10cSrcweir { 198*cdf0e10cSrcweir SdrHint* pSdrHint=PTR_CAST(SdrHint,&rHint); 199*cdf0e10cSrcweir if (pSdrHint!=NULL) 200*cdf0e10cSrcweir { 201*cdf0e10cSrcweir SdrHintKind eKind=pSdrHint->GetKind(); 202*cdf0e10cSrcweir 203*cdf0e10cSrcweir if (eKind==HINT_OBJCHG || eKind==HINT_OBJINSERTED || eKind==HINT_OBJREMOVED) 204*cdf0e10cSrcweir { 205*cdf0e10cSrcweir bMarkedObjRectDirty=sal_True; 206*cdf0e10cSrcweir bMarkedPointsRectsDirty=sal_True; 207*cdf0e10cSrcweir } 208*cdf0e10cSrcweir /* removed for now since this breaks existing code who iterates over the mark list and sequentially replaces objects 209*cdf0e10cSrcweir if( eKind==HINT_OBJREMOVED && IsObjMarked( const_cast<SdrObject*>(pSdrHint->GetObject()) ) ) 210*cdf0e10cSrcweir { 211*cdf0e10cSrcweir MarkObj( const_cast<SdrObject*>(pSdrHint->GetObject()), GetSdrPageView(), sal_True ); 212*cdf0e10cSrcweir } 213*cdf0e10cSrcweir */ 214*cdf0e10cSrcweir } 215*cdf0e10cSrcweir SdrSnapView::Notify(rBC,rHint); 216*cdf0e10cSrcweir } 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir void SdrMarkView::ModelHasChanged() 219*cdf0e10cSrcweir { 220*cdf0e10cSrcweir SdrPaintView::ModelHasChanged(); 221*cdf0e10cSrcweir GetMarkedObjectListWriteAccess().SetNameDirty(); 222*cdf0e10cSrcweir bMarkedObjRectDirty=sal_True; 223*cdf0e10cSrcweir bMarkedPointsRectsDirty=sal_True; 224*cdf0e10cSrcweir // Es sind beispielsweise Obj markiert und maMarkedObjectListist Sorted. 225*cdf0e10cSrcweir // In einer anderen View 2 wird die ObjOrder veraendert 226*cdf0e10cSrcweir // (z.B. MovToTop()). Dann ist Neusortieren der MarkList erforderlich. 227*cdf0e10cSrcweir GetMarkedObjectListWriteAccess().SetUnsorted(); 228*cdf0e10cSrcweir SortMarkedObjects(); 229*cdf0e10cSrcweir bMrkPntDirty=sal_True; 230*cdf0e10cSrcweir UndirtyMrkPnt(); 231*cdf0e10cSrcweir SdrView* pV=(SdrView*)this; 232*cdf0e10cSrcweir if (pV!=NULL && !pV->IsDragObj() && !pV->IsInsObjPoint()) { // an dieser Stelle habe ich ein ziemliches Problem !!! 233*cdf0e10cSrcweir AdjustMarkHdl(); 234*cdf0e10cSrcweir } 235*cdf0e10cSrcweir } 236*cdf0e10cSrcweir 237*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 238*cdf0e10cSrcweir 239*cdf0e10cSrcweir sal_Bool SdrMarkView::IsAction() const 240*cdf0e10cSrcweir { 241*cdf0e10cSrcweir return SdrSnapView::IsAction() || IsMarkObj() || IsMarkPoints() || IsMarkGluePoints(); 242*cdf0e10cSrcweir } 243*cdf0e10cSrcweir 244*cdf0e10cSrcweir void SdrMarkView::MovAction(const Point& rPnt) 245*cdf0e10cSrcweir { 246*cdf0e10cSrcweir SdrSnapView::MovAction(rPnt); 247*cdf0e10cSrcweir 248*cdf0e10cSrcweir if(IsMarkObj()) 249*cdf0e10cSrcweir { 250*cdf0e10cSrcweir MovMarkObj(rPnt); 251*cdf0e10cSrcweir } 252*cdf0e10cSrcweir else if(IsMarkPoints()) 253*cdf0e10cSrcweir { 254*cdf0e10cSrcweir MovMarkPoints(rPnt); 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir else if(IsMarkGluePoints()) 257*cdf0e10cSrcweir { 258*cdf0e10cSrcweir MovMarkGluePoints(rPnt); 259*cdf0e10cSrcweir } 260*cdf0e10cSrcweir } 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir void SdrMarkView::EndAction() 263*cdf0e10cSrcweir { 264*cdf0e10cSrcweir if(IsMarkObj()) 265*cdf0e10cSrcweir { 266*cdf0e10cSrcweir EndMarkObj(); 267*cdf0e10cSrcweir } 268*cdf0e10cSrcweir else if(IsMarkPoints()) 269*cdf0e10cSrcweir { 270*cdf0e10cSrcweir EndMarkPoints(); 271*cdf0e10cSrcweir } 272*cdf0e10cSrcweir else if(IsMarkGluePoints()) 273*cdf0e10cSrcweir { 274*cdf0e10cSrcweir EndMarkGluePoints(); 275*cdf0e10cSrcweir } 276*cdf0e10cSrcweir 277*cdf0e10cSrcweir SdrSnapView::EndAction(); 278*cdf0e10cSrcweir } 279*cdf0e10cSrcweir 280*cdf0e10cSrcweir void SdrMarkView::BckAction() 281*cdf0e10cSrcweir { 282*cdf0e10cSrcweir SdrSnapView::BckAction(); 283*cdf0e10cSrcweir BrkMarkObj(); 284*cdf0e10cSrcweir BrkMarkPoints(); 285*cdf0e10cSrcweir BrkMarkGluePoints(); 286*cdf0e10cSrcweir } 287*cdf0e10cSrcweir 288*cdf0e10cSrcweir void SdrMarkView::BrkAction() 289*cdf0e10cSrcweir { 290*cdf0e10cSrcweir SdrSnapView::BrkAction(); 291*cdf0e10cSrcweir BrkMarkObj(); 292*cdf0e10cSrcweir BrkMarkPoints(); 293*cdf0e10cSrcweir BrkMarkGluePoints(); 294*cdf0e10cSrcweir } 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir void SdrMarkView::TakeActionRect(Rectangle& rRect) const 297*cdf0e10cSrcweir { 298*cdf0e10cSrcweir if(IsMarkObj() || IsMarkPoints() || IsMarkGluePoints()) 299*cdf0e10cSrcweir { 300*cdf0e10cSrcweir rRect = Rectangle(aDragStat.GetStart(), aDragStat.GetNow()); 301*cdf0e10cSrcweir } 302*cdf0e10cSrcweir else 303*cdf0e10cSrcweir { 304*cdf0e10cSrcweir SdrSnapView::TakeActionRect(rRect); 305*cdf0e10cSrcweir } 306*cdf0e10cSrcweir } 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 309*cdf0e10cSrcweir 310*cdf0e10cSrcweir void SdrMarkView::ClearPageView() 311*cdf0e10cSrcweir { 312*cdf0e10cSrcweir UnmarkAllObj(); 313*cdf0e10cSrcweir SdrSnapView::ClearPageView(); 314*cdf0e10cSrcweir } 315*cdf0e10cSrcweir 316*cdf0e10cSrcweir void SdrMarkView::HideSdrPage() 317*cdf0e10cSrcweir { 318*cdf0e10cSrcweir bool bMrkChg(false); 319*cdf0e10cSrcweir //HMHbool bVis(false); 320*cdf0e10cSrcweir 321*cdf0e10cSrcweir if(mpPageView) 322*cdf0e10cSrcweir { 323*cdf0e10cSrcweir // break all creation actions when hiding page (#75081#) 324*cdf0e10cSrcweir BrkAction(); 325*cdf0e10cSrcweir //HMHbVis = IsMarkHdlShown(); 326*cdf0e10cSrcweir 327*cdf0e10cSrcweir //HMHif(bVis) 328*cdf0e10cSrcweir //HMH{ 329*cdf0e10cSrcweir //HMH HideMarkHdl(); 330*cdf0e10cSrcweir //HMH} 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir // Alle Markierungen dieser Seite verwerfen 333*cdf0e10cSrcweir bMrkChg = GetMarkedObjectListWriteAccess().DeletePageView(*mpPageView); 334*cdf0e10cSrcweir } 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir SdrSnapView::HideSdrPage(); 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir if(bMrkChg) 339*cdf0e10cSrcweir { 340*cdf0e10cSrcweir MarkListHasChanged(); 341*cdf0e10cSrcweir AdjustMarkHdl(); 342*cdf0e10cSrcweir } 343*cdf0e10cSrcweir 344*cdf0e10cSrcweir //HMHif(bVis) 345*cdf0e10cSrcweir //HMH{ 346*cdf0e10cSrcweir //HMH ShowMarkHdl(); 347*cdf0e10cSrcweir //HMH} 348*cdf0e10cSrcweir } 349*cdf0e10cSrcweir 350*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 351*cdf0e10cSrcweir 352*cdf0e10cSrcweir sal_Bool SdrMarkView::BegMarkObj(const Point& rPnt, sal_Bool bUnmark) 353*cdf0e10cSrcweir { 354*cdf0e10cSrcweir BrkAction(); 355*cdf0e10cSrcweir 356*cdf0e10cSrcweir DBG_ASSERT(0L == mpMarkObjOverlay, "SdrMarkView::BegMarkObj: There exists a mpMarkObjOverlay (!)"); 357*cdf0e10cSrcweir basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y()); 358*cdf0e10cSrcweir mpMarkObjOverlay = new ImplMarkingOverlay(*this, aStartPos, bUnmark); 359*cdf0e10cSrcweir 360*cdf0e10cSrcweir aDragStat.Reset(rPnt); 361*cdf0e10cSrcweir aDragStat.NextPoint(); 362*cdf0e10cSrcweir aDragStat.SetMinMove(nMinMovLog); 363*cdf0e10cSrcweir 364*cdf0e10cSrcweir return sal_True; 365*cdf0e10cSrcweir } 366*cdf0e10cSrcweir 367*cdf0e10cSrcweir void SdrMarkView::MovMarkObj(const Point& rPnt) 368*cdf0e10cSrcweir { 369*cdf0e10cSrcweir if(IsMarkObj() && aDragStat.CheckMinMoved(rPnt)) 370*cdf0e10cSrcweir { 371*cdf0e10cSrcweir aDragStat.NextMove(rPnt); 372*cdf0e10cSrcweir DBG_ASSERT(mpMarkObjOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)"); 373*cdf0e10cSrcweir basegfx::B2DPoint aNewPos(rPnt.X(), rPnt.Y()); 374*cdf0e10cSrcweir mpMarkObjOverlay->SetSecondPosition(aNewPos); 375*cdf0e10cSrcweir } 376*cdf0e10cSrcweir } 377*cdf0e10cSrcweir 378*cdf0e10cSrcweir sal_Bool SdrMarkView::EndMarkObj() 379*cdf0e10cSrcweir { 380*cdf0e10cSrcweir sal_Bool bRetval(sal_False); 381*cdf0e10cSrcweir 382*cdf0e10cSrcweir if(IsMarkObj()) 383*cdf0e10cSrcweir { 384*cdf0e10cSrcweir if(aDragStat.IsMinMoved()) 385*cdf0e10cSrcweir { 386*cdf0e10cSrcweir Rectangle aRect(aDragStat.GetStart(), aDragStat.GetNow()); 387*cdf0e10cSrcweir aRect.Justify(); 388*cdf0e10cSrcweir MarkObj(aRect, mpMarkObjOverlay->IsUnmarking()); 389*cdf0e10cSrcweir bRetval = sal_True; 390*cdf0e10cSrcweir } 391*cdf0e10cSrcweir 392*cdf0e10cSrcweir // cleanup 393*cdf0e10cSrcweir BrkMarkObj(); 394*cdf0e10cSrcweir } 395*cdf0e10cSrcweir 396*cdf0e10cSrcweir return bRetval; 397*cdf0e10cSrcweir } 398*cdf0e10cSrcweir 399*cdf0e10cSrcweir void SdrMarkView::BrkMarkObj() 400*cdf0e10cSrcweir { 401*cdf0e10cSrcweir if(IsMarkObj()) 402*cdf0e10cSrcweir { 403*cdf0e10cSrcweir DBG_ASSERT(mpMarkObjOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)"); 404*cdf0e10cSrcweir delete mpMarkObjOverlay; 405*cdf0e10cSrcweir mpMarkObjOverlay = 0L; 406*cdf0e10cSrcweir } 407*cdf0e10cSrcweir } 408*cdf0e10cSrcweir 409*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 410*cdf0e10cSrcweir 411*cdf0e10cSrcweir sal_Bool SdrMarkView::BegMarkPoints(const Point& rPnt, sal_Bool bUnmark) 412*cdf0e10cSrcweir { 413*cdf0e10cSrcweir if(HasMarkablePoints()) 414*cdf0e10cSrcweir { 415*cdf0e10cSrcweir BrkAction(); 416*cdf0e10cSrcweir 417*cdf0e10cSrcweir DBG_ASSERT(0L == mpMarkPointsOverlay, "SdrMarkView::BegMarkObj: There exists a mpMarkPointsOverlay (!)"); 418*cdf0e10cSrcweir basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y()); 419*cdf0e10cSrcweir mpMarkPointsOverlay = new ImplMarkingOverlay(*this, aStartPos, bUnmark); 420*cdf0e10cSrcweir 421*cdf0e10cSrcweir aDragStat.Reset(rPnt); 422*cdf0e10cSrcweir aDragStat.NextPoint(); 423*cdf0e10cSrcweir aDragStat.SetMinMove(nMinMovLog); 424*cdf0e10cSrcweir 425*cdf0e10cSrcweir return sal_True; 426*cdf0e10cSrcweir } 427*cdf0e10cSrcweir 428*cdf0e10cSrcweir return sal_False; 429*cdf0e10cSrcweir } 430*cdf0e10cSrcweir 431*cdf0e10cSrcweir void SdrMarkView::MovMarkPoints(const Point& rPnt) 432*cdf0e10cSrcweir { 433*cdf0e10cSrcweir if(IsMarkPoints() && aDragStat.CheckMinMoved(rPnt)) 434*cdf0e10cSrcweir { 435*cdf0e10cSrcweir aDragStat.NextMove(rPnt); 436*cdf0e10cSrcweir 437*cdf0e10cSrcweir DBG_ASSERT(mpMarkPointsOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)"); 438*cdf0e10cSrcweir basegfx::B2DPoint aNewPos(rPnt.X(), rPnt.Y()); 439*cdf0e10cSrcweir mpMarkPointsOverlay->SetSecondPosition(aNewPos); 440*cdf0e10cSrcweir } 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir 443*cdf0e10cSrcweir sal_Bool SdrMarkView::EndMarkPoints() 444*cdf0e10cSrcweir { 445*cdf0e10cSrcweir sal_Bool bRetval(sal_False); 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir if(IsMarkPoints()) 448*cdf0e10cSrcweir { 449*cdf0e10cSrcweir if(aDragStat.IsMinMoved()) 450*cdf0e10cSrcweir { 451*cdf0e10cSrcweir Rectangle aRect(aDragStat.GetStart(), aDragStat.GetNow()); 452*cdf0e10cSrcweir aRect.Justify(); 453*cdf0e10cSrcweir MarkPoints(aRect, mpMarkPointsOverlay->IsUnmarking()); 454*cdf0e10cSrcweir 455*cdf0e10cSrcweir bRetval = sal_True; 456*cdf0e10cSrcweir } 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir // cleanup 459*cdf0e10cSrcweir BrkMarkPoints(); 460*cdf0e10cSrcweir } 461*cdf0e10cSrcweir 462*cdf0e10cSrcweir return bRetval; 463*cdf0e10cSrcweir } 464*cdf0e10cSrcweir 465*cdf0e10cSrcweir void SdrMarkView::BrkMarkPoints() 466*cdf0e10cSrcweir { 467*cdf0e10cSrcweir if(IsMarkPoints()) 468*cdf0e10cSrcweir { 469*cdf0e10cSrcweir DBG_ASSERT(mpMarkPointsOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)"); 470*cdf0e10cSrcweir delete mpMarkPointsOverlay; 471*cdf0e10cSrcweir mpMarkPointsOverlay = 0L; 472*cdf0e10cSrcweir } 473*cdf0e10cSrcweir } 474*cdf0e10cSrcweir 475*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 476*cdf0e10cSrcweir 477*cdf0e10cSrcweir sal_Bool SdrMarkView::BegMarkGluePoints(const Point& rPnt, sal_Bool bUnmark) 478*cdf0e10cSrcweir { 479*cdf0e10cSrcweir if(HasMarkableGluePoints()) 480*cdf0e10cSrcweir { 481*cdf0e10cSrcweir BrkAction(); 482*cdf0e10cSrcweir 483*cdf0e10cSrcweir DBG_ASSERT(0L == mpMarkGluePointsOverlay, "SdrMarkView::BegMarkObj: There exists a mpMarkGluePointsOverlay (!)"); 484*cdf0e10cSrcweir basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y()); 485*cdf0e10cSrcweir mpMarkGluePointsOverlay = new ImplMarkingOverlay(*this, aStartPos, bUnmark); 486*cdf0e10cSrcweir 487*cdf0e10cSrcweir aDragStat.Reset(rPnt); 488*cdf0e10cSrcweir aDragStat.NextPoint(); 489*cdf0e10cSrcweir aDragStat.SetMinMove(nMinMovLog); 490*cdf0e10cSrcweir 491*cdf0e10cSrcweir return sal_True; 492*cdf0e10cSrcweir } 493*cdf0e10cSrcweir 494*cdf0e10cSrcweir return sal_False; 495*cdf0e10cSrcweir } 496*cdf0e10cSrcweir 497*cdf0e10cSrcweir void SdrMarkView::MovMarkGluePoints(const Point& rPnt) 498*cdf0e10cSrcweir { 499*cdf0e10cSrcweir if(IsMarkGluePoints() && aDragStat.CheckMinMoved(rPnt)) 500*cdf0e10cSrcweir { 501*cdf0e10cSrcweir aDragStat.NextMove(rPnt); 502*cdf0e10cSrcweir 503*cdf0e10cSrcweir DBG_ASSERT(mpMarkGluePointsOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)"); 504*cdf0e10cSrcweir basegfx::B2DPoint aNewPos(rPnt.X(), rPnt.Y()); 505*cdf0e10cSrcweir mpMarkGluePointsOverlay->SetSecondPosition(aNewPos); 506*cdf0e10cSrcweir } 507*cdf0e10cSrcweir } 508*cdf0e10cSrcweir 509*cdf0e10cSrcweir sal_Bool SdrMarkView::EndMarkGluePoints() 510*cdf0e10cSrcweir { 511*cdf0e10cSrcweir sal_Bool bRetval(sal_False); 512*cdf0e10cSrcweir 513*cdf0e10cSrcweir if(IsMarkGluePoints()) 514*cdf0e10cSrcweir { 515*cdf0e10cSrcweir if(aDragStat.IsMinMoved()) 516*cdf0e10cSrcweir { 517*cdf0e10cSrcweir Rectangle aRect(aDragStat.GetStart(),aDragStat.GetNow()); 518*cdf0e10cSrcweir aRect.Justify(); 519*cdf0e10cSrcweir MarkGluePoints(&aRect, mpMarkGluePointsOverlay->IsUnmarking()); 520*cdf0e10cSrcweir 521*cdf0e10cSrcweir bRetval = sal_True; 522*cdf0e10cSrcweir } 523*cdf0e10cSrcweir 524*cdf0e10cSrcweir // cleanup 525*cdf0e10cSrcweir BrkMarkGluePoints(); 526*cdf0e10cSrcweir } 527*cdf0e10cSrcweir 528*cdf0e10cSrcweir return bRetval; 529*cdf0e10cSrcweir } 530*cdf0e10cSrcweir 531*cdf0e10cSrcweir void SdrMarkView::BrkMarkGluePoints() 532*cdf0e10cSrcweir { 533*cdf0e10cSrcweir if(IsMarkGluePoints()) 534*cdf0e10cSrcweir { 535*cdf0e10cSrcweir DBG_ASSERT(mpMarkGluePointsOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)"); 536*cdf0e10cSrcweir delete mpMarkGluePointsOverlay; 537*cdf0e10cSrcweir mpMarkGluePointsOverlay = 0L; 538*cdf0e10cSrcweir } 539*cdf0e10cSrcweir } 540*cdf0e10cSrcweir 541*cdf0e10cSrcweir sal_Bool SdrMarkView::HasMarkableObj() const 542*cdf0e10cSrcweir { 543*cdf0e10cSrcweir sal_uIntPtr nCount=0; 544*cdf0e10cSrcweir 545*cdf0e10cSrcweir SdrPageView* pPV = GetSdrPageView(); 546*cdf0e10cSrcweir if(pPV) 547*cdf0e10cSrcweir { 548*cdf0e10cSrcweir SdrObjList* pOL=pPV->GetObjList(); 549*cdf0e10cSrcweir sal_uIntPtr nObjAnz=pOL->GetObjCount(); 550*cdf0e10cSrcweir for (sal_uIntPtr nObjNum=0; nObjNum<nObjAnz && nCount==0; nObjNum++) { 551*cdf0e10cSrcweir SdrObject* pObj=pOL->GetObj(nObjNum); 552*cdf0e10cSrcweir if (IsObjMarkable(pObj,pPV)) { 553*cdf0e10cSrcweir nCount++; 554*cdf0e10cSrcweir } 555*cdf0e10cSrcweir } 556*cdf0e10cSrcweir } 557*cdf0e10cSrcweir return nCount!=0; 558*cdf0e10cSrcweir } 559*cdf0e10cSrcweir 560*cdf0e10cSrcweir sal_uIntPtr SdrMarkView::GetMarkableObjCount() const 561*cdf0e10cSrcweir { 562*cdf0e10cSrcweir sal_uIntPtr nCount=0; 563*cdf0e10cSrcweir SdrPageView* pPV = GetSdrPageView(); 564*cdf0e10cSrcweir 565*cdf0e10cSrcweir if(pPV) 566*cdf0e10cSrcweir { 567*cdf0e10cSrcweir SdrObjList* pOL=pPV->GetObjList(); 568*cdf0e10cSrcweir sal_uIntPtr nObjAnz=pOL->GetObjCount(); 569*cdf0e10cSrcweir for (sal_uIntPtr nObjNum=0; nObjNum<nObjAnz; nObjNum++) { 570*cdf0e10cSrcweir SdrObject* pObj=pOL->GetObj(nObjNum); 571*cdf0e10cSrcweir if (IsObjMarkable(pObj,pPV)) { 572*cdf0e10cSrcweir nCount++; 573*cdf0e10cSrcweir } 574*cdf0e10cSrcweir } 575*cdf0e10cSrcweir } 576*cdf0e10cSrcweir return nCount; 577*cdf0e10cSrcweir } 578*cdf0e10cSrcweir 579*cdf0e10cSrcweir //HMHvoid SdrMarkView::ImpShowMarkHdl(bool /*bNoRefHdl*/) 580*cdf0e10cSrcweir //HMH{ 581*cdf0e10cSrcweir //HMH bNoRefHdl=sal_False; // geht leider erstmal nicht anders 582*cdf0e10cSrcweir //HMH if (!bHdlShown) { 583*cdf0e10cSrcweir //HMH bRefHdlShownOnly=sal_False; 584*cdf0e10cSrcweir //HMH bHdlShown=sal_True; 585*cdf0e10cSrcweir //HMH } 586*cdf0e10cSrcweir //HMH} 587*cdf0e10cSrcweir 588*cdf0e10cSrcweir //HMHvoid SdrMarkView::ShowMarkHdl(bool /*bNoRefHdl*/) 589*cdf0e10cSrcweir //HMH{ 590*cdf0e10cSrcweir //HMH bNoRefHdl=sal_False; // geht leider erstmal nicht anders 591*cdf0e10cSrcweir //HMH ImpShowMarkHdl(bNoRefHdl); 592*cdf0e10cSrcweir //HMH} 593*cdf0e10cSrcweir 594*cdf0e10cSrcweir 595*cdf0e10cSrcweir //HMHvoid SdrMarkView::HideMarkHdl(bool /*bNoRefHdl*/) 596*cdf0e10cSrcweir //HMH{ 597*cdf0e10cSrcweir //HMH bNoRefHdl=sal_False; // geht leider erstmal nicht anders 598*cdf0e10cSrcweir //HMH if (bHdlShown) { 599*cdf0e10cSrcweir //HMH bRefHdlShownOnly=bNoRefHdl; 600*cdf0e10cSrcweir //HMH bHdlShown=sal_False; 601*cdf0e10cSrcweir //HMH } 602*cdf0e10cSrcweir //HMH} 603*cdf0e10cSrcweir 604*cdf0e10cSrcweir void SdrMarkView::hideMarkHandles() 605*cdf0e10cSrcweir { 606*cdf0e10cSrcweir if(!mbMarkHandlesHidden) 607*cdf0e10cSrcweir { 608*cdf0e10cSrcweir mbMarkHandlesHidden = true; 609*cdf0e10cSrcweir AdjustMarkHdl(); 610*cdf0e10cSrcweir } 611*cdf0e10cSrcweir } 612*cdf0e10cSrcweir 613*cdf0e10cSrcweir void SdrMarkView::showMarkHandles() 614*cdf0e10cSrcweir { 615*cdf0e10cSrcweir if(mbMarkHandlesHidden) 616*cdf0e10cSrcweir { 617*cdf0e10cSrcweir mbMarkHandlesHidden = false; 618*cdf0e10cSrcweir AdjustMarkHdl(); 619*cdf0e10cSrcweir } 620*cdf0e10cSrcweir } 621*cdf0e10cSrcweir 622*cdf0e10cSrcweir sal_Bool SdrMarkView::ImpIsFrameHandles() const 623*cdf0e10cSrcweir { 624*cdf0e10cSrcweir sal_uIntPtr nMarkAnz=GetMarkedObjectCount(); 625*cdf0e10cSrcweir sal_Bool bFrmHdl=nMarkAnz>nFrameHandlesLimit || bForceFrameHandles; 626*cdf0e10cSrcweir sal_Bool bStdDrag=eDragMode==SDRDRAG_MOVE; 627*cdf0e10cSrcweir if (nMarkAnz==1 && bStdDrag && bFrmHdl) 628*cdf0e10cSrcweir { 629*cdf0e10cSrcweir const SdrObject* pObj=GetMarkedObjectByIndex(0); 630*cdf0e10cSrcweir if (pObj->GetObjInventor()==SdrInventor) 631*cdf0e10cSrcweir { 632*cdf0e10cSrcweir sal_uInt16 nIdent=pObj->GetObjIdentifier(); 633*cdf0e10cSrcweir if (nIdent==OBJ_LINE || nIdent==OBJ_EDGE || nIdent==OBJ_CAPTION || nIdent==OBJ_MEASURE || nIdent==OBJ_CUSTOMSHAPE || nIdent==OBJ_TABLE ) 634*cdf0e10cSrcweir { 635*cdf0e10cSrcweir bFrmHdl=sal_False; 636*cdf0e10cSrcweir } 637*cdf0e10cSrcweir } 638*cdf0e10cSrcweir } 639*cdf0e10cSrcweir if (!bStdDrag && !bFrmHdl) { 640*cdf0e10cSrcweir // Grundsaetzlich erstmal alle anderen Dragmodi nur mit FrameHandles 641*cdf0e10cSrcweir bFrmHdl=sal_True; 642*cdf0e10cSrcweir if (eDragMode==SDRDRAG_ROTATE) { 643*cdf0e10cSrcweir // bei Rotate ObjOwn-Drag, wenn mind. 1 PolyObj 644*cdf0e10cSrcweir for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && bFrmHdl; nMarkNum++) { 645*cdf0e10cSrcweir const SdrMark* pM=GetSdrMarkByIndex(nMarkNum); 646*cdf0e10cSrcweir const SdrObject* pObj=pM->GetMarkedSdrObj(); 647*cdf0e10cSrcweir bFrmHdl=!pObj->IsPolyObj(); 648*cdf0e10cSrcweir } 649*cdf0e10cSrcweir } 650*cdf0e10cSrcweir } 651*cdf0e10cSrcweir if (!bFrmHdl) { 652*cdf0e10cSrcweir // FrameHandles, wenn wenigstens 1 Obj kein SpecialDrag kann 653*cdf0e10cSrcweir for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && !bFrmHdl; nMarkNum++) { 654*cdf0e10cSrcweir const SdrMark* pM=GetSdrMarkByIndex(nMarkNum); 655*cdf0e10cSrcweir const SdrObject* pObj=pM->GetMarkedSdrObj(); 656*cdf0e10cSrcweir bFrmHdl=!pObj->hasSpecialDrag(); 657*cdf0e10cSrcweir } 658*cdf0e10cSrcweir } 659*cdf0e10cSrcweir return bFrmHdl; 660*cdf0e10cSrcweir } 661*cdf0e10cSrcweir 662*cdf0e10cSrcweir void SdrMarkView::SetMarkHandles() 663*cdf0e10cSrcweir { 664*cdf0e10cSrcweir // #105722# remember old focus handle values to search for it again 665*cdf0e10cSrcweir const SdrHdl* pSaveOldFocusHdl = aHdl.GetFocusHdl(); 666*cdf0e10cSrcweir sal_Bool bSaveOldFocus(sal_False); 667*cdf0e10cSrcweir sal_uInt32 nSavePolyNum(0L), nSavePointNum(0L); 668*cdf0e10cSrcweir SdrHdlKind eSaveKind(HDL_MOVE); 669*cdf0e10cSrcweir SdrObject* pSaveObj = NULL; 670*cdf0e10cSrcweir 671*cdf0e10cSrcweir if(pSaveOldFocusHdl 672*cdf0e10cSrcweir && pSaveOldFocusHdl->GetObj() 673*cdf0e10cSrcweir && pSaveOldFocusHdl->GetObj()->ISA(SdrPathObj) 674*cdf0e10cSrcweir && (pSaveOldFocusHdl->GetKind() == HDL_POLY || pSaveOldFocusHdl->GetKind() == HDL_BWGT)) 675*cdf0e10cSrcweir { 676*cdf0e10cSrcweir bSaveOldFocus = sal_True; 677*cdf0e10cSrcweir nSavePolyNum = pSaveOldFocusHdl->GetPolyNum(); 678*cdf0e10cSrcweir nSavePointNum = pSaveOldFocusHdl->GetPointNum(); 679*cdf0e10cSrcweir pSaveObj = pSaveOldFocusHdl->GetObj(); 680*cdf0e10cSrcweir eSaveKind = pSaveOldFocusHdl->GetKind(); 681*cdf0e10cSrcweir } 682*cdf0e10cSrcweir 683*cdf0e10cSrcweir // delete/clear all handles. This will always be done, even with areMarkHandlesHidden() 684*cdf0e10cSrcweir aHdl.Clear(); 685*cdf0e10cSrcweir aHdl.SetRotateShear(eDragMode==SDRDRAG_ROTATE); 686*cdf0e10cSrcweir aHdl.SetDistortShear(eDragMode==SDRDRAG_SHEAR); 687*cdf0e10cSrcweir pMarkedObj=NULL; 688*cdf0e10cSrcweir pMarkedPV=NULL; 689*cdf0e10cSrcweir 690*cdf0e10cSrcweir // are handles enabled at all? Create only then 691*cdf0e10cSrcweir if(!areMarkHandlesHidden()) 692*cdf0e10cSrcweir { 693*cdf0e10cSrcweir sal_uIntPtr nMarkAnz=GetMarkedObjectCount(); 694*cdf0e10cSrcweir sal_Bool bStdDrag=eDragMode==SDRDRAG_MOVE; 695*cdf0e10cSrcweir sal_Bool bSingleTextObjMark=sal_False; 696*cdf0e10cSrcweir 697*cdf0e10cSrcweir if (nMarkAnz==1) 698*cdf0e10cSrcweir { 699*cdf0e10cSrcweir pMarkedObj=GetMarkedObjectByIndex(0); 700*cdf0e10cSrcweir bSingleTextObjMark = 701*cdf0e10cSrcweir pMarkedObj && 702*cdf0e10cSrcweir pMarkedObj->ISA(SdrTextObj) && 703*cdf0e10cSrcweir static_cast<SdrTextObj*>(pMarkedObj)->IsTextFrame(); 704*cdf0e10cSrcweir } 705*cdf0e10cSrcweir 706*cdf0e10cSrcweir sal_Bool bFrmHdl=ImpIsFrameHandles(); 707*cdf0e10cSrcweir 708*cdf0e10cSrcweir if (nMarkAnz>0) 709*cdf0e10cSrcweir { 710*cdf0e10cSrcweir pMarkedPV=GetSdrPageViewOfMarkedByIndex(0); 711*cdf0e10cSrcweir 712*cdf0e10cSrcweir for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && (pMarkedPV!=NULL || !bFrmHdl); nMarkNum++) 713*cdf0e10cSrcweir { 714*cdf0e10cSrcweir const SdrMark* pM=GetSdrMarkByIndex(nMarkNum); 715*cdf0e10cSrcweir 716*cdf0e10cSrcweir if (pMarkedPV!=pM->GetPageView()) 717*cdf0e10cSrcweir { 718*cdf0e10cSrcweir pMarkedPV=NULL; 719*cdf0e10cSrcweir } 720*cdf0e10cSrcweir } 721*cdf0e10cSrcweir } 722*cdf0e10cSrcweir 723*cdf0e10cSrcweir if (bFrmHdl) 724*cdf0e10cSrcweir { 725*cdf0e10cSrcweir Rectangle aRect(GetMarkedObjRect()); 726*cdf0e10cSrcweir 727*cdf0e10cSrcweir // #i33755# 728*cdf0e10cSrcweir const sal_Bool bHideHandlesWhenInTextEdit( 729*cdf0e10cSrcweir ((SdrView*)this)->IsTextEdit() 730*cdf0e10cSrcweir && pMarkedObj 731*cdf0e10cSrcweir && pMarkedObj->ISA(SdrTextObj) 732*cdf0e10cSrcweir && ((SdrTextObj*)pMarkedObj)->IsInEditMode()); 733*cdf0e10cSrcweir 734*cdf0e10cSrcweir if(!aRect.IsEmpty() && !bHideHandlesWhenInTextEdit) 735*cdf0e10cSrcweir { // sonst nix gefunden 736*cdf0e10cSrcweir if( bSingleTextObjMark ) 737*cdf0e10cSrcweir { 738*cdf0e10cSrcweir const sal_uIntPtr nSiz0=aHdl.GetHdlCount(); 739*cdf0e10cSrcweir pMarkedObj->AddToHdlList(aHdl); 740*cdf0e10cSrcweir const sal_uIntPtr nSiz1=aHdl.GetHdlCount(); 741*cdf0e10cSrcweir for (sal_uIntPtr i=nSiz0; i<nSiz1; i++) 742*cdf0e10cSrcweir { 743*cdf0e10cSrcweir SdrHdl* pHdl=aHdl.GetHdl(i); 744*cdf0e10cSrcweir pHdl->SetObj(pMarkedObj); 745*cdf0e10cSrcweir pHdl->SetPageView(pMarkedPV); 746*cdf0e10cSrcweir pHdl->SetObjHdlNum(sal_uInt16(i-nSiz0)); 747*cdf0e10cSrcweir } 748*cdf0e10cSrcweir } 749*cdf0e10cSrcweir else if( eDragMode==SDRDRAG_CROP ) 750*cdf0e10cSrcweir { 751*cdf0e10cSrcweir aHdl.AddHdl(new SdrCropHdl(aRect.TopLeft() ,HDL_UPLFT)); 752*cdf0e10cSrcweir aHdl.AddHdl(new SdrCropHdl(aRect.TopCenter() ,HDL_UPPER)); 753*cdf0e10cSrcweir aHdl.AddHdl(new SdrCropHdl(aRect.TopRight() ,HDL_UPRGT)); 754*cdf0e10cSrcweir aHdl.AddHdl(new SdrCropHdl(aRect.LeftCenter() ,HDL_LEFT )); 755*cdf0e10cSrcweir aHdl.AddHdl(new SdrCropHdl(aRect.RightCenter() ,HDL_RIGHT)); 756*cdf0e10cSrcweir aHdl.AddHdl(new SdrCropHdl(aRect.BottomLeft() ,HDL_LWLFT)); 757*cdf0e10cSrcweir aHdl.AddHdl(new SdrCropHdl(aRect.BottomCenter(),HDL_LOWER)); 758*cdf0e10cSrcweir aHdl.AddHdl(new SdrCropHdl(aRect.BottomRight() ,HDL_LWRGT)); 759*cdf0e10cSrcweir } 760*cdf0e10cSrcweir else 761*cdf0e10cSrcweir { 762*cdf0e10cSrcweir sal_Bool bWdt0=aRect.Left()==aRect.Right(); 763*cdf0e10cSrcweir sal_Bool bHgt0=aRect.Top()==aRect.Bottom(); 764*cdf0e10cSrcweir if (bWdt0 && bHgt0) 765*cdf0e10cSrcweir { 766*cdf0e10cSrcweir aHdl.AddHdl(new SdrHdl(aRect.TopLeft(),HDL_UPLFT)); 767*cdf0e10cSrcweir } 768*cdf0e10cSrcweir else if (!bStdDrag && (bWdt0 || bHgt0)) 769*cdf0e10cSrcweir { 770*cdf0e10cSrcweir aHdl.AddHdl(new SdrHdl(aRect.TopLeft() ,HDL_UPLFT)); 771*cdf0e10cSrcweir aHdl.AddHdl(new SdrHdl(aRect.BottomRight(),HDL_LWRGT)); 772*cdf0e10cSrcweir } 773*cdf0e10cSrcweir else 774*cdf0e10cSrcweir { 775*cdf0e10cSrcweir if (!bWdt0 && !bHgt0) aHdl.AddHdl(new SdrHdl(aRect.TopLeft() ,HDL_UPLFT)); 776*cdf0e10cSrcweir if ( !bHgt0) aHdl.AddHdl(new SdrHdl(aRect.TopCenter() ,HDL_UPPER)); 777*cdf0e10cSrcweir if (!bWdt0 && !bHgt0) aHdl.AddHdl(new SdrHdl(aRect.TopRight() ,HDL_UPRGT)); 778*cdf0e10cSrcweir if (!bWdt0 ) aHdl.AddHdl(new SdrHdl(aRect.LeftCenter() ,HDL_LEFT )); 779*cdf0e10cSrcweir if (!bWdt0 ) aHdl.AddHdl(new SdrHdl(aRect.RightCenter() ,HDL_RIGHT)); 780*cdf0e10cSrcweir if (!bWdt0 && !bHgt0) aHdl.AddHdl(new SdrHdl(aRect.BottomLeft() ,HDL_LWLFT)); 781*cdf0e10cSrcweir if ( !bHgt0) aHdl.AddHdl(new SdrHdl(aRect.BottomCenter(),HDL_LOWER)); 782*cdf0e10cSrcweir if (!bWdt0 && !bHgt0) aHdl.AddHdl(new SdrHdl(aRect.BottomRight() ,HDL_LWRGT)); 783*cdf0e10cSrcweir } 784*cdf0e10cSrcweir } 785*cdf0e10cSrcweir } 786*cdf0e10cSrcweir } 787*cdf0e10cSrcweir else 788*cdf0e10cSrcweir { 789*cdf0e10cSrcweir for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++) 790*cdf0e10cSrcweir { 791*cdf0e10cSrcweir const SdrMark* pM=GetSdrMarkByIndex(nMarkNum); 792*cdf0e10cSrcweir SdrObject* pObj=pM->GetMarkedSdrObj(); 793*cdf0e10cSrcweir SdrPageView* pPV=pM->GetPageView(); 794*cdf0e10cSrcweir const sal_uIntPtr nSiz0=aHdl.GetHdlCount(); 795*cdf0e10cSrcweir pObj->AddToHdlList(aHdl); 796*cdf0e10cSrcweir const sal_uIntPtr nSiz1=aHdl.GetHdlCount(); 797*cdf0e10cSrcweir bool bPoly=pObj->IsPolyObj(); 798*cdf0e10cSrcweir const SdrUShortCont* pMrkPnts=pM->GetMarkedPoints(); 799*cdf0e10cSrcweir for (sal_uIntPtr i=nSiz0; i<nSiz1; i++) 800*cdf0e10cSrcweir { 801*cdf0e10cSrcweir SdrHdl* pHdl=aHdl.GetHdl(i); 802*cdf0e10cSrcweir pHdl->SetObj(pObj); 803*cdf0e10cSrcweir pHdl->SetPageView(pPV); 804*cdf0e10cSrcweir pHdl->SetObjHdlNum(sal_uInt16(i-nSiz0)); 805*cdf0e10cSrcweir if (bPoly) 806*cdf0e10cSrcweir { 807*cdf0e10cSrcweir sal_Bool bSelected=pMrkPnts!=NULL && pMrkPnts->Exist(sal_uInt16(i-nSiz0)); 808*cdf0e10cSrcweir pHdl->SetSelected(bSelected); 809*cdf0e10cSrcweir //sal_Bool bPlus=bPlusHdlAlways; 810*cdf0e10cSrcweir if (bPlusHdlAlways || bSelected) 811*cdf0e10cSrcweir { 812*cdf0e10cSrcweir sal_uInt32 nPlusAnz=pObj->GetPlusHdlCount(*pHdl); 813*cdf0e10cSrcweir for (sal_uInt32 nPlusNum=0; nPlusNum<nPlusAnz; nPlusNum++) 814*cdf0e10cSrcweir { 815*cdf0e10cSrcweir SdrHdl* pPlusHdl=pObj->GetPlusHdl(*pHdl,nPlusNum); 816*cdf0e10cSrcweir if (pPlusHdl!=NULL) 817*cdf0e10cSrcweir { 818*cdf0e10cSrcweir pPlusHdl->SetObj(pObj); 819*cdf0e10cSrcweir pPlusHdl->SetPageView(pPV); 820*cdf0e10cSrcweir pPlusHdl->SetPlusHdl(sal_True); 821*cdf0e10cSrcweir aHdl.AddHdl(pPlusHdl); 822*cdf0e10cSrcweir } 823*cdf0e10cSrcweir } 824*cdf0e10cSrcweir } 825*cdf0e10cSrcweir } 826*cdf0e10cSrcweir } 827*cdf0e10cSrcweir } // for nMarkNum 828*cdf0e10cSrcweir } // if bFrmHdl else 829*cdf0e10cSrcweir 830*cdf0e10cSrcweir // GluePoint-Handles 831*cdf0e10cSrcweir for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++) 832*cdf0e10cSrcweir { 833*cdf0e10cSrcweir const SdrMark* pM=GetSdrMarkByIndex(nMarkNum); 834*cdf0e10cSrcweir SdrObject* pObj=pM->GetMarkedSdrObj(); 835*cdf0e10cSrcweir SdrPageView* pPV=pM->GetPageView(); 836*cdf0e10cSrcweir const SdrUShortCont* pMrkGlue=pM->GetMarkedGluePoints(); 837*cdf0e10cSrcweir if (pMrkGlue!=NULL) 838*cdf0e10cSrcweir { 839*cdf0e10cSrcweir const SdrGluePointList* pGPL=pObj->GetGluePointList(); 840*cdf0e10cSrcweir if (pGPL!=NULL) 841*cdf0e10cSrcweir { 842*cdf0e10cSrcweir //sal_uInt16 nGlueAnz=pGPL->GetCount(); 843*cdf0e10cSrcweir sal_uInt16 nAnz=(sal_uInt16)pMrkGlue->GetCount(); 844*cdf0e10cSrcweir for (sal_uInt16 nNum=0; nNum<nAnz; nNum++) 845*cdf0e10cSrcweir { 846*cdf0e10cSrcweir sal_uInt16 nId=pMrkGlue->GetObject(nNum); 847*cdf0e10cSrcweir //nNum changed to nNumGP because already used in for loop 848*cdf0e10cSrcweir sal_uInt16 nNumGP=pGPL->FindGluePoint(nId); 849*cdf0e10cSrcweir if (nNumGP!=SDRGLUEPOINT_NOTFOUND) 850*cdf0e10cSrcweir { 851*cdf0e10cSrcweir const SdrGluePoint& rGP=(*pGPL)[nNumGP]; 852*cdf0e10cSrcweir Point aPos(rGP.GetAbsolutePos(*pObj)); 853*cdf0e10cSrcweir SdrHdl* pGlueHdl=new SdrHdl(aPos,HDL_GLUE); 854*cdf0e10cSrcweir pGlueHdl->SetObj(pObj); 855*cdf0e10cSrcweir pGlueHdl->SetPageView(pPV); 856*cdf0e10cSrcweir pGlueHdl->SetObjHdlNum(nId); 857*cdf0e10cSrcweir aHdl.AddHdl(pGlueHdl); 858*cdf0e10cSrcweir } 859*cdf0e10cSrcweir } 860*cdf0e10cSrcweir } 861*cdf0e10cSrcweir } 862*cdf0e10cSrcweir } 863*cdf0e10cSrcweir 864*cdf0e10cSrcweir // Drehpunkt/Spiegelachse 865*cdf0e10cSrcweir AddDragModeHdl(eDragMode); 866*cdf0e10cSrcweir 867*cdf0e10cSrcweir // add custom handles (used by other apps, e.g. AnchorPos) 868*cdf0e10cSrcweir AddCustomHdl(); 869*cdf0e10cSrcweir 870*cdf0e10cSrcweir // sort handles 871*cdf0e10cSrcweir aHdl.Sort(); 872*cdf0e10cSrcweir 873*cdf0e10cSrcweir // #105722# try to restore focus handle index from remembered values 874*cdf0e10cSrcweir if(bSaveOldFocus) 875*cdf0e10cSrcweir { 876*cdf0e10cSrcweir for(sal_uInt32 a(0); a < aHdl.GetHdlCount(); a++) 877*cdf0e10cSrcweir { 878*cdf0e10cSrcweir SdrHdl* pCandidate = aHdl.GetHdl(a); 879*cdf0e10cSrcweir 880*cdf0e10cSrcweir if(pCandidate->GetObj() 881*cdf0e10cSrcweir && pCandidate->GetObj() == pSaveObj 882*cdf0e10cSrcweir && pCandidate->GetKind() == eSaveKind 883*cdf0e10cSrcweir && pCandidate->GetPolyNum() == nSavePolyNum 884*cdf0e10cSrcweir && pCandidate->GetPointNum() == nSavePointNum) 885*cdf0e10cSrcweir { 886*cdf0e10cSrcweir aHdl.SetFocusHdl(pCandidate); 887*cdf0e10cSrcweir break; 888*cdf0e10cSrcweir } 889*cdf0e10cSrcweir } 890*cdf0e10cSrcweir } 891*cdf0e10cSrcweir } 892*cdf0e10cSrcweir } 893*cdf0e10cSrcweir 894*cdf0e10cSrcweir void SdrMarkView::AddCustomHdl() 895*cdf0e10cSrcweir { 896*cdf0e10cSrcweir // add custom handles (used by other apps, e.g. AnchorPos) 897*cdf0e10cSrcweir } 898*cdf0e10cSrcweir 899*cdf0e10cSrcweir void SdrMarkView::SetDragMode(SdrDragMode eMode) 900*cdf0e10cSrcweir { 901*cdf0e10cSrcweir SdrDragMode eMode0=eDragMode; 902*cdf0e10cSrcweir eDragMode=eMode; 903*cdf0e10cSrcweir if (eDragMode==SDRDRAG_RESIZE) eDragMode=SDRDRAG_MOVE; 904*cdf0e10cSrcweir if (eDragMode!=eMode0) { 905*cdf0e10cSrcweir //HMHBOOL bVis=IsMarkHdlShown(); 906*cdf0e10cSrcweir //HMHif (bVis) HideMarkHdl(); 907*cdf0e10cSrcweir ForceRefToMarked(); 908*cdf0e10cSrcweir SetMarkHandles(); 909*cdf0e10cSrcweir //HMHif (bVis) ShowMarkHdl(); 910*cdf0e10cSrcweir { 911*cdf0e10cSrcweir if (AreObjectsMarked()) MarkListHasChanged(); 912*cdf0e10cSrcweir } 913*cdf0e10cSrcweir } 914*cdf0e10cSrcweir } 915*cdf0e10cSrcweir 916*cdf0e10cSrcweir void SdrMarkView::AddDragModeHdl(SdrDragMode eMode) 917*cdf0e10cSrcweir { 918*cdf0e10cSrcweir switch(eMode) 919*cdf0e10cSrcweir { 920*cdf0e10cSrcweir case SDRDRAG_ROTATE: 921*cdf0e10cSrcweir { 922*cdf0e10cSrcweir // add rotation center 923*cdf0e10cSrcweir SdrHdl* pHdl = new SdrHdl(aRef1, HDL_REF1); 924*cdf0e10cSrcweir 925*cdf0e10cSrcweir aHdl.AddHdl(pHdl); 926*cdf0e10cSrcweir 927*cdf0e10cSrcweir break; 928*cdf0e10cSrcweir } 929*cdf0e10cSrcweir case SDRDRAG_MIRROR: 930*cdf0e10cSrcweir { 931*cdf0e10cSrcweir // add mirror axis 932*cdf0e10cSrcweir SdrHdl* pHdl3 = new SdrHdl(aRef2, HDL_REF2); 933*cdf0e10cSrcweir SdrHdl* pHdl2 = new SdrHdl(aRef1, HDL_REF1); 934*cdf0e10cSrcweir SdrHdl* pHdl1 = new SdrHdlLine(*pHdl2, *pHdl3, HDL_MIRX); 935*cdf0e10cSrcweir 936*cdf0e10cSrcweir pHdl1->SetObjHdlNum(1); // fuer Sortierung 937*cdf0e10cSrcweir pHdl2->SetObjHdlNum(2); // fuer Sortierung 938*cdf0e10cSrcweir pHdl3->SetObjHdlNum(3); // fuer Sortierung 939*cdf0e10cSrcweir 940*cdf0e10cSrcweir aHdl.AddHdl(pHdl1); // Linie als erstes, damit als letztes im HitTest 941*cdf0e10cSrcweir aHdl.AddHdl(pHdl2); 942*cdf0e10cSrcweir aHdl.AddHdl(pHdl3); 943*cdf0e10cSrcweir 944*cdf0e10cSrcweir break; 945*cdf0e10cSrcweir } 946*cdf0e10cSrcweir case SDRDRAG_TRANSPARENCE: 947*cdf0e10cSrcweir { 948*cdf0e10cSrcweir // add interactive transparence handle 949*cdf0e10cSrcweir sal_uIntPtr nMarkAnz = GetMarkedObjectCount(); 950*cdf0e10cSrcweir if(nMarkAnz == 1) 951*cdf0e10cSrcweir { 952*cdf0e10cSrcweir SdrObject* pObj = GetMarkedObjectByIndex(0); 953*cdf0e10cSrcweir SdrModel* pModel = GetModel(); 954*cdf0e10cSrcweir const SfxItemSet& rSet = pObj->GetMergedItemSet(); 955*cdf0e10cSrcweir 956*cdf0e10cSrcweir if(SFX_ITEM_SET != rSet.GetItemState(XATTR_FILLFLOATTRANSPARENCE, sal_False)) 957*cdf0e10cSrcweir { 958*cdf0e10cSrcweir // add this item, it's not yet there 959*cdf0e10cSrcweir XFillFloatTransparenceItem aNewItem( 960*cdf0e10cSrcweir (const XFillFloatTransparenceItem&)rSet.Get(XATTR_FILLFLOATTRANSPARENCE)); 961*cdf0e10cSrcweir XGradient aGrad = aNewItem.GetGradientValue(); 962*cdf0e10cSrcweir 963*cdf0e10cSrcweir aNewItem.SetEnabled(sal_True); 964*cdf0e10cSrcweir aGrad.SetStartIntens(100); 965*cdf0e10cSrcweir aGrad.SetEndIntens(100); 966*cdf0e10cSrcweir aNewItem.SetGradientValue(aGrad); 967*cdf0e10cSrcweir 968*cdf0e10cSrcweir // add undo to allow user to take back this step 969*cdf0e10cSrcweir if( pModel->IsUndoEnabled() ) 970*cdf0e10cSrcweir { 971*cdf0e10cSrcweir pModel->BegUndo(SVX_RESSTR(SIP_XA_FILLTRANSPARENCE)); 972*cdf0e10cSrcweir pModel->AddUndo(pModel->GetSdrUndoFactory().CreateUndoAttrObject(*pObj)); 973*cdf0e10cSrcweir pModel->EndUndo(); 974*cdf0e10cSrcweir } 975*cdf0e10cSrcweir 976*cdf0e10cSrcweir //pObj->SetItemAndBroadcast(aNewItem); 977*cdf0e10cSrcweir SfxItemSet aNewSet(pModel->GetItemPool()); 978*cdf0e10cSrcweir aNewSet.Put(aNewItem); 979*cdf0e10cSrcweir pObj->SetMergedItemSetAndBroadcast(aNewSet); 980*cdf0e10cSrcweir } 981*cdf0e10cSrcweir 982*cdf0e10cSrcweir // set values and transform to vector set 983*cdf0e10cSrcweir GradTransformer aGradTransformer; 984*cdf0e10cSrcweir GradTransVector aGradTransVector; 985*cdf0e10cSrcweir GradTransGradient aGradTransGradient; 986*cdf0e10cSrcweir 987*cdf0e10cSrcweir aGradTransGradient.aGradient = ((XFillFloatTransparenceItem&)rSet.Get(XATTR_FILLFLOATTRANSPARENCE)).GetGradientValue(); 988*cdf0e10cSrcweir aGradTransformer.GradToVec(aGradTransGradient, aGradTransVector, pObj); 989*cdf0e10cSrcweir 990*cdf0e10cSrcweir // build handles 991*cdf0e10cSrcweir const Point aTmpPos1(basegfx::fround(aGradTransVector.maPositionA.getX()), basegfx::fround(aGradTransVector.maPositionA.getY())); 992*cdf0e10cSrcweir const Point aTmpPos2(basegfx::fround(aGradTransVector.maPositionB.getX()), basegfx::fround(aGradTransVector.maPositionB.getY())); 993*cdf0e10cSrcweir SdrHdlColor* pColHdl1 = new SdrHdlColor(aTmpPos1, aGradTransVector.aCol1, SDR_HANDLE_COLOR_SIZE_NORMAL, sal_True); 994*cdf0e10cSrcweir SdrHdlColor* pColHdl2 = new SdrHdlColor(aTmpPos2, aGradTransVector.aCol2, SDR_HANDLE_COLOR_SIZE_NORMAL, sal_True); 995*cdf0e10cSrcweir SdrHdlGradient* pGradHdl = new SdrHdlGradient(aTmpPos1, aTmpPos2, sal_False); 996*cdf0e10cSrcweir DBG_ASSERT(pColHdl1 && pColHdl2 && pGradHdl, "Got not all necessary handles!!"); 997*cdf0e10cSrcweir 998*cdf0e10cSrcweir // link them 999*cdf0e10cSrcweir pGradHdl->SetColorHandles(pColHdl1, pColHdl2); 1000*cdf0e10cSrcweir pGradHdl->SetObj(pObj); 1001*cdf0e10cSrcweir pColHdl1->SetColorChangeHdl(LINK(pGradHdl, SdrHdlGradient, ColorChangeHdl)); 1002*cdf0e10cSrcweir pColHdl2->SetColorChangeHdl(LINK(pGradHdl, SdrHdlGradient, ColorChangeHdl)); 1003*cdf0e10cSrcweir 1004*cdf0e10cSrcweir // insert them 1005*cdf0e10cSrcweir aHdl.AddHdl(pColHdl1); 1006*cdf0e10cSrcweir aHdl.AddHdl(pColHdl2); 1007*cdf0e10cSrcweir aHdl.AddHdl(pGradHdl); 1008*cdf0e10cSrcweir } 1009*cdf0e10cSrcweir break; 1010*cdf0e10cSrcweir } 1011*cdf0e10cSrcweir case SDRDRAG_GRADIENT: 1012*cdf0e10cSrcweir { 1013*cdf0e10cSrcweir // add interactive gradient handle 1014*cdf0e10cSrcweir sal_uIntPtr nMarkAnz = GetMarkedObjectCount(); 1015*cdf0e10cSrcweir if(nMarkAnz == 1) 1016*cdf0e10cSrcweir { 1017*cdf0e10cSrcweir SdrObject* pObj = GetMarkedObjectByIndex(0); 1018*cdf0e10cSrcweir const SfxItemSet& rSet = pObj->GetMergedItemSet(); 1019*cdf0e10cSrcweir XFillStyle eFillStyle = ((XFillStyleItem&)(rSet.Get(XATTR_FILLSTYLE))).GetValue(); 1020*cdf0e10cSrcweir 1021*cdf0e10cSrcweir if(eFillStyle == XFILL_GRADIENT) 1022*cdf0e10cSrcweir { 1023*cdf0e10cSrcweir // set values and transform to vector set 1024*cdf0e10cSrcweir GradTransformer aGradTransformer; 1025*cdf0e10cSrcweir GradTransVector aGradTransVector; 1026*cdf0e10cSrcweir GradTransGradient aGradTransGradient; 1027*cdf0e10cSrcweir Size aHdlSize(15, 15); 1028*cdf0e10cSrcweir 1029*cdf0e10cSrcweir aGradTransGradient.aGradient = ((XFillGradientItem&)rSet.Get(XATTR_FILLGRADIENT)).GetGradientValue(); 1030*cdf0e10cSrcweir aGradTransformer.GradToVec(aGradTransGradient, aGradTransVector, pObj); 1031*cdf0e10cSrcweir 1032*cdf0e10cSrcweir // build handles 1033*cdf0e10cSrcweir const Point aTmpPos1(basegfx::fround(aGradTransVector.maPositionA.getX()), basegfx::fround(aGradTransVector.maPositionA.getY())); 1034*cdf0e10cSrcweir const Point aTmpPos2(basegfx::fround(aGradTransVector.maPositionB.getX()), basegfx::fround(aGradTransVector.maPositionB.getY())); 1035*cdf0e10cSrcweir SdrHdlColor* pColHdl1 = new SdrHdlColor(aTmpPos1, aGradTransVector.aCol1, aHdlSize, sal_False); 1036*cdf0e10cSrcweir SdrHdlColor* pColHdl2 = new SdrHdlColor(aTmpPos2, aGradTransVector.aCol2, aHdlSize, sal_False); 1037*cdf0e10cSrcweir SdrHdlGradient* pGradHdl = new SdrHdlGradient(aTmpPos1, aTmpPos2, sal_True); 1038*cdf0e10cSrcweir DBG_ASSERT(pColHdl1 && pColHdl2 && pGradHdl, "Got not all necessary handles!!"); 1039*cdf0e10cSrcweir 1040*cdf0e10cSrcweir // link them 1041*cdf0e10cSrcweir pGradHdl->SetColorHandles(pColHdl1, pColHdl2); 1042*cdf0e10cSrcweir pGradHdl->SetObj(pObj); 1043*cdf0e10cSrcweir pColHdl1->SetColorChangeHdl(LINK(pGradHdl, SdrHdlGradient, ColorChangeHdl)); 1044*cdf0e10cSrcweir pColHdl2->SetColorChangeHdl(LINK(pGradHdl, SdrHdlGradient, ColorChangeHdl)); 1045*cdf0e10cSrcweir 1046*cdf0e10cSrcweir // insert them 1047*cdf0e10cSrcweir aHdl.AddHdl(pColHdl1); 1048*cdf0e10cSrcweir aHdl.AddHdl(pColHdl2); 1049*cdf0e10cSrcweir aHdl.AddHdl(pGradHdl); 1050*cdf0e10cSrcweir } 1051*cdf0e10cSrcweir } 1052*cdf0e10cSrcweir break; 1053*cdf0e10cSrcweir } 1054*cdf0e10cSrcweir case SDRDRAG_CROP: 1055*cdf0e10cSrcweir { 1056*cdf0e10cSrcweir // todo 1057*cdf0e10cSrcweir break; 1058*cdf0e10cSrcweir } 1059*cdf0e10cSrcweir default: break; 1060*cdf0e10cSrcweir } 1061*cdf0e10cSrcweir } 1062*cdf0e10cSrcweir 1063*cdf0e10cSrcweir /** handle mouse over effects for handles */ 1064*cdf0e10cSrcweir sal_Bool SdrMarkView::MouseMove(const MouseEvent& rMEvt, Window* pWin) 1065*cdf0e10cSrcweir { 1066*cdf0e10cSrcweir if(aHdl.GetHdlCount()) 1067*cdf0e10cSrcweir { 1068*cdf0e10cSrcweir SdrHdl* pMouseOverHdl = 0; 1069*cdf0e10cSrcweir if( !rMEvt.IsLeaveWindow() && pWin ) 1070*cdf0e10cSrcweir { 1071*cdf0e10cSrcweir Point aMDPos( pWin->PixelToLogic( rMEvt.GetPosPixel() ) ); 1072*cdf0e10cSrcweir pMouseOverHdl = PickHandle(aMDPos); 1073*cdf0e10cSrcweir } 1074*cdf0e10cSrcweir 1075*cdf0e10cSrcweir // notify last mouse over handle that he lost the mouse 1076*cdf0e10cSrcweir const sal_uIntPtr nHdlCount = aHdl.GetHdlCount(); 1077*cdf0e10cSrcweir 1078*cdf0e10cSrcweir for(sal_uIntPtr nHdl = 0; nHdl < nHdlCount; nHdl++ ) 1079*cdf0e10cSrcweir { 1080*cdf0e10cSrcweir SdrHdl* pCurrentHdl = GetHdl(nHdl); 1081*cdf0e10cSrcweir if( pCurrentHdl->mbMouseOver ) 1082*cdf0e10cSrcweir { 1083*cdf0e10cSrcweir if( pCurrentHdl != pMouseOverHdl ) 1084*cdf0e10cSrcweir { 1085*cdf0e10cSrcweir pCurrentHdl->mbMouseOver = false; 1086*cdf0e10cSrcweir pCurrentHdl->onMouseLeave(); 1087*cdf0e10cSrcweir } 1088*cdf0e10cSrcweir break; 1089*cdf0e10cSrcweir } 1090*cdf0e10cSrcweir } 1091*cdf0e10cSrcweir 1092*cdf0e10cSrcweir // notify current mouse over handle 1093*cdf0e10cSrcweir if( pMouseOverHdl /* && !pMouseOverHdl->mbMouseOver */ ) 1094*cdf0e10cSrcweir { 1095*cdf0e10cSrcweir pMouseOverHdl->mbMouseOver = true; 1096*cdf0e10cSrcweir pMouseOverHdl->onMouseEnter(rMEvt); 1097*cdf0e10cSrcweir } 1098*cdf0e10cSrcweir } 1099*cdf0e10cSrcweir return SdrSnapView::MouseMove(rMEvt, pWin); 1100*cdf0e10cSrcweir } 1101*cdf0e10cSrcweir 1102*cdf0e10cSrcweir void SdrMarkView::ForceRefToMarked() 1103*cdf0e10cSrcweir { 1104*cdf0e10cSrcweir switch(eDragMode) 1105*cdf0e10cSrcweir { 1106*cdf0e10cSrcweir case SDRDRAG_ROTATE: 1107*cdf0e10cSrcweir { 1108*cdf0e10cSrcweir Rectangle aR(GetMarkedObjRect()); 1109*cdf0e10cSrcweir aRef1 = aR.Center(); 1110*cdf0e10cSrcweir 1111*cdf0e10cSrcweir break; 1112*cdf0e10cSrcweir } 1113*cdf0e10cSrcweir 1114*cdf0e10cSrcweir case SDRDRAG_MIRROR: 1115*cdf0e10cSrcweir { 1116*cdf0e10cSrcweir // Erstmal die laenge der Spiegelachsenlinie berechnen 1117*cdf0e10cSrcweir long nOutMin=0; 1118*cdf0e10cSrcweir long nOutMax=0; 1119*cdf0e10cSrcweir long nMinLen=0; 1120*cdf0e10cSrcweir long nObjDst=0; 1121*cdf0e10cSrcweir long nOutHgt=0; 1122*cdf0e10cSrcweir OutputDevice* pOut=GetFirstOutputDevice(); 1123*cdf0e10cSrcweir //OutputDevice* pOut=GetWin(0); 1124*cdf0e10cSrcweir if (pOut!=NULL) { 1125*cdf0e10cSrcweir // Mindestlaenge 50 Pixel 1126*cdf0e10cSrcweir nMinLen=pOut->PixelToLogic(Size(0,50)).Height(); 1127*cdf0e10cSrcweir // 20 Pixel fuer RefPt-Abstand vom Obj 1128*cdf0e10cSrcweir nObjDst=pOut->PixelToLogic(Size(0,20)).Height(); 1129*cdf0e10cSrcweir // MinY/MaxY 1130*cdf0e10cSrcweir // Abstand zum Rand = Mindestlaenge = 10 Pixel 1131*cdf0e10cSrcweir long nDst=pOut->PixelToLogic(Size(0,10)).Height(); 1132*cdf0e10cSrcweir nOutMin=-pOut->GetMapMode().GetOrigin().Y(); 1133*cdf0e10cSrcweir nOutMax=pOut->GetOutputSize().Height()-1+nOutMin; 1134*cdf0e10cSrcweir nOutMin+=nDst; 1135*cdf0e10cSrcweir nOutMax-=nDst; 1136*cdf0e10cSrcweir // Absolute Mindestlaenge jedoch 10 Pixel 1137*cdf0e10cSrcweir if (nOutMax-nOutMin<nDst) { 1138*cdf0e10cSrcweir nOutMin+=nOutMax+1; 1139*cdf0e10cSrcweir nOutMin/=2; 1140*cdf0e10cSrcweir nOutMin-=(nDst+1)/2; 1141*cdf0e10cSrcweir nOutMax=nOutMin+nDst; 1142*cdf0e10cSrcweir } 1143*cdf0e10cSrcweir nOutHgt=nOutMax-nOutMin; 1144*cdf0e10cSrcweir // Sonst Mindestlaenge = 1/4 OutHgt 1145*cdf0e10cSrcweir long nTemp=nOutHgt/4; 1146*cdf0e10cSrcweir if (nTemp>nMinLen) nMinLen=nTemp; 1147*cdf0e10cSrcweir } 1148*cdf0e10cSrcweir 1149*cdf0e10cSrcweir Rectangle aR(GetMarkedObjBoundRect()); 1150*cdf0e10cSrcweir Point aCenter(aR.Center()); 1151*cdf0e10cSrcweir long nMarkHgt=aR.GetHeight()-1; 1152*cdf0e10cSrcweir long nHgt=nMarkHgt+nObjDst*2; // 20 Pixel obej und unten ueberstehend 1153*cdf0e10cSrcweir if (nHgt<nMinLen) nHgt=nMinLen; // Mindestlaenge 50 Pixel bzw. 1/4 OutHgt 1154*cdf0e10cSrcweir 1155*cdf0e10cSrcweir long nY1=aCenter.Y()-(nHgt+1)/2; 1156*cdf0e10cSrcweir long nY2=nY1+nHgt; 1157*cdf0e10cSrcweir 1158*cdf0e10cSrcweir if (pOut!=NULL && nMinLen>nOutHgt) nMinLen=nOutHgt; // evtl. noch etwas verkuerzen 1159*cdf0e10cSrcweir 1160*cdf0e10cSrcweir if (pOut!=NULL) { // nun vollstaendig in den sichtbaren Bereich schieben 1161*cdf0e10cSrcweir if (nY1<nOutMin) { 1162*cdf0e10cSrcweir nY1=nOutMin; 1163*cdf0e10cSrcweir if (nY2<nY1+nMinLen) nY2=nY1+nMinLen; 1164*cdf0e10cSrcweir } 1165*cdf0e10cSrcweir if (nY2>nOutMax) { 1166*cdf0e10cSrcweir nY2=nOutMax; 1167*cdf0e10cSrcweir if (nY1>nY2-nMinLen) nY1=nY2-nMinLen; 1168*cdf0e10cSrcweir } 1169*cdf0e10cSrcweir } 1170*cdf0e10cSrcweir 1171*cdf0e10cSrcweir aRef1.X()=aCenter.X(); 1172*cdf0e10cSrcweir aRef1.Y()=nY1; 1173*cdf0e10cSrcweir aRef2.X()=aCenter.X(); 1174*cdf0e10cSrcweir aRef2.Y()=nY2; 1175*cdf0e10cSrcweir 1176*cdf0e10cSrcweir break; 1177*cdf0e10cSrcweir } 1178*cdf0e10cSrcweir 1179*cdf0e10cSrcweir case SDRDRAG_TRANSPARENCE: 1180*cdf0e10cSrcweir case SDRDRAG_GRADIENT: 1181*cdf0e10cSrcweir case SDRDRAG_CROP: 1182*cdf0e10cSrcweir { 1183*cdf0e10cSrcweir Rectangle aRect(GetMarkedObjBoundRect()); 1184*cdf0e10cSrcweir aRef1 = aRect.TopLeft(); 1185*cdf0e10cSrcweir aRef2 = aRect.BottomRight(); 1186*cdf0e10cSrcweir break; 1187*cdf0e10cSrcweir } 1188*cdf0e10cSrcweir default: break; 1189*cdf0e10cSrcweir } 1190*cdf0e10cSrcweir } 1191*cdf0e10cSrcweir 1192*cdf0e10cSrcweir void SdrMarkView::SetRef1(const Point& rPt) 1193*cdf0e10cSrcweir { 1194*cdf0e10cSrcweir if(eDragMode == SDRDRAG_ROTATE || eDragMode == SDRDRAG_MIRROR) 1195*cdf0e10cSrcweir { 1196*cdf0e10cSrcweir aRef1 = rPt; 1197*cdf0e10cSrcweir SdrHdl* pH = aHdl.GetHdl(HDL_REF1); 1198*cdf0e10cSrcweir if(pH) 1199*cdf0e10cSrcweir pH->SetPos(rPt); 1200*cdf0e10cSrcweir //HMHShowMarkHdl(); 1201*cdf0e10cSrcweir } 1202*cdf0e10cSrcweir } 1203*cdf0e10cSrcweir 1204*cdf0e10cSrcweir void SdrMarkView::SetRef2(const Point& rPt) 1205*cdf0e10cSrcweir { 1206*cdf0e10cSrcweir if(eDragMode == SDRDRAG_MIRROR) 1207*cdf0e10cSrcweir { 1208*cdf0e10cSrcweir aRef2 = rPt; 1209*cdf0e10cSrcweir SdrHdl* pH = aHdl.GetHdl(HDL_REF2); 1210*cdf0e10cSrcweir if(pH) 1211*cdf0e10cSrcweir pH->SetPos(rPt); 1212*cdf0e10cSrcweir //HMHShowMarkHdl(); 1213*cdf0e10cSrcweir } 1214*cdf0e10cSrcweir } 1215*cdf0e10cSrcweir 1216*cdf0e10cSrcweir void SdrMarkView::CheckMarked() 1217*cdf0e10cSrcweir { 1218*cdf0e10cSrcweir for (sal_uIntPtr nm=GetMarkedObjectCount(); nm>0;) { 1219*cdf0e10cSrcweir nm--; 1220*cdf0e10cSrcweir SdrMark* pM=GetSdrMarkByIndex(nm); 1221*cdf0e10cSrcweir SdrObject* pObj=pM->GetMarkedSdrObj(); 1222*cdf0e10cSrcweir SdrPageView* pPV=pM->GetPageView(); 1223*cdf0e10cSrcweir SdrLayerID nLay=pObj->GetLayer(); 1224*cdf0e10cSrcweir sal_Bool bRaus=!pObj->IsInserted(); // Obj geloescht? 1225*cdf0e10cSrcweir if (!pObj->Is3DObj()) { 1226*cdf0e10cSrcweir bRaus=bRaus || pObj->GetPage()!=pPV->GetPage(); // Obj ploetzlich in anderer Page oder Group 1227*cdf0e10cSrcweir } 1228*cdf0e10cSrcweir bRaus=bRaus || pPV->GetLockedLayers().IsSet(nLay) || // Layer gesperrt? 1229*cdf0e10cSrcweir !pPV->GetVisibleLayers().IsSet(nLay); // Layer nicht sichtbar? 1230*cdf0e10cSrcweir 1231*cdf0e10cSrcweir if( !bRaus ) 1232*cdf0e10cSrcweir bRaus = !pObj->IsVisible(); // not visible objects can not be marked 1233*cdf0e10cSrcweir 1234*cdf0e10cSrcweir if (!bRaus) { 1235*cdf0e10cSrcweir // Joe am 9.3.1997: Gruppierte Objekten koennen nun auch 1236*cdf0e10cSrcweir // markiert werden. Nach EnterGroup muessen aber die Objekte 1237*cdf0e10cSrcweir // der hoeheren Ebene deselektiert werden. 1238*cdf0e10cSrcweir const SdrObjList* pOOL=pObj->GetObjList(); 1239*cdf0e10cSrcweir const SdrObjList* pVOL=pPV->GetObjList(); 1240*cdf0e10cSrcweir while (pOOL!=NULL && pOOL!=pVOL) { 1241*cdf0e10cSrcweir pOOL=pOOL->GetUpList(); 1242*cdf0e10cSrcweir } 1243*cdf0e10cSrcweir bRaus=pOOL!=pVOL; 1244*cdf0e10cSrcweir } 1245*cdf0e10cSrcweir 1246*cdf0e10cSrcweir if (bRaus) 1247*cdf0e10cSrcweir { 1248*cdf0e10cSrcweir GetMarkedObjectListWriteAccess().DeleteMark(nm); 1249*cdf0e10cSrcweir } 1250*cdf0e10cSrcweir else 1251*cdf0e10cSrcweir { 1252*cdf0e10cSrcweir if (!IsGluePointEditMode()) { // Markierte GluePoints nur im GlueEditMode 1253*cdf0e10cSrcweir SdrUShortCont* pPts=pM->GetMarkedGluePoints(); 1254*cdf0e10cSrcweir if (pPts!=NULL && pPts->GetCount()!=0) { 1255*cdf0e10cSrcweir pPts->Clear(); 1256*cdf0e10cSrcweir } 1257*cdf0e10cSrcweir } 1258*cdf0e10cSrcweir } 1259*cdf0e10cSrcweir } 1260*cdf0e10cSrcweir 1261*cdf0e10cSrcweir // #97995# at least reset the remembered BoundRect to prevent handle 1262*cdf0e10cSrcweir // generation if bForceFrameHandles is TRUE. 1263*cdf0e10cSrcweir bMarkedObjRectDirty = sal_True; 1264*cdf0e10cSrcweir } 1265*cdf0e10cSrcweir 1266*cdf0e10cSrcweir void SdrMarkView::SetMarkRects() 1267*cdf0e10cSrcweir { 1268*cdf0e10cSrcweir SdrPageView* pPV = GetSdrPageView(); 1269*cdf0e10cSrcweir 1270*cdf0e10cSrcweir if(pPV) 1271*cdf0e10cSrcweir { 1272*cdf0e10cSrcweir pPV->SetHasMarkedObj(GetSnapRectFromMarkedObjects(pPV, pPV->MarkSnap())); 1273*cdf0e10cSrcweir GetBoundRectFromMarkedObjects(pPV, pPV->MarkBound()); 1274*cdf0e10cSrcweir } 1275*cdf0e10cSrcweir } 1276*cdf0e10cSrcweir 1277*cdf0e10cSrcweir void SdrMarkView::SetFrameHandles(sal_Bool bOn) 1278*cdf0e10cSrcweir { 1279*cdf0e10cSrcweir if (bOn!=bForceFrameHandles) { 1280*cdf0e10cSrcweir sal_Bool bOld=ImpIsFrameHandles(); 1281*cdf0e10cSrcweir bForceFrameHandles=bOn; 1282*cdf0e10cSrcweir sal_Bool bNew=ImpIsFrameHandles(); 1283*cdf0e10cSrcweir if (bNew!=bOld) { 1284*cdf0e10cSrcweir AdjustMarkHdl(); //HMHTRUE); 1285*cdf0e10cSrcweir MarkListHasChanged(); 1286*cdf0e10cSrcweir } 1287*cdf0e10cSrcweir } 1288*cdf0e10cSrcweir } 1289*cdf0e10cSrcweir 1290*cdf0e10cSrcweir void SdrMarkView::SetEditMode(SdrViewEditMode eMode) 1291*cdf0e10cSrcweir { 1292*cdf0e10cSrcweir if (eMode!=eEditMode) { 1293*cdf0e10cSrcweir sal_Bool bGlue0=eEditMode==SDREDITMODE_GLUEPOINTEDIT; 1294*cdf0e10cSrcweir sal_Bool bEdge0=((SdrCreateView*)this)->IsEdgeTool(); 1295*cdf0e10cSrcweir eEditMode0=eEditMode; 1296*cdf0e10cSrcweir eEditMode=eMode; 1297*cdf0e10cSrcweir sal_Bool bGlue1=eEditMode==SDREDITMODE_GLUEPOINTEDIT; 1298*cdf0e10cSrcweir sal_Bool bEdge1=((SdrCreateView*)this)->IsEdgeTool(); 1299*cdf0e10cSrcweir // etwas Aufwand um Flackern zu verhindern beim Umschalten 1300*cdf0e10cSrcweir // zwischen GlueEdit und EdgeTool 1301*cdf0e10cSrcweir if (bGlue1 && !bGlue0) ImpSetGlueVisible2(bGlue1); 1302*cdf0e10cSrcweir if (bEdge1!=bEdge0) ImpSetGlueVisible3(bEdge1); 1303*cdf0e10cSrcweir if (!bGlue1 && bGlue0) ImpSetGlueVisible2(bGlue1); 1304*cdf0e10cSrcweir if (bGlue0 && !bGlue1) UnmarkAllGluePoints(); 1305*cdf0e10cSrcweir } 1306*cdf0e10cSrcweir } 1307*cdf0e10cSrcweir 1308*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 1309*cdf0e10cSrcweir 1310*cdf0e10cSrcweir sal_Bool SdrMarkView::IsObjMarkable(SdrObject* pObj, SdrPageView* pPV) const 1311*cdf0e10cSrcweir { 1312*cdf0e10cSrcweir if (pObj) 1313*cdf0e10cSrcweir { 1314*cdf0e10cSrcweir if (pObj->IsMarkProtect() || 1315*cdf0e10cSrcweir (!bDesignMode && pObj->IsUnoObj())) 1316*cdf0e10cSrcweir { 1317*cdf0e10cSrcweir // Objekt nicht selektierbar oder 1318*cdf0e10cSrcweir // SdrUnoObj nicht im DesignMode 1319*cdf0e10cSrcweir return sal_False; 1320*cdf0e10cSrcweir } 1321*cdf0e10cSrcweir } 1322*cdf0e10cSrcweir return pPV!=NULL ? pPV->IsObjMarkable(pObj) : sal_True; 1323*cdf0e10cSrcweir } 1324*cdf0e10cSrcweir 1325*cdf0e10cSrcweir sal_Bool SdrMarkView::IsMarkedObjHit(const Point& rPnt, short nTol) const 1326*cdf0e10cSrcweir { 1327*cdf0e10cSrcweir sal_Bool bRet=sal_False; 1328*cdf0e10cSrcweir nTol=ImpGetHitTolLogic(nTol,NULL); 1329*cdf0e10cSrcweir Point aPt(rPnt); 1330*cdf0e10cSrcweir for (sal_uIntPtr nm=0; nm<GetMarkedObjectCount() && !bRet; nm++) { 1331*cdf0e10cSrcweir SdrMark* pM=GetSdrMarkByIndex(nm); 1332*cdf0e10cSrcweir bRet = 0 != CheckSingleSdrObjectHit(aPt,sal_uInt16(nTol),pM->GetMarkedSdrObj(),pM->GetPageView(),0,0); 1333*cdf0e10cSrcweir } 1334*cdf0e10cSrcweir return bRet; 1335*cdf0e10cSrcweir } 1336*cdf0e10cSrcweir 1337*cdf0e10cSrcweir SdrHdl* SdrMarkView::PickHandle(const Point& rPnt, sal_uIntPtr nOptions, SdrHdl* pHdl0) const 1338*cdf0e10cSrcweir { 1339*cdf0e10cSrcweir if (bSomeObjChgdFlag) { // ggf. Handles neu berechnen lassen! 1340*cdf0e10cSrcweir FlushComeBackTimer(); 1341*cdf0e10cSrcweir } 1342*cdf0e10cSrcweir sal_Bool bBack=(nOptions & SDRSEARCH_BACKWARD) !=0; 1343*cdf0e10cSrcweir sal_Bool bNext=(nOptions & SDRSEARCH_NEXT) !=0; 1344*cdf0e10cSrcweir Point aPt(rPnt); 1345*cdf0e10cSrcweir return aHdl.IsHdlListHit(aPt,bBack,bNext,pHdl0); 1346*cdf0e10cSrcweir } 1347*cdf0e10cSrcweir 1348*cdf0e10cSrcweir sal_Bool SdrMarkView::MarkObj(const Point& rPnt, short nTol, sal_Bool bToggle, sal_Bool bDeep) 1349*cdf0e10cSrcweir { 1350*cdf0e10cSrcweir SdrObject* pObj; 1351*cdf0e10cSrcweir SdrPageView* pPV; 1352*cdf0e10cSrcweir nTol=ImpGetHitTolLogic(nTol,NULL); 1353*cdf0e10cSrcweir sal_uIntPtr nOptions=SDRSEARCH_PICKMARKABLE; 1354*cdf0e10cSrcweir if (bDeep) nOptions=nOptions|SDRSEARCH_DEEP; 1355*cdf0e10cSrcweir sal_Bool bRet=PickObj(rPnt,(sal_uInt16)nTol,pObj,pPV,nOptions); 1356*cdf0e10cSrcweir if (bRet) { 1357*cdf0e10cSrcweir sal_Bool bUnmark=bToggle && IsObjMarked(pObj); 1358*cdf0e10cSrcweir MarkObj(pObj,pPV,bUnmark); 1359*cdf0e10cSrcweir } 1360*cdf0e10cSrcweir return bRet; 1361*cdf0e10cSrcweir } 1362*cdf0e10cSrcweir 1363*cdf0e10cSrcweir sal_Bool SdrMarkView::MarkNextObj(sal_Bool bPrev) 1364*cdf0e10cSrcweir { 1365*cdf0e10cSrcweir SdrPageView* pPageView = GetSdrPageView(); 1366*cdf0e10cSrcweir 1367*cdf0e10cSrcweir if(!pPageView) 1368*cdf0e10cSrcweir { 1369*cdf0e10cSrcweir return sal_False; 1370*cdf0e10cSrcweir } 1371*cdf0e10cSrcweir 1372*cdf0e10cSrcweir SortMarkedObjects(); 1373*cdf0e10cSrcweir sal_uIntPtr nMarkAnz=GetMarkedObjectCount(); 1374*cdf0e10cSrcweir sal_uIntPtr nChgMarkNum = ULONG_MAX; // Nummer des zu ersetzenden MarkEntries 1375*cdf0e10cSrcweir sal_uIntPtr nSearchObjNum = bPrev ? 0 : ULONG_MAX; 1376*cdf0e10cSrcweir if (nMarkAnz!=0) { 1377*cdf0e10cSrcweir nChgMarkNum=bPrev ? 0 : sal_uIntPtr(nMarkAnz-1); 1378*cdf0e10cSrcweir SdrMark* pM=GetSdrMarkByIndex(nChgMarkNum); 1379*cdf0e10cSrcweir OSL_ASSERT(pM!=NULL); 1380*cdf0e10cSrcweir if (pM->GetMarkedSdrObj() != NULL) 1381*cdf0e10cSrcweir nSearchObjNum = pM->GetMarkedSdrObj()->GetNavigationPosition(); 1382*cdf0e10cSrcweir } 1383*cdf0e10cSrcweir 1384*cdf0e10cSrcweir SdrObject* pMarkObj=NULL; 1385*cdf0e10cSrcweir SdrObjList* pSearchObjList=pPageView->GetObjList(); 1386*cdf0e10cSrcweir sal_uIntPtr nObjAnz=pSearchObjList->GetObjCount(); 1387*cdf0e10cSrcweir if (nObjAnz!=0) { 1388*cdf0e10cSrcweir if (nSearchObjNum>nObjAnz) nSearchObjNum=nObjAnz; 1389*cdf0e10cSrcweir while (pMarkObj==NULL && ((!bPrev && nSearchObjNum>0) || (bPrev && nSearchObjNum<nObjAnz))) 1390*cdf0e10cSrcweir { 1391*cdf0e10cSrcweir if (!bPrev) 1392*cdf0e10cSrcweir nSearchObjNum--; 1393*cdf0e10cSrcweir SdrObject* pSearchObj = pSearchObjList->GetObjectForNavigationPosition(nSearchObjNum); 1394*cdf0e10cSrcweir if (IsObjMarkable(pSearchObj,pPageView)) 1395*cdf0e10cSrcweir { 1396*cdf0e10cSrcweir if (TryToFindMarkedObject(pSearchObj)==CONTAINER_ENTRY_NOTFOUND) 1397*cdf0e10cSrcweir { 1398*cdf0e10cSrcweir pMarkObj=pSearchObj; 1399*cdf0e10cSrcweir } 1400*cdf0e10cSrcweir } 1401*cdf0e10cSrcweir if (bPrev) nSearchObjNum++; 1402*cdf0e10cSrcweir } 1403*cdf0e10cSrcweir } 1404*cdf0e10cSrcweir 1405*cdf0e10cSrcweir if(!pMarkObj) 1406*cdf0e10cSrcweir { 1407*cdf0e10cSrcweir return sal_False; 1408*cdf0e10cSrcweir } 1409*cdf0e10cSrcweir 1410*cdf0e10cSrcweir if (nChgMarkNum!=ULONG_MAX) 1411*cdf0e10cSrcweir { 1412*cdf0e10cSrcweir GetMarkedObjectListWriteAccess().DeleteMark(nChgMarkNum); 1413*cdf0e10cSrcweir } 1414*cdf0e10cSrcweir MarkObj(pMarkObj,pPageView); // ruft auch MarkListHasChanged(), AdjustMarkHdl() 1415*cdf0e10cSrcweir return sal_True; 1416*cdf0e10cSrcweir } 1417*cdf0e10cSrcweir 1418*cdf0e10cSrcweir sal_Bool SdrMarkView::MarkNextObj(const Point& rPnt, short nTol, sal_Bool bPrev) 1419*cdf0e10cSrcweir { 1420*cdf0e10cSrcweir SortMarkedObjects(); 1421*cdf0e10cSrcweir nTol=ImpGetHitTolLogic(nTol,NULL); 1422*cdf0e10cSrcweir Point aPt(rPnt); 1423*cdf0e10cSrcweir SdrMark* pTopMarkHit=NULL; 1424*cdf0e10cSrcweir SdrMark* pBtmMarkHit=NULL; 1425*cdf0e10cSrcweir sal_uIntPtr nTopMarkHit=0; 1426*cdf0e10cSrcweir sal_uIntPtr nBtmMarkHit=0; 1427*cdf0e10cSrcweir // oberstes der markierten Objekte suchen, das von rPnt getroffen wird 1428*cdf0e10cSrcweir sal_uIntPtr nMarkAnz=GetMarkedObjectCount(); 1429*cdf0e10cSrcweir sal_uIntPtr nm=0; 1430*cdf0e10cSrcweir for (nm=nMarkAnz; nm>0 && pTopMarkHit==NULL;) { 1431*cdf0e10cSrcweir nm--; 1432*cdf0e10cSrcweir SdrMark* pM=GetSdrMarkByIndex(nm); 1433*cdf0e10cSrcweir if(CheckSingleSdrObjectHit(aPt,sal_uInt16(nTol),pM->GetMarkedSdrObj(),pM->GetPageView(),0,0)) 1434*cdf0e10cSrcweir { 1435*cdf0e10cSrcweir pTopMarkHit=pM; 1436*cdf0e10cSrcweir nTopMarkHit=nm; 1437*cdf0e10cSrcweir } 1438*cdf0e10cSrcweir } 1439*cdf0e10cSrcweir // Nichts gefunden, dann ganz normal ein Obj markieren. 1440*cdf0e10cSrcweir if (pTopMarkHit==NULL) return MarkObj(rPnt,sal_uInt16(nTol),sal_False); 1441*cdf0e10cSrcweir 1442*cdf0e10cSrcweir SdrObject* pTopObjHit=pTopMarkHit->GetMarkedSdrObj(); 1443*cdf0e10cSrcweir SdrObjList* pObjList=pTopObjHit->GetObjList(); 1444*cdf0e10cSrcweir SdrPageView* pPV=pTopMarkHit->GetPageView(); 1445*cdf0e10cSrcweir // unterstes der markierten Objekte suchen, das von rPnt getroffen wird 1446*cdf0e10cSrcweir // und auf der gleichen PageView liegt wie pTopMarkHit 1447*cdf0e10cSrcweir for (nm=0; nm<nMarkAnz && pBtmMarkHit==NULL; nm++) { 1448*cdf0e10cSrcweir SdrMark* pM=GetSdrMarkByIndex(nm); 1449*cdf0e10cSrcweir SdrPageView* pPV2=pM->GetPageView(); 1450*cdf0e10cSrcweir if (pPV2==pPV && CheckSingleSdrObjectHit(aPt,sal_uInt16(nTol),pM->GetMarkedSdrObj(),pPV2,0,0)) 1451*cdf0e10cSrcweir { 1452*cdf0e10cSrcweir pBtmMarkHit=pM; 1453*cdf0e10cSrcweir nBtmMarkHit=nm; 1454*cdf0e10cSrcweir } 1455*cdf0e10cSrcweir } 1456*cdf0e10cSrcweir if (pBtmMarkHit==NULL) { pBtmMarkHit=pTopMarkHit; nBtmMarkHit=nTopMarkHit; } 1457*cdf0e10cSrcweir SdrObject* pBtmObjHit=pBtmMarkHit->GetMarkedSdrObj(); 1458*cdf0e10cSrcweir sal_uIntPtr nObjAnz=pObjList->GetObjCount(); 1459*cdf0e10cSrcweir 1460*cdf0e10cSrcweir // #110988# 1461*cdf0e10cSrcweir //sal_uIntPtr nSearchBeg=bPrev ? pBtmObjHit->GetOrdNum()+1 : pTopObjHit->GetOrdNum(); 1462*cdf0e10cSrcweir sal_uInt32 nSearchBeg; 1463*cdf0e10cSrcweir E3dScene* pScene = NULL; 1464*cdf0e10cSrcweir SdrObject* pObjHit = (bPrev) ? pBtmObjHit : pTopObjHit; 1465*cdf0e10cSrcweir sal_Bool bRemap = pObjHit->ISA(E3dCompoundObject) 1466*cdf0e10cSrcweir ? ((E3dCompoundObject*)pObjHit)->IsAOrdNumRemapCandidate(pScene) 1467*cdf0e10cSrcweir : sal_False; 1468*cdf0e10cSrcweir 1469*cdf0e10cSrcweir if(bPrev) 1470*cdf0e10cSrcweir { 1471*cdf0e10cSrcweir sal_uInt32 nOrdNumBtm(pBtmObjHit->GetOrdNum()); 1472*cdf0e10cSrcweir 1473*cdf0e10cSrcweir if(bRemap) 1474*cdf0e10cSrcweir { 1475*cdf0e10cSrcweir nOrdNumBtm = pScene->RemapOrdNum(nOrdNumBtm); 1476*cdf0e10cSrcweir } 1477*cdf0e10cSrcweir 1478*cdf0e10cSrcweir nSearchBeg = nOrdNumBtm + 1; 1479*cdf0e10cSrcweir } 1480*cdf0e10cSrcweir else 1481*cdf0e10cSrcweir { 1482*cdf0e10cSrcweir sal_uInt32 nOrdNumTop(pTopObjHit->GetOrdNum()); 1483*cdf0e10cSrcweir 1484*cdf0e10cSrcweir if(bRemap) 1485*cdf0e10cSrcweir { 1486*cdf0e10cSrcweir nOrdNumTop = pScene->RemapOrdNum(nOrdNumTop); 1487*cdf0e10cSrcweir } 1488*cdf0e10cSrcweir 1489*cdf0e10cSrcweir nSearchBeg = nOrdNumTop; 1490*cdf0e10cSrcweir } 1491*cdf0e10cSrcweir 1492*cdf0e10cSrcweir sal_uIntPtr no=nSearchBeg; 1493*cdf0e10cSrcweir SdrObject* pFndObj=NULL; 1494*cdf0e10cSrcweir //SdrObject* pAktObj=NULL; 1495*cdf0e10cSrcweir while (pFndObj==NULL && ((!bPrev && no>0) || (bPrev && no<nObjAnz))) { 1496*cdf0e10cSrcweir if (!bPrev) no--; 1497*cdf0e10cSrcweir SdrObject* pObj; 1498*cdf0e10cSrcweir 1499*cdf0e10cSrcweir if(bRemap) 1500*cdf0e10cSrcweir { 1501*cdf0e10cSrcweir pObj = pObjList->GetObj(pScene->RemapOrdNum(no)); 1502*cdf0e10cSrcweir } 1503*cdf0e10cSrcweir else 1504*cdf0e10cSrcweir { 1505*cdf0e10cSrcweir pObj = pObjList->GetObj(no); 1506*cdf0e10cSrcweir } 1507*cdf0e10cSrcweir 1508*cdf0e10cSrcweir if (CheckSingleSdrObjectHit(aPt,sal_uInt16(nTol),pObj,pPV,SDRSEARCH_TESTMARKABLE,0)) 1509*cdf0e10cSrcweir { 1510*cdf0e10cSrcweir if (TryToFindMarkedObject(pObj)==CONTAINER_ENTRY_NOTFOUND) { 1511*cdf0e10cSrcweir pFndObj=pObj; 1512*cdf0e10cSrcweir } else { 1513*cdf0e10cSrcweir // hier wg. Performance ggf. noch no auf Top bzw. auf Btm stellen 1514*cdf0e10cSrcweir } 1515*cdf0e10cSrcweir } 1516*cdf0e10cSrcweir if (bPrev) no++; 1517*cdf0e10cSrcweir } 1518*cdf0e10cSrcweir if (pFndObj!=NULL) 1519*cdf0e10cSrcweir { 1520*cdf0e10cSrcweir GetMarkedObjectListWriteAccess().DeleteMark(bPrev?nBtmMarkHit:nTopMarkHit); 1521*cdf0e10cSrcweir GetMarkedObjectListWriteAccess().InsertEntry(SdrMark(pFndObj,pPV)); 1522*cdf0e10cSrcweir MarkListHasChanged(); 1523*cdf0e10cSrcweir AdjustMarkHdl(); //HMHTRUE); 1524*cdf0e10cSrcweir } 1525*cdf0e10cSrcweir return pFndObj!=NULL; 1526*cdf0e10cSrcweir } 1527*cdf0e10cSrcweir 1528*cdf0e10cSrcweir sal_Bool SdrMarkView::MarkObj(const Rectangle& rRect, sal_Bool bUnmark) 1529*cdf0e10cSrcweir { 1530*cdf0e10cSrcweir sal_Bool bFnd=sal_False; 1531*cdf0e10cSrcweir Rectangle aR(rRect); 1532*cdf0e10cSrcweir SdrObject* pObj; 1533*cdf0e10cSrcweir SdrObjList* pObjList; 1534*cdf0e10cSrcweir BrkAction(); 1535*cdf0e10cSrcweir SdrPageView* pPV = GetSdrPageView(); 1536*cdf0e10cSrcweir 1537*cdf0e10cSrcweir if(pPV) 1538*cdf0e10cSrcweir { 1539*cdf0e10cSrcweir pObjList=pPV->GetObjList(); 1540*cdf0e10cSrcweir Rectangle aFrm1(aR); 1541*cdf0e10cSrcweir sal_uIntPtr nObjAnz=pObjList->GetObjCount(); 1542*cdf0e10cSrcweir for (sal_uIntPtr nO=0; nO<nObjAnz; nO++) { 1543*cdf0e10cSrcweir pObj=pObjList->GetObj(nO); 1544*cdf0e10cSrcweir Rectangle aRect(pObj->GetCurrentBoundRect()); 1545*cdf0e10cSrcweir if (aFrm1.IsInside(aRect)) { 1546*cdf0e10cSrcweir if (!bUnmark) { 1547*cdf0e10cSrcweir if (IsObjMarkable(pObj,pPV)) 1548*cdf0e10cSrcweir { 1549*cdf0e10cSrcweir GetMarkedObjectListWriteAccess().InsertEntry(SdrMark(pObj,pPV)); 1550*cdf0e10cSrcweir bFnd=sal_True; 1551*cdf0e10cSrcweir } 1552*cdf0e10cSrcweir } else { 1553*cdf0e10cSrcweir sal_uIntPtr nPos=TryToFindMarkedObject(pObj); 1554*cdf0e10cSrcweir if (nPos!=CONTAINER_ENTRY_NOTFOUND) 1555*cdf0e10cSrcweir { 1556*cdf0e10cSrcweir GetMarkedObjectListWriteAccess().DeleteMark(nPos); 1557*cdf0e10cSrcweir bFnd=sal_True; 1558*cdf0e10cSrcweir } 1559*cdf0e10cSrcweir } 1560*cdf0e10cSrcweir } 1561*cdf0e10cSrcweir } 1562*cdf0e10cSrcweir } 1563*cdf0e10cSrcweir if (bFnd) { 1564*cdf0e10cSrcweir SortMarkedObjects(); 1565*cdf0e10cSrcweir MarkListHasChanged(); 1566*cdf0e10cSrcweir AdjustMarkHdl(); //HMHTRUE); 1567*cdf0e10cSrcweir //HMHShowMarkHdl(); 1568*cdf0e10cSrcweir } 1569*cdf0e10cSrcweir return bFnd; 1570*cdf0e10cSrcweir } 1571*cdf0e10cSrcweir 1572*cdf0e10cSrcweir void SdrMarkView::MarkObj(SdrObject* pObj, SdrPageView* pPV, sal_Bool bUnmark, sal_Bool bImpNoSetMarkHdl) 1573*cdf0e10cSrcweir { 1574*cdf0e10cSrcweir if (pObj!=NULL && pPV!=NULL && IsObjMarkable(pObj, pPV)) { 1575*cdf0e10cSrcweir BrkAction(); 1576*cdf0e10cSrcweir if (!bUnmark) 1577*cdf0e10cSrcweir { 1578*cdf0e10cSrcweir GetMarkedObjectListWriteAccess().InsertEntry(SdrMark(pObj,pPV)); 1579*cdf0e10cSrcweir } 1580*cdf0e10cSrcweir else 1581*cdf0e10cSrcweir { 1582*cdf0e10cSrcweir sal_uIntPtr nPos=TryToFindMarkedObject(pObj); 1583*cdf0e10cSrcweir if (nPos!=CONTAINER_ENTRY_NOTFOUND) 1584*cdf0e10cSrcweir { 1585*cdf0e10cSrcweir GetMarkedObjectListWriteAccess().DeleteMark(nPos); 1586*cdf0e10cSrcweir } 1587*cdf0e10cSrcweir } 1588*cdf0e10cSrcweir if (!bImpNoSetMarkHdl) { 1589*cdf0e10cSrcweir MarkListHasChanged(); 1590*cdf0e10cSrcweir AdjustMarkHdl(); //HMHTRUE); 1591*cdf0e10cSrcweir //HMHif (!bSomeObjChgdFlag) { 1592*cdf0e10cSrcweir // ShowMarkHdl kommt sonst mit dem AfterPaintTimer 1593*cdf0e10cSrcweir //HMHShowMarkHdl(); 1594*cdf0e10cSrcweir //HMH} 1595*cdf0e10cSrcweir } 1596*cdf0e10cSrcweir } 1597*cdf0e10cSrcweir } 1598*cdf0e10cSrcweir 1599*cdf0e10cSrcweir sal_Bool SdrMarkView::IsObjMarked(SdrObject* pObj) const 1600*cdf0e10cSrcweir { 1601*cdf0e10cSrcweir // nicht so ganz die feine Art: Da FindObject() nicht const ist 1602*cdf0e10cSrcweir // muss ich mich hier auf non-const casten. 1603*cdf0e10cSrcweir sal_uIntPtr nPos=((SdrMarkView*)this)->TryToFindMarkedObject(pObj); 1604*cdf0e10cSrcweir return nPos!=CONTAINER_ENTRY_NOTFOUND; 1605*cdf0e10cSrcweir } 1606*cdf0e10cSrcweir 1607*cdf0e10cSrcweir sal_uInt16 SdrMarkView::GetMarkHdlSizePixel() const 1608*cdf0e10cSrcweir { 1609*cdf0e10cSrcweir return aHdl.GetHdlSize()*2+1; 1610*cdf0e10cSrcweir } 1611*cdf0e10cSrcweir 1612*cdf0e10cSrcweir void SdrMarkView::SetSolidMarkHdl(sal_Bool bOn) 1613*cdf0e10cSrcweir { 1614*cdf0e10cSrcweir if (bOn!=aHdl.IsFineHdl()) { 1615*cdf0e10cSrcweir //HMHBOOL bMerk=IsMarkHdlShown(); 1616*cdf0e10cSrcweir //HMHif (bMerk) HideMarkHdl(); 1617*cdf0e10cSrcweir aHdl.SetFineHdl(bOn); 1618*cdf0e10cSrcweir //HMHif (bMerk) ShowMarkHdl(); 1619*cdf0e10cSrcweir } 1620*cdf0e10cSrcweir } 1621*cdf0e10cSrcweir 1622*cdf0e10cSrcweir void SdrMarkView::SetMarkHdlSizePixel(sal_uInt16 nSiz) 1623*cdf0e10cSrcweir { 1624*cdf0e10cSrcweir if (nSiz<3) nSiz=3; 1625*cdf0e10cSrcweir nSiz/=2; 1626*cdf0e10cSrcweir if (nSiz!=aHdl.GetHdlSize()) { 1627*cdf0e10cSrcweir //HMHBOOL bMerk=IsMarkHdlShown(); 1628*cdf0e10cSrcweir //HMHif (bMerk) HideMarkHdl(); 1629*cdf0e10cSrcweir aHdl.SetHdlSize(nSiz); 1630*cdf0e10cSrcweir //HMHif (bMerk) ShowMarkHdl(); 1631*cdf0e10cSrcweir } 1632*cdf0e10cSrcweir } 1633*cdf0e10cSrcweir 1634*cdf0e10cSrcweir #define SDRSEARCH_IMPISMASTER 0x80000000 /* MasterPage wird gerade durchsucht */ 1635*cdf0e10cSrcweir SdrObject* SdrMarkView::CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObject* pObj, SdrPageView* pPV, sal_uIntPtr nOptions, const SetOfByte* pMVisLay) const 1636*cdf0e10cSrcweir { 1637*cdf0e10cSrcweir if(((nOptions & SDRSEARCH_IMPISMASTER) && pObj->IsNotVisibleAsMaster()) || (!pObj->IsVisible())) 1638*cdf0e10cSrcweir { 1639*cdf0e10cSrcweir return NULL; 1640*cdf0e10cSrcweir } 1641*cdf0e10cSrcweir 1642*cdf0e10cSrcweir const bool bCheckIfMarkable(nOptions & SDRSEARCH_TESTMARKABLE); 1643*cdf0e10cSrcweir const bool bDeep(nOptions & SDRSEARCH_DEEP); 1644*cdf0e10cSrcweir const bool bOLE(pObj->ISA(SdrOle2Obj)); 1645*cdf0e10cSrcweir const bool bTXT(pObj->ISA(SdrTextObj) && ((SdrTextObj*)pObj)->IsTextFrame()); 1646*cdf0e10cSrcweir SdrObject* pRet=NULL; 1647*cdf0e10cSrcweir Rectangle aRect(pObj->GetCurrentBoundRect()); 1648*cdf0e10cSrcweir sal_uInt16 nTol2(nTol); 1649*cdf0e10cSrcweir 1650*cdf0e10cSrcweir // double tolerance for OLE, text frames and objects in 1651*cdf0e10cSrcweir // active text edit 1652*cdf0e10cSrcweir if(bOLE || bTXT || pObj==((SdrObjEditView*)this)->GetTextEditObject()) 1653*cdf0e10cSrcweir { 1654*cdf0e10cSrcweir nTol2*=2; 1655*cdf0e10cSrcweir } 1656*cdf0e10cSrcweir 1657*cdf0e10cSrcweir aRect.Left ()-=nTol2; // Einmal Toleranz drauf fuer alle Objekte 1658*cdf0e10cSrcweir aRect.Top ()-=nTol2; 1659*cdf0e10cSrcweir aRect.Right ()+=nTol2; 1660*cdf0e10cSrcweir aRect.Bottom()+=nTol2; 1661*cdf0e10cSrcweir 1662*cdf0e10cSrcweir if (aRect.IsInside(rPnt)) 1663*cdf0e10cSrcweir { 1664*cdf0e10cSrcweir if ((!bCheckIfMarkable || IsObjMarkable(pObj,pPV))) 1665*cdf0e10cSrcweir { 1666*cdf0e10cSrcweir SdrObjList* pOL=pObj->GetSubList(); 1667*cdf0e10cSrcweir 1668*cdf0e10cSrcweir if (pOL!=NULL && pOL->GetObjCount()!=0) 1669*cdf0e10cSrcweir { 1670*cdf0e10cSrcweir SdrObject* pTmpObj; 1671*cdf0e10cSrcweir // OD 30.06.2003 #108784# - adjustment hit point for virtual 1672*cdf0e10cSrcweir // objects. 1673*cdf0e10cSrcweir Point aPnt( rPnt ); 1674*cdf0e10cSrcweir 1675*cdf0e10cSrcweir if ( pObj->ISA(SdrVirtObj) ) 1676*cdf0e10cSrcweir { 1677*cdf0e10cSrcweir Point aOffset = static_cast<SdrVirtObj*>(pObj)->GetOffset(); 1678*cdf0e10cSrcweir aPnt.Move( -aOffset.X(), -aOffset.Y() ); 1679*cdf0e10cSrcweir } 1680*cdf0e10cSrcweir 1681*cdf0e10cSrcweir pRet=CheckSingleSdrObjectHit(aPnt,nTol,pOL,pPV,nOptions,pMVisLay,pTmpObj); 1682*cdf0e10cSrcweir } 1683*cdf0e10cSrcweir else 1684*cdf0e10cSrcweir { 1685*cdf0e10cSrcweir if(!pMVisLay || pMVisLay->IsSet(pObj->GetLayer())) 1686*cdf0e10cSrcweir { 1687*cdf0e10cSrcweir pRet = SdrObjectPrimitiveHit(*pObj, rPnt, nTol2, *pPV, &pPV->GetVisibleLayers(), false); 1688*cdf0e10cSrcweir } 1689*cdf0e10cSrcweir } 1690*cdf0e10cSrcweir } 1691*cdf0e10cSrcweir } 1692*cdf0e10cSrcweir 1693*cdf0e10cSrcweir if (!bDeep && pRet!=NULL) 1694*cdf0e10cSrcweir { 1695*cdf0e10cSrcweir pRet=pObj; 1696*cdf0e10cSrcweir } 1697*cdf0e10cSrcweir 1698*cdf0e10cSrcweir return pRet; 1699*cdf0e10cSrcweir } 1700*cdf0e10cSrcweir 1701*cdf0e10cSrcweir SdrObject* SdrMarkView::CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObjList* pOL, SdrPageView* pPV, sal_uIntPtr nOptions, const SetOfByte* pMVisLay, SdrObject*& rpRootObj) const 1702*cdf0e10cSrcweir { 1703*cdf0e10cSrcweir sal_Bool bBack=(nOptions & SDRSEARCH_BACKWARD)!=0; 1704*cdf0e10cSrcweir SdrObject* pRet=NULL; 1705*cdf0e10cSrcweir rpRootObj=NULL; 1706*cdf0e10cSrcweir if (pOL!=NULL) 1707*cdf0e10cSrcweir { 1708*cdf0e10cSrcweir // #110988# 1709*cdf0e10cSrcweir sal_Bool bRemap(pOL->GetOwnerObj() && pOL->GetOwnerObj()->ISA(E3dScene)); 1710*cdf0e10cSrcweir E3dScene* pRemapScene = (bRemap ? (E3dScene*)pOL->GetOwnerObj() : 0L); 1711*cdf0e10cSrcweir 1712*cdf0e10cSrcweir sal_uIntPtr nObjAnz=pOL->GetObjCount(); 1713*cdf0e10cSrcweir sal_uIntPtr nObjNum=bBack ? 0 : nObjAnz; 1714*cdf0e10cSrcweir while (pRet==NULL && (bBack ? nObjNum<nObjAnz : nObjNum>0)) { 1715*cdf0e10cSrcweir if (!bBack) nObjNum--; 1716*cdf0e10cSrcweir SdrObject* pObj; 1717*cdf0e10cSrcweir 1718*cdf0e10cSrcweir // #110988# 1719*cdf0e10cSrcweir if(bRemap) 1720*cdf0e10cSrcweir { 1721*cdf0e10cSrcweir pObj = pOL->GetObj(pRemapScene->RemapOrdNum(nObjNum)); 1722*cdf0e10cSrcweir } 1723*cdf0e10cSrcweir else 1724*cdf0e10cSrcweir { 1725*cdf0e10cSrcweir pObj = pOL->GetObj(nObjNum); 1726*cdf0e10cSrcweir } 1727*cdf0e10cSrcweir 1728*cdf0e10cSrcweir pRet=CheckSingleSdrObjectHit(rPnt,nTol,pObj,pPV,nOptions,pMVisLay); 1729*cdf0e10cSrcweir if (pRet!=NULL) rpRootObj=pObj; 1730*cdf0e10cSrcweir if (bBack) nObjNum++; 1731*cdf0e10cSrcweir } 1732*cdf0e10cSrcweir } 1733*cdf0e10cSrcweir return pRet; 1734*cdf0e10cSrcweir } 1735*cdf0e10cSrcweir 1736*cdf0e10cSrcweir sal_Bool SdrMarkView::PickObj(const Point& rPnt, short nTol, SdrObject*& rpObj, SdrPageView*& rpPV, sal_uIntPtr nOptions) const 1737*cdf0e10cSrcweir { 1738*cdf0e10cSrcweir return PickObj(rPnt,nTol,rpObj,rpPV,nOptions,NULL,NULL,NULL); 1739*cdf0e10cSrcweir } 1740*cdf0e10cSrcweir 1741*cdf0e10cSrcweir sal_Bool SdrMarkView::PickObj(const Point& rPnt, short nTol, SdrObject*& rpObj, SdrPageView*& rpPV, sal_uIntPtr nOptions, SdrObject** ppRootObj, sal_uIntPtr* pnMarkNum, sal_uInt16* pnPassNum) const 1742*cdf0e10cSrcweir { // Fehlt noch Pass2,Pass3 1743*cdf0e10cSrcweir SortMarkedObjects(); 1744*cdf0e10cSrcweir if (ppRootObj!=NULL) *ppRootObj=NULL; 1745*cdf0e10cSrcweir if (pnMarkNum!=NULL) *pnMarkNum=CONTAINER_ENTRY_NOTFOUND; 1746*cdf0e10cSrcweir if (pnPassNum!=NULL) *pnPassNum=0; 1747*cdf0e10cSrcweir rpObj=NULL; 1748*cdf0e10cSrcweir rpPV=NULL; 1749*cdf0e10cSrcweir sal_Bool bWholePage=(nOptions & SDRSEARCH_WHOLEPAGE) !=0; 1750*cdf0e10cSrcweir sal_Bool bMarked=(nOptions & SDRSEARCH_MARKED) !=0; 1751*cdf0e10cSrcweir sal_Bool bMasters=!bMarked && (nOptions & SDRSEARCH_ALSOONMASTER) !=0; 1752*cdf0e10cSrcweir sal_Bool bBack=(nOptions & SDRSEARCH_BACKWARD) !=0; 1753*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 1754*cdf0e10cSrcweir sal_Bool bNext=(nOptions & SDRSEARCH_NEXT) !=0; (void)bNext; // n.i. 1755*cdf0e10cSrcweir sal_Bool bBoundCheckOn2ndPass=(nOptions & SDRSEARCH_PASS2BOUND) !=0; (void)bBoundCheckOn2ndPass;// n.i. 1756*cdf0e10cSrcweir sal_Bool bCheckNearestOn3rdPass=(nOptions & SDRSEARCH_PASS3NEAREST) !=0; (void)bCheckNearestOn3rdPass;// n.i. 1757*cdf0e10cSrcweir #endif 1758*cdf0e10cSrcweir if (nTol<0) nTol=ImpGetHitTolLogic(nTol,NULL); 1759*cdf0e10cSrcweir Point aPt(rPnt); 1760*cdf0e10cSrcweir SdrObject* pObj=NULL; 1761*cdf0e10cSrcweir SdrObject* pHitObj=NULL; 1762*cdf0e10cSrcweir SdrPageView* pPV=NULL; 1763*cdf0e10cSrcweir if (!bBack && ((SdrObjEditView*)this)->IsTextEditFrameHit(rPnt)) { 1764*cdf0e10cSrcweir pObj=((SdrObjEditView*)this)->GetTextEditObject(); 1765*cdf0e10cSrcweir pHitObj=pObj; 1766*cdf0e10cSrcweir pPV=((SdrObjEditView*)this)->GetTextEditPageView(); 1767*cdf0e10cSrcweir } 1768*cdf0e10cSrcweir if (bMarked) { 1769*cdf0e10cSrcweir sal_uIntPtr nMrkAnz=GetMarkedObjectCount(); 1770*cdf0e10cSrcweir sal_uIntPtr nMrkNum=bBack ? 0 : nMrkAnz; 1771*cdf0e10cSrcweir while (pHitObj==NULL && (bBack ? nMrkNum<nMrkAnz : nMrkNum>0)) { 1772*cdf0e10cSrcweir if (!bBack) nMrkNum--; 1773*cdf0e10cSrcweir SdrMark* pM=GetSdrMarkByIndex(nMrkNum); 1774*cdf0e10cSrcweir pObj=pM->GetMarkedSdrObj(); 1775*cdf0e10cSrcweir pPV=pM->GetPageView(); 1776*cdf0e10cSrcweir pHitObj=CheckSingleSdrObjectHit(aPt,nTol,pObj,pPV,nOptions,NULL); 1777*cdf0e10cSrcweir if (bBack) nMrkNum++; 1778*cdf0e10cSrcweir } 1779*cdf0e10cSrcweir } 1780*cdf0e10cSrcweir else 1781*cdf0e10cSrcweir { 1782*cdf0e10cSrcweir pPV = GetSdrPageView(); 1783*cdf0e10cSrcweir 1784*cdf0e10cSrcweir if(pPV) 1785*cdf0e10cSrcweir { 1786*cdf0e10cSrcweir SdrPage* pPage=pPV->GetPage(); 1787*cdf0e10cSrcweir sal_uInt16 nPgAnz=1; 1788*cdf0e10cSrcweir 1789*cdf0e10cSrcweir if(bMasters && pPage->TRG_HasMasterPage()) 1790*cdf0e10cSrcweir { 1791*cdf0e10cSrcweir nPgAnz++; 1792*cdf0e10cSrcweir } 1793*cdf0e10cSrcweir 1794*cdf0e10cSrcweir sal_Bool bExtraPassForWholePage=bWholePage && pPage!=pPV->GetObjList(); 1795*cdf0e10cSrcweir if (bExtraPassForWholePage) nPgAnz++; // Suche erst in AktObjList, dann auf der gesamten Page 1796*cdf0e10cSrcweir sal_uInt16 nPgNum=bBack ? 0 : nPgAnz; 1797*cdf0e10cSrcweir while (pHitObj==NULL && (bBack ? nPgNum<nPgAnz : nPgNum>0)) { 1798*cdf0e10cSrcweir sal_uIntPtr nTmpOptions=nOptions; 1799*cdf0e10cSrcweir if (!bBack) nPgNum--; 1800*cdf0e10cSrcweir const SetOfByte* pMVisLay=NULL; 1801*cdf0e10cSrcweir SdrObjList* pObjList=NULL; 1802*cdf0e10cSrcweir if (pnPassNum!=NULL) *pnPassNum&=~(SDRSEARCHPASS_MASTERPAGE|SDRSEARCHPASS_INACTIVELIST); 1803*cdf0e10cSrcweir if (nPgNum>=nPgAnz-1 || (bExtraPassForWholePage && nPgNum>=nPgAnz-2)) 1804*cdf0e10cSrcweir { 1805*cdf0e10cSrcweir pObjList=pPV->GetObjList(); 1806*cdf0e10cSrcweir if (bExtraPassForWholePage && nPgNum==nPgAnz-2) { 1807*cdf0e10cSrcweir pObjList=pPage; 1808*cdf0e10cSrcweir if (pnPassNum!=NULL) *pnPassNum|=SDRSEARCHPASS_INACTIVELIST; 1809*cdf0e10cSrcweir } 1810*cdf0e10cSrcweir } 1811*cdf0e10cSrcweir else 1812*cdf0e10cSrcweir { 1813*cdf0e10cSrcweir // sonst MasterPage 1814*cdf0e10cSrcweir SdrPage& rMasterPage = pPage->TRG_GetMasterPage(); 1815*cdf0e10cSrcweir pMVisLay = &pPage->TRG_GetMasterPageVisibleLayers(); 1816*cdf0e10cSrcweir pObjList = &rMasterPage; 1817*cdf0e10cSrcweir 1818*cdf0e10cSrcweir if (pnPassNum!=NULL) *pnPassNum|=SDRSEARCHPASS_MASTERPAGE; 1819*cdf0e10cSrcweir nTmpOptions=nTmpOptions | SDRSEARCH_IMPISMASTER; 1820*cdf0e10cSrcweir } 1821*cdf0e10cSrcweir pHitObj=CheckSingleSdrObjectHit(aPt,nTol,pObjList,pPV,nTmpOptions,pMVisLay,pObj); 1822*cdf0e10cSrcweir if (bBack) nPgNum++; 1823*cdf0e10cSrcweir } 1824*cdf0e10cSrcweir } 1825*cdf0e10cSrcweir } 1826*cdf0e10cSrcweir if (pHitObj!=NULL) { 1827*cdf0e10cSrcweir if (ppRootObj!=NULL) *ppRootObj=pObj; 1828*cdf0e10cSrcweir if ((nOptions & SDRSEARCH_DEEP) !=0) pObj=pHitObj; 1829*cdf0e10cSrcweir if ((nOptions & SDRSEARCH_TESTTEXTEDIT) !=0) { 1830*cdf0e10cSrcweir if (!pObj->HasTextEdit() || pPV->GetLockedLayers().IsSet(pObj->GetLayer())) { 1831*cdf0e10cSrcweir pObj=NULL; 1832*cdf0e10cSrcweir } 1833*cdf0e10cSrcweir } 1834*cdf0e10cSrcweir if (pObj!=NULL && (nOptions & SDRSEARCH_TESTMACRO) !=0) { 1835*cdf0e10cSrcweir SdrObjMacroHitRec aHitRec; 1836*cdf0e10cSrcweir aHitRec.aPos=aPt; 1837*cdf0e10cSrcweir aHitRec.aDownPos=aPt; 1838*cdf0e10cSrcweir aHitRec.nTol=nTol; 1839*cdf0e10cSrcweir aHitRec.pVisiLayer=&pPV->GetVisibleLayers(); 1840*cdf0e10cSrcweir aHitRec.pPageView=pPV; 1841*cdf0e10cSrcweir if (!pObj->HasMacro() || !pObj->IsMacroHit(aHitRec)) pObj=NULL; 1842*cdf0e10cSrcweir } 1843*cdf0e10cSrcweir if (pObj!=NULL && (nOptions & SDRSEARCH_WITHTEXT) !=0 && pObj->GetOutlinerParaObject()==NULL) pObj=NULL; 1844*cdf0e10cSrcweir if (pObj!=NULL && (nOptions & SDRSEARCH_TESTTEXTAREA) !=0) 1845*cdf0e10cSrcweir { 1846*cdf0e10cSrcweir if(!SdrObjectPrimitiveHit(*pObj, aPt, 0, *pPV, 0, true)) 1847*cdf0e10cSrcweir { 1848*cdf0e10cSrcweir pObj = 0; 1849*cdf0e10cSrcweir } 1850*cdf0e10cSrcweir } 1851*cdf0e10cSrcweir if (pObj!=NULL) { 1852*cdf0e10cSrcweir rpObj=pObj; 1853*cdf0e10cSrcweir rpPV=pPV; 1854*cdf0e10cSrcweir if (pnPassNum!=NULL) *pnPassNum|=SDRSEARCHPASS_DIRECT; 1855*cdf0e10cSrcweir } 1856*cdf0e10cSrcweir } 1857*cdf0e10cSrcweir return rpObj!=NULL; 1858*cdf0e10cSrcweir } 1859*cdf0e10cSrcweir 1860*cdf0e10cSrcweir sal_Bool SdrMarkView::PickMarkedObj(const Point& rPnt, SdrObject*& rpObj, SdrPageView*& rpPV, sal_uIntPtr* pnMarkNum, sal_uIntPtr nOptions) const 1861*cdf0e10cSrcweir { 1862*cdf0e10cSrcweir SortMarkedObjects(); 1863*cdf0e10cSrcweir sal_Bool bBoundCheckOn2ndPass=(nOptions & SDRSEARCH_PASS2BOUND) !=0; 1864*cdf0e10cSrcweir sal_Bool bCheckNearestOn3rdPass=(nOptions & SDRSEARCH_PASS3NEAREST) !=0; 1865*cdf0e10cSrcweir rpObj=NULL; 1866*cdf0e10cSrcweir rpPV=NULL; 1867*cdf0e10cSrcweir if (pnMarkNum!=NULL) *pnMarkNum=CONTAINER_ENTRY_NOTFOUND; 1868*cdf0e10cSrcweir Point aPt(rPnt); 1869*cdf0e10cSrcweir sal_uInt16 nTol=(sal_uInt16)nHitTolLog; 1870*cdf0e10cSrcweir sal_Bool bFnd=sal_False; 1871*cdf0e10cSrcweir sal_uIntPtr nMarkAnz=GetMarkedObjectCount(); 1872*cdf0e10cSrcweir sal_uIntPtr nMarkNum; 1873*cdf0e10cSrcweir for (nMarkNum=nMarkAnz; nMarkNum>0 && !bFnd;) { 1874*cdf0e10cSrcweir nMarkNum--; 1875*cdf0e10cSrcweir SdrMark* pM=GetSdrMarkByIndex(nMarkNum); 1876*cdf0e10cSrcweir SdrPageView* pPV=pM->GetPageView(); 1877*cdf0e10cSrcweir SdrObject* pObj=pM->GetMarkedSdrObj(); 1878*cdf0e10cSrcweir bFnd = 0 != CheckSingleSdrObjectHit(aPt,nTol,pObj,pPV,SDRSEARCH_TESTMARKABLE,0); 1879*cdf0e10cSrcweir if (bFnd) { 1880*cdf0e10cSrcweir rpObj=pObj; 1881*cdf0e10cSrcweir rpPV=pPV; 1882*cdf0e10cSrcweir if (pnMarkNum!=NULL) *pnMarkNum=nMarkNum; 1883*cdf0e10cSrcweir } 1884*cdf0e10cSrcweir } 1885*cdf0e10cSrcweir if ((bBoundCheckOn2ndPass || bCheckNearestOn3rdPass) && !bFnd) { 1886*cdf0e10cSrcweir SdrObject* pBestObj=NULL; 1887*cdf0e10cSrcweir SdrPageView* pBestPV=NULL; 1888*cdf0e10cSrcweir sal_uIntPtr nBestMarkNum=0; 1889*cdf0e10cSrcweir sal_uIntPtr nBestDist=ULONG_MAX; 1890*cdf0e10cSrcweir for (nMarkNum=nMarkAnz; nMarkNum>0 && !bFnd;) { 1891*cdf0e10cSrcweir nMarkNum--; 1892*cdf0e10cSrcweir SdrMark* pM=GetSdrMarkByIndex(nMarkNum); 1893*cdf0e10cSrcweir SdrPageView* pPV=pM->GetPageView(); 1894*cdf0e10cSrcweir SdrObject* pObj=pM->GetMarkedSdrObj(); 1895*cdf0e10cSrcweir Rectangle aRect(pObj->GetCurrentBoundRect()); 1896*cdf0e10cSrcweir aRect.Left ()-=nTol; 1897*cdf0e10cSrcweir aRect.Top ()-=nTol; 1898*cdf0e10cSrcweir aRect.Right ()+=nTol; 1899*cdf0e10cSrcweir aRect.Bottom()+=nTol; 1900*cdf0e10cSrcweir if (aRect.IsInside(aPt)) { 1901*cdf0e10cSrcweir bFnd=sal_True; 1902*cdf0e10cSrcweir rpObj=pObj; 1903*cdf0e10cSrcweir rpPV=pPV; 1904*cdf0e10cSrcweir if (pnMarkNum!=NULL) *pnMarkNum=nMarkNum; 1905*cdf0e10cSrcweir } else if (bCheckNearestOn3rdPass) { 1906*cdf0e10cSrcweir sal_uIntPtr nDist=0; 1907*cdf0e10cSrcweir if (aPt.X()<aRect.Left()) nDist+=aRect.Left()-aPt.X(); 1908*cdf0e10cSrcweir if (aPt.X()>aRect.Right()) nDist+=aPt.X()-aRect.Right(); 1909*cdf0e10cSrcweir if (aPt.Y()<aRect.Top()) nDist+=aRect.Top()-aPt.Y(); 1910*cdf0e10cSrcweir if (aPt.Y()>aRect.Bottom()) nDist+=aPt.Y()-aRect.Bottom(); 1911*cdf0e10cSrcweir if (nDist<nBestDist) { 1912*cdf0e10cSrcweir pBestObj=pObj; 1913*cdf0e10cSrcweir pBestPV=pPV; 1914*cdf0e10cSrcweir nBestMarkNum=nMarkNum; 1915*cdf0e10cSrcweir } 1916*cdf0e10cSrcweir } 1917*cdf0e10cSrcweir } 1918*cdf0e10cSrcweir if (bCheckNearestOn3rdPass && !bFnd) { 1919*cdf0e10cSrcweir rpObj=pBestObj; 1920*cdf0e10cSrcweir rpPV=pBestPV; 1921*cdf0e10cSrcweir if (pnMarkNum!=NULL) *pnMarkNum=nBestMarkNum; 1922*cdf0e10cSrcweir bFnd=pBestObj!=NULL; 1923*cdf0e10cSrcweir } 1924*cdf0e10cSrcweir } 1925*cdf0e10cSrcweir return bFnd; 1926*cdf0e10cSrcweir } 1927*cdf0e10cSrcweir 1928*cdf0e10cSrcweir SdrHitKind SdrMarkView::PickSomething(const Point& rPnt, short nTol) const 1929*cdf0e10cSrcweir { 1930*cdf0e10cSrcweir nTol=ImpGetHitTolLogic(nTol,NULL); 1931*cdf0e10cSrcweir SdrHitKind eRet=SDRHIT_NONE; 1932*cdf0e10cSrcweir Point aPt(rPnt); 1933*cdf0e10cSrcweir SdrObject* pObj=NULL; 1934*cdf0e10cSrcweir SdrPageView* pPV=NULL; 1935*cdf0e10cSrcweir if (eRet==SDRHIT_NONE && PickObj(rPnt,sal_uInt16(nTol),pObj,pPV,SDRSEARCH_PICKMARKABLE)) { 1936*cdf0e10cSrcweir Rectangle aRct1(aPt-Point(nTol,nTol),aPt+Point(nTol,nTol)); // HitRect fuer Toleranz 1937*cdf0e10cSrcweir Rectangle aBR(pObj->GetCurrentBoundRect()); 1938*cdf0e10cSrcweir if (aRct1.IsInside(aBR.TopLeft())) eRet=SDRHIT_BOUNDTL; 1939*cdf0e10cSrcweir else if (aRct1.IsInside(aBR.TopCenter())) eRet=SDRHIT_BOUNDTC; 1940*cdf0e10cSrcweir else if (aRct1.IsInside(aBR.TopRight())) eRet=SDRHIT_BOUNDTR; 1941*cdf0e10cSrcweir else if (aRct1.IsInside(aBR.LeftCenter())) eRet=SDRHIT_BOUNDCL; 1942*cdf0e10cSrcweir else if (aRct1.IsInside(aBR.RightCenter())) eRet=SDRHIT_BOUNDCR; 1943*cdf0e10cSrcweir else if (aRct1.IsInside(aBR.BottomLeft())) eRet=SDRHIT_BOUNDBL; 1944*cdf0e10cSrcweir else if (aRct1.IsInside(aBR.BottomCenter())) eRet=SDRHIT_BOUNDBC; 1945*cdf0e10cSrcweir else if (aRct1.IsInside(aBR.BottomRight())) eRet=SDRHIT_BOUNDBR; 1946*cdf0e10cSrcweir else eRet=SDRHIT_OBJECT; 1947*cdf0e10cSrcweir } 1948*cdf0e10cSrcweir return eRet; 1949*cdf0e10cSrcweir } 1950*cdf0e10cSrcweir 1951*cdf0e10cSrcweir void SdrMarkView::UnmarkAllObj(SdrPageView* pPV) 1952*cdf0e10cSrcweir { 1953*cdf0e10cSrcweir if (GetMarkedObjectCount()!=0) { 1954*cdf0e10cSrcweir BrkAction(); 1955*cdf0e10cSrcweir //HMHBOOL bVis=bHdlShown; 1956*cdf0e10cSrcweir //HMHif (bVis) HideMarkHdl(); 1957*cdf0e10cSrcweir if (pPV!=NULL) 1958*cdf0e10cSrcweir { 1959*cdf0e10cSrcweir GetMarkedObjectListWriteAccess().DeletePageView(*pPV); 1960*cdf0e10cSrcweir } 1961*cdf0e10cSrcweir else 1962*cdf0e10cSrcweir { 1963*cdf0e10cSrcweir GetMarkedObjectListWriteAccess().Clear(); 1964*cdf0e10cSrcweir } 1965*cdf0e10cSrcweir pMarkedObj=NULL; 1966*cdf0e10cSrcweir pMarkedPV=NULL; 1967*cdf0e10cSrcweir MarkListHasChanged(); 1968*cdf0e10cSrcweir AdjustMarkHdl(); //HMHTRUE); 1969*cdf0e10cSrcweir //HMHif (bVis) ShowMarkHdl(); // ggf. fuer die RefPoints 1970*cdf0e10cSrcweir } 1971*cdf0e10cSrcweir } 1972*cdf0e10cSrcweir 1973*cdf0e10cSrcweir void SdrMarkView::MarkAllObj(SdrPageView* _pPV) 1974*cdf0e10cSrcweir { 1975*cdf0e10cSrcweir BrkAction(); 1976*cdf0e10cSrcweir //HMHHideMarkHdl(); 1977*cdf0e10cSrcweir 1978*cdf0e10cSrcweir if(!_pPV) 1979*cdf0e10cSrcweir { 1980*cdf0e10cSrcweir _pPV = GetSdrPageView(); 1981*cdf0e10cSrcweir } 1982*cdf0e10cSrcweir 1983*cdf0e10cSrcweir // #i69171# _pPV may still be NULL if there is no SDrPageView (!), e.g. when inserting 1984*cdf0e10cSrcweir // other files 1985*cdf0e10cSrcweir if(_pPV) 1986*cdf0e10cSrcweir { 1987*cdf0e10cSrcweir const bool bMarkChg(GetMarkedObjectListWriteAccess().InsertPageView(*_pPV)); 1988*cdf0e10cSrcweir 1989*cdf0e10cSrcweir if(bMarkChg) 1990*cdf0e10cSrcweir { 1991*cdf0e10cSrcweir MarkListHasChanged(); 1992*cdf0e10cSrcweir } 1993*cdf0e10cSrcweir } 1994*cdf0e10cSrcweir 1995*cdf0e10cSrcweir if(GetMarkedObjectCount()) 1996*cdf0e10cSrcweir { 1997*cdf0e10cSrcweir AdjustMarkHdl(); //HMHTRUE); 1998*cdf0e10cSrcweir //HMHShowMarkHdl(); 1999*cdf0e10cSrcweir } 2000*cdf0e10cSrcweir } 2001*cdf0e10cSrcweir 2002*cdf0e10cSrcweir void SdrMarkView::AdjustMarkHdl() //HMHBOOL bRestraintPaint) 2003*cdf0e10cSrcweir { 2004*cdf0e10cSrcweir //HMHBOOL bVis=bHdlShown; 2005*cdf0e10cSrcweir //HMHif (bVis) HideMarkHdl(); 2006*cdf0e10cSrcweir CheckMarked(); 2007*cdf0e10cSrcweir SetMarkRects(); 2008*cdf0e10cSrcweir SetMarkHandles(); 2009*cdf0e10cSrcweir //HMHif(bRestraintPaint && bVis) 2010*cdf0e10cSrcweir //HMH{ 2011*cdf0e10cSrcweir //HMH ShowMarkHdl(); 2012*cdf0e10cSrcweir //HMH} 2013*cdf0e10cSrcweir } 2014*cdf0e10cSrcweir 2015*cdf0e10cSrcweir Rectangle SdrMarkView::GetMarkedObjBoundRect() const 2016*cdf0e10cSrcweir { 2017*cdf0e10cSrcweir Rectangle aRect; 2018*cdf0e10cSrcweir for (sal_uIntPtr nm=0; nm<GetMarkedObjectCount(); nm++) { 2019*cdf0e10cSrcweir SdrMark* pM=GetSdrMarkByIndex(nm); 2020*cdf0e10cSrcweir SdrObject* pO=pM->GetMarkedSdrObj(); 2021*cdf0e10cSrcweir Rectangle aR1(pO->GetCurrentBoundRect()); 2022*cdf0e10cSrcweir if (aRect.IsEmpty()) aRect=aR1; 2023*cdf0e10cSrcweir else aRect.Union(aR1); 2024*cdf0e10cSrcweir } 2025*cdf0e10cSrcweir return aRect; 2026*cdf0e10cSrcweir } 2027*cdf0e10cSrcweir 2028*cdf0e10cSrcweir const Rectangle& SdrMarkView::GetMarkedObjRect() const 2029*cdf0e10cSrcweir { 2030*cdf0e10cSrcweir if (bMarkedObjRectDirty) { 2031*cdf0e10cSrcweir ((SdrMarkView*)this)->bMarkedObjRectDirty=sal_False; 2032*cdf0e10cSrcweir Rectangle aRect; 2033*cdf0e10cSrcweir for (sal_uIntPtr nm=0; nm<GetMarkedObjectCount(); nm++) { 2034*cdf0e10cSrcweir SdrMark* pM=GetSdrMarkByIndex(nm); 2035*cdf0e10cSrcweir SdrObject* pO=pM->GetMarkedSdrObj(); 2036*cdf0e10cSrcweir Rectangle aR1(pO->GetSnapRect()); 2037*cdf0e10cSrcweir if (aRect.IsEmpty()) aRect=aR1; 2038*cdf0e10cSrcweir else aRect.Union(aR1); 2039*cdf0e10cSrcweir } 2040*cdf0e10cSrcweir ((SdrMarkView*)this)->aMarkedObjRect=aRect; 2041*cdf0e10cSrcweir } 2042*cdf0e10cSrcweir return aMarkedObjRect; 2043*cdf0e10cSrcweir } 2044*cdf0e10cSrcweir 2045*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 2046*cdf0e10cSrcweir 2047*cdf0e10cSrcweir void SdrMarkView::ImpTakeDescriptionStr(sal_uInt16 nStrCacheID, XubString& rStr, sal_uInt16 nVal, sal_uInt16 nOpt) const 2048*cdf0e10cSrcweir { 2049*cdf0e10cSrcweir rStr = ImpGetResStr(nStrCacheID); 2050*cdf0e10cSrcweir xub_StrLen nPos = rStr.SearchAscii("%1"); 2051*cdf0e10cSrcweir 2052*cdf0e10cSrcweir if(nPos != STRING_NOTFOUND) 2053*cdf0e10cSrcweir { 2054*cdf0e10cSrcweir rStr.Erase(nPos, 2); 2055*cdf0e10cSrcweir 2056*cdf0e10cSrcweir if(nOpt == IMPSDR_POINTSDESCRIPTION) 2057*cdf0e10cSrcweir { 2058*cdf0e10cSrcweir rStr.Insert(GetDescriptionOfMarkedPoints(), nPos); 2059*cdf0e10cSrcweir } 2060*cdf0e10cSrcweir else if(nOpt == IMPSDR_GLUEPOINTSDESCRIPTION) 2061*cdf0e10cSrcweir { 2062*cdf0e10cSrcweir rStr.Insert(GetDescriptionOfMarkedGluePoints(), nPos); 2063*cdf0e10cSrcweir } 2064*cdf0e10cSrcweir else 2065*cdf0e10cSrcweir { 2066*cdf0e10cSrcweir rStr.Insert(GetDescriptionOfMarkedObjects(), nPos); 2067*cdf0e10cSrcweir } 2068*cdf0e10cSrcweir } 2069*cdf0e10cSrcweir 2070*cdf0e10cSrcweir nPos = rStr.SearchAscii("%2"); 2071*cdf0e10cSrcweir 2072*cdf0e10cSrcweir if(nPos != STRING_NOTFOUND) 2073*cdf0e10cSrcweir { 2074*cdf0e10cSrcweir rStr.Erase(nPos, 2); 2075*cdf0e10cSrcweir rStr.Insert(UniString::CreateFromInt32(nVal), nPos); 2076*cdf0e10cSrcweir } 2077*cdf0e10cSrcweir } 2078*cdf0e10cSrcweir 2079*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 2080*cdf0e10cSrcweir 2081*cdf0e10cSrcweir sal_Bool SdrMarkView::EnterMarkedGroup() 2082*cdf0e10cSrcweir { 2083*cdf0e10cSrcweir sal_Bool bRet=sal_False; 2084*cdf0e10cSrcweir // Es wird nur die erste gefundene Gruppe (also nur in einer PageView) geentert 2085*cdf0e10cSrcweir // Weil PageView::EnterGroup ein AdjustMarkHdl ruft. 2086*cdf0e10cSrcweir // Das muss ich per Flag mal unterbinden vvvvvvvv 2087*cdf0e10cSrcweir SdrPageView* pPV = GetSdrPageView(); 2088*cdf0e10cSrcweir 2089*cdf0e10cSrcweir if(pPV) 2090*cdf0e10cSrcweir { 2091*cdf0e10cSrcweir sal_Bool bEnter=sal_False; 2092*cdf0e10cSrcweir for (sal_uInt32 nm(GetMarkedObjectCount()); nm > 0 && !bEnter;) 2093*cdf0e10cSrcweir { 2094*cdf0e10cSrcweir nm--; 2095*cdf0e10cSrcweir SdrMark* pM=GetSdrMarkByIndex(nm); 2096*cdf0e10cSrcweir if (pM->GetPageView()==pPV) { 2097*cdf0e10cSrcweir SdrObject* pObj=pM->GetMarkedSdrObj(); 2098*cdf0e10cSrcweir if (pObj->IsGroupObject()) { 2099*cdf0e10cSrcweir if (pPV->EnterGroup(pObj)) { 2100*cdf0e10cSrcweir bRet=sal_True; 2101*cdf0e10cSrcweir bEnter=sal_True; 2102*cdf0e10cSrcweir } 2103*cdf0e10cSrcweir } 2104*cdf0e10cSrcweir } 2105*cdf0e10cSrcweir } 2106*cdf0e10cSrcweir } 2107*cdf0e10cSrcweir return bRet; 2108*cdf0e10cSrcweir } 2109*cdf0e10cSrcweir 2110*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 2111*cdf0e10cSrcweir 2112*cdf0e10cSrcweir void SdrMarkView::MarkListHasChanged() 2113*cdf0e10cSrcweir { 2114*cdf0e10cSrcweir GetMarkedObjectListWriteAccess().SetNameDirty(); 2115*cdf0e10cSrcweir SetEdgesOfMarkedNodesDirty(); // bEdgesOfMarkedNodesDirty=sal_True; 2116*cdf0e10cSrcweir 2117*cdf0e10cSrcweir bMarkedObjRectDirty=sal_True; 2118*cdf0e10cSrcweir bMarkedPointsRectsDirty=sal_True; 2119*cdf0e10cSrcweir #ifdef DBG_UTIL 2120*cdf0e10cSrcweir if (pItemBrowser!=NULL) pItemBrowser->SetDirty(); 2121*cdf0e10cSrcweir #endif 2122*cdf0e10cSrcweir sal_Bool bOneEdgeMarked=sal_False; 2123*cdf0e10cSrcweir if (GetMarkedObjectCount()==1) { 2124*cdf0e10cSrcweir const SdrObject* pObj=GetMarkedObjectByIndex(0); 2125*cdf0e10cSrcweir if (pObj->GetObjInventor()==SdrInventor) { 2126*cdf0e10cSrcweir sal_uInt16 nIdent=pObj->GetObjIdentifier(); 2127*cdf0e10cSrcweir bOneEdgeMarked=nIdent==OBJ_EDGE; 2128*cdf0e10cSrcweir } 2129*cdf0e10cSrcweir } 2130*cdf0e10cSrcweir ImpSetGlueVisible4(bOneEdgeMarked); 2131*cdf0e10cSrcweir } 2132*cdf0e10cSrcweir 2133*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 2134*cdf0e10cSrcweir 2135*cdf0e10cSrcweir void SdrMarkView::SetMoveOutside(sal_Bool bOn) 2136*cdf0e10cSrcweir { 2137*cdf0e10cSrcweir aHdl.SetMoveOutside(bOn); 2138*cdf0e10cSrcweir } 2139*cdf0e10cSrcweir 2140*cdf0e10cSrcweir sal_Bool SdrMarkView::IsMoveOutside() const 2141*cdf0e10cSrcweir { 2142*cdf0e10cSrcweir return aHdl.IsMoveOutside(); 2143*cdf0e10cSrcweir } 2144*cdf0e10cSrcweir 2145*cdf0e10cSrcweir void SdrMarkView::SetDesignMode( sal_Bool _bOn ) 2146*cdf0e10cSrcweir { 2147*cdf0e10cSrcweir if ( bDesignMode != _bOn ) 2148*cdf0e10cSrcweir { 2149*cdf0e10cSrcweir bDesignMode = _bOn; 2150*cdf0e10cSrcweir SdrPageView* pPageView = GetSdrPageView(); 2151*cdf0e10cSrcweir if ( pPageView ) 2152*cdf0e10cSrcweir pPageView->SetDesignMode( _bOn ); 2153*cdf0e10cSrcweir } 2154*cdf0e10cSrcweir } 2155*cdf0e10cSrcweir 2156*cdf0e10cSrcweir // MarkHandles Objektaenderung: 2157*cdf0e10cSrcweir // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2158*cdf0e10cSrcweir // - Bei Notify mit HINT_OBJCHG (oder so) werden die Handles erstmal versteckt 2159*cdf0e10cSrcweir // (wenn nicht schon wegen Dragging versteckt). 2160*cdf0e10cSrcweir // - XorHdl: Bei ModelHasChanged() werden sie dann wieder angezeigt. 2161*cdf0e10cSrcweir // - PaintEvents kommen nun durch. 2162*cdf0e10cSrcweir // - Die XorHandles werden z.T. wieder uebermalt. 2163*cdf0e10cSrcweir // - Xor: Nach dem Painten werden die Handles im (vom PaintHandler gerufenen) 2164*cdf0e10cSrcweir // CompleteRedraw per ToggleShownXor bei gesetzter ClipRegion nochmal gemalt 2165*cdf0e10cSrcweir // und damit ist alles in Butter. 2166*cdf0e10cSrcweir // - ToggleShownXor macht bei SolidHdl nix weil bHdlShown=FALSE 2167*cdf0e10cSrcweir // - Der AfterPaintTimer wird gestartet. 2168*cdf0e10cSrcweir // - SolidHdl: Im AfterPaintHandler wird ShowMarkHdl gerufen. 2169*cdf0e10cSrcweir // Da die Handles zu diesem Zeitpunkt nicht angezeigt sind wird: 2170*cdf0e10cSrcweir // - SaveBackground durchgefuehrt. 2171*cdf0e10cSrcweir // - DrawMarkHdl gerufen und bHdlShown gesetzt. 2172*cdf0e10cSrcweir // 2173*cdf0e10cSrcweir // MarkHandles bei sonstigem Invalidate: 2174*cdf0e10cSrcweir // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2175*cdf0e10cSrcweir // In diesem Fall bekomme ich kein Notify und beim Aufruf des 2176*cdf0e10cSrcweir // PaintHandlers->CompleteRedraw() sind auch die SolidHandles sichtbar. 2177*cdf0e10cSrcweir 2178