1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: svdmrkv.cxx,v $
10 * $Revision: 1.39.74.1 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_svx.hxx"
34 #include <svx/svdmrkv.hxx>
35 #include <svx/svdetc.hxx>
36 #include <svx/svdoedge.hxx>
37 #include "svdglob.hxx"
38 #include "svditext.hxx"
39 #include <svx/svdview.hxx>
40 #include <svx/svdpagv.hxx>
41 #include <svx/svdpage.hxx>
42 #include "svddrgm1.hxx"
45 #include <svdibrow.hxx>
48 #include <svx/svdoole2.hxx>
49 #include <svx/xgrad.hxx>
50 #include <svx/xflgrit.hxx>
51 #include "gradtrns.hxx"
52 #include <svx/xflftrit.hxx>
53 #include <svx/dialmgr.hxx>
55 #include <svx/svdundo.hxx>
56 #include <svx/svdopath.hxx>
57 #include <svx/scene3d.hxx>
58 #include <svx/svdovirt.hxx>
59 #include <svx/sdr/overlay/overlayrollingrectangle.hxx>
60 #include <svx/sdr/overlay/overlaymanager.hxx>
61 #include <sdrpaintwindow.hxx>
62 #include <svx/sdrpagewindow.hxx>
63 #include <svx/sdrhittesthelper.hxx>
65 ////////////////////////////////////////////////////////////////////////////////////////////////////
68 class SdrUnoControlList
;
70 ////////////////////////////////////////////////////////////////////////////////////////////////////
71 // #114409#-3 Migrate Marking of Objects, Points and GluePoints
73 class ImplMarkingOverlay
76 ::sdr::overlay::OverlayObjectList maObjects
;
78 // The remembered second position in logical coodinates
79 basegfx::B2DPoint maSecondPosition
;
82 // A flag to remember if the action is for unmarking.
83 unsigned mbUnmarking
: 1;
86 ImplMarkingOverlay(const SdrPaintView
& rView
, const basegfx::B2DPoint
& rStartPos
, sal_Bool bUnmarking
= sal_False
);
87 ~ImplMarkingOverlay();
89 void SetSecondPosition(const basegfx::B2DPoint
& rNewPosition
);
90 sal_Bool
IsUnmarking() const { return mbUnmarking
; }
93 ImplMarkingOverlay::ImplMarkingOverlay(const SdrPaintView
& rView
, const basegfx::B2DPoint
& rStartPos
, sal_Bool bUnmarking
)
94 : maSecondPosition(rStartPos
),
95 mbUnmarking(bUnmarking
)
97 for(sal_uInt32
a(0L); a
< rView
.PaintWindowCount(); a
++)
99 SdrPaintWindow
* pCandidate
= rView
.GetPaintWindow(a
);
100 ::sdr::overlay::OverlayManager
* pTargetOverlay
= pCandidate
->GetOverlayManager();
104 ::sdr::overlay::OverlayRollingRectangleStriped
* pNew
= new ::sdr::overlay::OverlayRollingRectangleStriped(
105 rStartPos
, rStartPos
, false);
106 pTargetOverlay
->add(*pNew
);
107 maObjects
.append(*pNew
);
112 ImplMarkingOverlay::~ImplMarkingOverlay()
114 // The OverlayObjects are cleared using the destructor of OverlayObjectList.
115 // That destructor calls clear() at the list which removes all objects from the
116 // OverlayManager and deletes them.
119 void ImplMarkingOverlay::SetSecondPosition(const basegfx::B2DPoint
& rNewPosition
)
121 if(rNewPosition
!= maSecondPosition
)
123 // apply to OverlayObjects
124 for(sal_uInt32
a(0L); a
< maObjects
.count(); a
++)
126 ::sdr::overlay::OverlayRollingRectangleStriped
& rCandidate
= (::sdr::overlay::OverlayRollingRectangleStriped
&)maObjects
.getOverlayObject(a
);
127 rCandidate
.setSecondPosition(rNewPosition
);
130 // remember new position
131 maSecondPosition
= rNewPosition
;
135 ////////////////////////////////////////////////////////////////////////////////////////////////////
136 ////////////////////////////////////////////////////////////////////////////////////////////////////
138 // @@ @@ @@@@ @@@@@ @@ @@ @@ @@ @@ @@@@@ @@ @@
139 // @@@ @@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
140 // @@@@@@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @ @@
141 // @@@@@@@ @@@@@@ @@@@@ @@@@ @@@@@ @@ @@@@ @@@@@@@
142 // @@ @ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@@@@@
143 // @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@ @@@
144 // @@ @@ @@ @@ @@ @@ @@ @@ @ @@ @@@@@ @@ @@
146 ////////////////////////////////////////////////////////////////////////////////////////////////////
147 ////////////////////////////////////////////////////////////////////////////////////////////////////
149 void SdrMarkView::ImpClearVars()
151 eDragMode
=SDRDRAG_MOVE
;
152 //HMHbHdlShown=FALSE;
153 bRefHdlShownOnly
=FALSE
;
154 eEditMode
=SDREDITMODE_EDIT
;
155 eEditMode0
=SDREDITMODE_EDIT
;
159 bForceFrameHandles
=FALSE
;
160 bPlusHdlAlways
=FALSE
;
161 nFrameHandlesLimit
=50;
164 bMarkedObjRectDirty
=FALSE
;
165 bMarkedPointsRectsDirty
=FALSE
;
166 mbMarkHandlesHidden
= false;
168 bMarkHdlWhenTextEdit
=FALSE
;
169 bMarkableObjCountDirty
=FALSE
; // noch nicht implementiert
170 nMarkableObjCount
=0; // noch nicht implementiert
172 // #114409#-3 Migrate selections
178 SdrMarkView::SdrMarkView(SdrModel
* pModel1
, OutputDevice
* pOut
)
179 : SdrSnapView(pModel1
,pOut
),
180 mpMarkObjOverlay(0L),
181 mpMarkPointsOverlay(0L),
182 mpMarkGluePointsOverlay(0L),
184 mpSdrViewSelection(new sdr::ViewSelection())
187 StartListening(*pModel1
);
190 SdrMarkView::~SdrMarkView()
192 // #114409#-3 Migrate selections
196 delete mpSdrViewSelection
;
199 void __EXPORT
SdrMarkView::Notify(SfxBroadcaster
& rBC
, const SfxHint
& rHint
)
201 SdrHint
* pSdrHint
=PTR_CAST(SdrHint
,&rHint
);
204 SdrHintKind eKind
=pSdrHint
->GetKind();
206 if (eKind
==HINT_OBJCHG
|| eKind
==HINT_OBJINSERTED
|| eKind
==HINT_OBJREMOVED
)
208 bMarkedObjRectDirty
=TRUE
;
209 bMarkedPointsRectsDirty
=TRUE
;
211 /* removed for now since this breaks existing code who iterates over the mark list and sequentially replaces objects
212 if( eKind==HINT_OBJREMOVED && IsObjMarked( const_cast<SdrObject*>(pSdrHint->GetObject()) ) )
214 MarkObj( const_cast<SdrObject*>(pSdrHint->GetObject()), GetSdrPageView(), TRUE );
218 SdrSnapView::Notify(rBC
,rHint
);
221 void SdrMarkView::ModelHasChanged()
223 SdrPaintView::ModelHasChanged();
224 GetMarkedObjectListWriteAccess().SetNameDirty();
225 bMarkedObjRectDirty
=TRUE
;
226 bMarkedPointsRectsDirty
=TRUE
;
227 // Es sind beispielsweise Obj markiert und maMarkedObjectListist Sorted.
228 // In einer anderen View 2 wird die ObjOrder veraendert
229 // (z.B. MovToTop()). Dann ist Neusortieren der MarkList erforderlich.
230 GetMarkedObjectListWriteAccess().SetUnsorted();
233 //remove empty maked SdrObject
234 ULONG nMarkAnz
=GetMarkedObjectCount();
235 for (ULONG nMarkNum
=nMarkAnz
; nMarkNum
>0;)
238 SdrMark
* pM
=GetSdrMarkByIndex(nMarkNum
);
239 const SdrObject
* pObj
=pM
->GetMarkedSdrObj();
242 GetMarkedObjectListWriteAccess().DeleteMark(nMarkNum
);
247 SdrView
* pV
=(SdrView
*)this;
248 if (pV
!=NULL
&& !pV
->IsDragObj() && !pV
->IsInsObjPoint()) { // an dieser Stelle habe ich ein ziemliches Problem !!!
253 ////////////////////////////////////////////////////////////////////////////////////////////////////
255 BOOL
SdrMarkView::IsAction() const
257 return SdrSnapView::IsAction() || IsMarkObj() || IsMarkPoints() || IsMarkGluePoints();
260 void SdrMarkView::MovAction(const Point
& rPnt
)
262 SdrSnapView::MovAction(rPnt
);
268 else if(IsMarkPoints())
272 else if(IsMarkGluePoints())
274 MovMarkGluePoints(rPnt
);
278 void SdrMarkView::EndAction()
284 else if(IsMarkPoints())
288 else if(IsMarkGluePoints())
293 SdrSnapView::EndAction();
296 void SdrMarkView::BckAction()
298 SdrSnapView::BckAction();
304 void SdrMarkView::BrkAction()
306 SdrSnapView::BrkAction();
312 void SdrMarkView::TakeActionRect(Rectangle
& rRect
) const
314 if(IsMarkObj() || IsMarkPoints() || IsMarkGluePoints())
316 rRect
= Rectangle(aDragStat
.GetStart(), aDragStat
.GetNow());
320 SdrSnapView::TakeActionRect(rRect
);
324 ////////////////////////////////////////////////////////////////////////////////////////////////////
326 void SdrMarkView::ClearPageView()
329 SdrSnapView::ClearPageView();
332 void SdrMarkView::HideSdrPage()
335 //HMHbool bVis(false);
339 // break all creation actions when hiding page (#75081#)
341 //HMHbVis = IsMarkHdlShown();
348 // Alle Markierungen dieser Seite verwerfen
349 bMrkChg
= GetMarkedObjectListWriteAccess().DeletePageView(*mpPageView
);
352 SdrSnapView::HideSdrPage();
356 MarkListHasChanged();
366 ////////////////////////////////////////////////////////////////////////////////////////////////////
368 sal_Bool
SdrMarkView::BegMarkObj(const Point
& rPnt
, sal_Bool bUnmark
)
372 DBG_ASSERT(0L == mpMarkObjOverlay
, "SdrMarkView::BegMarkObj: There exists a mpMarkObjOverlay (!)");
373 basegfx::B2DPoint
aStartPos(rPnt
.X(), rPnt
.Y());
374 mpMarkObjOverlay
= new ImplMarkingOverlay(*this, aStartPos
, bUnmark
);
376 aDragStat
.Reset(rPnt
);
377 aDragStat
.NextPoint();
378 aDragStat
.SetMinMove(nMinMovLog
);
383 void SdrMarkView::MovMarkObj(const Point
& rPnt
)
385 if(IsMarkObj() && aDragStat
.CheckMinMoved(rPnt
))
387 aDragStat
.NextMove(rPnt
);
388 DBG_ASSERT(mpMarkObjOverlay
, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
389 basegfx::B2DPoint
aNewPos(rPnt
.X(), rPnt
.Y());
390 mpMarkObjOverlay
->SetSecondPosition(aNewPos
);
394 sal_Bool
SdrMarkView::EndMarkObj()
396 sal_Bool
bRetval(sal_False
);
400 if(aDragStat
.IsMinMoved())
402 Rectangle
aRect(aDragStat
.GetStart(), aDragStat
.GetNow());
404 MarkObj(aRect
, mpMarkObjOverlay
->IsUnmarking());
415 void SdrMarkView::BrkMarkObj()
419 DBG_ASSERT(mpMarkObjOverlay
, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
420 delete mpMarkObjOverlay
;
421 mpMarkObjOverlay
= 0L;
425 ////////////////////////////////////////////////////////////////////////////////////////////////////
427 sal_Bool
SdrMarkView::BegMarkPoints(const Point
& rPnt
, sal_Bool bUnmark
)
429 if(HasMarkablePoints())
433 DBG_ASSERT(0L == mpMarkPointsOverlay
, "SdrMarkView::BegMarkObj: There exists a mpMarkPointsOverlay (!)");
434 basegfx::B2DPoint
aStartPos(rPnt
.X(), rPnt
.Y());
435 mpMarkPointsOverlay
= new ImplMarkingOverlay(*this, aStartPos
, bUnmark
);
437 aDragStat
.Reset(rPnt
);
438 aDragStat
.NextPoint();
439 aDragStat
.SetMinMove(nMinMovLog
);
447 void SdrMarkView::MovMarkPoints(const Point
& rPnt
)
449 if(IsMarkPoints() && aDragStat
.CheckMinMoved(rPnt
))
451 aDragStat
.NextMove(rPnt
);
453 DBG_ASSERT(mpMarkPointsOverlay
, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
454 basegfx::B2DPoint
aNewPos(rPnt
.X(), rPnt
.Y());
455 mpMarkPointsOverlay
->SetSecondPosition(aNewPos
);
459 sal_Bool
SdrMarkView::EndMarkPoints()
461 sal_Bool
bRetval(sal_False
);
465 if(aDragStat
.IsMinMoved())
467 Rectangle
aRect(aDragStat
.GetStart(), aDragStat
.GetNow());
469 MarkPoints(aRect
, mpMarkPointsOverlay
->IsUnmarking());
481 void SdrMarkView::BrkMarkPoints()
485 DBG_ASSERT(mpMarkPointsOverlay
, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
486 delete mpMarkPointsOverlay
;
487 mpMarkPointsOverlay
= 0L;
491 ////////////////////////////////////////////////////////////////////////////////////////////////////
493 sal_Bool
SdrMarkView::BegMarkGluePoints(const Point
& rPnt
, sal_Bool bUnmark
)
495 if(HasMarkableGluePoints())
499 DBG_ASSERT(0L == mpMarkGluePointsOverlay
, "SdrMarkView::BegMarkObj: There exists a mpMarkGluePointsOverlay (!)");
500 basegfx::B2DPoint
aStartPos(rPnt
.X(), rPnt
.Y());
501 mpMarkGluePointsOverlay
= new ImplMarkingOverlay(*this, aStartPos
, bUnmark
);
503 aDragStat
.Reset(rPnt
);
504 aDragStat
.NextPoint();
505 aDragStat
.SetMinMove(nMinMovLog
);
513 void SdrMarkView::MovMarkGluePoints(const Point
& rPnt
)
515 if(IsMarkGluePoints() && aDragStat
.CheckMinMoved(rPnt
))
517 aDragStat
.NextMove(rPnt
);
519 DBG_ASSERT(mpMarkGluePointsOverlay
, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
520 basegfx::B2DPoint
aNewPos(rPnt
.X(), rPnt
.Y());
521 mpMarkGluePointsOverlay
->SetSecondPosition(aNewPos
);
525 sal_Bool
SdrMarkView::EndMarkGluePoints()
527 sal_Bool
bRetval(sal_False
);
529 if(IsMarkGluePoints())
531 if(aDragStat
.IsMinMoved())
533 Rectangle
aRect(aDragStat
.GetStart(),aDragStat
.GetNow());
535 MarkGluePoints(&aRect
, mpMarkGluePointsOverlay
->IsUnmarking());
547 void SdrMarkView::BrkMarkGluePoints()
549 if(IsMarkGluePoints())
551 DBG_ASSERT(mpMarkGluePointsOverlay
, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
552 delete mpMarkGluePointsOverlay
;
553 mpMarkGluePointsOverlay
= 0L;
557 BOOL
SdrMarkView::HasMarkableObj() const
561 SdrPageView
* pPV
= GetSdrPageView();
564 SdrObjList
* pOL
=pPV
->GetObjList();
565 ULONG nObjAnz
=pOL
->GetObjCount();
566 for (ULONG nObjNum
=0; nObjNum
<nObjAnz
&& nCount
==0; nObjNum
++) {
567 SdrObject
* pObj
=pOL
->GetObj(nObjNum
);
568 if (IsObjMarkable(pObj
,pPV
)) {
576 ULONG
SdrMarkView::GetMarkableObjCount() const
579 SdrPageView
* pPV
= GetSdrPageView();
583 SdrObjList
* pOL
=pPV
->GetObjList();
584 ULONG nObjAnz
=pOL
->GetObjCount();
585 for (ULONG nObjNum
=0; nObjNum
<nObjAnz
; nObjNum
++) {
586 SdrObject
* pObj
=pOL
->GetObj(nObjNum
);
587 if (IsObjMarkable(pObj
,pPV
)) {
595 //HMHvoid SdrMarkView::ImpShowMarkHdl(bool /*bNoRefHdl*/)
597 //HMH bNoRefHdl=FALSE; // geht leider erstmal nicht anders
598 //HMH if (!bHdlShown) {
599 //HMH bRefHdlShownOnly=FALSE;
600 //HMH bHdlShown=TRUE;
604 //HMHvoid SdrMarkView::ShowMarkHdl(bool /*bNoRefHdl*/)
606 //HMH bNoRefHdl=FALSE; // geht leider erstmal nicht anders
607 //HMH ImpShowMarkHdl(bNoRefHdl);
611 //HMHvoid SdrMarkView::HideMarkHdl(bool /*bNoRefHdl*/)
613 //HMH bNoRefHdl=FALSE; // geht leider erstmal nicht anders
614 //HMH if (bHdlShown) {
615 //HMH bRefHdlShownOnly=bNoRefHdl;
616 //HMH bHdlShown=FALSE;
620 void SdrMarkView::hideMarkHandles()
622 if(!mbMarkHandlesHidden
)
624 mbMarkHandlesHidden
= true;
629 void SdrMarkView::showMarkHandles()
631 if(mbMarkHandlesHidden
)
633 mbMarkHandlesHidden
= false;
638 BOOL
SdrMarkView::ImpIsFrameHandles() const
640 ULONG nMarkAnz
=GetMarkedObjectCount();
641 BOOL bFrmHdl
=nMarkAnz
>nFrameHandlesLimit
|| bForceFrameHandles
;
642 BOOL bStdDrag
=eDragMode
==SDRDRAG_MOVE
;
643 if (nMarkAnz
==1 && bStdDrag
&& bFrmHdl
)
645 const SdrObject
* pObj
=GetMarkedObjectByIndex(0);
646 if (pObj
->GetObjInventor()==SdrInventor
)
648 UINT16 nIdent
=pObj
->GetObjIdentifier();
649 if (nIdent
==OBJ_LINE
|| nIdent
==OBJ_EDGE
|| nIdent
==OBJ_CAPTION
|| nIdent
==OBJ_MEASURE
|| nIdent
==OBJ_CUSTOMSHAPE
|| nIdent
==OBJ_TABLE
)
655 if (!bStdDrag
&& !bFrmHdl
) {
656 // Grundsaetzlich erstmal alle anderen Dragmodi nur mit FrameHandles
658 if (eDragMode
==SDRDRAG_ROTATE
) {
659 // bei Rotate ObjOwn-Drag, wenn mind. 1 PolyObj
660 for (ULONG nMarkNum
=0; nMarkNum
<nMarkAnz
&& bFrmHdl
; nMarkNum
++) {
661 const SdrMark
* pM
=GetSdrMarkByIndex(nMarkNum
);
662 const SdrObject
* pObj
=pM
->GetMarkedSdrObj();
663 bFrmHdl
=!pObj
->IsPolyObj();
668 // FrameHandles, wenn wenigstens 1 Obj kein SpecialDrag kann
669 for (ULONG nMarkNum
=0; nMarkNum
<nMarkAnz
&& !bFrmHdl
; nMarkNum
++) {
670 const SdrMark
* pM
=GetSdrMarkByIndex(nMarkNum
);
671 const SdrObject
* pObj
=pM
->GetMarkedSdrObj();
672 bFrmHdl
=!pObj
->hasSpecialDrag();
678 void SdrMarkView::SetMarkHandles()
680 // #105722# remember old focus handle values to search for it again
681 const SdrHdl
* pSaveOldFocusHdl
= aHdl
.GetFocusHdl();
682 sal_Bool
bSaveOldFocus(sal_False
);
683 sal_uInt32
nSavePolyNum(0L), nSavePointNum(0L);
684 SdrHdlKind
eSaveKind(HDL_MOVE
);
685 SdrObject
* pSaveObj
= NULL
;
688 && pSaveOldFocusHdl
->GetObj()
689 && pSaveOldFocusHdl
->GetObj()->ISA(SdrPathObj
)
690 && (pSaveOldFocusHdl
->GetKind() == HDL_POLY
|| pSaveOldFocusHdl
->GetKind() == HDL_BWGT
))
692 bSaveOldFocus
= sal_True
;
693 nSavePolyNum
= pSaveOldFocusHdl
->GetPolyNum();
694 nSavePointNum
= pSaveOldFocusHdl
->GetPointNum();
695 pSaveObj
= pSaveOldFocusHdl
->GetObj();
696 eSaveKind
= pSaveOldFocusHdl
->GetKind();
699 // delete/clear all handles. This will always be done, even with areMarkHandlesHidden()
701 aHdl
.SetRotateShear(eDragMode
==SDRDRAG_ROTATE
);
702 aHdl
.SetDistortShear(eDragMode
==SDRDRAG_SHEAR
);
706 // are handles enabled at all? Create only then
707 if(!areMarkHandlesHidden())
709 ULONG nMarkAnz
=GetMarkedObjectCount();
710 BOOL bStdDrag
=eDragMode
==SDRDRAG_MOVE
;
711 BOOL bSingleTextObjMark
=FALSE
;
715 pMarkedObj
=GetMarkedObjectByIndex(0);
718 pMarkedObj
->ISA(SdrTextObj
) &&
719 static_cast<SdrTextObj
*>(pMarkedObj
)->IsTextFrame();
722 BOOL bFrmHdl
=ImpIsFrameHandles();
726 pMarkedPV
=GetSdrPageViewOfMarkedByIndex(0);
728 for (ULONG nMarkNum
=0; nMarkNum
<nMarkAnz
&& (pMarkedPV
!=NULL
|| !bFrmHdl
); nMarkNum
++)
730 const SdrMark
* pM
=GetSdrMarkByIndex(nMarkNum
);
732 if (pMarkedPV
!=pM
->GetPageView())
741 Rectangle
aRect(GetMarkedObjRect());
744 const sal_Bool
bHideHandlesWhenInTextEdit(
745 ((SdrView
*)this)->IsTextEdit()
747 && pMarkedObj
->ISA(SdrTextObj
)
748 && ((SdrTextObj
*)pMarkedObj
)->IsInEditMode());
750 if(!aRect
.IsEmpty() && !bHideHandlesWhenInTextEdit
)
751 { // sonst nix gefunden
752 if( bSingleTextObjMark
)
754 const ULONG nSiz0
=aHdl
.GetHdlCount();
755 pMarkedObj
->AddToHdlList(aHdl
);
756 const ULONG nSiz1
=aHdl
.GetHdlCount();
757 for (ULONG i
=nSiz0
; i
<nSiz1
; i
++)
759 SdrHdl
* pHdl
=aHdl
.GetHdl(i
);
760 pHdl
->SetObj(pMarkedObj
);
761 pHdl
->SetPageView(pMarkedPV
);
762 pHdl
->SetObjHdlNum(USHORT(i
-nSiz0
));
765 else if( eDragMode
==SDRDRAG_CROP
)
767 aHdl
.AddHdl(new SdrCropHdl(aRect
.TopLeft() ,HDL_UPLFT
));
768 aHdl
.AddHdl(new SdrCropHdl(aRect
.TopCenter() ,HDL_UPPER
));
769 aHdl
.AddHdl(new SdrCropHdl(aRect
.TopRight() ,HDL_UPRGT
));
770 aHdl
.AddHdl(new SdrCropHdl(aRect
.LeftCenter() ,HDL_LEFT
));
771 aHdl
.AddHdl(new SdrCropHdl(aRect
.RightCenter() ,HDL_RIGHT
));
772 aHdl
.AddHdl(new SdrCropHdl(aRect
.BottomLeft() ,HDL_LWLFT
));
773 aHdl
.AddHdl(new SdrCropHdl(aRect
.BottomCenter(),HDL_LOWER
));
774 aHdl
.AddHdl(new SdrCropHdl(aRect
.BottomRight() ,HDL_LWRGT
));
778 BOOL bWdt0
=aRect
.Left()==aRect
.Right();
779 BOOL bHgt0
=aRect
.Top()==aRect
.Bottom();
782 aHdl
.AddHdl(new SdrHdl(aRect
.TopLeft(),HDL_UPLFT
));
784 else if (!bStdDrag
&& (bWdt0
|| bHgt0
))
786 aHdl
.AddHdl(new SdrHdl(aRect
.TopLeft() ,HDL_UPLFT
));
787 aHdl
.AddHdl(new SdrHdl(aRect
.BottomRight(),HDL_LWRGT
));
791 if (!bWdt0
&& !bHgt0
) aHdl
.AddHdl(new SdrHdl(aRect
.TopLeft() ,HDL_UPLFT
));
792 if ( !bHgt0
) aHdl
.AddHdl(new SdrHdl(aRect
.TopCenter() ,HDL_UPPER
));
793 if (!bWdt0
&& !bHgt0
) aHdl
.AddHdl(new SdrHdl(aRect
.TopRight() ,HDL_UPRGT
));
794 if (!bWdt0
) aHdl
.AddHdl(new SdrHdl(aRect
.LeftCenter() ,HDL_LEFT
));
795 if (!bWdt0
) aHdl
.AddHdl(new SdrHdl(aRect
.RightCenter() ,HDL_RIGHT
));
796 if (!bWdt0
&& !bHgt0
) aHdl
.AddHdl(new SdrHdl(aRect
.BottomLeft() ,HDL_LWLFT
));
797 if ( !bHgt0
) aHdl
.AddHdl(new SdrHdl(aRect
.BottomCenter(),HDL_LOWER
));
798 if (!bWdt0
&& !bHgt0
) aHdl
.AddHdl(new SdrHdl(aRect
.BottomRight() ,HDL_LWRGT
));
805 for (ULONG nMarkNum
=0; nMarkNum
<nMarkAnz
; nMarkNum
++)
807 const SdrMark
* pM
=GetSdrMarkByIndex(nMarkNum
);
808 SdrObject
* pObj
=pM
->GetMarkedSdrObj();
809 SdrPageView
* pPV
=pM
->GetPageView();
810 const ULONG nSiz0
=aHdl
.GetHdlCount();
811 pObj
->AddToHdlList(aHdl
);
812 const ULONG nSiz1
=aHdl
.GetHdlCount();
813 bool bPoly
=pObj
->IsPolyObj();
814 const SdrUShortCont
* pMrkPnts
=pM
->GetMarkedPoints();
815 for (ULONG i
=nSiz0
; i
<nSiz1
; i
++)
817 SdrHdl
* pHdl
=aHdl
.GetHdl(i
);
819 pHdl
->SetPageView(pPV
);
820 pHdl
->SetObjHdlNum(USHORT(i
-nSiz0
));
823 BOOL bSelected
=pMrkPnts
!=NULL
&& pMrkPnts
->Exist(USHORT(i
-nSiz0
));
824 pHdl
->SetSelected(bSelected
);
825 //BOOL bPlus=bPlusHdlAlways;
826 if (bPlusHdlAlways
|| bSelected
)
828 sal_uInt32 nPlusAnz
=pObj
->GetPlusHdlCount(*pHdl
);
829 for (sal_uInt32 nPlusNum
=0; nPlusNum
<nPlusAnz
; nPlusNum
++)
831 SdrHdl
* pPlusHdl
=pObj
->GetPlusHdl(*pHdl
,nPlusNum
);
834 pPlusHdl
->SetObj(pObj
);
835 pPlusHdl
->SetPageView(pPV
);
836 pPlusHdl
->SetPlusHdl(TRUE
);
837 aHdl
.AddHdl(pPlusHdl
);
847 for (ULONG nMarkNum
=0; nMarkNum
<nMarkAnz
; nMarkNum
++)
849 const SdrMark
* pM
=GetSdrMarkByIndex(nMarkNum
);
850 SdrObject
* pObj
=pM
->GetMarkedSdrObj();
851 SdrPageView
* pPV
=pM
->GetPageView();
852 const SdrUShortCont
* pMrkGlue
=pM
->GetMarkedGluePoints();
855 const SdrGluePointList
* pGPL
=pObj
->GetGluePointList();
858 //USHORT nGlueAnz=pGPL->GetCount();
859 USHORT nAnz
=(USHORT
)pMrkGlue
->GetCount();
860 for (USHORT nNum
=0; nNum
<nAnz
; nNum
++)
862 USHORT nId
=pMrkGlue
->GetObject(nNum
);
863 //nNum changed to nNumGP because already used in for loop
864 USHORT nNumGP
=pGPL
->FindGluePoint(nId
);
865 if (nNumGP
!=SDRGLUEPOINT_NOTFOUND
)
867 const SdrGluePoint
& rGP
=(*pGPL
)[nNumGP
];
868 Point
aPos(rGP
.GetAbsolutePos(*pObj
));
869 SdrHdl
* pGlueHdl
=new SdrHdl(aPos
,HDL_GLUE
);
870 pGlueHdl
->SetObj(pObj
);
871 pGlueHdl
->SetPageView(pPV
);
872 pGlueHdl
->SetObjHdlNum(nId
);
873 aHdl
.AddHdl(pGlueHdl
);
880 // Drehpunkt/Spiegelachse
881 AddDragModeHdl(eDragMode
);
883 // add custom handles (used by other apps, e.g. AnchorPos)
889 // #105722# try to restore focus handle index from remembered values
892 for(sal_uInt32
a(0); a
< aHdl
.GetHdlCount(); a
++)
894 SdrHdl
* pCandidate
= aHdl
.GetHdl(a
);
896 if(pCandidate
->GetObj()
897 && pCandidate
->GetObj() == pSaveObj
898 && pCandidate
->GetKind() == eSaveKind
899 && pCandidate
->GetPolyNum() == nSavePolyNum
900 && pCandidate
->GetPointNum() == nSavePointNum
)
902 aHdl
.SetFocusHdl(pCandidate
);
910 void SdrMarkView::AddCustomHdl()
912 // add custom handles (used by other apps, e.g. AnchorPos)
915 void SdrMarkView::SetDragMode(SdrDragMode eMode
)
917 SdrDragMode eMode0
=eDragMode
;
919 if (eDragMode
==SDRDRAG_RESIZE
) eDragMode
=SDRDRAG_MOVE
;
920 if (eDragMode
!=eMode0
) {
921 //HMHBOOL bVis=IsMarkHdlShown();
922 //HMHif (bVis) HideMarkHdl();
925 //HMHif (bVis) ShowMarkHdl();
927 if (AreObjectsMarked()) MarkListHasChanged();
932 void SdrMarkView::AddDragModeHdl(SdrDragMode eMode
)
938 // add rotation center
939 SdrHdl
* pHdl
= new SdrHdl(aRef1
, HDL_REF1
);
948 SdrHdl
* pHdl3
= new SdrHdl(aRef2
, HDL_REF2
);
949 SdrHdl
* pHdl2
= new SdrHdl(aRef1
, HDL_REF1
);
950 SdrHdl
* pHdl1
= new SdrHdlLine(*pHdl2
, *pHdl3
, HDL_MIRX
);
952 pHdl1
->SetObjHdlNum(1); // fuer Sortierung
953 pHdl2
->SetObjHdlNum(2); // fuer Sortierung
954 pHdl3
->SetObjHdlNum(3); // fuer Sortierung
956 aHdl
.AddHdl(pHdl1
); // Linie als erstes, damit als letztes im HitTest
962 case SDRDRAG_TRANSPARENCE
:
964 // add interactive transparence handle
965 ULONG nMarkAnz
= GetMarkedObjectCount();
968 SdrObject
* pObj
= GetMarkedObjectByIndex(0);
969 SdrModel
* pModel
= GetModel();
970 const SfxItemSet
& rSet
= pObj
->GetMergedItemSet();
972 if(SFX_ITEM_SET
!= rSet
.GetItemState(XATTR_FILLFLOATTRANSPARENCE
, FALSE
))
974 // add this item, it's not yet there
975 XFillFloatTransparenceItem
aNewItem(
976 (const XFillFloatTransparenceItem
&)rSet
.Get(XATTR_FILLFLOATTRANSPARENCE
));
977 XGradient aGrad
= aNewItem
.GetGradientValue();
979 aNewItem
.SetEnabled(TRUE
);
980 aGrad
.SetStartIntens(100);
981 aGrad
.SetEndIntens(100);
982 aNewItem
.SetGradientValue(aGrad
);
984 // add undo to allow user to take back this step
985 if( pModel
->IsUndoEnabled() )
987 pModel
->BegUndo(SVX_RESSTR(SIP_XA_FILLTRANSPARENCE
));
988 pModel
->AddUndo(pModel
->GetSdrUndoFactory().CreateUndoAttrObject(*pObj
));
992 //pObj->SetItemAndBroadcast(aNewItem);
993 SfxItemSet
aNewSet(pModel
->GetItemPool());
994 aNewSet
.Put(aNewItem
);
995 pObj
->SetMergedItemSetAndBroadcast(aNewSet
);
998 // set values and transform to vector set
999 GradTransformer aGradTransformer
;
1000 GradTransVector aGradTransVector
;
1001 GradTransGradient aGradTransGradient
;
1003 aGradTransGradient
.aGradient
= ((XFillFloatTransparenceItem
&)rSet
.Get(XATTR_FILLFLOATTRANSPARENCE
)).GetGradientValue();
1004 aGradTransformer
.GradToVec(aGradTransGradient
, aGradTransVector
, pObj
);
1007 const Point
aTmpPos1(basegfx::fround(aGradTransVector
.maPositionA
.getX()), basegfx::fround(aGradTransVector
.maPositionA
.getY()));
1008 const Point
aTmpPos2(basegfx::fround(aGradTransVector
.maPositionB
.getX()), basegfx::fround(aGradTransVector
.maPositionB
.getY()));
1009 SdrHdlColor
* pColHdl1
= new SdrHdlColor(aTmpPos1
, aGradTransVector
.aCol1
, SDR_HANDLE_COLOR_SIZE_NORMAL
, TRUE
);
1010 SdrHdlColor
* pColHdl2
= new SdrHdlColor(aTmpPos2
, aGradTransVector
.aCol2
, SDR_HANDLE_COLOR_SIZE_NORMAL
, TRUE
);
1011 SdrHdlGradient
* pGradHdl
= new SdrHdlGradient(aTmpPos1
, aTmpPos2
, FALSE
);
1012 DBG_ASSERT(pColHdl1
&& pColHdl2
&& pGradHdl
, "Got not all necessary handles!!");
1015 pGradHdl
->SetColorHandles(pColHdl1
, pColHdl2
);
1016 pGradHdl
->SetObj(pObj
);
1017 pColHdl1
->SetColorChangeHdl(LINK(pGradHdl
, SdrHdlGradient
, ColorChangeHdl
));
1018 pColHdl2
->SetColorChangeHdl(LINK(pGradHdl
, SdrHdlGradient
, ColorChangeHdl
));
1021 aHdl
.AddHdl(pColHdl1
);
1022 aHdl
.AddHdl(pColHdl2
);
1023 aHdl
.AddHdl(pGradHdl
);
1027 case SDRDRAG_GRADIENT
:
1029 // add interactive gradient handle
1030 ULONG nMarkAnz
= GetMarkedObjectCount();
1033 SdrObject
* pObj
= GetMarkedObjectByIndex(0);
1034 const SfxItemSet
& rSet
= pObj
->GetMergedItemSet();
1035 XFillStyle eFillStyle
= ((XFillStyleItem
&)(rSet
.Get(XATTR_FILLSTYLE
))).GetValue();
1037 if(eFillStyle
== XFILL_GRADIENT
)
1039 // set values and transform to vector set
1040 GradTransformer aGradTransformer
;
1041 GradTransVector aGradTransVector
;
1042 GradTransGradient aGradTransGradient
;
1043 Size
aHdlSize(15, 15);
1045 aGradTransGradient
.aGradient
= ((XFillGradientItem
&)rSet
.Get(XATTR_FILLGRADIENT
)).GetGradientValue();
1046 aGradTransformer
.GradToVec(aGradTransGradient
, aGradTransVector
, pObj
);
1049 const Point
aTmpPos1(basegfx::fround(aGradTransVector
.maPositionA
.getX()), basegfx::fround(aGradTransVector
.maPositionA
.getY()));
1050 const Point
aTmpPos2(basegfx::fround(aGradTransVector
.maPositionB
.getX()), basegfx::fround(aGradTransVector
.maPositionB
.getY()));
1051 SdrHdlColor
* pColHdl1
= new SdrHdlColor(aTmpPos1
, aGradTransVector
.aCol1
, aHdlSize
, FALSE
);
1052 SdrHdlColor
* pColHdl2
= new SdrHdlColor(aTmpPos2
, aGradTransVector
.aCol2
, aHdlSize
, FALSE
);
1053 SdrHdlGradient
* pGradHdl
= new SdrHdlGradient(aTmpPos1
, aTmpPos2
, TRUE
);
1054 DBG_ASSERT(pColHdl1
&& pColHdl2
&& pGradHdl
, "Got not all necessary handles!!");
1057 pGradHdl
->SetColorHandles(pColHdl1
, pColHdl2
);
1058 pGradHdl
->SetObj(pObj
);
1059 pColHdl1
->SetColorChangeHdl(LINK(pGradHdl
, SdrHdlGradient
, ColorChangeHdl
));
1060 pColHdl2
->SetColorChangeHdl(LINK(pGradHdl
, SdrHdlGradient
, ColorChangeHdl
));
1063 aHdl
.AddHdl(pColHdl1
);
1064 aHdl
.AddHdl(pColHdl2
);
1065 aHdl
.AddHdl(pGradHdl
);
1079 void SdrMarkView::ForceRefToMarked()
1083 case SDRDRAG_ROTATE
:
1085 Rectangle
aR(GetMarkedObjRect());
1086 aRef1
= aR
.Center();
1091 case SDRDRAG_MIRROR
:
1093 // Erstmal die laenge der Spiegelachsenlinie berechnen
1099 OutputDevice
* pOut
=GetFirstOutputDevice();
1100 //OutputDevice* pOut=GetWin(0);
1102 // Mindestlaenge 50 Pixel
1103 nMinLen
=pOut
->PixelToLogic(Size(0,50)).Height();
1104 // 20 Pixel fuer RefPt-Abstand vom Obj
1105 nObjDst
=pOut
->PixelToLogic(Size(0,20)).Height();
1107 // Abstand zum Rand = Mindestlaenge = 10 Pixel
1108 long nDst
=pOut
->PixelToLogic(Size(0,10)).Height();
1109 nOutMin
=-pOut
->GetMapMode().GetOrigin().Y();
1110 nOutMax
=pOut
->GetOutputSize().Height()-1+nOutMin
;
1113 // Absolute Mindestlaenge jedoch 10 Pixel
1114 if (nOutMax
-nOutMin
<nDst
) {
1117 nOutMin
-=(nDst
+1)/2;
1118 nOutMax
=nOutMin
+nDst
;
1120 nOutHgt
=nOutMax
-nOutMin
;
1121 // Sonst Mindestlaenge = 1/4 OutHgt
1122 long nTemp
=nOutHgt
/4;
1123 if (nTemp
>nMinLen
) nMinLen
=nTemp
;
1126 Rectangle
aR(GetMarkedObjBoundRect());
1127 Point
aCenter(aR
.Center());
1128 long nMarkHgt
=aR
.GetHeight()-1;
1129 long nHgt
=nMarkHgt
+nObjDst
*2; // 20 Pixel obej und unten ueberstehend
1130 if (nHgt
<nMinLen
) nHgt
=nMinLen
; // Mindestlaenge 50 Pixel bzw. 1/4 OutHgt
1132 long nY1
=aCenter
.Y()-(nHgt
+1)/2;
1135 if (pOut
!=NULL
&& nMinLen
>nOutHgt
) nMinLen
=nOutHgt
; // evtl. noch etwas verkuerzen
1137 if (pOut
!=NULL
) { // nun vollstaendig in den sichtbaren Bereich schieben
1140 if (nY2
<nY1
+nMinLen
) nY2
=nY1
+nMinLen
;
1144 if (nY1
>nY2
-nMinLen
) nY1
=nY2
-nMinLen
;
1148 aRef1
.X()=aCenter
.X();
1150 aRef2
.X()=aCenter
.X();
1156 case SDRDRAG_TRANSPARENCE
:
1157 case SDRDRAG_GRADIENT
:
1160 Rectangle
aRect(GetMarkedObjBoundRect());
1161 aRef1
= aRect
.TopLeft();
1162 aRef2
= aRect
.BottomRight();
1169 void SdrMarkView::SetRef1(const Point
& rPt
)
1171 if(eDragMode
== SDRDRAG_ROTATE
|| eDragMode
== SDRDRAG_MIRROR
)
1174 SdrHdl
* pH
= aHdl
.GetHdl(HDL_REF1
);
1181 void SdrMarkView::SetRef2(const Point
& rPt
)
1183 if(eDragMode
== SDRDRAG_MIRROR
)
1186 SdrHdl
* pH
= aHdl
.GetHdl(HDL_REF2
);
1193 void SdrMarkView::CheckMarked()
1195 for (ULONG nm
=GetMarkedObjectCount(); nm
>0;) {
1197 SdrMark
* pM
=GetSdrMarkByIndex(nm
);
1198 SdrObject
* pObj
=pM
->GetMarkedSdrObj();
1199 SdrPageView
* pPV
=pM
->GetPageView();
1200 SdrLayerID nLay
=pObj
->GetLayer();
1201 BOOL bRaus
=!pObj
->IsInserted(); // Obj geloescht?
1202 if (!pObj
->Is3DObj()) {
1203 bRaus
=bRaus
|| pObj
->GetPage()!=pPV
->GetPage(); // Obj ploetzlich in anderer Page oder Group
1205 bRaus
=bRaus
|| pPV
->GetLockedLayers().IsSet(nLay
) || // Layer gesperrt?
1206 !pPV
->GetVisibleLayers().IsSet(nLay
); // Layer nicht sichtbar?
1208 // Joe am 9.3.1997: Gruppierte Objekten koennen nun auch
1209 // markiert werden. Nach EnterGroup muessen aber die Objekte
1210 // der hoeheren Ebene deselektiert werden.
1211 const SdrObjList
* pOOL
=pObj
->GetObjList();
1212 const SdrObjList
* pVOL
=pPV
->GetObjList();
1213 while (pOOL
!=NULL
&& pOOL
!=pVOL
) {
1214 pOOL
=pOOL
->GetUpList();
1221 GetMarkedObjectListWriteAccess().DeleteMark(nm
);
1225 if (!IsGluePointEditMode()) { // Markierte GluePoints nur im GlueEditMode
1226 SdrUShortCont
* pPts
=pM
->GetMarkedGluePoints();
1227 if (pPts
!=NULL
&& pPts
->GetCount()!=0) {
1234 // #97995# at least reset the remembered BoundRect to prevent handle
1235 // generation if bForceFrameHandles is TRUE.
1236 bMarkedObjRectDirty
= TRUE
;
1239 void SdrMarkView::SetMarkRects()
1241 SdrPageView
* pPV
= GetSdrPageView();
1245 pPV
->SetHasMarkedObj(GetSnapRectFromMarkedObjects(pPV
, pPV
->MarkSnap()));
1246 GetBoundRectFromMarkedObjects(pPV
, pPV
->MarkBound());
1250 void SdrMarkView::SetFrameHandles(BOOL bOn
)
1252 if (bOn
!=bForceFrameHandles
) {
1253 BOOL bOld
=ImpIsFrameHandles();
1254 bForceFrameHandles
=bOn
;
1255 BOOL bNew
=ImpIsFrameHandles();
1257 AdjustMarkHdl(); //HMHTRUE);
1258 MarkListHasChanged();
1263 void SdrMarkView::SetEditMode(SdrViewEditMode eMode
)
1265 if (eMode
!=eEditMode
) {
1266 BOOL bGlue0
=eEditMode
==SDREDITMODE_GLUEPOINTEDIT
;
1267 BOOL bEdge0
=((SdrCreateView
*)this)->IsEdgeTool();
1268 eEditMode0
=eEditMode
;
1270 BOOL bGlue1
=eEditMode
==SDREDITMODE_GLUEPOINTEDIT
;
1271 BOOL bEdge1
=((SdrCreateView
*)this)->IsEdgeTool();
1272 // etwas Aufwand um Flackern zu verhindern beim Umschalten
1273 // zwischen GlueEdit und EdgeTool
1274 if (bGlue1
&& !bGlue0
) ImpSetGlueVisible2(bGlue1
);
1275 if (bEdge1
!=bEdge0
) ImpSetGlueVisible3(bEdge1
);
1276 if (!bGlue1
&& bGlue0
) ImpSetGlueVisible2(bGlue1
);
1277 if (bGlue0
&& !bGlue1
) UnmarkAllGluePoints();
1281 ////////////////////////////////////////////////////////////////////////////////////////////////////
1283 BOOL
SdrMarkView::IsObjMarkable(SdrObject
* pObj
, SdrPageView
* pPV
) const
1287 if (pObj
->IsMarkProtect() ||
1288 (!bDesignMode
&& pObj
->IsUnoObj()))
1290 // Objekt nicht selektierbar oder
1291 // SdrUnoObj nicht im DesignMode
1295 return pPV
!=NULL
? pPV
->IsObjMarkable(pObj
) : TRUE
;
1298 BOOL
SdrMarkView::IsMarkedObjHit(const Point
& rPnt
, short nTol
) const
1301 nTol
=ImpGetHitTolLogic(nTol
,NULL
);
1303 for (ULONG nm
=0; nm
<GetMarkedObjectCount() && !bRet
; nm
++) {
1304 SdrMark
* pM
=GetSdrMarkByIndex(nm
);
1305 bRet
= 0 != CheckSingleSdrObjectHit(aPt
,USHORT(nTol
),pM
->GetMarkedSdrObj(),pM
->GetPageView(),0,0);
1310 SdrHdl
* SdrMarkView::PickHandle(const Point
& rPnt
, ULONG nOptions
, SdrHdl
* pHdl0
) const
1312 if (bSomeObjChgdFlag
) { // ggf. Handles neu berechnen lassen!
1313 FlushComeBackTimer();
1315 BOOL bBack
=(nOptions
& SDRSEARCH_BACKWARD
) !=0;
1316 BOOL bNext
=(nOptions
& SDRSEARCH_NEXT
) !=0;
1318 return aHdl
.IsHdlListHit(aPt
,bBack
,bNext
,pHdl0
);
1321 BOOL
SdrMarkView::MarkObj(const Point
& rPnt
, short nTol
, BOOL bToggle
, BOOL bDeep
)
1325 nTol
=ImpGetHitTolLogic(nTol
,NULL
);
1326 ULONG nOptions
=SDRSEARCH_PICKMARKABLE
;
1327 if (bDeep
) nOptions
=nOptions
|SDRSEARCH_DEEP
;
1328 BOOL bRet
=PickObj(rPnt
,(USHORT
)nTol
,pObj
,pPV
,nOptions
);
1330 BOOL bUnmark
=bToggle
&& IsObjMarked(pObj
);
1331 MarkObj(pObj
,pPV
,bUnmark
);
1336 BOOL
SdrMarkView::MarkNextObj(BOOL bPrev
)
1338 SdrPageView
* pPageView
= GetSdrPageView();
1345 SortMarkedObjects();
1346 ULONG nMarkAnz
=GetMarkedObjectCount();
1347 ULONG nChgMarkNum
= ULONG_MAX
; // Nummer des zu ersetzenden MarkEntries
1348 ULONG nSearchObjNum
= bPrev
? 0 : ULONG_MAX
;
1350 nChgMarkNum
=bPrev
? 0 : ULONG(nMarkAnz
-1);
1351 SdrMark
* pM
=GetSdrMarkByIndex(nChgMarkNum
);
1352 OSL_ASSERT(pM
!=NULL
);
1353 if (pM
->GetMarkedSdrObj() != NULL
)
1354 nSearchObjNum
= pM
->GetMarkedSdrObj()->GetNavigationPosition();
1357 SdrObject
* pMarkObj
=NULL
;
1358 SdrObjList
* pSearchObjList
=pPageView
->GetObjList();
1359 ULONG nObjAnz
=pSearchObjList
->GetObjCount();
1361 if (nSearchObjNum
>nObjAnz
) nSearchObjNum
=nObjAnz
;
1362 while (pMarkObj
==NULL
&& ((!bPrev
&& nSearchObjNum
>0) || (bPrev
&& nSearchObjNum
<nObjAnz
)))
1366 SdrObject
* pSearchObj
= pSearchObjList
->GetObjectForNavigationPosition(nSearchObjNum
);
1367 if (IsObjMarkable(pSearchObj
,pPageView
))
1369 if (TryToFindMarkedObject(pSearchObj
)==CONTAINER_ENTRY_NOTFOUND
)
1371 pMarkObj
=pSearchObj
;
1374 if (bPrev
) nSearchObjNum
++;
1383 if (nChgMarkNum
!=ULONG_MAX
)
1385 GetMarkedObjectListWriteAccess().DeleteMark(nChgMarkNum
);
1387 MarkObj(pMarkObj
,pPageView
); // ruft auch MarkListHasChanged(), AdjustMarkHdl()
1391 BOOL
SdrMarkView::MarkNextObj(const Point
& rPnt
, short nTol
, BOOL bPrev
)
1393 SortMarkedObjects();
1394 nTol
=ImpGetHitTolLogic(nTol
,NULL
);
1396 SdrMark
* pTopMarkHit
=NULL
;
1397 SdrMark
* pBtmMarkHit
=NULL
;
1398 ULONG nTopMarkHit
=0;
1399 ULONG nBtmMarkHit
=0;
1400 // oberstes der markierten Objekte suchen, das von rPnt getroffen wird
1401 ULONG nMarkAnz
=GetMarkedObjectCount();
1403 for (nm
=nMarkAnz
; nm
>0 && pTopMarkHit
==NULL
;) {
1405 SdrMark
* pM
=GetSdrMarkByIndex(nm
);
1406 if(CheckSingleSdrObjectHit(aPt
,USHORT(nTol
),pM
->GetMarkedSdrObj(),pM
->GetPageView(),0,0))
1412 // Nichts gefunden, dann ganz normal ein Obj markieren.
1413 if (pTopMarkHit
==NULL
) return MarkObj(rPnt
,USHORT(nTol
),FALSE
);
1415 SdrObject
* pTopObjHit
=pTopMarkHit
->GetMarkedSdrObj();
1416 SdrObjList
* pObjList
=pTopObjHit
->GetObjList();
1417 SdrPageView
* pPV
=pTopMarkHit
->GetPageView();
1418 // unterstes der markierten Objekte suchen, das von rPnt getroffen wird
1419 // und auf der gleichen PageView liegt wie pTopMarkHit
1420 for (nm
=0; nm
<nMarkAnz
&& pBtmMarkHit
==NULL
; nm
++) {
1421 SdrMark
* pM
=GetSdrMarkByIndex(nm
);
1422 SdrPageView
* pPV2
=pM
->GetPageView();
1423 if (pPV2
==pPV
&& CheckSingleSdrObjectHit(aPt
,USHORT(nTol
),pM
->GetMarkedSdrObj(),pPV2
,0,0))
1429 if (pBtmMarkHit
==NULL
) { pBtmMarkHit
=pTopMarkHit
; nBtmMarkHit
=nTopMarkHit
; }
1430 SdrObject
* pBtmObjHit
=pBtmMarkHit
->GetMarkedSdrObj();
1431 ULONG nObjAnz
=pObjList
->GetObjCount();
1434 //ULONG nSearchBeg=bPrev ? pBtmObjHit->GetOrdNum()+1 : pTopObjHit->GetOrdNum();
1435 sal_uInt32 nSearchBeg
;
1436 E3dScene
* pScene
= NULL
;
1437 SdrObject
* pObjHit
= (bPrev
) ? pBtmObjHit
: pTopObjHit
;
1438 sal_Bool bRemap
= pObjHit
->ISA(E3dCompoundObject
)
1439 ? ((E3dCompoundObject
*)pObjHit
)->IsAOrdNumRemapCandidate(pScene
)
1444 sal_uInt32
nOrdNumBtm(pBtmObjHit
->GetOrdNum());
1448 nOrdNumBtm
= pScene
->RemapOrdNum(nOrdNumBtm
);
1451 nSearchBeg
= nOrdNumBtm
+ 1;
1455 sal_uInt32
nOrdNumTop(pTopObjHit
->GetOrdNum());
1459 nOrdNumTop
= pScene
->RemapOrdNum(nOrdNumTop
);
1462 nSearchBeg
= nOrdNumTop
;
1465 ULONG no
=nSearchBeg
;
1466 SdrObject
* pFndObj
=NULL
;
1467 //SdrObject* pAktObj=NULL;
1468 while (pFndObj
==NULL
&& ((!bPrev
&& no
>0) || (bPrev
&& no
<nObjAnz
))) {
1474 pObj
= pObjList
->GetObj(pScene
->RemapOrdNum(no
));
1478 pObj
= pObjList
->GetObj(no
);
1481 if (CheckSingleSdrObjectHit(aPt
,USHORT(nTol
),pObj
,pPV
,SDRSEARCH_TESTMARKABLE
,0))
1483 if (TryToFindMarkedObject(pObj
)==CONTAINER_ENTRY_NOTFOUND
) {
1486 // hier wg. Performance ggf. noch no auf Top bzw. auf Btm stellen
1493 GetMarkedObjectListWriteAccess().DeleteMark(bPrev
?nBtmMarkHit
:nTopMarkHit
);
1494 GetMarkedObjectListWriteAccess().InsertEntry(SdrMark(pFndObj
,pPV
));
1495 MarkListHasChanged();
1496 AdjustMarkHdl(); //HMHTRUE);
1498 return pFndObj
!=NULL
;
1501 BOOL
SdrMarkView::MarkObj(const Rectangle
& rRect
, BOOL bUnmark
)
1504 Rectangle
aR(rRect
);
1506 SdrObjList
* pObjList
;
1508 SdrPageView
* pPV
= GetSdrPageView();
1512 pObjList
=pPV
->GetObjList();
1513 Rectangle
aFrm1(aR
);
1514 ULONG nObjAnz
=pObjList
->GetObjCount();
1515 for (ULONG nO
=0; nO
<nObjAnz
; nO
++) {
1516 pObj
=pObjList
->GetObj(nO
);
1517 Rectangle
aRect(pObj
->GetCurrentBoundRect());
1518 if (aFrm1
.IsInside(aRect
)) {
1520 if (IsObjMarkable(pObj
,pPV
))
1522 GetMarkedObjectListWriteAccess().InsertEntry(SdrMark(pObj
,pPV
));
1526 ULONG nPos
=TryToFindMarkedObject(pObj
);
1527 if (nPos
!=CONTAINER_ENTRY_NOTFOUND
)
1529 GetMarkedObjectListWriteAccess().DeleteMark(nPos
);
1537 SortMarkedObjects();
1538 MarkListHasChanged();
1539 AdjustMarkHdl(); //HMHTRUE);
1545 void SdrMarkView::MarkObj(SdrObject
* pObj
, SdrPageView
* pPV
, BOOL bUnmark
, BOOL bImpNoSetMarkHdl
)
1547 if (pObj
!=NULL
&& pPV
!=NULL
&& IsObjMarkable(pObj
, pPV
)) {
1551 GetMarkedObjectListWriteAccess().InsertEntry(SdrMark(pObj
,pPV
));
1555 ULONG nPos
=TryToFindMarkedObject(pObj
);
1556 if (nPos
!=CONTAINER_ENTRY_NOTFOUND
)
1558 GetMarkedObjectListWriteAccess().DeleteMark(nPos
);
1561 if (!bImpNoSetMarkHdl
) {
1562 MarkListHasChanged();
1563 AdjustMarkHdl(); //HMHTRUE);
1564 //HMHif (!bSomeObjChgdFlag) {
1565 // ShowMarkHdl kommt sonst mit dem AfterPaintTimer
1572 BOOL
SdrMarkView::IsObjMarked(SdrObject
* pObj
) const
1574 // nicht so ganz die feine Art: Da FindObject() nicht const ist
1575 // muss ich mich hier auf non-const casten.
1576 ULONG nPos
=((SdrMarkView
*)this)->TryToFindMarkedObject(pObj
);
1577 return nPos
!=CONTAINER_ENTRY_NOTFOUND
;
1580 USHORT
SdrMarkView::GetMarkHdlSizePixel() const
1582 return aHdl
.GetHdlSize()*2+1;
1585 void SdrMarkView::SetSolidMarkHdl(BOOL bOn
)
1587 if (bOn
!=aHdl
.IsFineHdl()) {
1588 //HMHBOOL bMerk=IsMarkHdlShown();
1589 //HMHif (bMerk) HideMarkHdl();
1590 aHdl
.SetFineHdl(bOn
);
1591 //HMHif (bMerk) ShowMarkHdl();
1595 void SdrMarkView::SetMarkHdlSizePixel(USHORT nSiz
)
1599 if (nSiz
!=aHdl
.GetHdlSize()) {
1600 //HMHBOOL bMerk=IsMarkHdlShown();
1601 //HMHif (bMerk) HideMarkHdl();
1602 aHdl
.SetHdlSize(nSiz
);
1603 //HMHif (bMerk) ShowMarkHdl();
1607 #define SDRSEARCH_IMPISMASTER 0x80000000 /* MasterPage wird gerade durchsucht */
1608 SdrObject
* SdrMarkView::CheckSingleSdrObjectHit(const Point
& rPnt
, USHORT nTol
, SdrObject
* pObj
, SdrPageView
* pPV
, ULONG nOptions
, const SetOfByte
* pMVisLay
) const
1610 if((nOptions
& SDRSEARCH_IMPISMASTER
) && pObj
->IsNotVisibleAsMaster())
1615 const bool bCheckIfMarkable(nOptions
& SDRSEARCH_TESTMARKABLE
);
1616 const bool bDeep(nOptions
& SDRSEARCH_DEEP
);
1617 const bool bOLE(pObj
->ISA(SdrOle2Obj
));
1618 const bool bTXT(pObj
->ISA(SdrTextObj
) && ((SdrTextObj
*)pObj
)->IsTextFrame());
1619 SdrObject
* pRet
=NULL
;
1620 Rectangle
aRect(pObj
->GetCurrentBoundRect());
1623 // double tolerance for OLE, text frames and objects in
1625 if(bOLE
|| bTXT
|| pObj
==((SdrObjEditView
*)this)->GetTextEditObject())
1630 aRect
.Left ()-=nTol2
; // Einmal Toleranz drauf fuer alle Objekte
1631 aRect
.Top ()-=nTol2
;
1632 aRect
.Right ()+=nTol2
;
1633 aRect
.Bottom()+=nTol2
;
1635 if (aRect
.IsInside(rPnt
))
1637 if ((!bCheckIfMarkable
|| IsObjMarkable(pObj
,pPV
)))
1639 SdrObjList
* pOL
=pObj
->GetSubList();
1641 if (pOL
!=NULL
&& pOL
->GetObjCount()!=0)
1644 // OD 30.06.2003 #108784# - adjustment hit point for virtual
1648 if ( pObj
->ISA(SdrVirtObj
) )
1650 Point aOffset
= static_cast<SdrVirtObj
*>(pObj
)->GetOffset();
1651 aPnt
.Move( -aOffset
.X(), -aOffset
.Y() );
1654 pRet
=CheckSingleSdrObjectHit(aPnt
,nTol
,pOL
,pPV
,nOptions
,pMVisLay
,pTmpObj
);
1658 if(!pMVisLay
|| pMVisLay
->IsSet(pObj
->GetLayer()))
1660 pRet
= SdrObjectPrimitiveHit(*pObj
, rPnt
, nTol2
, *pPV
, &pPV
->GetVisibleLayers(), false);
1666 if (!bDeep
&& pRet
!=NULL
)
1674 SdrObject
* SdrMarkView::CheckSingleSdrObjectHit(const Point
& rPnt
, USHORT nTol
, SdrObjList
* pOL
, SdrPageView
* pPV
, ULONG nOptions
, const SetOfByte
* pMVisLay
, SdrObject
*& rpRootObj
) const
1676 BOOL bBack
=(nOptions
& SDRSEARCH_BACKWARD
)!=0;
1677 SdrObject
* pRet
=NULL
;
1682 sal_Bool
bRemap(pOL
->GetOwnerObj() && pOL
->GetOwnerObj()->ISA(E3dScene
));
1683 E3dScene
* pRemapScene
= (bRemap
? (E3dScene
*)pOL
->GetOwnerObj() : 0L);
1685 ULONG nObjAnz
=pOL
->GetObjCount();
1686 ULONG nObjNum
=bBack
? 0 : nObjAnz
;
1687 while (pRet
==NULL
&& (bBack
? nObjNum
<nObjAnz
: nObjNum
>0)) {
1688 if (!bBack
) nObjNum
--;
1694 pObj
= pOL
->GetObj(pRemapScene
->RemapOrdNum(nObjNum
));
1698 pObj
= pOL
->GetObj(nObjNum
);
1701 pRet
=CheckSingleSdrObjectHit(rPnt
,nTol
,pObj
,pPV
,nOptions
,pMVisLay
);
1702 if (pRet
!=NULL
) rpRootObj
=pObj
;
1703 if (bBack
) nObjNum
++;
1709 BOOL
SdrMarkView::PickObj(const Point
& rPnt
, short nTol
, SdrObject
*& rpObj
, SdrPageView
*& rpPV
, ULONG nOptions
) const
1711 return PickObj(rPnt
,nTol
,rpObj
,rpPV
,nOptions
,NULL
,NULL
,NULL
);
1714 BOOL
SdrMarkView::PickObj(const Point
& rPnt
, short nTol
, SdrObject
*& rpObj
, SdrPageView
*& rpPV
, ULONG nOptions
, SdrObject
** ppRootObj
, ULONG
* pnMarkNum
, USHORT
* pnPassNum
) const
1715 { // Fehlt noch Pass2,Pass3
1716 SortMarkedObjects();
1717 if (ppRootObj
!=NULL
) *ppRootObj
=NULL
;
1718 if (pnMarkNum
!=NULL
) *pnMarkNum
=CONTAINER_ENTRY_NOTFOUND
;
1719 if (pnPassNum
!=NULL
) *pnPassNum
=0;
1722 BOOL bWholePage
=(nOptions
& SDRSEARCH_WHOLEPAGE
) !=0;
1723 BOOL bMarked
=(nOptions
& SDRSEARCH_MARKED
) !=0;
1724 BOOL bMasters
=!bMarked
&& (nOptions
& SDRSEARCH_ALSOONMASTER
) !=0;
1725 BOOL bBack
=(nOptions
& SDRSEARCH_BACKWARD
) !=0;
1726 #if OSL_DEBUG_LEVEL > 0
1727 BOOL bNext
=(nOptions
& SDRSEARCH_NEXT
) !=0; (void)bNext
; // n.i.
1728 BOOL bBoundCheckOn2ndPass
=(nOptions
& SDRSEARCH_PASS2BOUND
) !=0; (void)bBoundCheckOn2ndPass
;// n.i.
1729 BOOL bCheckNearestOn3rdPass
=(nOptions
& SDRSEARCH_PASS3NEAREST
) !=0; (void)bCheckNearestOn3rdPass
;// n.i.
1731 if (nTol
<0) nTol
=ImpGetHitTolLogic(nTol
,NULL
);
1733 SdrObject
* pObj
=NULL
;
1734 SdrObject
* pHitObj
=NULL
;
1735 SdrPageView
* pPV
=NULL
;
1736 if (!bBack
&& ((SdrObjEditView
*)this)->IsTextEditFrameHit(rPnt
)) {
1737 pObj
=((SdrObjEditView
*)this)->GetTextEditObject();
1739 pPV
=((SdrObjEditView
*)this)->GetTextEditPageView();
1742 ULONG nMrkAnz
=GetMarkedObjectCount();
1743 ULONG nMrkNum
=bBack
? 0 : nMrkAnz
;
1744 while (pHitObj
==NULL
&& (bBack
? nMrkNum
<nMrkAnz
: nMrkNum
>0)) {
1745 if (!bBack
) nMrkNum
--;
1746 SdrMark
* pM
=GetSdrMarkByIndex(nMrkNum
);
1747 pObj
=pM
->GetMarkedSdrObj();
1748 pPV
=pM
->GetPageView();
1749 pHitObj
=CheckSingleSdrObjectHit(aPt
,nTol
,pObj
,pPV
,nOptions
,NULL
);
1750 if (bBack
) nMrkNum
++;
1755 pPV
= GetSdrPageView();
1759 SdrPage
* pPage
=pPV
->GetPage();
1762 if(bMasters
&& pPage
->TRG_HasMasterPage())
1767 BOOL bExtraPassForWholePage
=bWholePage
&& pPage
!=pPV
->GetObjList();
1768 if (bExtraPassForWholePage
) nPgAnz
++; // Suche erst in AktObjList, dann auf der gesamten Page
1769 USHORT nPgNum
=bBack
? 0 : nPgAnz
;
1770 while (pHitObj
==NULL
&& (bBack
? nPgNum
<nPgAnz
: nPgNum
>0)) {
1771 ULONG nTmpOptions
=nOptions
;
1772 if (!bBack
) nPgNum
--;
1773 const SetOfByte
* pMVisLay
=NULL
;
1774 SdrObjList
* pObjList
=NULL
;
1775 if (pnPassNum
!=NULL
) *pnPassNum
&=~(SDRSEARCHPASS_MASTERPAGE
|SDRSEARCHPASS_INACTIVELIST
);
1776 if (nPgNum
>=nPgAnz
-1 || (bExtraPassForWholePage
&& nPgNum
>=nPgAnz
-2))
1778 pObjList
=pPV
->GetObjList();
1779 if (bExtraPassForWholePage
&& nPgNum
==nPgAnz
-2) {
1781 if (pnPassNum
!=NULL
) *pnPassNum
|=SDRSEARCHPASS_INACTIVELIST
;
1787 SdrPage
& rMasterPage
= pPage
->TRG_GetMasterPage();
1788 pMVisLay
= &pPage
->TRG_GetMasterPageVisibleLayers();
1789 pObjList
= &rMasterPage
;
1791 if (pnPassNum
!=NULL
) *pnPassNum
|=SDRSEARCHPASS_MASTERPAGE
;
1792 nTmpOptions
=nTmpOptions
| SDRSEARCH_IMPISMASTER
;
1794 pHitObj
=CheckSingleSdrObjectHit(aPt
,nTol
,pObjList
,pPV
,nTmpOptions
,pMVisLay
,pObj
);
1795 if (bBack
) nPgNum
++;
1799 if (pHitObj
!=NULL
) {
1800 if (ppRootObj
!=NULL
) *ppRootObj
=pObj
;
1801 if ((nOptions
& SDRSEARCH_DEEP
) !=0) pObj
=pHitObj
;
1802 if ((nOptions
& SDRSEARCH_TESTTEXTEDIT
) !=0) {
1803 if (!pObj
->HasTextEdit() || pPV
->GetLockedLayers().IsSet(pObj
->GetLayer())) {
1807 if (pObj
!=NULL
&& (nOptions
& SDRSEARCH_TESTMACRO
) !=0) {
1808 SdrObjMacroHitRec aHitRec
;
1810 aHitRec
.aDownPos
=aPt
;
1812 aHitRec
.pVisiLayer
=&pPV
->GetVisibleLayers();
1813 aHitRec
.pPageView
=pPV
;
1814 if (!pObj
->HasMacro() || !pObj
->IsMacroHit(aHitRec
)) pObj
=NULL
;
1816 if (pObj
!=NULL
&& (nOptions
& SDRSEARCH_WITHTEXT
) !=0 && pObj
->GetOutlinerParaObject()==NULL
) pObj
=NULL
;
1817 if (pObj
!=NULL
&& (nOptions
& SDRSEARCH_TESTTEXTAREA
) !=0)
1819 if(!SdrObjectPrimitiveHit(*pObj
, aPt
, 0, *pPV
, 0, true))
1827 if (pnPassNum
!=NULL
) *pnPassNum
|=SDRSEARCHPASS_DIRECT
;
1833 BOOL
SdrMarkView::PickMarkedObj(const Point
& rPnt
, SdrObject
*& rpObj
, SdrPageView
*& rpPV
, ULONG
* pnMarkNum
, ULONG nOptions
) const
1835 SortMarkedObjects();
1836 BOOL bBoundCheckOn2ndPass
=(nOptions
& SDRSEARCH_PASS2BOUND
) !=0;
1837 BOOL bCheckNearestOn3rdPass
=(nOptions
& SDRSEARCH_PASS3NEAREST
) !=0;
1840 if (pnMarkNum
!=NULL
) *pnMarkNum
=CONTAINER_ENTRY_NOTFOUND
;
1842 USHORT nTol
=(USHORT
)nHitTolLog
;
1844 ULONG nMarkAnz
=GetMarkedObjectCount();
1846 for (nMarkNum
=nMarkAnz
; nMarkNum
>0 && !bFnd
;) {
1848 SdrMark
* pM
=GetSdrMarkByIndex(nMarkNum
);
1849 SdrPageView
* pPV
=pM
->GetPageView();
1850 SdrObject
* pObj
=pM
->GetMarkedSdrObj();
1851 bFnd
= 0 != CheckSingleSdrObjectHit(aPt
,nTol
,pObj
,pPV
,SDRSEARCH_TESTMARKABLE
,0);
1855 if (pnMarkNum
!=NULL
) *pnMarkNum
=nMarkNum
;
1858 if ((bBoundCheckOn2ndPass
|| bCheckNearestOn3rdPass
) && !bFnd
) {
1859 SdrObject
* pBestObj
=NULL
;
1860 SdrPageView
* pBestPV
=NULL
;
1861 ULONG nBestMarkNum
=0;
1862 ULONG nBestDist
=ULONG_MAX
;
1863 for (nMarkNum
=nMarkAnz
; nMarkNum
>0 && !bFnd
;) {
1865 SdrMark
* pM
=GetSdrMarkByIndex(nMarkNum
);
1866 SdrPageView
* pPV
=pM
->GetPageView();
1867 SdrObject
* pObj
=pM
->GetMarkedSdrObj();
1868 Rectangle
aRect(pObj
->GetCurrentBoundRect());
1869 aRect
.Left ()-=nTol
;
1871 aRect
.Right ()+=nTol
;
1872 aRect
.Bottom()+=nTol
;
1873 if (aRect
.IsInside(aPt
)) {
1877 if (pnMarkNum
!=NULL
) *pnMarkNum
=nMarkNum
;
1878 } else if (bCheckNearestOn3rdPass
) {
1880 if (aPt
.X()<aRect
.Left()) nDist
+=aRect
.Left()-aPt
.X();
1881 if (aPt
.X()>aRect
.Right()) nDist
+=aPt
.X()-aRect
.Right();
1882 if (aPt
.Y()<aRect
.Top()) nDist
+=aRect
.Top()-aPt
.Y();
1883 if (aPt
.Y()>aRect
.Bottom()) nDist
+=aPt
.Y()-aRect
.Bottom();
1884 if (nDist
<nBestDist
) {
1887 nBestMarkNum
=nMarkNum
;
1891 if (bCheckNearestOn3rdPass
&& !bFnd
) {
1894 if (pnMarkNum
!=NULL
) *pnMarkNum
=nBestMarkNum
;
1895 bFnd
=pBestObj
!=NULL
;
1901 SdrHitKind
SdrMarkView::PickSomething(const Point
& rPnt
, short nTol
) const
1903 nTol
=ImpGetHitTolLogic(nTol
,NULL
);
1904 SdrHitKind eRet
=SDRHIT_NONE
;
1906 SdrObject
* pObj
=NULL
;
1907 SdrPageView
* pPV
=NULL
;
1908 if (eRet
==SDRHIT_NONE
&& PickObj(rPnt
,USHORT(nTol
),pObj
,pPV
,SDRSEARCH_PICKMARKABLE
)) {
1909 Rectangle
aRct1(aPt
-Point(nTol
,nTol
),aPt
+Point(nTol
,nTol
)); // HitRect fuer Toleranz
1910 Rectangle
aBR(pObj
->GetCurrentBoundRect());
1911 if (aRct1
.IsInside(aBR
.TopLeft())) eRet
=SDRHIT_BOUNDTL
;
1912 else if (aRct1
.IsInside(aBR
.TopCenter())) eRet
=SDRHIT_BOUNDTC
;
1913 else if (aRct1
.IsInside(aBR
.TopRight())) eRet
=SDRHIT_BOUNDTR
;
1914 else if (aRct1
.IsInside(aBR
.LeftCenter())) eRet
=SDRHIT_BOUNDCL
;
1915 else if (aRct1
.IsInside(aBR
.RightCenter())) eRet
=SDRHIT_BOUNDCR
;
1916 else if (aRct1
.IsInside(aBR
.BottomLeft())) eRet
=SDRHIT_BOUNDBL
;
1917 else if (aRct1
.IsInside(aBR
.BottomCenter())) eRet
=SDRHIT_BOUNDBC
;
1918 else if (aRct1
.IsInside(aBR
.BottomRight())) eRet
=SDRHIT_BOUNDBR
;
1919 else eRet
=SDRHIT_OBJECT
;
1924 void SdrMarkView::UnmarkAllObj(SdrPageView
* pPV
)
1926 if (GetMarkedObjectCount()!=0) {
1928 //HMHBOOL bVis=bHdlShown;
1929 //HMHif (bVis) HideMarkHdl();
1932 GetMarkedObjectListWriteAccess().DeletePageView(*pPV
);
1936 GetMarkedObjectListWriteAccess().Clear();
1940 MarkListHasChanged();
1941 AdjustMarkHdl(); //HMHTRUE);
1942 //HMHif (bVis) ShowMarkHdl(); // ggf. fuer die RefPoints
1946 void SdrMarkView::MarkAllObj(SdrPageView
* _pPV
)
1953 _pPV
= GetSdrPageView();
1956 // #i69171# _pPV may still be NULL if there is no SDrPageView (!), e.g. when inserting
1960 const bool bMarkChg(GetMarkedObjectListWriteAccess().InsertPageView(*_pPV
));
1964 MarkListHasChanged();
1968 if(GetMarkedObjectCount())
1970 AdjustMarkHdl(); //HMHTRUE);
1975 void SdrMarkView::AdjustMarkHdl() //HMHBOOL bRestraintPaint)
1977 //HMHBOOL bVis=bHdlShown;
1978 //HMHif (bVis) HideMarkHdl();
1982 //HMHif(bRestraintPaint && bVis)
1984 //HMH ShowMarkHdl();
1988 Rectangle
SdrMarkView::GetMarkedObjBoundRect() const
1991 for (ULONG nm
=0; nm
<GetMarkedObjectCount(); nm
++) {
1992 SdrMark
* pM
=GetSdrMarkByIndex(nm
);
1993 SdrObject
* pO
=pM
->GetMarkedSdrObj();
1994 Rectangle
aR1(pO
->GetCurrentBoundRect());
1995 if (aRect
.IsEmpty()) aRect
=aR1
;
1996 else aRect
.Union(aR1
);
2001 const Rectangle
& SdrMarkView::GetMarkedObjRect() const
2003 if (bMarkedObjRectDirty
) {
2004 ((SdrMarkView
*)this)->bMarkedObjRectDirty
=FALSE
;
2006 for (ULONG nm
=0; nm
<GetMarkedObjectCount(); nm
++) {
2007 SdrMark
* pM
=GetSdrMarkByIndex(nm
);
2008 SdrObject
* pO
=pM
->GetMarkedSdrObj();
2009 Rectangle
aR1(pO
->GetSnapRect());
2010 if (aRect
.IsEmpty()) aRect
=aR1
;
2011 else aRect
.Union(aR1
);
2013 ((SdrMarkView
*)this)->aMarkedObjRect
=aRect
;
2015 return aMarkedObjRect
;
2018 ////////////////////////////////////////////////////////////////////////////////////////////////////
2020 void SdrMarkView::ImpTakeDescriptionStr(USHORT nStrCacheID
, XubString
& rStr
, USHORT nVal
, USHORT nOpt
) const
2022 rStr
= ImpGetResStr(nStrCacheID
);
2023 xub_StrLen nPos
= rStr
.SearchAscii("%1");
2025 if(nPos
!= STRING_NOTFOUND
)
2027 rStr
.Erase(nPos
, 2);
2029 if(nOpt
== IMPSDR_POINTSDESCRIPTION
)
2031 rStr
.Insert(GetDescriptionOfMarkedPoints(), nPos
);
2033 else if(nOpt
== IMPSDR_GLUEPOINTSDESCRIPTION
)
2035 rStr
.Insert(GetDescriptionOfMarkedGluePoints(), nPos
);
2039 rStr
.Insert(GetDescriptionOfMarkedObjects(), nPos
);
2043 nPos
= rStr
.SearchAscii("%2");
2045 if(nPos
!= STRING_NOTFOUND
)
2047 rStr
.Erase(nPos
, 2);
2048 rStr
.Insert(UniString::CreateFromInt32(nVal
), nPos
);
2052 ////////////////////////////////////////////////////////////////////////////////////////////////////
2054 BOOL
SdrMarkView::EnterMarkedGroup()
2057 // Es wird nur die erste gefundene Gruppe (also nur in einer PageView) geentert
2058 // Weil PageView::EnterGroup ein AdjustMarkHdl ruft.
2059 // Das muss ich per Flag mal unterbinden vvvvvvvv
2060 SdrPageView
* pPV
= GetSdrPageView();
2065 for (sal_uInt32
nm(GetMarkedObjectCount()); nm
> 0 && !bEnter
;)
2068 SdrMark
* pM
=GetSdrMarkByIndex(nm
);
2069 if (pM
->GetPageView()==pPV
) {
2070 SdrObject
* pObj
=pM
->GetMarkedSdrObj();
2071 if (pObj
->IsGroupObject()) {
2072 if (pPV
->EnterGroup(pObj
)) {
2083 ////////////////////////////////////////////////////////////////////////////////////////////////////
2085 void SdrMarkView::MarkListHasChanged()
2087 GetMarkedObjectListWriteAccess().SetNameDirty();
2088 SetEdgesOfMarkedNodesDirty(); // bEdgesOfMarkedNodesDirty=TRUE;
2090 bMarkedObjRectDirty
=TRUE
;
2091 bMarkedPointsRectsDirty
=TRUE
;
2093 if (pItemBrowser
!=NULL
) pItemBrowser
->SetDirty();
2095 BOOL bOneEdgeMarked
=FALSE
;
2096 if (GetMarkedObjectCount()==1) {
2097 const SdrObject
* pObj
=GetMarkedObjectByIndex(0);
2098 if (pObj
->GetObjInventor()==SdrInventor
) {
2099 UINT16 nIdent
=pObj
->GetObjIdentifier();
2100 bOneEdgeMarked
=nIdent
==OBJ_EDGE
;
2103 ImpSetGlueVisible4(bOneEdgeMarked
);
2106 ////////////////////////////////////////////////////////////////////////////////////////////////////
2108 void SdrMarkView::SetMoveOutside(BOOL bOn
)
2110 aHdl
.SetMoveOutside(bOn
);
2113 BOOL
SdrMarkView::IsMoveOutside() const
2115 return aHdl
.IsMoveOutside();
2118 void SdrMarkView::SetDesignMode( BOOL _bOn
)
2120 if ( bDesignMode
!= _bOn
)
2123 SdrPageView
* pPageView
= GetSdrPageView();
2125 pPageView
->SetDesignMode( _bOn
);
2129 // MarkHandles Objektaenderung:
2130 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2131 // - Bei Notify mit HINT_OBJCHG (oder so) werden die Handles erstmal versteckt
2132 // (wenn nicht schon wegen Dragging versteckt).
2133 // - XorHdl: Bei ModelHasChanged() werden sie dann wieder angezeigt.
2134 // - PaintEvents kommen nun durch.
2135 // - Die XorHandles werden z.T. wieder uebermalt.
2136 // - Xor: Nach dem Painten werden die Handles im (vom PaintHandler gerufenen)
2137 // CompleteRedraw per ToggleShownXor bei gesetzter ClipRegion nochmal gemalt
2138 // und damit ist alles in Butter.
2139 // - ToggleShownXor macht bei SolidHdl nix weil bHdlShown=FALSE
2140 // - Der AfterPaintTimer wird gestartet.
2141 // - SolidHdl: Im AfterPaintHandler wird ShowMarkHdl gerufen.
2142 // Da die Handles zu diesem Zeitpunkt nicht angezeigt sind wird:
2143 // - SaveBackground durchgefuehrt.
2144 // - DrawMarkHdl gerufen und bHdlShown gesetzt.
2146 // MarkHandles bei sonstigem Invalidate:
2147 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2148 // In diesem Fall bekomme ich kein Notify und beim Aufruf des
2149 // PaintHandlers->CompleteRedraw() sind auch die SolidHandles sichtbar.