1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #include <svx/svdmrkv.hxx>
28*b1cdbd2cSJim Jagielski #include <svx/svdetc.hxx>
29*b1cdbd2cSJim Jagielski #include <svx/svdoedge.hxx>
30*b1cdbd2cSJim Jagielski #include "svx/svdglob.hxx"
31*b1cdbd2cSJim Jagielski #include <svx/svdpagv.hxx>
32*b1cdbd2cSJim Jagielski #include <svx/svdpage.hxx>
33*b1cdbd2cSJim Jagielski #include "svddrgm1.hxx"
34*b1cdbd2cSJim Jagielski
35*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
36*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
37*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
38*b1cdbd2cSJim Jagielski //
39*b1cdbd2cSJim Jagielski // @@@@@ @@ @@ @@ @@ @@ @@ @@@@@@ @@ @@ @@@@ @@@@@ @@ @@ @@ @@@@@ @@@@@ @@ @@ @@ @@ @@@@
40*b1cdbd2cSJim Jagielski // @@ @@ @@ @@ @@@ @@ @@ @@ @@ @@@ @@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@
41*b1cdbd2cSJim Jagielski // @@ @@ @@ @@ @@@@@@ @@ @@ @@ @@@@@@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@@@@@ @@
42*b1cdbd2cSJim Jagielski // @@@@@ @@ @@ @@@@@@ @@@@ @@ @@@@@@@ @@@@@@ @@@@@ @@@@ @@ @@@@ @@@@@ @@ @@ @@@@@@ @@ @@@
43*b1cdbd2cSJim Jagielski // @@ @@ @@ @@ @@@ @@ @@ @@ @@ @ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@
44*b1cdbd2cSJim Jagielski // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
45*b1cdbd2cSJim Jagielski // @@ @@@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@@@@ @@ @@ @@@@ @@ @@ @@@@@
46*b1cdbd2cSJim Jagielski //
47*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
48*b1cdbd2cSJim Jagielski
HasMarkablePoints() const49*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::HasMarkablePoints() const
50*b1cdbd2cSJim Jagielski {
51*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
52*b1cdbd2cSJim Jagielski bool bRet=false;
53*b1cdbd2cSJim Jagielski if (!ImpIsFrameHandles()) {
54*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
55*b1cdbd2cSJim Jagielski if (nMarkAnz<=nFrameHandlesLimit) {
56*b1cdbd2cSJim Jagielski for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && !bRet; nMarkNum++) {
57*b1cdbd2cSJim Jagielski const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
58*b1cdbd2cSJim Jagielski const SdrObject* pObj=pM->GetMarkedSdrObj();
59*b1cdbd2cSJim Jagielski bRet=pObj->IsPolyObj();
60*b1cdbd2cSJim Jagielski }
61*b1cdbd2cSJim Jagielski }
62*b1cdbd2cSJim Jagielski }
63*b1cdbd2cSJim Jagielski return bRet;
64*b1cdbd2cSJim Jagielski }
65*b1cdbd2cSJim Jagielski
GetMarkablePointCount() const66*b1cdbd2cSJim Jagielski sal_uIntPtr SdrMarkView::GetMarkablePointCount() const
67*b1cdbd2cSJim Jagielski {
68*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
69*b1cdbd2cSJim Jagielski sal_uIntPtr nAnz=0;
70*b1cdbd2cSJim Jagielski if (!ImpIsFrameHandles()) {
71*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
72*b1cdbd2cSJim Jagielski if (nMarkAnz<=nFrameHandlesLimit) {
73*b1cdbd2cSJim Jagielski for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++) {
74*b1cdbd2cSJim Jagielski const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
75*b1cdbd2cSJim Jagielski const SdrObject* pObj=pM->GetMarkedSdrObj();
76*b1cdbd2cSJim Jagielski if (pObj->IsPolyObj()) {
77*b1cdbd2cSJim Jagielski nAnz+=pObj->GetPointCount();
78*b1cdbd2cSJim Jagielski }
79*b1cdbd2cSJim Jagielski }
80*b1cdbd2cSJim Jagielski }
81*b1cdbd2cSJim Jagielski }
82*b1cdbd2cSJim Jagielski return nAnz;
83*b1cdbd2cSJim Jagielski }
84*b1cdbd2cSJim Jagielski
HasMarkedPoints() const85*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::HasMarkedPoints() const
86*b1cdbd2cSJim Jagielski {
87*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
88*b1cdbd2cSJim Jagielski sal_Bool bRet=sal_False;
89*b1cdbd2cSJim Jagielski if (!ImpIsFrameHandles()) {
90*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
91*b1cdbd2cSJim Jagielski if (nMarkAnz<=nFrameHandlesLimit) {
92*b1cdbd2cSJim Jagielski for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && !bRet; nMarkNum++) {
93*b1cdbd2cSJim Jagielski const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
94*b1cdbd2cSJim Jagielski const SdrUShortCont* pPts=pM->GetMarkedPoints();
95*b1cdbd2cSJim Jagielski bRet=pPts!=NULL && pPts->GetCount()!=0;
96*b1cdbd2cSJim Jagielski }
97*b1cdbd2cSJim Jagielski }
98*b1cdbd2cSJim Jagielski }
99*b1cdbd2cSJim Jagielski return bRet;
100*b1cdbd2cSJim Jagielski }
101*b1cdbd2cSJim Jagielski
GetMarkedPointCount() const102*b1cdbd2cSJim Jagielski sal_uIntPtr SdrMarkView::GetMarkedPointCount() const
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
105*b1cdbd2cSJim Jagielski sal_uIntPtr nAnz=0;
106*b1cdbd2cSJim Jagielski if (!ImpIsFrameHandles()) {
107*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
108*b1cdbd2cSJim Jagielski if (nMarkAnz<=nFrameHandlesLimit) {
109*b1cdbd2cSJim Jagielski for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++) {
110*b1cdbd2cSJim Jagielski const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
111*b1cdbd2cSJim Jagielski const SdrUShortCont* pPts=pM->GetMarkedPoints();
112*b1cdbd2cSJim Jagielski if (pPts!=NULL) nAnz+=pPts->GetCount();
113*b1cdbd2cSJim Jagielski }
114*b1cdbd2cSJim Jagielski }
115*b1cdbd2cSJim Jagielski }
116*b1cdbd2cSJim Jagielski return nAnz;
117*b1cdbd2cSJim Jagielski }
118*b1cdbd2cSJim Jagielski
IsPointMarkable(const SdrHdl & rHdl) const119*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::IsPointMarkable(const SdrHdl& rHdl) const
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski return !ImpIsFrameHandles() && &rHdl!=NULL && !rHdl.IsPlusHdl() && rHdl.GetKind()!=HDL_GLUE && rHdl.GetKind()!=HDL_SMARTTAG && rHdl.GetObj()!=NULL && rHdl.GetObj()->IsPolyObj();
122*b1cdbd2cSJim Jagielski }
123*b1cdbd2cSJim Jagielski
MarkPointHelper(SdrHdl * pHdl,SdrMark * pMark,sal_Bool bUnmark)124*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::MarkPointHelper(SdrHdl* pHdl, SdrMark* pMark, sal_Bool bUnmark)
125*b1cdbd2cSJim Jagielski {
126*b1cdbd2cSJim Jagielski return ImpMarkPoint( pHdl, pMark, bUnmark );
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski
ImpMarkPoint(SdrHdl * pHdl,SdrMark * pMark,sal_Bool bUnmark)129*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::ImpMarkPoint(SdrHdl* pHdl, SdrMark* pMark, sal_Bool bUnmark)
130*b1cdbd2cSJim Jagielski {
131*b1cdbd2cSJim Jagielski if (pHdl==NULL || pHdl->IsPlusHdl() || pHdl->GetKind()==HDL_GLUE)
132*b1cdbd2cSJim Jagielski return sal_False;
133*b1cdbd2cSJim Jagielski
134*b1cdbd2cSJim Jagielski if (pHdl->IsSelected() != bUnmark)
135*b1cdbd2cSJim Jagielski return sal_False;
136*b1cdbd2cSJim Jagielski
137*b1cdbd2cSJim Jagielski SdrObject* pObj=pHdl->GetObj();
138*b1cdbd2cSJim Jagielski if (pObj==NULL || !pObj->IsPolyObj())
139*b1cdbd2cSJim Jagielski return sal_False;
140*b1cdbd2cSJim Jagielski
141*b1cdbd2cSJim Jagielski if (pMark==NULL)
142*b1cdbd2cSJim Jagielski {
143*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkNum=TryToFindMarkedObject(pObj);
144*b1cdbd2cSJim Jagielski if (nMarkNum==CONTAINER_ENTRY_NOTFOUND)
145*b1cdbd2cSJim Jagielski return sal_False;
146*b1cdbd2cSJim Jagielski pMark=GetSdrMarkByIndex(nMarkNum);
147*b1cdbd2cSJim Jagielski }
148*b1cdbd2cSJim Jagielski const sal_uInt32 nHdlNum(pHdl->GetObjHdlNum());
149*b1cdbd2cSJim Jagielski SdrUShortCont* pPts=pMark->ForceMarkedPoints();
150*b1cdbd2cSJim Jagielski if (!bUnmark)
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski pPts->Insert((sal_uInt16)nHdlNum);
153*b1cdbd2cSJim Jagielski }
154*b1cdbd2cSJim Jagielski else
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski sal_uIntPtr nBla=pPts->GetPos((sal_uInt16)nHdlNum);
157*b1cdbd2cSJim Jagielski if (nBla!=CONTAINER_ENTRY_NOTFOUND)
158*b1cdbd2cSJim Jagielski {
159*b1cdbd2cSJim Jagielski pPts->Remove(nBla);
160*b1cdbd2cSJim Jagielski }
161*b1cdbd2cSJim Jagielski else
162*b1cdbd2cSJim Jagielski {
163*b1cdbd2cSJim Jagielski return sal_False; // Fehlerfall!
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski }
166*b1cdbd2cSJim Jagielski
167*b1cdbd2cSJim Jagielski pHdl->SetSelected(!bUnmark);
168*b1cdbd2cSJim Jagielski if (!bPlusHdlAlways)
169*b1cdbd2cSJim Jagielski {
170*b1cdbd2cSJim Jagielski if (!bUnmark)
171*b1cdbd2cSJim Jagielski {
172*b1cdbd2cSJim Jagielski sal_uInt32 nAnz(pObj->GetPlusHdlCount(*pHdl));
173*b1cdbd2cSJim Jagielski for (sal_uInt32 i=0; i<nAnz; i++)
174*b1cdbd2cSJim Jagielski {
175*b1cdbd2cSJim Jagielski SdrHdl* pPlusHdl=pObj->GetPlusHdl(*pHdl,i);
176*b1cdbd2cSJim Jagielski if (pPlusHdl!=NULL)
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski pPlusHdl->SetObj(pObj);
179*b1cdbd2cSJim Jagielski pPlusHdl->SetPageView(pMark->GetPageView());
180*b1cdbd2cSJim Jagielski pPlusHdl->SetPlusHdl(sal_True);
181*b1cdbd2cSJim Jagielski aHdl.AddHdl(pPlusHdl);
182*b1cdbd2cSJim Jagielski }
183*b1cdbd2cSJim Jagielski }
184*b1cdbd2cSJim Jagielski }
185*b1cdbd2cSJim Jagielski else
186*b1cdbd2cSJim Jagielski {
187*b1cdbd2cSJim Jagielski for (sal_uIntPtr i = aHdl.GetHdlCount(); i>0;)
188*b1cdbd2cSJim Jagielski {
189*b1cdbd2cSJim Jagielski i--;
190*b1cdbd2cSJim Jagielski SdrHdl* pPlusHdl=aHdl.GetHdl(i);
191*b1cdbd2cSJim Jagielski if (pPlusHdl->IsPlusHdl() && pPlusHdl->GetSourceHdlNum()==nHdlNum)
192*b1cdbd2cSJim Jagielski {
193*b1cdbd2cSJim Jagielski aHdl.RemoveHdl(i);
194*b1cdbd2cSJim Jagielski delete pPlusHdl;
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski }
197*b1cdbd2cSJim Jagielski }
198*b1cdbd2cSJim Jagielski }
199*b1cdbd2cSJim Jagielski
200*b1cdbd2cSJim Jagielski // #97016# II: Sort handles. This was missing in ImpMarkPoint all the time.
201*b1cdbd2cSJim Jagielski aHdl.Sort();
202*b1cdbd2cSJim Jagielski
203*b1cdbd2cSJim Jagielski return sal_True;
204*b1cdbd2cSJim Jagielski }
205*b1cdbd2cSJim Jagielski
206*b1cdbd2cSJim Jagielski
MarkPoint(SdrHdl & rHdl,sal_Bool bUnmark)207*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::MarkPoint(SdrHdl& rHdl, sal_Bool bUnmark)
208*b1cdbd2cSJim Jagielski {
209*b1cdbd2cSJim Jagielski if (&rHdl==NULL) return sal_False;
210*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
211*b1cdbd2cSJim Jagielski sal_Bool bRet=sal_False;
212*b1cdbd2cSJim Jagielski const SdrObject* pObj=rHdl.GetObj();
213*b1cdbd2cSJim Jagielski if (IsPointMarkable(rHdl) && rHdl.IsSelected()==bUnmark) {
214*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkNum=TryToFindMarkedObject(pObj);
215*b1cdbd2cSJim Jagielski if (nMarkNum!=CONTAINER_ENTRY_NOTFOUND) {
216*b1cdbd2cSJim Jagielski SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
217*b1cdbd2cSJim Jagielski SdrUShortCont* pPts=pM->ForceMarkedPoints();
218*b1cdbd2cSJim Jagielski pPts->ForceSort();
219*b1cdbd2cSJim Jagielski if (ImpMarkPoint(&rHdl,pM,bUnmark)) {
220*b1cdbd2cSJim Jagielski pPts->ForceSort();
221*b1cdbd2cSJim Jagielski MarkListHasChanged();
222*b1cdbd2cSJim Jagielski bRet=sal_True;
223*b1cdbd2cSJim Jagielski }
224*b1cdbd2cSJim Jagielski }
225*b1cdbd2cSJim Jagielski }
226*b1cdbd2cSJim Jagielski
227*b1cdbd2cSJim Jagielski return bRet;
228*b1cdbd2cSJim Jagielski }
229*b1cdbd2cSJim Jagielski
MarkPoints(const Rectangle * pRect,sal_Bool bUnmark)230*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::MarkPoints(const Rectangle* pRect, sal_Bool bUnmark)
231*b1cdbd2cSJim Jagielski {
232*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
233*b1cdbd2cSJim Jagielski sal_Bool bChgd=sal_False;
234*b1cdbd2cSJim Jagielski SortMarkedObjects();
235*b1cdbd2cSJim Jagielski const SdrObject* pObj0=NULL;
236*b1cdbd2cSJim Jagielski const SdrPageView* pPV0=NULL;
237*b1cdbd2cSJim Jagielski SdrMark* pM=NULL;
238*b1cdbd2cSJim Jagielski aHdl.Sort();
239*b1cdbd2cSJim Jagielski //HMHBOOL bHideHdl=IsMarkHdlShown() && IsSolidMarkHdl() && !bPlusHdlAlways;
240*b1cdbd2cSJim Jagielski sal_uIntPtr nHdlAnz=aHdl.GetHdlCount();
241*b1cdbd2cSJim Jagielski for (sal_uIntPtr nHdlNum=nHdlAnz; nHdlNum>0;) {
242*b1cdbd2cSJim Jagielski nHdlNum--;
243*b1cdbd2cSJim Jagielski SdrHdl* pHdl=aHdl.GetHdl(nHdlNum);
244*b1cdbd2cSJim Jagielski if (IsPointMarkable(*pHdl) && pHdl->IsSelected()==bUnmark) {
245*b1cdbd2cSJim Jagielski const SdrObject* pObj=pHdl->GetObj();
246*b1cdbd2cSJim Jagielski const SdrPageView* pPV=pHdl->GetPageView();
247*b1cdbd2cSJim Jagielski if (pObj!=pObj0 || pPV!=pPV0 || pM==NULL) { // Dieser Abschnitt dient zur Optimierung,
248*b1cdbd2cSJim Jagielski if (pM!=NULL) {
249*b1cdbd2cSJim Jagielski SdrUShortCont* pPts=pM->GetMarkedPoints();
250*b1cdbd2cSJim Jagielski if (pPts!=NULL) pPts->ForceSort();
251*b1cdbd2cSJim Jagielski }
252*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkNum=TryToFindMarkedObject(pObj); // damit ImpMarkPoint() nicht staendig das
253*b1cdbd2cSJim Jagielski if (nMarkNum!=CONTAINER_ENTRY_NOTFOUND) { // Objekt in der MarkList suchen muss.
254*b1cdbd2cSJim Jagielski pM=GetSdrMarkByIndex(nMarkNum);
255*b1cdbd2cSJim Jagielski pObj0=pObj;
256*b1cdbd2cSJim Jagielski pPV0=pPV;
257*b1cdbd2cSJim Jagielski SdrUShortCont* pPts=pM->ForceMarkedPoints();
258*b1cdbd2cSJim Jagielski pPts->ForceSort();
259*b1cdbd2cSJim Jagielski } else {
260*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
261*b1cdbd2cSJim Jagielski if (pObj->IsInserted()) {
262*b1cdbd2cSJim Jagielski DBG_ERROR("SdrMarkView::MarkPoints(const Rectangle* pRect): Markiertes Objekt nicht gefunden");
263*b1cdbd2cSJim Jagielski }
264*b1cdbd2cSJim Jagielski #endif
265*b1cdbd2cSJim Jagielski pM=NULL;
266*b1cdbd2cSJim Jagielski }
267*b1cdbd2cSJim Jagielski }
268*b1cdbd2cSJim Jagielski Point aPos(pHdl->GetPos());
269*b1cdbd2cSJim Jagielski if (pM!=NULL && (pRect==NULL || pRect->IsInside(aPos))) {
270*b1cdbd2cSJim Jagielski //HMHif (bHideHdl && IsMarkHdlShown() && pHdl->GetObj()!=NULL) {
271*b1cdbd2cSJim Jagielski //HMHsal_uInt32 nAnz=pHdl->GetObj()->GetPlusHdlCount(*pHdl);
272*b1cdbd2cSJim Jagielski //HMHif (nAnz!=0L) HideMarkHdl(); // #36987#
273*b1cdbd2cSJim Jagielski //HMH}
274*b1cdbd2cSJim Jagielski if (ImpMarkPoint(pHdl,pM,bUnmark)) bChgd=sal_True;
275*b1cdbd2cSJim Jagielski }
276*b1cdbd2cSJim Jagielski }
277*b1cdbd2cSJim Jagielski }
278*b1cdbd2cSJim Jagielski if (pM!=NULL) { // Den zuletzt geaenderten MarkEntry ggf. noch aufraeumen
279*b1cdbd2cSJim Jagielski SdrUShortCont* pPts=pM->GetMarkedPoints();
280*b1cdbd2cSJim Jagielski if (pPts!=NULL) pPts->ForceSort();
281*b1cdbd2cSJim Jagielski }
282*b1cdbd2cSJim Jagielski //HMHif (bHideHdl) ShowMarkHdl(); // #36987#
283*b1cdbd2cSJim Jagielski if (bChgd) {
284*b1cdbd2cSJim Jagielski MarkListHasChanged();
285*b1cdbd2cSJim Jagielski }
286*b1cdbd2cSJim Jagielski
287*b1cdbd2cSJim Jagielski return bChgd;
288*b1cdbd2cSJim Jagielski }
289*b1cdbd2cSJim Jagielski
MarkNextPoint(sal_Bool)290*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::MarkNextPoint(sal_Bool /*bPrev*/)
291*b1cdbd2cSJim Jagielski {
292*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
293*b1cdbd2cSJim Jagielski sal_Bool bChgd=sal_False;
294*b1cdbd2cSJim Jagielski SortMarkedObjects();
295*b1cdbd2cSJim Jagielski // ...
296*b1cdbd2cSJim Jagielski if (bChgd) {
297*b1cdbd2cSJim Jagielski MarkListHasChanged();
298*b1cdbd2cSJim Jagielski }
299*b1cdbd2cSJim Jagielski return bChgd;
300*b1cdbd2cSJim Jagielski }
301*b1cdbd2cSJim Jagielski
MarkNextPoint(const Point &,sal_Bool)302*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::MarkNextPoint(const Point& /*rPnt*/, sal_Bool /*bPrev*/)
303*b1cdbd2cSJim Jagielski {
304*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
305*b1cdbd2cSJim Jagielski sal_Bool bChgd=sal_False;
306*b1cdbd2cSJim Jagielski SortMarkedObjects();
307*b1cdbd2cSJim Jagielski // ...
308*b1cdbd2cSJim Jagielski if (bChgd) {
309*b1cdbd2cSJim Jagielski MarkListHasChanged();
310*b1cdbd2cSJim Jagielski }
311*b1cdbd2cSJim Jagielski return bChgd;
312*b1cdbd2cSJim Jagielski }
313*b1cdbd2cSJim Jagielski
GetMarkedPointsRect() const314*b1cdbd2cSJim Jagielski const Rectangle& SdrMarkView::GetMarkedPointsRect() const
315*b1cdbd2cSJim Jagielski {
316*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
317*b1cdbd2cSJim Jagielski if (bMarkedPointsRectsDirty) ImpSetPointsRects();
318*b1cdbd2cSJim Jagielski return aMarkedPointsRect;
319*b1cdbd2cSJim Jagielski }
320*b1cdbd2cSJim Jagielski
SetPlusHandlesAlwaysVisible(sal_Bool bOn)321*b1cdbd2cSJim Jagielski void SdrMarkView::SetPlusHandlesAlwaysVisible(sal_Bool bOn)
322*b1cdbd2cSJim Jagielski { // HandlePaint optimieren !!!!!!!
323*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
324*b1cdbd2cSJim Jagielski if (bOn!=bPlusHdlAlways) {
325*b1cdbd2cSJim Jagielski //HMHBOOL bVis=IsMarkHdlShown();
326*b1cdbd2cSJim Jagielski //HMHif (bVis) HideMarkHdl();
327*b1cdbd2cSJim Jagielski bPlusHdlAlways=bOn;
328*b1cdbd2cSJim Jagielski SetMarkHandles();
329*b1cdbd2cSJim Jagielski //HMHif (bVis) ShowMarkHdl();
330*b1cdbd2cSJim Jagielski MarkListHasChanged();
331*b1cdbd2cSJim Jagielski }
332*b1cdbd2cSJim Jagielski }
333*b1cdbd2cSJim Jagielski
334*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
335*b1cdbd2cSJim Jagielski // ImpSetPointsRects() ist fuer PolyPoints und GluePoints!
336*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
337*b1cdbd2cSJim Jagielski
ImpSetPointsRects() const338*b1cdbd2cSJim Jagielski void SdrMarkView::ImpSetPointsRects() const
339*b1cdbd2cSJim Jagielski {
340*b1cdbd2cSJim Jagielski Rectangle aPnts;
341*b1cdbd2cSJim Jagielski Rectangle aGlue;
342*b1cdbd2cSJim Jagielski sal_uIntPtr nHdlAnz=aHdl.GetHdlCount();
343*b1cdbd2cSJim Jagielski for (sal_uIntPtr nHdlNum=0; nHdlNum<nHdlAnz; nHdlNum++) {
344*b1cdbd2cSJim Jagielski const SdrHdl* pHdl=aHdl.GetHdl(nHdlNum);
345*b1cdbd2cSJim Jagielski SdrHdlKind eKind=pHdl->GetKind();
346*b1cdbd2cSJim Jagielski if ((eKind==HDL_POLY && pHdl->IsSelected()) || eKind==HDL_GLUE) {
347*b1cdbd2cSJim Jagielski Point aPt(pHdl->GetPos());
348*b1cdbd2cSJim Jagielski Rectangle& rR=eKind==HDL_GLUE ? aGlue : aPnts;
349*b1cdbd2cSJim Jagielski if (rR.IsEmpty()) {
350*b1cdbd2cSJim Jagielski rR=Rectangle(aPt,aPt);
351*b1cdbd2cSJim Jagielski } else {
352*b1cdbd2cSJim Jagielski if (aPt.X()<rR.Left ()) rR.Left ()=aPt.X();
353*b1cdbd2cSJim Jagielski if (aPt.X()>rR.Right ()) rR.Right ()=aPt.X();
354*b1cdbd2cSJim Jagielski if (aPt.Y()<rR.Top ()) rR.Top ()=aPt.Y();
355*b1cdbd2cSJim Jagielski if (aPt.Y()>rR.Bottom()) rR.Bottom()=aPt.Y();
356*b1cdbd2cSJim Jagielski }
357*b1cdbd2cSJim Jagielski }
358*b1cdbd2cSJim Jagielski }
359*b1cdbd2cSJim Jagielski ((SdrMarkView*)this)->aMarkedPointsRect=aPnts;
360*b1cdbd2cSJim Jagielski ((SdrMarkView*)this)->aMarkedGluePointsRect=aGlue;
361*b1cdbd2cSJim Jagielski ((SdrMarkView*)this)->bMarkedPointsRectsDirty=sal_False;
362*b1cdbd2cSJim Jagielski }
363*b1cdbd2cSJim Jagielski
364*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
365*b1cdbd2cSJim Jagielski // UndirtyMrkPnt() ist fuer PolyPoints und GluePoints!
366*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
367*b1cdbd2cSJim Jagielski
UndirtyMrkPnt() const368*b1cdbd2cSJim Jagielski void SdrMarkView::UndirtyMrkPnt() const
369*b1cdbd2cSJim Jagielski {
370*b1cdbd2cSJim Jagielski sal_Bool bChg=sal_False;
371*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
372*b1cdbd2cSJim Jagielski for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++) {
373*b1cdbd2cSJim Jagielski SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
374*b1cdbd2cSJim Jagielski const SdrObject* pObj=pM->GetMarkedSdrObj();
375*b1cdbd2cSJim Jagielski // PolyPoints
376*b1cdbd2cSJim Jagielski SdrUShortCont* pPts=pM->GetMarkedPoints();
377*b1cdbd2cSJim Jagielski if (pPts!=NULL) {
378*b1cdbd2cSJim Jagielski if (pObj->IsPolyObj()) {
379*b1cdbd2cSJim Jagielski // Ungueltig markierte Punkte entfernen, also alle
380*b1cdbd2cSJim Jagielski // Eintraege die groesser sind als die Punktanzahl des Objekts
381*b1cdbd2cSJim Jagielski sal_uInt32 nMax(pObj->GetPointCount());
382*b1cdbd2cSJim Jagielski sal_uInt32 nPtNum(0xffffffff);
383*b1cdbd2cSJim Jagielski
384*b1cdbd2cSJim Jagielski pPts->ForceSort();
385*b1cdbd2cSJim Jagielski
386*b1cdbd2cSJim Jagielski for (sal_uInt32 nIndex(pPts->GetCount()); nIndex > 0L && nPtNum >= nMax;)
387*b1cdbd2cSJim Jagielski {
388*b1cdbd2cSJim Jagielski nIndex--;
389*b1cdbd2cSJim Jagielski nPtNum = pPts->GetObject(nIndex);
390*b1cdbd2cSJim Jagielski
391*b1cdbd2cSJim Jagielski if(nPtNum >= nMax)
392*b1cdbd2cSJim Jagielski {
393*b1cdbd2cSJim Jagielski pPts->Remove(nIndex);
394*b1cdbd2cSJim Jagielski bChg = sal_True;
395*b1cdbd2cSJim Jagielski }
396*b1cdbd2cSJim Jagielski }
397*b1cdbd2cSJim Jagielski }
398*b1cdbd2cSJim Jagielski else
399*b1cdbd2cSJim Jagielski {
400*b1cdbd2cSJim Jagielski DBG_ERROR("SdrMarkView::UndirtyMrkPnt(): Markierte Punkte an einem Objekt, dass kein PolyObj ist!");
401*b1cdbd2cSJim Jagielski if(pPts && pPts->GetCount())
402*b1cdbd2cSJim Jagielski {
403*b1cdbd2cSJim Jagielski pPts->Clear();
404*b1cdbd2cSJim Jagielski bChg = sal_True;
405*b1cdbd2cSJim Jagielski }
406*b1cdbd2cSJim Jagielski }
407*b1cdbd2cSJim Jagielski }
408*b1cdbd2cSJim Jagielski
409*b1cdbd2cSJim Jagielski // GluePoints
410*b1cdbd2cSJim Jagielski pPts=pM->GetMarkedGluePoints();
411*b1cdbd2cSJim Jagielski const SdrGluePointList* pGPL=pObj->GetGluePointList();
412*b1cdbd2cSJim Jagielski if (pPts!=NULL) {
413*b1cdbd2cSJim Jagielski if (pGPL!=NULL) {
414*b1cdbd2cSJim Jagielski // Ungueltig markierte Klebepunkte entfernen, also alle
415*b1cdbd2cSJim Jagielski // Eintraege (Id's) die nicht in der GluePointList des
416*b1cdbd2cSJim Jagielski // Objekts enthalten sind
417*b1cdbd2cSJim Jagielski pPts->ForceSort();
418*b1cdbd2cSJim Jagielski for (sal_uIntPtr nIndex=pPts->GetCount(); nIndex>0;) {
419*b1cdbd2cSJim Jagielski nIndex--;
420*b1cdbd2cSJim Jagielski sal_uInt16 nId=pPts->GetObject(nIndex);
421*b1cdbd2cSJim Jagielski if (pGPL->FindGluePoint(nId)==SDRGLUEPOINT_NOTFOUND) {
422*b1cdbd2cSJim Jagielski pPts->Remove(nIndex);
423*b1cdbd2cSJim Jagielski bChg=sal_True;
424*b1cdbd2cSJim Jagielski }
425*b1cdbd2cSJim Jagielski }
426*b1cdbd2cSJim Jagielski } else {
427*b1cdbd2cSJim Jagielski if (pPts!=NULL && pPts->GetCount()!=0) {
428*b1cdbd2cSJim Jagielski pPts->Clear(); // Objekt hat keine Klebepunkte (mehr)
429*b1cdbd2cSJim Jagielski bChg=sal_True;
430*b1cdbd2cSJim Jagielski }
431*b1cdbd2cSJim Jagielski }
432*b1cdbd2cSJim Jagielski }
433*b1cdbd2cSJim Jagielski }
434*b1cdbd2cSJim Jagielski if (bChg) ((SdrMarkView*)this)->bMarkedPointsRectsDirty=sal_True;
435*b1cdbd2cSJim Jagielski ((SdrMarkView*)this)->bMrkPntDirty=sal_False;
436*b1cdbd2cSJim Jagielski }
437*b1cdbd2cSJim Jagielski
438*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
439*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
440*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
441*b1cdbd2cSJim Jagielski
HasMarkableGluePoints() const442*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::HasMarkableGluePoints() const
443*b1cdbd2cSJim Jagielski {
444*b1cdbd2cSJim Jagielski sal_Bool bRet=sal_False;
445*b1cdbd2cSJim Jagielski if (IsGluePointEditMode()) {
446*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
447*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
448*b1cdbd2cSJim Jagielski for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && !bRet; nMarkNum++) {
449*b1cdbd2cSJim Jagielski const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
450*b1cdbd2cSJim Jagielski const SdrObject* pObj=pM->GetMarkedSdrObj();
451*b1cdbd2cSJim Jagielski const SdrGluePointList* pGPL=pObj->GetGluePointList();
452*b1cdbd2cSJim Jagielski
453*b1cdbd2cSJim Jagielski // #i38892#
454*b1cdbd2cSJim Jagielski if(pGPL && pGPL->GetCount())
455*b1cdbd2cSJim Jagielski {
456*b1cdbd2cSJim Jagielski for(sal_uInt16 a(0); !bRet && a < pGPL->GetCount(); a++)
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski if((*pGPL)[a].IsUserDefined())
459*b1cdbd2cSJim Jagielski {
460*b1cdbd2cSJim Jagielski bRet = sal_True;
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski }
463*b1cdbd2cSJim Jagielski }
464*b1cdbd2cSJim Jagielski }
465*b1cdbd2cSJim Jagielski }
466*b1cdbd2cSJim Jagielski return bRet;
467*b1cdbd2cSJim Jagielski }
468*b1cdbd2cSJim Jagielski
GetMarkableGluePointCount() const469*b1cdbd2cSJim Jagielski sal_uIntPtr SdrMarkView::GetMarkableGluePointCount() const
470*b1cdbd2cSJim Jagielski {
471*b1cdbd2cSJim Jagielski sal_uIntPtr nAnz=0;
472*b1cdbd2cSJim Jagielski if (IsGluePointEditMode()) {
473*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
474*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
475*b1cdbd2cSJim Jagielski for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++) {
476*b1cdbd2cSJim Jagielski const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
477*b1cdbd2cSJim Jagielski const SdrObject* pObj=pM->GetMarkedSdrObj();
478*b1cdbd2cSJim Jagielski const SdrGluePointList* pGPL=pObj->GetGluePointList();
479*b1cdbd2cSJim Jagielski
480*b1cdbd2cSJim Jagielski // #i38892#
481*b1cdbd2cSJim Jagielski if(pGPL && pGPL->GetCount())
482*b1cdbd2cSJim Jagielski {
483*b1cdbd2cSJim Jagielski for(sal_uInt16 a(0); a < pGPL->GetCount(); a++)
484*b1cdbd2cSJim Jagielski {
485*b1cdbd2cSJim Jagielski if((*pGPL)[a].IsUserDefined())
486*b1cdbd2cSJim Jagielski {
487*b1cdbd2cSJim Jagielski nAnz++;
488*b1cdbd2cSJim Jagielski }
489*b1cdbd2cSJim Jagielski }
490*b1cdbd2cSJim Jagielski }
491*b1cdbd2cSJim Jagielski }
492*b1cdbd2cSJim Jagielski }
493*b1cdbd2cSJim Jagielski return nAnz;
494*b1cdbd2cSJim Jagielski }
495*b1cdbd2cSJim Jagielski
HasMarkedGluePoints() const496*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::HasMarkedGluePoints() const
497*b1cdbd2cSJim Jagielski {
498*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
499*b1cdbd2cSJim Jagielski sal_Bool bRet=sal_False;
500*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
501*b1cdbd2cSJim Jagielski for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && !bRet; nMarkNum++) {
502*b1cdbd2cSJim Jagielski const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
503*b1cdbd2cSJim Jagielski const SdrUShortCont* pPts=pM->GetMarkedGluePoints();
504*b1cdbd2cSJim Jagielski bRet=pPts!=NULL && pPts->GetCount()!=0;
505*b1cdbd2cSJim Jagielski }
506*b1cdbd2cSJim Jagielski return bRet;
507*b1cdbd2cSJim Jagielski }
508*b1cdbd2cSJim Jagielski
GetMarkedGluePointCount() const509*b1cdbd2cSJim Jagielski sal_uIntPtr SdrMarkView::GetMarkedGluePointCount() const
510*b1cdbd2cSJim Jagielski {
511*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
512*b1cdbd2cSJim Jagielski sal_uIntPtr nAnz=0;
513*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
514*b1cdbd2cSJim Jagielski for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++) {
515*b1cdbd2cSJim Jagielski const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
516*b1cdbd2cSJim Jagielski const SdrUShortCont* pPts=pM->GetMarkedGluePoints();
517*b1cdbd2cSJim Jagielski if (pPts!=NULL) nAnz+=pPts->GetCount();
518*b1cdbd2cSJim Jagielski }
519*b1cdbd2cSJim Jagielski return nAnz;
520*b1cdbd2cSJim Jagielski }
521*b1cdbd2cSJim Jagielski
MarkGluePoints(const Rectangle * pRect,sal_Bool bUnmark)522*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::MarkGluePoints(const Rectangle* pRect, sal_Bool bUnmark)
523*b1cdbd2cSJim Jagielski {
524*b1cdbd2cSJim Jagielski if (!IsGluePointEditMode() && !bUnmark) return sal_False;
525*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
526*b1cdbd2cSJim Jagielski sal_Bool bChgd=sal_False;
527*b1cdbd2cSJim Jagielski SortMarkedObjects();
528*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
529*b1cdbd2cSJim Jagielski for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++) {
530*b1cdbd2cSJim Jagielski SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
531*b1cdbd2cSJim Jagielski const SdrObject* pObj=pM->GetMarkedSdrObj();
532*b1cdbd2cSJim Jagielski const SdrGluePointList* pGPL=pObj->GetGluePointList();
533*b1cdbd2cSJim Jagielski SdrUShortCont* pPts=pM->GetMarkedGluePoints();
534*b1cdbd2cSJim Jagielski if (bUnmark && pRect==NULL) { // UnmarkAll
535*b1cdbd2cSJim Jagielski if (pPts!=NULL && pPts->GetCount()!=0) {
536*b1cdbd2cSJim Jagielski pPts->Clear();
537*b1cdbd2cSJim Jagielski bChgd=sal_True;
538*b1cdbd2cSJim Jagielski }
539*b1cdbd2cSJim Jagielski } else {
540*b1cdbd2cSJim Jagielski if (pGPL!=NULL && (pPts!=NULL || !bUnmark)) {
541*b1cdbd2cSJim Jagielski sal_uInt16 nGPAnz=pGPL->GetCount();
542*b1cdbd2cSJim Jagielski for (sal_uInt16 nGPNum=0; nGPNum<nGPAnz; nGPNum++) {
543*b1cdbd2cSJim Jagielski const SdrGluePoint& rGP=(*pGPL)[nGPNum];
544*b1cdbd2cSJim Jagielski
545*b1cdbd2cSJim Jagielski // #i38892#
546*b1cdbd2cSJim Jagielski if(rGP.IsUserDefined())
547*b1cdbd2cSJim Jagielski {
548*b1cdbd2cSJim Jagielski Point aPos(rGP.GetAbsolutePos(*pObj));
549*b1cdbd2cSJim Jagielski if (pRect==NULL || pRect->IsInside(aPos)) {
550*b1cdbd2cSJim Jagielski if (pPts==NULL) pPts=pM->ForceMarkedGluePoints();
551*b1cdbd2cSJim Jagielski else pPts->ForceSort();
552*b1cdbd2cSJim Jagielski sal_uIntPtr nPos=pPts->GetPos(rGP.GetId());
553*b1cdbd2cSJim Jagielski if (!bUnmark && nPos==CONTAINER_ENTRY_NOTFOUND) {
554*b1cdbd2cSJim Jagielski bChgd=sal_True;
555*b1cdbd2cSJim Jagielski pPts->Insert(rGP.GetId());
556*b1cdbd2cSJim Jagielski }
557*b1cdbd2cSJim Jagielski if (bUnmark && nPos!=CONTAINER_ENTRY_NOTFOUND) {
558*b1cdbd2cSJim Jagielski bChgd=sal_True;
559*b1cdbd2cSJim Jagielski pPts->Remove(nPos);
560*b1cdbd2cSJim Jagielski }
561*b1cdbd2cSJim Jagielski }
562*b1cdbd2cSJim Jagielski }
563*b1cdbd2cSJim Jagielski }
564*b1cdbd2cSJim Jagielski }
565*b1cdbd2cSJim Jagielski }
566*b1cdbd2cSJim Jagielski }
567*b1cdbd2cSJim Jagielski if (bChgd) {
568*b1cdbd2cSJim Jagielski AdjustMarkHdl();
569*b1cdbd2cSJim Jagielski MarkListHasChanged();
570*b1cdbd2cSJim Jagielski }
571*b1cdbd2cSJim Jagielski return bChgd;
572*b1cdbd2cSJim Jagielski }
573*b1cdbd2cSJim Jagielski
PickGluePoint(const Point & rPnt,SdrObject * & rpObj,sal_uInt16 & rnId,SdrPageView * & rpPV,sal_uIntPtr nOptions) const574*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::PickGluePoint(const Point& rPnt, SdrObject*& rpObj, sal_uInt16& rnId, SdrPageView*& rpPV, sal_uIntPtr nOptions) const
575*b1cdbd2cSJim Jagielski {
576*b1cdbd2cSJim Jagielski SdrObject* pObj0=rpObj;
577*b1cdbd2cSJim Jagielski //SdrPageView* pPV0=rpPV;
578*b1cdbd2cSJim Jagielski sal_uInt16 nId0=rnId;
579*b1cdbd2cSJim Jagielski rpObj=NULL; rpPV=NULL; rnId=0;
580*b1cdbd2cSJim Jagielski if (!IsGluePointEditMode()) return sal_False;
581*b1cdbd2cSJim Jagielski sal_Bool bBack=(nOptions & SDRSEARCH_BACKWARD) !=0;
582*b1cdbd2cSJim Jagielski sal_Bool bNext=(nOptions & SDRSEARCH_NEXT) !=0;
583*b1cdbd2cSJim Jagielski OutputDevice* pOut=(OutputDevice*)pActualOutDev;
584*b1cdbd2cSJim Jagielski if (pOut==NULL) pOut=GetFirstOutputDevice(); //GetWin(0);
585*b1cdbd2cSJim Jagielski if (pOut==NULL) return sal_False;
586*b1cdbd2cSJim Jagielski SortMarkedObjects();
587*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
588*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkNum=bBack ? 0 : nMarkAnz;
589*b1cdbd2cSJim Jagielski if (bNext) {
590*b1cdbd2cSJim Jagielski nMarkNum=((SdrMarkView*)this)->TryToFindMarkedObject(pObj0);
591*b1cdbd2cSJim Jagielski if (nMarkNum==CONTAINER_ENTRY_NOTFOUND) return sal_False;
592*b1cdbd2cSJim Jagielski if (!bBack) nMarkNum++;
593*b1cdbd2cSJim Jagielski }
594*b1cdbd2cSJim Jagielski while (bBack ? nMarkNum<nMarkAnz : nMarkNum>0) {
595*b1cdbd2cSJim Jagielski if (!bBack) nMarkNum--;
596*b1cdbd2cSJim Jagielski const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
597*b1cdbd2cSJim Jagielski SdrObject* pObj=pM->GetMarkedSdrObj();
598*b1cdbd2cSJim Jagielski SdrPageView* pPV=pM->GetPageView();
599*b1cdbd2cSJim Jagielski const SdrGluePointList* pGPL=pObj->GetGluePointList();
600*b1cdbd2cSJim Jagielski if (pGPL!=NULL) {
601*b1cdbd2cSJim Jagielski sal_uInt16 nNum=pGPL->HitTest(rPnt,*pOut,pObj,bBack,bNext,nId0);
602*b1cdbd2cSJim Jagielski if (nNum!=SDRGLUEPOINT_NOTFOUND)
603*b1cdbd2cSJim Jagielski {
604*b1cdbd2cSJim Jagielski // #i38892#
605*b1cdbd2cSJim Jagielski const SdrGluePoint& rCandidate = (*pGPL)[nNum];
606*b1cdbd2cSJim Jagielski
607*b1cdbd2cSJim Jagielski if(rCandidate.IsUserDefined())
608*b1cdbd2cSJim Jagielski {
609*b1cdbd2cSJim Jagielski rpObj=pObj;
610*b1cdbd2cSJim Jagielski rnId=(*pGPL)[nNum].GetId();
611*b1cdbd2cSJim Jagielski rpPV=pPV;
612*b1cdbd2cSJim Jagielski return sal_True;
613*b1cdbd2cSJim Jagielski }
614*b1cdbd2cSJim Jagielski }
615*b1cdbd2cSJim Jagielski }
616*b1cdbd2cSJim Jagielski bNext=sal_False; // HitNextGluePoint nur beim ersten Obj
617*b1cdbd2cSJim Jagielski if (bBack) nMarkNum++;
618*b1cdbd2cSJim Jagielski }
619*b1cdbd2cSJim Jagielski return sal_False;
620*b1cdbd2cSJim Jagielski }
621*b1cdbd2cSJim Jagielski
MarkGluePoint(const SdrObject * pObj,sal_uInt16 nId,const SdrPageView *,sal_Bool bUnmark)622*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::MarkGluePoint(const SdrObject* pObj, sal_uInt16 nId, const SdrPageView* /*pPV*/, sal_Bool bUnmark)
623*b1cdbd2cSJim Jagielski {
624*b1cdbd2cSJim Jagielski if (!IsGluePointEditMode()) return sal_False;
625*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
626*b1cdbd2cSJim Jagielski sal_Bool bChgd=sal_False;
627*b1cdbd2cSJim Jagielski if (pObj!=NULL) {
628*b1cdbd2cSJim Jagielski sal_uIntPtr nMarkPos=TryToFindMarkedObject(pObj);
629*b1cdbd2cSJim Jagielski if (nMarkPos!=CONTAINER_ENTRY_NOTFOUND) {
630*b1cdbd2cSJim Jagielski SdrMark* pM=GetSdrMarkByIndex(nMarkPos);
631*b1cdbd2cSJim Jagielski SdrUShortCont* pPts=bUnmark ? pM->GetMarkedGluePoints() : pM->ForceMarkedGluePoints();
632*b1cdbd2cSJim Jagielski if (pPts!=NULL) {
633*b1cdbd2cSJim Jagielski sal_uIntPtr nPointPos=pPts->GetPos(nId);
634*b1cdbd2cSJim Jagielski if (!bUnmark && nPointPos==CONTAINER_ENTRY_NOTFOUND) {
635*b1cdbd2cSJim Jagielski bChgd=sal_True;
636*b1cdbd2cSJim Jagielski pPts->Insert(nId);
637*b1cdbd2cSJim Jagielski }
638*b1cdbd2cSJim Jagielski if (bUnmark && nPointPos!=CONTAINER_ENTRY_NOTFOUND) {
639*b1cdbd2cSJim Jagielski bChgd=sal_True;
640*b1cdbd2cSJim Jagielski pPts->Remove(nPointPos);
641*b1cdbd2cSJim Jagielski }
642*b1cdbd2cSJim Jagielski }
643*b1cdbd2cSJim Jagielski } else {
644*b1cdbd2cSJim Jagielski // Objekt implizit markieren ...
645*b1cdbd2cSJim Jagielski // ... fehlende Implementation
646*b1cdbd2cSJim Jagielski }
647*b1cdbd2cSJim Jagielski }
648*b1cdbd2cSJim Jagielski if (bChgd) {
649*b1cdbd2cSJim Jagielski AdjustMarkHdl();
650*b1cdbd2cSJim Jagielski MarkListHasChanged();
651*b1cdbd2cSJim Jagielski }
652*b1cdbd2cSJim Jagielski return bChgd;
653*b1cdbd2cSJim Jagielski }
654*b1cdbd2cSJim Jagielski
IsGluePointMarked(const SdrObject * pObj,sal_uInt16 nId) const655*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::IsGluePointMarked(const SdrObject* pObj, sal_uInt16 nId) const
656*b1cdbd2cSJim Jagielski {
657*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
658*b1cdbd2cSJim Jagielski sal_Bool bRet=sal_False;
659*b1cdbd2cSJim Jagielski sal_uIntPtr nPos=((SdrMarkView*)this)->TryToFindMarkedObject(pObj); // casting auf NonConst
660*b1cdbd2cSJim Jagielski if (nPos!=CONTAINER_ENTRY_NOTFOUND) {
661*b1cdbd2cSJim Jagielski const SdrMark* pM=GetSdrMarkByIndex(nPos);
662*b1cdbd2cSJim Jagielski const SdrUShortCont* pPts=pM->GetMarkedGluePoints();
663*b1cdbd2cSJim Jagielski if (pPts!=NULL) {
664*b1cdbd2cSJim Jagielski bRet=pPts->Exist(nId);
665*b1cdbd2cSJim Jagielski }
666*b1cdbd2cSJim Jagielski }
667*b1cdbd2cSJim Jagielski return bRet;
668*b1cdbd2cSJim Jagielski }
669*b1cdbd2cSJim Jagielski
UnmarkGluePoint(const SdrHdl & rHdl)670*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::UnmarkGluePoint(const SdrHdl& rHdl)
671*b1cdbd2cSJim Jagielski {
672*b1cdbd2cSJim Jagielski if (&rHdl!=NULL && rHdl.GetKind()==HDL_GLUE && rHdl.GetObj()!=NULL) {
673*b1cdbd2cSJim Jagielski return MarkGluePoint(rHdl.GetObj(),(sal_uInt16)rHdl.GetObjHdlNum(),rHdl.GetPageView(),sal_True);
674*b1cdbd2cSJim Jagielski } else return sal_False;
675*b1cdbd2cSJim Jagielski }
676*b1cdbd2cSJim Jagielski
GetGluePointHdl(const SdrObject * pObj,sal_uInt16 nId) const677*b1cdbd2cSJim Jagielski SdrHdl* SdrMarkView::GetGluePointHdl(const SdrObject* pObj, sal_uInt16 nId) const
678*b1cdbd2cSJim Jagielski {
679*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
680*b1cdbd2cSJim Jagielski sal_uIntPtr nHdlAnz=aHdl.GetHdlCount();
681*b1cdbd2cSJim Jagielski for (sal_uIntPtr nHdlNum=0; nHdlNum<nHdlAnz; nHdlNum++) {
682*b1cdbd2cSJim Jagielski SdrHdl* pHdl=aHdl.GetHdl(nHdlNum);
683*b1cdbd2cSJim Jagielski if (pHdl->GetObj()==pObj &&
684*b1cdbd2cSJim Jagielski pHdl->GetKind()==HDL_GLUE &&
685*b1cdbd2cSJim Jagielski pHdl->GetObjHdlNum()==nId ) return pHdl;
686*b1cdbd2cSJim Jagielski }
687*b1cdbd2cSJim Jagielski return NULL;
688*b1cdbd2cSJim Jagielski }
689*b1cdbd2cSJim Jagielski
MarkNextGluePoint(sal_Bool)690*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::MarkNextGluePoint(sal_Bool /*bPrev*/)
691*b1cdbd2cSJim Jagielski {
692*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
693*b1cdbd2cSJim Jagielski sal_Bool bChgd=sal_False;
694*b1cdbd2cSJim Jagielski SortMarkedObjects();
695*b1cdbd2cSJim Jagielski // ...
696*b1cdbd2cSJim Jagielski if (bChgd) {
697*b1cdbd2cSJim Jagielski MarkListHasChanged();
698*b1cdbd2cSJim Jagielski }
699*b1cdbd2cSJim Jagielski return bChgd;
700*b1cdbd2cSJim Jagielski }
701*b1cdbd2cSJim Jagielski
MarkNextGluePoint(const Point &,sal_Bool)702*b1cdbd2cSJim Jagielski sal_Bool SdrMarkView::MarkNextGluePoint(const Point& /*rPnt*/, sal_Bool /*bPrev*/)
703*b1cdbd2cSJim Jagielski {
704*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
705*b1cdbd2cSJim Jagielski sal_Bool bChgd=sal_False;
706*b1cdbd2cSJim Jagielski SortMarkedObjects();
707*b1cdbd2cSJim Jagielski // ...
708*b1cdbd2cSJim Jagielski if (bChgd) {
709*b1cdbd2cSJim Jagielski MarkListHasChanged();
710*b1cdbd2cSJim Jagielski }
711*b1cdbd2cSJim Jagielski return bChgd;
712*b1cdbd2cSJim Jagielski }
713*b1cdbd2cSJim Jagielski
GetMarkedGluePointsRect() const714*b1cdbd2cSJim Jagielski const Rectangle& SdrMarkView::GetMarkedGluePointsRect() const
715*b1cdbd2cSJim Jagielski {
716*b1cdbd2cSJim Jagielski ForceUndirtyMrkPnt();
717*b1cdbd2cSJim Jagielski if (bMarkedPointsRectsDirty) ImpSetPointsRects();
718*b1cdbd2cSJim Jagielski return aMarkedGluePointsRect;
719*b1cdbd2cSJim Jagielski }
720*b1cdbd2cSJim Jagielski
721