xref: /aoo4110/main/svx/source/svdraw/svdmrkv1.cxx (revision b1cdbd2c)
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