xref: /aoo41x/main/svx/source/svdraw/svdhdl.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_svx.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <algorithm>
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #include <svx/svdhdl.hxx>
34*cdf0e10cSrcweir #include <svx/svdpagv.hxx>
35*cdf0e10cSrcweir #include <svx/svdetc.hxx>
36*cdf0e10cSrcweir #include <svx/svdmrkv.hxx>
37*cdf0e10cSrcweir #include <vcl/window.hxx>
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir #include <vcl/virdev.hxx>
40*cdf0e10cSrcweir #include <tools/poly.hxx>
41*cdf0e10cSrcweir #include <vcl/bmpacc.hxx>
42*cdf0e10cSrcweir 
43*cdf0e10cSrcweir #include <svx/sxekitm.hxx>
44*cdf0e10cSrcweir #include "svx/svdstr.hrc"
45*cdf0e10cSrcweir #include "svx/svdglob.hxx"
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir #include <svx/svdmodel.hxx>
48*cdf0e10cSrcweir #include "gradtrns.hxx"
49*cdf0e10cSrcweir #include <svx/xflgrit.hxx>
50*cdf0e10cSrcweir #include <svx/svdundo.hxx>
51*cdf0e10cSrcweir #include <svx/dialmgr.hxx>
52*cdf0e10cSrcweir #include <svx/xflftrit.hxx>
53*cdf0e10cSrcweir 
54*cdf0e10cSrcweir // #105678#
55*cdf0e10cSrcweir #include <svx/svdopath.hxx>
56*cdf0e10cSrcweir #include <basegfx/vector/b2dvector.hxx>
57*cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygon.hxx>
58*cdf0e10cSrcweir #include <svx/sdr/overlay/overlaymanager.hxx>
59*cdf0e10cSrcweir #include <svx/sdr/overlay/overlayanimatedbitmapex.hxx>
60*cdf0e10cSrcweir #include <svx/sdr/overlay/overlaybitmapex.hxx>
61*cdf0e10cSrcweir #include <svx/sdr/overlay/overlayline.hxx>
62*cdf0e10cSrcweir #include <svx/sdr/overlay/overlaytriangle.hxx>
63*cdf0e10cSrcweir #include <svx/sdr/overlay/overlayhatchrect.hxx>
64*cdf0e10cSrcweir #include <svx/sdrpagewindow.hxx>
65*cdf0e10cSrcweir #include <svx/sdrpaintwindow.hxx>
66*cdf0e10cSrcweir #include <vcl/svapp.hxx>
67*cdf0e10cSrcweir #include <svx/sdr/overlay/overlaypolypolygon.hxx>
68*cdf0e10cSrcweir #include <vcl/lazydelete.hxx>
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
71*cdf0e10cSrcweir // #i15222#
72*cdf0e10cSrcweir // Due to the ressource problems in Win95/98 with bitmap ressources i
73*cdf0e10cSrcweir // will change this handle bitmap provinging class. Old version was splitting
74*cdf0e10cSrcweir // and preparing all small handle bitmaps in device bitmap format, now this will
75*cdf0e10cSrcweir // be done on the fly. Thus, tehre is only the one big bitmap remembered. With
76*cdf0e10cSrcweir // three source bitmaps, this will be 3 system bitmap ressources instead of hundreds.
77*cdf0e10cSrcweir // The price for that needs to be evaluated. Maybe we will need another change here
78*cdf0e10cSrcweir // if this is too expensive.
79*cdf0e10cSrcweir class SdrHdlBitmapSet
80*cdf0e10cSrcweir {
81*cdf0e10cSrcweir 	// the bitmap holding all infos
82*cdf0e10cSrcweir 	BitmapEx				    maMarkersBitmap;
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir     // the cropped Bitmaps for reusage
85*cdf0e10cSrcweir     ::std::vector< BitmapEx >   maRealMarkers;
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir     // elpers
88*cdf0e10cSrcweir     BitmapEx& impGetOrCreateTargetBitmap(sal_uInt16 nIndex, const Rectangle& rRectangle);
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir public:
91*cdf0e10cSrcweir 	SdrHdlBitmapSet(sal_uInt16 nResId);
92*cdf0e10cSrcweir 	~SdrHdlBitmapSet();
93*cdf0e10cSrcweir 
94*cdf0e10cSrcweir 	const BitmapEx& GetBitmapEx(BitmapMarkerKind eKindOfMarker, sal_uInt16 nInd=0);
95*cdf0e10cSrcweir };
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
98*cdf0e10cSrcweir #define KIND_COUNT          (14)
99*cdf0e10cSrcweir #define INDEX_COUNT         (6)
100*cdf0e10cSrcweir #define INDIVIDUAL_COUNT    (4)
101*cdf0e10cSrcweir 
102*cdf0e10cSrcweir SdrHdlBitmapSet::SdrHdlBitmapSet(sal_uInt16 nResId)
103*cdf0e10cSrcweir :   maMarkersBitmap(),
104*cdf0e10cSrcweir     // 14 kinds (BitmapMarkerKind) use index [0..5], 4 extra
105*cdf0e10cSrcweir     maRealMarkers((KIND_COUNT * INDEX_COUNT) + INDIVIDUAL_COUNT)
106*cdf0e10cSrcweir {
107*cdf0e10cSrcweir 	// #101928# change color used for transparent parts to 0x00ff00ff (ImageList standard)
108*cdf0e10cSrcweir 	const Color aColTransparent(0x00ff00ff);
109*cdf0e10cSrcweir 	const Bitmap aBitmap(ResId(nResId, *ImpGetResMgr()));
110*cdf0e10cSrcweir     const Bitmap aMask(aBitmap.CreateMask(aColTransparent));
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir     // create a real BitmapEx with an AlphaMask
113*cdf0e10cSrcweir     maMarkersBitmap = BitmapEx(aBitmap, aMask);
114*cdf0e10cSrcweir     // maMarkersBitmap = BitmapEx(aBitmap, aColTransparent);
115*cdf0e10cSrcweir }
116*cdf0e10cSrcweir 
117*cdf0e10cSrcweir SdrHdlBitmapSet::~SdrHdlBitmapSet()
118*cdf0e10cSrcweir {
119*cdf0e10cSrcweir }
120*cdf0e10cSrcweir 
121*cdf0e10cSrcweir BitmapEx& SdrHdlBitmapSet::impGetOrCreateTargetBitmap(sal_uInt16 nIndex, const Rectangle& rRectangle)
122*cdf0e10cSrcweir {
123*cdf0e10cSrcweir     BitmapEx& rTargetBitmap = maRealMarkers[nIndex];
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir     if(rTargetBitmap.IsEmpty())
126*cdf0e10cSrcweir     {
127*cdf0e10cSrcweir         rTargetBitmap = maMarkersBitmap;
128*cdf0e10cSrcweir         rTargetBitmap.Crop(rRectangle);
129*cdf0e10cSrcweir     }
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir     return rTargetBitmap;
132*cdf0e10cSrcweir }
133*cdf0e10cSrcweir 
134*cdf0e10cSrcweir // change getting of bitmap to use the big ressource bitmap
135*cdf0e10cSrcweir const BitmapEx& SdrHdlBitmapSet::GetBitmapEx(BitmapMarkerKind eKindOfMarker, sal_uInt16 nInd)
136*cdf0e10cSrcweir {
137*cdf0e10cSrcweir 	// fill in size and source position in maMarkersBitmap
138*cdf0e10cSrcweir 	const sal_uInt16 nYPos(nInd * 11);
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir 	switch(eKindOfMarker)
141*cdf0e10cSrcweir 	{
142*cdf0e10cSrcweir 		default:
143*cdf0e10cSrcweir 		{
144*cdf0e10cSrcweir 			DBG_ERROR( "unknown kind of marker" );
145*cdf0e10cSrcweir 			// no break here, return Rect_7x7 as default
146*cdf0e10cSrcweir 		}
147*cdf0e10cSrcweir 		case Rect_7x7:
148*cdf0e10cSrcweir 		{
149*cdf0e10cSrcweir             return impGetOrCreateTargetBitmap((0 * INDEX_COUNT) + nInd, Rectangle(Point(0, nYPos), Size(7, 7)));
150*cdf0e10cSrcweir 		}
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir 		case Rect_9x9:
153*cdf0e10cSrcweir 		{
154*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((1 * INDEX_COUNT) + nInd, Rectangle(Point(7, nYPos), Size(9, 9)));
155*cdf0e10cSrcweir 		}
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir 		case Rect_11x11:
158*cdf0e10cSrcweir 		{
159*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((2 * INDEX_COUNT) + nInd, Rectangle(Point(16, nYPos), Size(11, 11)));
160*cdf0e10cSrcweir 		}
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir 		case Rect_13x13:
163*cdf0e10cSrcweir 		{
164*cdf0e10cSrcweir             const sal_uInt16 nIndex((3 * INDEX_COUNT) + nInd);
165*cdf0e10cSrcweir 
166*cdf0e10cSrcweir 			switch(nInd)
167*cdf0e10cSrcweir 			{
168*cdf0e10cSrcweir     			case 0:
169*cdf0e10cSrcweir                 {
170*cdf0e10cSrcweir                     return impGetOrCreateTargetBitmap(nIndex, Rectangle(Point(72, 66), Size(13, 13)));
171*cdf0e10cSrcweir                 }
172*cdf0e10cSrcweir 	    		case 1:
173*cdf0e10cSrcweir                 {
174*cdf0e10cSrcweir                     return impGetOrCreateTargetBitmap(nIndex, Rectangle(Point(85, 66), Size(13, 13)));
175*cdf0e10cSrcweir                 }
176*cdf0e10cSrcweir 		    	case 2:
177*cdf0e10cSrcweir                 {
178*cdf0e10cSrcweir                     return impGetOrCreateTargetBitmap(nIndex, Rectangle(Point(72, 78), Size(13, 13)));
179*cdf0e10cSrcweir                 }
180*cdf0e10cSrcweir 			    case 3:
181*cdf0e10cSrcweir                 {
182*cdf0e10cSrcweir                     return impGetOrCreateTargetBitmap(nIndex, Rectangle(Point(85, 78), Size(13, 13)));
183*cdf0e10cSrcweir                 }
184*cdf0e10cSrcweir     			case 4:
185*cdf0e10cSrcweir                 {
186*cdf0e10cSrcweir                     return impGetOrCreateTargetBitmap(nIndex, Rectangle(Point(98, 78), Size(13, 13)));
187*cdf0e10cSrcweir                 }
188*cdf0e10cSrcweir                 default: // case 5:
189*cdf0e10cSrcweir                 {
190*cdf0e10cSrcweir                     return impGetOrCreateTargetBitmap(nIndex, Rectangle(Point(98, 66), Size(13, 13)));
191*cdf0e10cSrcweir                 }
192*cdf0e10cSrcweir 			}
193*cdf0e10cSrcweir 		}
194*cdf0e10cSrcweir 
195*cdf0e10cSrcweir 		case Circ_7x7:
196*cdf0e10cSrcweir 		{
197*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((4 * INDEX_COUNT) + nInd, Rectangle(Point(27, nYPos), Size(7, 7)));
198*cdf0e10cSrcweir 		}
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir 		case Circ_9x9:
201*cdf0e10cSrcweir 		case Customshape1:
202*cdf0e10cSrcweir 		{
203*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((5 * INDEX_COUNT) + nInd, Rectangle(Point(34, nYPos), Size(9, 9)));
204*cdf0e10cSrcweir 		}
205*cdf0e10cSrcweir 
206*cdf0e10cSrcweir 		case Circ_11x11:
207*cdf0e10cSrcweir 		{
208*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((6 * INDEX_COUNT) + nInd, Rectangle(Point(43, nYPos), Size(11, 11)));
209*cdf0e10cSrcweir 		}
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir 		case Elli_7x9:
212*cdf0e10cSrcweir 		{
213*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((7 * INDEX_COUNT) + nInd, Rectangle(Point(54, nYPos), Size(7, 9)));
214*cdf0e10cSrcweir 		}
215*cdf0e10cSrcweir 
216*cdf0e10cSrcweir 		case Elli_9x11:
217*cdf0e10cSrcweir 		{
218*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((8 * INDEX_COUNT) + nInd, Rectangle(Point(61, nYPos), Size(9, 11)));
219*cdf0e10cSrcweir 		}
220*cdf0e10cSrcweir 
221*cdf0e10cSrcweir 		case Elli_9x7:
222*cdf0e10cSrcweir 		{
223*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((9 * INDEX_COUNT) + nInd, Rectangle(Point(70, nYPos), Size(9, 7)));
224*cdf0e10cSrcweir 		}
225*cdf0e10cSrcweir 
226*cdf0e10cSrcweir 		case Elli_11x9:
227*cdf0e10cSrcweir 		{
228*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((10 * INDEX_COUNT) + nInd, Rectangle(Point(79, nYPos), Size(11, 9)));
229*cdf0e10cSrcweir 		}
230*cdf0e10cSrcweir 
231*cdf0e10cSrcweir 		case RectPlus_7x7:
232*cdf0e10cSrcweir 		{
233*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((11 * INDEX_COUNT) + nInd, Rectangle(Point(90, nYPos), Size(7, 7)));
234*cdf0e10cSrcweir 		}
235*cdf0e10cSrcweir 
236*cdf0e10cSrcweir 		case RectPlus_9x9:
237*cdf0e10cSrcweir 		{
238*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((12 * INDEX_COUNT) + nInd, Rectangle(Point(97, nYPos), Size(9, 9)));
239*cdf0e10cSrcweir 		}
240*cdf0e10cSrcweir 
241*cdf0e10cSrcweir 		case RectPlus_11x11:
242*cdf0e10cSrcweir 		{
243*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((13 * INDEX_COUNT) + nInd, Rectangle(Point(106, nYPos), Size(11, 11)));
244*cdf0e10cSrcweir 		}
245*cdf0e10cSrcweir 
246*cdf0e10cSrcweir 		case Crosshair:
247*cdf0e10cSrcweir 		{
248*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((KIND_COUNT * INDEX_COUNT) + 0, Rectangle(Point(0, 68), Size(15, 15)));
249*cdf0e10cSrcweir 		}
250*cdf0e10cSrcweir 
251*cdf0e10cSrcweir 		case Glue:
252*cdf0e10cSrcweir 		{
253*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((KIND_COUNT * INDEX_COUNT) + 1, Rectangle(Point(15, 74), Size(9, 9)));
254*cdf0e10cSrcweir 		}
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir 		case Anchor: // #101688# AnchorTR for SW
257*cdf0e10cSrcweir 		case AnchorTR:
258*cdf0e10cSrcweir 		{
259*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((KIND_COUNT * INDEX_COUNT) + 2, Rectangle(Point(24, 68), Size(24, 23)));
260*cdf0e10cSrcweir 		}
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir 		// #98388# add AnchorPressed to be able to aninate anchor control
263*cdf0e10cSrcweir 		case AnchorPressed:
264*cdf0e10cSrcweir 		case AnchorPressedTR:
265*cdf0e10cSrcweir 		{
266*cdf0e10cSrcweir 			return impGetOrCreateTargetBitmap((KIND_COUNT * INDEX_COUNT) + 3, Rectangle(Point(48, 68), Size(24, 23)));
267*cdf0e10cSrcweir 		}
268*cdf0e10cSrcweir 	}
269*cdf0e10cSrcweir 
270*cdf0e10cSrcweir 	// cannot happen since all pathes return something; return Rect_7x7 as default (see switch)
271*cdf0e10cSrcweir     return maRealMarkers[0];
272*cdf0e10cSrcweir }
273*cdf0e10cSrcweir 
274*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
275*cdf0e10cSrcweir 
276*cdf0e10cSrcweir SdrHdlBitmapSet& getSimpleSet()
277*cdf0e10cSrcweir {
278*cdf0e10cSrcweir     static vcl::DeleteOnDeinit< SdrHdlBitmapSet > aSimpleSet(new SdrHdlBitmapSet(SIP_SA_MARKERS));
279*cdf0e10cSrcweir     return *aSimpleSet.get();
280*cdf0e10cSrcweir }
281*cdf0e10cSrcweir 
282*cdf0e10cSrcweir SdrHdlBitmapSet& getModernSet()
283*cdf0e10cSrcweir {
284*cdf0e10cSrcweir     static vcl::DeleteOnDeinit< SdrHdlBitmapSet > aModernSet(new SdrHdlBitmapSet(SIP_SA_FINE_MARKERS));
285*cdf0e10cSrcweir     return *aModernSet.get();
286*cdf0e10cSrcweir }
287*cdf0e10cSrcweir 
288*cdf0e10cSrcweir SdrHdlBitmapSet& getHighContrastSet()
289*cdf0e10cSrcweir {
290*cdf0e10cSrcweir     static vcl::DeleteOnDeinit< SdrHdlBitmapSet > aHighContrastSet(new SdrHdlBitmapSet(SIP_SA_ACCESSIBILITY_MARKERS));
291*cdf0e10cSrcweir     return *aHighContrastSet.get();
292*cdf0e10cSrcweir }
293*cdf0e10cSrcweir 
294*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
295*cdf0e10cSrcweir 
296*cdf0e10cSrcweir SdrHdl::SdrHdl():
297*cdf0e10cSrcweir     pObj(NULL),
298*cdf0e10cSrcweir     pPV(NULL),
299*cdf0e10cSrcweir     pHdlList(NULL),
300*cdf0e10cSrcweir     eKind(HDL_MOVE),
301*cdf0e10cSrcweir     nDrehWink(0),
302*cdf0e10cSrcweir     nObjHdlNum(0),
303*cdf0e10cSrcweir     nPolyNum(0),
304*cdf0e10cSrcweir     nPPntNum(0),
305*cdf0e10cSrcweir     nSourceHdlNum(0),
306*cdf0e10cSrcweir     bSelect(sal_False),
307*cdf0e10cSrcweir     b1PixMore(sal_False),
308*cdf0e10cSrcweir     bPlusHdl(sal_False),
309*cdf0e10cSrcweir 	mbMoveOutside(false),
310*cdf0e10cSrcweir 	mbMouseOver(false)
311*cdf0e10cSrcweir {
312*cdf0e10cSrcweir }
313*cdf0e10cSrcweir 
314*cdf0e10cSrcweir SdrHdl::SdrHdl(const Point& rPnt, SdrHdlKind eNewKind):
315*cdf0e10cSrcweir     pObj(NULL),
316*cdf0e10cSrcweir     pPV(NULL),
317*cdf0e10cSrcweir     pHdlList(NULL),
318*cdf0e10cSrcweir     aPos(rPnt),
319*cdf0e10cSrcweir     eKind(eNewKind),
320*cdf0e10cSrcweir     nDrehWink(0),
321*cdf0e10cSrcweir     nObjHdlNum(0),
322*cdf0e10cSrcweir     nPolyNum(0),
323*cdf0e10cSrcweir     nPPntNum(0),
324*cdf0e10cSrcweir     nSourceHdlNum(0),
325*cdf0e10cSrcweir     bSelect(sal_False),
326*cdf0e10cSrcweir     b1PixMore(sal_False),
327*cdf0e10cSrcweir     bPlusHdl(sal_False),
328*cdf0e10cSrcweir 	mbMoveOutside(false),
329*cdf0e10cSrcweir 	mbMouseOver(false)
330*cdf0e10cSrcweir {
331*cdf0e10cSrcweir }
332*cdf0e10cSrcweir 
333*cdf0e10cSrcweir SdrHdl::~SdrHdl()
334*cdf0e10cSrcweir {
335*cdf0e10cSrcweir 	GetRidOfIAObject();
336*cdf0e10cSrcweir }
337*cdf0e10cSrcweir 
338*cdf0e10cSrcweir void SdrHdl::Set1PixMore(sal_Bool bJa)
339*cdf0e10cSrcweir {
340*cdf0e10cSrcweir 	if(b1PixMore != bJa)
341*cdf0e10cSrcweir 	{
342*cdf0e10cSrcweir 		b1PixMore = bJa;
343*cdf0e10cSrcweir 
344*cdf0e10cSrcweir 		// create new display
345*cdf0e10cSrcweir 		Touch();
346*cdf0e10cSrcweir 	}
347*cdf0e10cSrcweir }
348*cdf0e10cSrcweir 
349*cdf0e10cSrcweir void SdrHdl::SetMoveOutside( bool bMoveOutside )
350*cdf0e10cSrcweir {
351*cdf0e10cSrcweir 	if(mbMoveOutside != bMoveOutside)
352*cdf0e10cSrcweir 	{
353*cdf0e10cSrcweir 		mbMoveOutside = bMoveOutside;
354*cdf0e10cSrcweir 
355*cdf0e10cSrcweir 		// create new display
356*cdf0e10cSrcweir 		Touch();
357*cdf0e10cSrcweir 	}
358*cdf0e10cSrcweir }
359*cdf0e10cSrcweir 
360*cdf0e10cSrcweir void SdrHdl::SetDrehWink(long n)
361*cdf0e10cSrcweir {
362*cdf0e10cSrcweir 	if(nDrehWink != n)
363*cdf0e10cSrcweir 	{
364*cdf0e10cSrcweir 		nDrehWink = n;
365*cdf0e10cSrcweir 
366*cdf0e10cSrcweir 		// create new display
367*cdf0e10cSrcweir 		Touch();
368*cdf0e10cSrcweir 	}
369*cdf0e10cSrcweir }
370*cdf0e10cSrcweir 
371*cdf0e10cSrcweir void SdrHdl::SetPos(const Point& rPnt)
372*cdf0e10cSrcweir {
373*cdf0e10cSrcweir 	if(aPos != rPnt)
374*cdf0e10cSrcweir 	{
375*cdf0e10cSrcweir 		// remember new position
376*cdf0e10cSrcweir 		aPos = rPnt;
377*cdf0e10cSrcweir 
378*cdf0e10cSrcweir 		// create new display
379*cdf0e10cSrcweir 		Touch();
380*cdf0e10cSrcweir 	}
381*cdf0e10cSrcweir }
382*cdf0e10cSrcweir 
383*cdf0e10cSrcweir void SdrHdl::SetSelected(sal_Bool bJa)
384*cdf0e10cSrcweir {
385*cdf0e10cSrcweir 	if(bSelect != bJa)
386*cdf0e10cSrcweir 	{
387*cdf0e10cSrcweir 		// remember new value
388*cdf0e10cSrcweir 		bSelect = bJa;
389*cdf0e10cSrcweir 
390*cdf0e10cSrcweir 		// create new display
391*cdf0e10cSrcweir 		Touch();
392*cdf0e10cSrcweir 	}
393*cdf0e10cSrcweir }
394*cdf0e10cSrcweir 
395*cdf0e10cSrcweir void SdrHdl::SetHdlList(SdrHdlList* pList)
396*cdf0e10cSrcweir {
397*cdf0e10cSrcweir 	if(pHdlList != pList)
398*cdf0e10cSrcweir 	{
399*cdf0e10cSrcweir 		// rememver list
400*cdf0e10cSrcweir 		pHdlList = pList;
401*cdf0e10cSrcweir 
402*cdf0e10cSrcweir 		// now its possible to create graphic representation
403*cdf0e10cSrcweir 		Touch();
404*cdf0e10cSrcweir 	}
405*cdf0e10cSrcweir }
406*cdf0e10cSrcweir 
407*cdf0e10cSrcweir void SdrHdl::SetObj(SdrObject* pNewObj)
408*cdf0e10cSrcweir {
409*cdf0e10cSrcweir 	if(pObj != pNewObj)
410*cdf0e10cSrcweir 	{
411*cdf0e10cSrcweir 		// remember new object
412*cdf0e10cSrcweir 		pObj = pNewObj;
413*cdf0e10cSrcweir 
414*cdf0e10cSrcweir 		// graphic representation may have changed
415*cdf0e10cSrcweir 		Touch();
416*cdf0e10cSrcweir 	}
417*cdf0e10cSrcweir }
418*cdf0e10cSrcweir 
419*cdf0e10cSrcweir void SdrHdl::Touch()
420*cdf0e10cSrcweir {
421*cdf0e10cSrcweir 	// force update of graphic representation
422*cdf0e10cSrcweir 	CreateB2dIAObject();
423*cdf0e10cSrcweir }
424*cdf0e10cSrcweir 
425*cdf0e10cSrcweir void SdrHdl::GetRidOfIAObject()
426*cdf0e10cSrcweir {
427*cdf0e10cSrcweir 	//OLMaIAOGroup.Delete();
428*cdf0e10cSrcweir 
429*cdf0e10cSrcweir 	// OVERLAYMANAGER
430*cdf0e10cSrcweir 	maOverlayGroup.clear();
431*cdf0e10cSrcweir }
432*cdf0e10cSrcweir 
433*cdf0e10cSrcweir void SdrHdl::CreateB2dIAObject()
434*cdf0e10cSrcweir {
435*cdf0e10cSrcweir 	// first throw away old one
436*cdf0e10cSrcweir 	GetRidOfIAObject();
437*cdf0e10cSrcweir 
438*cdf0e10cSrcweir 	if(pHdlList && pHdlList->GetView() && !pHdlList->GetView()->areMarkHandlesHidden())
439*cdf0e10cSrcweir 	{
440*cdf0e10cSrcweir 		BitmapColorIndex eColIndex = LightGreen;
441*cdf0e10cSrcweir 		BitmapMarkerKind eKindOfMarker = Rect_7x7;
442*cdf0e10cSrcweir 
443*cdf0e10cSrcweir         sal_Bool bRot = pHdlList->IsRotateShear();
444*cdf0e10cSrcweir         if(pObj)
445*cdf0e10cSrcweir             eColIndex = (bSelect) ? Cyan : LightCyan;
446*cdf0e10cSrcweir         if(bRot)
447*cdf0e10cSrcweir 		{
448*cdf0e10cSrcweir 			// Drehhandles in Rot
449*cdf0e10cSrcweir             if(pObj && bSelect)
450*cdf0e10cSrcweir 				eColIndex = Red;
451*cdf0e10cSrcweir 			else
452*cdf0e10cSrcweir 	            eColIndex = LightRed;
453*cdf0e10cSrcweir         }
454*cdf0e10cSrcweir 
455*cdf0e10cSrcweir 		switch(eKind)
456*cdf0e10cSrcweir 		{
457*cdf0e10cSrcweir 			case HDL_MOVE:
458*cdf0e10cSrcweir 			{
459*cdf0e10cSrcweir 				eKindOfMarker = (b1PixMore) ? Rect_9x9 : Rect_7x7;
460*cdf0e10cSrcweir 				break;
461*cdf0e10cSrcweir 			}
462*cdf0e10cSrcweir 			case HDL_UPLFT:
463*cdf0e10cSrcweir 			case HDL_UPRGT:
464*cdf0e10cSrcweir 			case HDL_LWLFT:
465*cdf0e10cSrcweir 			case HDL_LWRGT:
466*cdf0e10cSrcweir 			{
467*cdf0e10cSrcweir 				// corner handles
468*cdf0e10cSrcweir 				if(bRot)
469*cdf0e10cSrcweir 				{
470*cdf0e10cSrcweir 					eKindOfMarker = Circ_7x7;
471*cdf0e10cSrcweir 				}
472*cdf0e10cSrcweir 				else
473*cdf0e10cSrcweir 				{
474*cdf0e10cSrcweir 					eKindOfMarker = Rect_7x7;
475*cdf0e10cSrcweir 				}
476*cdf0e10cSrcweir 				break;
477*cdf0e10cSrcweir 			}
478*cdf0e10cSrcweir 			case HDL_UPPER:
479*cdf0e10cSrcweir 			case HDL_LOWER:
480*cdf0e10cSrcweir 			{
481*cdf0e10cSrcweir 				// Upper/Lower handles
482*cdf0e10cSrcweir 				if(bRot)
483*cdf0e10cSrcweir 				{
484*cdf0e10cSrcweir 					eKindOfMarker = Elli_9x7;
485*cdf0e10cSrcweir 				}
486*cdf0e10cSrcweir 				else
487*cdf0e10cSrcweir 				{
488*cdf0e10cSrcweir 					eKindOfMarker = Rect_7x7;
489*cdf0e10cSrcweir 				}
490*cdf0e10cSrcweir 				break;
491*cdf0e10cSrcweir 			}
492*cdf0e10cSrcweir 			case HDL_LEFT:
493*cdf0e10cSrcweir 			case HDL_RIGHT:
494*cdf0e10cSrcweir 			{
495*cdf0e10cSrcweir 				// Left/Right handles
496*cdf0e10cSrcweir 				if(bRot)
497*cdf0e10cSrcweir 				{
498*cdf0e10cSrcweir 					eKindOfMarker = Elli_7x9;
499*cdf0e10cSrcweir 				}
500*cdf0e10cSrcweir 				else
501*cdf0e10cSrcweir 				{
502*cdf0e10cSrcweir 					eKindOfMarker = Rect_7x7;
503*cdf0e10cSrcweir 				}
504*cdf0e10cSrcweir 				break;
505*cdf0e10cSrcweir 			}
506*cdf0e10cSrcweir 			case HDL_POLY:
507*cdf0e10cSrcweir 			{
508*cdf0e10cSrcweir 				if(bRot)
509*cdf0e10cSrcweir 				{
510*cdf0e10cSrcweir 					eKindOfMarker = (b1PixMore) ? Circ_9x9 : Circ_7x7;
511*cdf0e10cSrcweir 				}
512*cdf0e10cSrcweir 				else
513*cdf0e10cSrcweir 				{
514*cdf0e10cSrcweir 					eKindOfMarker = (b1PixMore) ? Rect_9x9 : Rect_7x7;
515*cdf0e10cSrcweir 				}
516*cdf0e10cSrcweir 				break;
517*cdf0e10cSrcweir 			}
518*cdf0e10cSrcweir 			case HDL_BWGT: // weight at poly
519*cdf0e10cSrcweir 			{
520*cdf0e10cSrcweir 				eKindOfMarker = Circ_7x7;
521*cdf0e10cSrcweir 				break;
522*cdf0e10cSrcweir 			}
523*cdf0e10cSrcweir 			case HDL_CIRC:
524*cdf0e10cSrcweir 			{
525*cdf0e10cSrcweir 				eKindOfMarker = Rect_11x11;
526*cdf0e10cSrcweir 				break;
527*cdf0e10cSrcweir 			}
528*cdf0e10cSrcweir 			case HDL_REF1:
529*cdf0e10cSrcweir 			case HDL_REF2:
530*cdf0e10cSrcweir 			{
531*cdf0e10cSrcweir 				eKindOfMarker = Crosshair;
532*cdf0e10cSrcweir 				break;
533*cdf0e10cSrcweir 			}
534*cdf0e10cSrcweir 			case HDL_GLUE:
535*cdf0e10cSrcweir 			{
536*cdf0e10cSrcweir 				eKindOfMarker = Glue;
537*cdf0e10cSrcweir 				break;
538*cdf0e10cSrcweir 			}
539*cdf0e10cSrcweir 			case HDL_ANCHOR:
540*cdf0e10cSrcweir 			{
541*cdf0e10cSrcweir 				eKindOfMarker = Anchor;
542*cdf0e10cSrcweir 				break;
543*cdf0e10cSrcweir 			}
544*cdf0e10cSrcweir 			case HDL_USER:
545*cdf0e10cSrcweir 			{
546*cdf0e10cSrcweir 				break;
547*cdf0e10cSrcweir 			}
548*cdf0e10cSrcweir 			// #101688# top right anchor for SW
549*cdf0e10cSrcweir 			case HDL_ANCHOR_TR:
550*cdf0e10cSrcweir 			{
551*cdf0e10cSrcweir 				eKindOfMarker = AnchorTR;
552*cdf0e10cSrcweir 				break;
553*cdf0e10cSrcweir 			}
554*cdf0e10cSrcweir 
555*cdf0e10cSrcweir 			// for SJ and the CustomShapeHandles:
556*cdf0e10cSrcweir 			case HDL_CUSTOMSHAPE1:
557*cdf0e10cSrcweir 			{
558*cdf0e10cSrcweir 				eKindOfMarker = Customshape1;
559*cdf0e10cSrcweir 				eColIndex = Yellow;
560*cdf0e10cSrcweir 				break;
561*cdf0e10cSrcweir 			}
562*cdf0e10cSrcweir             default:
563*cdf0e10cSrcweir                 break;
564*cdf0e10cSrcweir 		}
565*cdf0e10cSrcweir 
566*cdf0e10cSrcweir 		SdrMarkView* pView = pHdlList->GetView();
567*cdf0e10cSrcweir 		SdrPageView* pPageView = pView->GetSdrPageView();
568*cdf0e10cSrcweir 
569*cdf0e10cSrcweir 		if(pPageView)
570*cdf0e10cSrcweir 		{
571*cdf0e10cSrcweir 			for(sal_uInt32 b(0L); b < pPageView->PageWindowCount(); b++)
572*cdf0e10cSrcweir 			{
573*cdf0e10cSrcweir 				// const SdrPageViewWinRec& rPageViewWinRec = rPageViewWinList[b];
574*cdf0e10cSrcweir 				const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
575*cdf0e10cSrcweir 
576*cdf0e10cSrcweir 				if(rPageWindow.GetPaintWindow().OutputToWindow())
577*cdf0e10cSrcweir 				{
578*cdf0e10cSrcweir 					Point aMoveOutsideOffset(0, 0);
579*cdf0e10cSrcweir 
580*cdf0e10cSrcweir 					// add offset if necessary
581*cdf0e10cSrcweir 					if(pHdlList->IsMoveOutside() || mbMoveOutside)
582*cdf0e10cSrcweir 					{
583*cdf0e10cSrcweir 						OutputDevice& rOutDev = rPageWindow.GetPaintWindow().GetOutputDevice();
584*cdf0e10cSrcweir 						Size aOffset = rOutDev.PixelToLogic(Size(4, 4));
585*cdf0e10cSrcweir 
586*cdf0e10cSrcweir 						if(eKind == HDL_UPLFT || eKind == HDL_UPPER || eKind == HDL_UPRGT)
587*cdf0e10cSrcweir 							aMoveOutsideOffset.Y() -= aOffset.Width();
588*cdf0e10cSrcweir 						if(eKind == HDL_LWLFT || eKind == HDL_LOWER || eKind == HDL_LWRGT)
589*cdf0e10cSrcweir 							aMoveOutsideOffset.Y() += aOffset.Height();
590*cdf0e10cSrcweir 						if(eKind == HDL_UPLFT || eKind == HDL_LEFT  || eKind == HDL_LWLFT)
591*cdf0e10cSrcweir 							aMoveOutsideOffset.X() -= aOffset.Width();
592*cdf0e10cSrcweir 						if(eKind == HDL_UPRGT || eKind == HDL_RIGHT || eKind == HDL_LWRGT)
593*cdf0e10cSrcweir 							aMoveOutsideOffset.X() += aOffset.Height();
594*cdf0e10cSrcweir 					}
595*cdf0e10cSrcweir 
596*cdf0e10cSrcweir 					if(rPageWindow.GetOverlayManager())
597*cdf0e10cSrcweir 					{
598*cdf0e10cSrcweir 						basegfx::B2DPoint aPosition(aPos.X(), aPos.Y());
599*cdf0e10cSrcweir 						::sdr::overlay::OverlayObject* pNewOverlayObject = CreateOverlayObject(
600*cdf0e10cSrcweir 							aPosition,
601*cdf0e10cSrcweir 							eColIndex,
602*cdf0e10cSrcweir 							eKindOfMarker,
603*cdf0e10cSrcweir 							aMoveOutsideOffset);
604*cdf0e10cSrcweir 
605*cdf0e10cSrcweir 						// OVERLAYMANAGER
606*cdf0e10cSrcweir 						if(pNewOverlayObject)
607*cdf0e10cSrcweir 						{
608*cdf0e10cSrcweir 							rPageWindow.GetOverlayManager()->add(*pNewOverlayObject);
609*cdf0e10cSrcweir 							maOverlayGroup.append(*pNewOverlayObject);
610*cdf0e10cSrcweir 						}
611*cdf0e10cSrcweir 					}
612*cdf0e10cSrcweir 				}
613*cdf0e10cSrcweir 			}
614*cdf0e10cSrcweir 		}
615*cdf0e10cSrcweir 	}
616*cdf0e10cSrcweir }
617*cdf0e10cSrcweir 
618*cdf0e10cSrcweir BitmapMarkerKind SdrHdl::GetNextBigger(BitmapMarkerKind eKnd) const
619*cdf0e10cSrcweir {
620*cdf0e10cSrcweir 	BitmapMarkerKind eRetval(eKnd);
621*cdf0e10cSrcweir 
622*cdf0e10cSrcweir 	switch(eKnd)
623*cdf0e10cSrcweir 	{
624*cdf0e10cSrcweir 		case Rect_7x7:			eRetval = Rect_9x9;			break;
625*cdf0e10cSrcweir 		case Rect_9x9:			eRetval = Rect_11x11;		break;
626*cdf0e10cSrcweir 		case Rect_11x11:		eRetval = Rect_13x13;		break;
627*cdf0e10cSrcweir 		//case Rect_13x13:		eRetval = ;	break;
628*cdf0e10cSrcweir 
629*cdf0e10cSrcweir 		case Circ_7x7:			eRetval = Circ_9x9;			break;
630*cdf0e10cSrcweir 		case Circ_9x9:			eRetval = Circ_11x11;		break;
631*cdf0e10cSrcweir 		//case Circ_11x11:		eRetval = ;	break;
632*cdf0e10cSrcweir 
633*cdf0e10cSrcweir 		case Elli_7x9:			eRetval = Elli_9x11;		break;
634*cdf0e10cSrcweir 		//case Elli_9x11:			eRetval = ;	break;
635*cdf0e10cSrcweir 
636*cdf0e10cSrcweir 		case Elli_9x7:			eRetval = Elli_11x9;		break;
637*cdf0e10cSrcweir 		//case Elli_11x9:			eRetval = ;	break;
638*cdf0e10cSrcweir 
639*cdf0e10cSrcweir 		case RectPlus_7x7:		eRetval = RectPlus_9x9;		break;
640*cdf0e10cSrcweir 		case RectPlus_9x9:		eRetval = RectPlus_11x11;	break;
641*cdf0e10cSrcweir 		//case RectPlus_11x11:	eRetval = ;	break;
642*cdf0e10cSrcweir 
643*cdf0e10cSrcweir 		//case Crosshair:			eRetval = ;	break;
644*cdf0e10cSrcweir 		//case Glue:				eRetval = ;	break;
645*cdf0e10cSrcweir 
646*cdf0e10cSrcweir 		// #98388# let anchor blink with it's pressed state
647*cdf0e10cSrcweir 		case Anchor:			eRetval = AnchorPressed;	break;
648*cdf0e10cSrcweir 
649*cdf0e10cSrcweir 		// #101688# same for AnchorTR
650*cdf0e10cSrcweir 		case AnchorTR:			eRetval = AnchorPressedTR;	break;
651*cdf0e10cSrcweir         default:
652*cdf0e10cSrcweir             break;
653*cdf0e10cSrcweir 	}
654*cdf0e10cSrcweir 
655*cdf0e10cSrcweir 	return eRetval;
656*cdf0e10cSrcweir }
657*cdf0e10cSrcweir 
658*cdf0e10cSrcweir // #101928#
659*cdf0e10cSrcweir BitmapEx SdrHdl::ImpGetBitmapEx(BitmapMarkerKind eKindOfMarker, sal_uInt16 nInd, sal_Bool bFine, sal_Bool bIsHighContrast)
660*cdf0e10cSrcweir {
661*cdf0e10cSrcweir 	if(bIsHighContrast)
662*cdf0e10cSrcweir 	{
663*cdf0e10cSrcweir 		return getHighContrastSet().GetBitmapEx(eKindOfMarker, nInd);
664*cdf0e10cSrcweir 	}
665*cdf0e10cSrcweir 	else
666*cdf0e10cSrcweir 	{
667*cdf0e10cSrcweir 		if(bFine)
668*cdf0e10cSrcweir 		{
669*cdf0e10cSrcweir 			return getModernSet().GetBitmapEx(eKindOfMarker, nInd);
670*cdf0e10cSrcweir 		}
671*cdf0e10cSrcweir 		else
672*cdf0e10cSrcweir 		{
673*cdf0e10cSrcweir 			return getSimpleSet().GetBitmapEx(eKindOfMarker, nInd);
674*cdf0e10cSrcweir 		}
675*cdf0e10cSrcweir 	}
676*cdf0e10cSrcweir }
677*cdf0e10cSrcweir 
678*cdf0e10cSrcweir ::sdr::overlay::OverlayObject* SdrHdl::CreateOverlayObject(
679*cdf0e10cSrcweir 	const basegfx::B2DPoint& rPos,
680*cdf0e10cSrcweir 	BitmapColorIndex eColIndex, BitmapMarkerKind eKindOfMarker, Point aMoveOutsideOffset)
681*cdf0e10cSrcweir {
682*cdf0e10cSrcweir 	::sdr::overlay::OverlayObject* pRetval = 0L;
683*cdf0e10cSrcweir 	sal_Bool bIsFineHdl(pHdlList->IsFineHdl());
684*cdf0e10cSrcweir 	const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
685*cdf0e10cSrcweir 	sal_Bool bIsHighContrast(rStyleSettings.GetHighContrastMode());
686*cdf0e10cSrcweir 
687*cdf0e10cSrcweir 	// support bigger sizes
688*cdf0e10cSrcweir 	sal_Bool bForceBiggerSize(sal_False);
689*cdf0e10cSrcweir 
690*cdf0e10cSrcweir 	if(pHdlList->GetHdlSize() > 3)
691*cdf0e10cSrcweir 	{
692*cdf0e10cSrcweir 		bForceBiggerSize = sal_True;
693*cdf0e10cSrcweir 	}
694*cdf0e10cSrcweir 
695*cdf0e10cSrcweir 	// #101928# ...for high contrast, too.
696*cdf0e10cSrcweir 	if(!bForceBiggerSize && bIsHighContrast)
697*cdf0e10cSrcweir 	{
698*cdf0e10cSrcweir 		// #107925#
699*cdf0e10cSrcweir 		// ...but not for anchors, else they will not blink when activated
700*cdf0e10cSrcweir 		if(Anchor != eKindOfMarker && AnchorTR != eKindOfMarker)
701*cdf0e10cSrcweir 		{
702*cdf0e10cSrcweir 			bForceBiggerSize = sal_True;
703*cdf0e10cSrcweir 		}
704*cdf0e10cSrcweir 	}
705*cdf0e10cSrcweir 
706*cdf0e10cSrcweir 	if(bForceBiggerSize)
707*cdf0e10cSrcweir 	{
708*cdf0e10cSrcweir 		eKindOfMarker = GetNextBigger(eKindOfMarker);
709*cdf0e10cSrcweir 	}
710*cdf0e10cSrcweir 
711*cdf0e10cSrcweir 	// #97016# II This handle has the focus, visualize it
712*cdf0e10cSrcweir 	if(IsFocusHdl() && pHdlList && pHdlList->GetFocusHdl() == this)
713*cdf0e10cSrcweir 	{
714*cdf0e10cSrcweir 		// create animated handle
715*cdf0e10cSrcweir 		BitmapMarkerKind eNextBigger = GetNextBigger(eKindOfMarker);
716*cdf0e10cSrcweir 
717*cdf0e10cSrcweir 		if(eNextBigger == eKindOfMarker)
718*cdf0e10cSrcweir 		{
719*cdf0e10cSrcweir 			// this may happen for the not supported getting-bigger types.
720*cdf0e10cSrcweir 			// Choose an alternative here
721*cdf0e10cSrcweir 			switch(eKindOfMarker)
722*cdf0e10cSrcweir 			{
723*cdf0e10cSrcweir 				case Rect_13x13:		eNextBigger = Rect_11x11;	break;
724*cdf0e10cSrcweir 				case Circ_11x11:		eNextBigger = Elli_11x9;	break;
725*cdf0e10cSrcweir 				case Elli_9x11:			eNextBigger = Elli_11x9;	break;
726*cdf0e10cSrcweir 				case Elli_11x9:			eNextBigger = Elli_9x11;	break;
727*cdf0e10cSrcweir 				case RectPlus_11x11:	eNextBigger = Rect_13x13;	break;
728*cdf0e10cSrcweir 
729*cdf0e10cSrcweir 				case Crosshair:
730*cdf0e10cSrcweir 					eNextBigger = Glue;
731*cdf0e10cSrcweir 					break;
732*cdf0e10cSrcweir 
733*cdf0e10cSrcweir 				case Glue:
734*cdf0e10cSrcweir 					eNextBigger = Crosshair;
735*cdf0e10cSrcweir 					break;
736*cdf0e10cSrcweir                 default:
737*cdf0e10cSrcweir                     break;
738*cdf0e10cSrcweir 			}
739*cdf0e10cSrcweir 		}
740*cdf0e10cSrcweir 
741*cdf0e10cSrcweir 		// create animated hdl
742*cdf0e10cSrcweir 		// #101928# use ImpGetBitmapEx(...) now
743*cdf0e10cSrcweir 		BitmapEx aBmpEx1 = ImpGetBitmapEx(eKindOfMarker, (sal_uInt16)eColIndex, bIsFineHdl, bIsHighContrast);
744*cdf0e10cSrcweir 		BitmapEx aBmpEx2 = ImpGetBitmapEx(eNextBigger, (sal_uInt16)eColIndex, bIsFineHdl, bIsHighContrast);
745*cdf0e10cSrcweir 
746*cdf0e10cSrcweir 		// #i53216# Use system cursor blink time. Use the unsigned value.
747*cdf0e10cSrcweir 		const sal_uInt32 nBlinkTime((sal_uInt32)Application::GetSettings().GetStyleSettings().GetCursorBlinkTime());
748*cdf0e10cSrcweir 
749*cdf0e10cSrcweir 		if(eKindOfMarker == Anchor || eKindOfMarker == AnchorPressed)
750*cdf0e10cSrcweir 		{
751*cdf0e10cSrcweir 			// #98388# when anchor is used take upper left as reference point inside the handle
752*cdf0e10cSrcweir 			pRetval = new ::sdr::overlay::OverlayAnimatedBitmapEx(rPos, aBmpEx1, aBmpEx2, nBlinkTime);
753*cdf0e10cSrcweir 		}
754*cdf0e10cSrcweir 		else if(eKindOfMarker == AnchorTR || eKindOfMarker == AnchorPressedTR)
755*cdf0e10cSrcweir 		{
756*cdf0e10cSrcweir 			// #101688# AnchorTR for SW, take top right as (0,0)
757*cdf0e10cSrcweir 			pRetval = new ::sdr::overlay::OverlayAnimatedBitmapEx(rPos, aBmpEx1, aBmpEx2, nBlinkTime,
758*cdf0e10cSrcweir 				(sal_uInt16)(aBmpEx1.GetSizePixel().Width() - 1), 0,
759*cdf0e10cSrcweir 				(sal_uInt16)(aBmpEx2.GetSizePixel().Width() - 1), 0);
760*cdf0e10cSrcweir 		}
761*cdf0e10cSrcweir 		else
762*cdf0e10cSrcweir 		{
763*cdf0e10cSrcweir 			// create centered handle as default
764*cdf0e10cSrcweir 			pRetval = new ::sdr::overlay::OverlayAnimatedBitmapEx(rPos, aBmpEx1, aBmpEx2, nBlinkTime,
765*cdf0e10cSrcweir 				(sal_uInt16)(aBmpEx1.GetSizePixel().Width() - 1) >> 1,
766*cdf0e10cSrcweir 				(sal_uInt16)(aBmpEx1.GetSizePixel().Height() - 1) >> 1,
767*cdf0e10cSrcweir 				(sal_uInt16)(aBmpEx2.GetSizePixel().Width() - 1) >> 1,
768*cdf0e10cSrcweir 				(sal_uInt16)(aBmpEx2.GetSizePixel().Height() - 1) >> 1);
769*cdf0e10cSrcweir 		}
770*cdf0e10cSrcweir 	}
771*cdf0e10cSrcweir 	else
772*cdf0e10cSrcweir 	{
773*cdf0e10cSrcweir 		// create normal handle
774*cdf0e10cSrcweir 		// #101928# use ImpGetBitmapEx(...) now
775*cdf0e10cSrcweir 		BitmapEx aBmpEx = ImpGetBitmapEx(eKindOfMarker, (sal_uInt16)eColIndex, bIsFineHdl, bIsHighContrast);
776*cdf0e10cSrcweir 
777*cdf0e10cSrcweir 		if(eKindOfMarker == Anchor || eKindOfMarker == AnchorPressed)
778*cdf0e10cSrcweir 		{
779*cdf0e10cSrcweir 			// #98388# upper left as reference point inside the handle for AnchorPressed, too
780*cdf0e10cSrcweir 			pRetval = new ::sdr::overlay::OverlayBitmapEx(rPos, aBmpEx);
781*cdf0e10cSrcweir 		}
782*cdf0e10cSrcweir 		else if(eKindOfMarker == AnchorTR || eKindOfMarker == AnchorPressedTR)
783*cdf0e10cSrcweir 		{
784*cdf0e10cSrcweir 			// #101688# AnchorTR for SW, take top right as (0,0)
785*cdf0e10cSrcweir 			pRetval = new ::sdr::overlay::OverlayBitmapEx(rPos, aBmpEx,
786*cdf0e10cSrcweir 				(sal_uInt16)(aBmpEx.GetSizePixel().Width() - 1), 0);
787*cdf0e10cSrcweir 		}
788*cdf0e10cSrcweir 		else
789*cdf0e10cSrcweir 		{
790*cdf0e10cSrcweir 			sal_uInt16 nCenX((sal_uInt16)(aBmpEx.GetSizePixel().Width() - 1L) >> 1);
791*cdf0e10cSrcweir 			sal_uInt16 nCenY((sal_uInt16)(aBmpEx.GetSizePixel().Height() - 1L) >> 1);
792*cdf0e10cSrcweir 
793*cdf0e10cSrcweir 			if(aMoveOutsideOffset.X() > 0)
794*cdf0e10cSrcweir 			{
795*cdf0e10cSrcweir 				nCenX = 0;
796*cdf0e10cSrcweir 			}
797*cdf0e10cSrcweir 			else if(aMoveOutsideOffset.X() < 0)
798*cdf0e10cSrcweir 			{
799*cdf0e10cSrcweir 				nCenX = (sal_uInt16)(aBmpEx.GetSizePixel().Width() - 1);
800*cdf0e10cSrcweir 			}
801*cdf0e10cSrcweir 
802*cdf0e10cSrcweir 			if(aMoveOutsideOffset.Y() > 0)
803*cdf0e10cSrcweir 			{
804*cdf0e10cSrcweir 				nCenY = 0;
805*cdf0e10cSrcweir 			}
806*cdf0e10cSrcweir 			else if(aMoveOutsideOffset.Y() < 0)
807*cdf0e10cSrcweir 			{
808*cdf0e10cSrcweir 				nCenY = (sal_uInt16)(aBmpEx.GetSizePixel().Height() - 1);
809*cdf0e10cSrcweir 			}
810*cdf0e10cSrcweir 
811*cdf0e10cSrcweir 			// create centered handle as default
812*cdf0e10cSrcweir 			pRetval = new ::sdr::overlay::OverlayBitmapEx(rPos, aBmpEx, nCenX, nCenY);
813*cdf0e10cSrcweir 		}
814*cdf0e10cSrcweir 	}
815*cdf0e10cSrcweir 
816*cdf0e10cSrcweir 	return pRetval;
817*cdf0e10cSrcweir }
818*cdf0e10cSrcweir 
819*cdf0e10cSrcweir bool SdrHdl::IsHdlHit(const Point& rPnt) const
820*cdf0e10cSrcweir {
821*cdf0e10cSrcweir 	// OVERLAYMANAGER
822*cdf0e10cSrcweir 	basegfx::B2DPoint aPosition(rPnt.X(), rPnt.Y());
823*cdf0e10cSrcweir 	return maOverlayGroup.isHitLogic(aPosition);
824*cdf0e10cSrcweir }
825*cdf0e10cSrcweir 
826*cdf0e10cSrcweir Pointer SdrHdl::GetPointer() const
827*cdf0e10cSrcweir {
828*cdf0e10cSrcweir     PointerStyle ePtr=POINTER_MOVE;
829*cdf0e10cSrcweir     const sal_Bool bSize=eKind>=HDL_UPLFT && eKind<=HDL_LWRGT;
830*cdf0e10cSrcweir     const sal_Bool bRot=pHdlList!=NULL && pHdlList->IsRotateShear();
831*cdf0e10cSrcweir     const sal_Bool bDis=pHdlList!=NULL && pHdlList->IsDistortShear();
832*cdf0e10cSrcweir     if (bSize && pHdlList!=NULL && (bRot || bDis)) {
833*cdf0e10cSrcweir         switch (eKind) {
834*cdf0e10cSrcweir             case HDL_UPLFT: case HDL_UPRGT:
835*cdf0e10cSrcweir             case HDL_LWLFT: case HDL_LWRGT: ePtr=bRot ? POINTER_ROTATE : POINTER_REFHAND; break;
836*cdf0e10cSrcweir             case HDL_LEFT : case HDL_RIGHT: ePtr=POINTER_VSHEAR; break;
837*cdf0e10cSrcweir             case HDL_UPPER: case HDL_LOWER: ePtr=POINTER_HSHEAR; break;
838*cdf0e10cSrcweir             default:
839*cdf0e10cSrcweir                 break;
840*cdf0e10cSrcweir         }
841*cdf0e10cSrcweir     } else {
842*cdf0e10cSrcweir         // Fuer Resize von gedrehten Rechtecken die Mauszeiger etwas mitdrehen
843*cdf0e10cSrcweir         if (bSize && nDrehWink!=0) {
844*cdf0e10cSrcweir             long nHdlWink=0;
845*cdf0e10cSrcweir             switch (eKind) {
846*cdf0e10cSrcweir                 case HDL_LWRGT: nHdlWink=31500; break;
847*cdf0e10cSrcweir                 case HDL_LOWER: nHdlWink=27000; break;
848*cdf0e10cSrcweir                 case HDL_LWLFT: nHdlWink=22500; break;
849*cdf0e10cSrcweir                 case HDL_LEFT : nHdlWink=18000; break;
850*cdf0e10cSrcweir                 case HDL_UPLFT: nHdlWink=13500; break;
851*cdf0e10cSrcweir                 case HDL_UPPER: nHdlWink=9000;  break;
852*cdf0e10cSrcweir                 case HDL_UPRGT: nHdlWink=4500;  break;
853*cdf0e10cSrcweir                 case HDL_RIGHT: nHdlWink=0;     break;
854*cdf0e10cSrcweir                 default:
855*cdf0e10cSrcweir                     break;
856*cdf0e10cSrcweir             }
857*cdf0e10cSrcweir             nHdlWink+=nDrehWink+2249; // und etwas drauf (zum runden)
858*cdf0e10cSrcweir             while (nHdlWink<0) nHdlWink+=36000;
859*cdf0e10cSrcweir             while (nHdlWink>=36000) nHdlWink-=36000;
860*cdf0e10cSrcweir             nHdlWink/=4500;
861*cdf0e10cSrcweir             switch ((sal_uInt8)nHdlWink) {
862*cdf0e10cSrcweir                 case 0: ePtr=POINTER_ESIZE;  break;
863*cdf0e10cSrcweir                 case 1: ePtr=POINTER_NESIZE; break;
864*cdf0e10cSrcweir                 case 2: ePtr=POINTER_NSIZE;  break;
865*cdf0e10cSrcweir                 case 3: ePtr=POINTER_NWSIZE; break;
866*cdf0e10cSrcweir                 case 4: ePtr=POINTER_WSIZE;  break;
867*cdf0e10cSrcweir                 case 5: ePtr=POINTER_SWSIZE; break;
868*cdf0e10cSrcweir                 case 6: ePtr=POINTER_SSIZE;  break;
869*cdf0e10cSrcweir                 case 7: ePtr=POINTER_SESIZE; break;
870*cdf0e10cSrcweir             } // switch
871*cdf0e10cSrcweir         } else {
872*cdf0e10cSrcweir             switch (eKind) {
873*cdf0e10cSrcweir                 case HDL_UPLFT: ePtr=POINTER_NWSIZE;  break;
874*cdf0e10cSrcweir                 case HDL_UPPER: ePtr=POINTER_NSIZE;     break;
875*cdf0e10cSrcweir                 case HDL_UPRGT: ePtr=POINTER_NESIZE;  break;
876*cdf0e10cSrcweir                 case HDL_LEFT : ePtr=POINTER_WSIZE;     break;
877*cdf0e10cSrcweir                 case HDL_RIGHT: ePtr=POINTER_ESIZE;     break;
878*cdf0e10cSrcweir                 case HDL_LWLFT: ePtr=POINTER_SWSIZE;  break;
879*cdf0e10cSrcweir                 case HDL_LOWER: ePtr=POINTER_SSIZE;     break;
880*cdf0e10cSrcweir                 case HDL_LWRGT: ePtr=POINTER_SESIZE;  break;
881*cdf0e10cSrcweir                 case HDL_POLY : ePtr=POINTER_MOVEPOINT; break;
882*cdf0e10cSrcweir                 case HDL_CIRC : ePtr=POINTER_HAND;      break;
883*cdf0e10cSrcweir                 case HDL_REF1 : ePtr=POINTER_REFHAND;   break;
884*cdf0e10cSrcweir                 case HDL_REF2 : ePtr=POINTER_REFHAND;   break;
885*cdf0e10cSrcweir                 case HDL_BWGT : ePtr=POINTER_MOVEBEZIERWEIGHT; break;
886*cdf0e10cSrcweir                 case HDL_GLUE : ePtr=POINTER_MOVEPOINT; break;
887*cdf0e10cSrcweir 				case HDL_CUSTOMSHAPE1 : ePtr=POINTER_HAND; break;
888*cdf0e10cSrcweir                 default:
889*cdf0e10cSrcweir                     break;
890*cdf0e10cSrcweir             }
891*cdf0e10cSrcweir         }
892*cdf0e10cSrcweir     }
893*cdf0e10cSrcweir     return Pointer(ePtr);
894*cdf0e10cSrcweir }
895*cdf0e10cSrcweir 
896*cdf0e10cSrcweir // #97016# II
897*cdf0e10cSrcweir sal_Bool SdrHdl::IsFocusHdl() const
898*cdf0e10cSrcweir {
899*cdf0e10cSrcweir 	switch(eKind)
900*cdf0e10cSrcweir 	{
901*cdf0e10cSrcweir 		case HDL_UPLFT:		// Oben links
902*cdf0e10cSrcweir 		case HDL_UPPER:		// Oben
903*cdf0e10cSrcweir 		case HDL_UPRGT:		// Oben rechts
904*cdf0e10cSrcweir 		case HDL_LEFT:		// Links
905*cdf0e10cSrcweir 		case HDL_RIGHT:		// Rechts
906*cdf0e10cSrcweir 		case HDL_LWLFT:		// Unten links
907*cdf0e10cSrcweir 		case HDL_LOWER:		// Unten
908*cdf0e10cSrcweir 		case HDL_LWRGT:		// Unten rechts
909*cdf0e10cSrcweir 		{
910*cdf0e10cSrcweir 			// if it's a activated TextEdit, it's moved to extended points
911*cdf0e10cSrcweir 			if(pHdlList && pHdlList->IsMoveOutside())
912*cdf0e10cSrcweir 				return sal_False;
913*cdf0e10cSrcweir 			else
914*cdf0e10cSrcweir 				return sal_True;
915*cdf0e10cSrcweir 		}
916*cdf0e10cSrcweir 
917*cdf0e10cSrcweir 		case HDL_MOVE:		// Handle zum Verschieben des Objekts
918*cdf0e10cSrcweir 		case HDL_POLY:		// Punktselektion an Polygon oder Bezierkurve
919*cdf0e10cSrcweir 		case HDL_BWGT:		// Gewicht an einer Bezierkurve
920*cdf0e10cSrcweir 		case HDL_CIRC:		// Winkel an Kreissegmenten, Eckenradius am Rect
921*cdf0e10cSrcweir 		case HDL_REF1:		// Referenzpunkt 1, z.B. Rotationsmitte
922*cdf0e10cSrcweir 		case HDL_REF2:		// Referenzpunkt 2, z.B. Endpunkt der Spiegelachse
923*cdf0e10cSrcweir 		//case HDL_MIRX:		// Die Spiegelachse selbst
924*cdf0e10cSrcweir 		case HDL_GLUE:		// GluePoint
925*cdf0e10cSrcweir 
926*cdf0e10cSrcweir 		// #98388# do NOT activate here, let SW implement their own SdrHdl and
927*cdf0e10cSrcweir 		// overload IsFocusHdl() there to make the anchor accessible
928*cdf0e10cSrcweir 		//case HDL_ANCHOR:		// anchor symbol (SD, SW)
929*cdf0e10cSrcweir 		// #101688# same for AnchorTR
930*cdf0e10cSrcweir 		//case HDL_ANCHOR_TR:	// anchor symbol (SD, SW)
931*cdf0e10cSrcweir 
932*cdf0e10cSrcweir 		//case HDL_TRNS:		// interactive transparence
933*cdf0e10cSrcweir 		//case HDL_GRAD:		// interactive gradient
934*cdf0e10cSrcweir 		//case HDL_COLR:		// interactive color
935*cdf0e10cSrcweir 
936*cdf0e10cSrcweir 		// for SJ and the CustomShapeHandles:
937*cdf0e10cSrcweir 		case HDL_CUSTOMSHAPE1:
938*cdf0e10cSrcweir 
939*cdf0e10cSrcweir 		case HDL_USER:
940*cdf0e10cSrcweir 		{
941*cdf0e10cSrcweir 			return sal_True;
942*cdf0e10cSrcweir 		}
943*cdf0e10cSrcweir 
944*cdf0e10cSrcweir 		default:
945*cdf0e10cSrcweir 		{
946*cdf0e10cSrcweir 			return sal_False;
947*cdf0e10cSrcweir 		}
948*cdf0e10cSrcweir 	}
949*cdf0e10cSrcweir }
950*cdf0e10cSrcweir 
951*cdf0e10cSrcweir void SdrHdl::onMouseEnter(const MouseEvent& /*rMEvt*/)
952*cdf0e10cSrcweir {
953*cdf0e10cSrcweir }
954*cdf0e10cSrcweir 
955*cdf0e10cSrcweir void SdrHdl::onMouseLeave()
956*cdf0e10cSrcweir {
957*cdf0e10cSrcweir }
958*cdf0e10cSrcweir 
959*cdf0e10cSrcweir bool SdrHdl::isMouseOver() const
960*cdf0e10cSrcweir {
961*cdf0e10cSrcweir 	return mbMouseOver;
962*cdf0e10cSrcweir }
963*cdf0e10cSrcweir 
964*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
965*cdf0e10cSrcweir // class SdrHdlColor
966*cdf0e10cSrcweir 
967*cdf0e10cSrcweir SdrHdlColor::SdrHdlColor(const Point& rRef, Color aCol, const Size& rSize, sal_Bool bLum)
968*cdf0e10cSrcweir :	SdrHdl(rRef, HDL_COLR),
969*cdf0e10cSrcweir 	aMarkerSize(rSize),
970*cdf0e10cSrcweir 	bUseLuminance(bLum)
971*cdf0e10cSrcweir {
972*cdf0e10cSrcweir 	if(IsUseLuminance())
973*cdf0e10cSrcweir 		aCol = GetLuminance(aCol);
974*cdf0e10cSrcweir 
975*cdf0e10cSrcweir 	// remember color
976*cdf0e10cSrcweir 	aMarkerColor = aCol;
977*cdf0e10cSrcweir }
978*cdf0e10cSrcweir 
979*cdf0e10cSrcweir SdrHdlColor::~SdrHdlColor()
980*cdf0e10cSrcweir {
981*cdf0e10cSrcweir }
982*cdf0e10cSrcweir 
983*cdf0e10cSrcweir void SdrHdlColor::CreateB2dIAObject()
984*cdf0e10cSrcweir {
985*cdf0e10cSrcweir 	// first throw away old one
986*cdf0e10cSrcweir 	GetRidOfIAObject();
987*cdf0e10cSrcweir 
988*cdf0e10cSrcweir 	if(pHdlList)
989*cdf0e10cSrcweir 	{
990*cdf0e10cSrcweir 		SdrMarkView* pView = pHdlList->GetView();
991*cdf0e10cSrcweir 
992*cdf0e10cSrcweir 		if(pView && !pView->areMarkHandlesHidden())
993*cdf0e10cSrcweir 		{
994*cdf0e10cSrcweir 			SdrPageView* pPageView = pView->GetSdrPageView();
995*cdf0e10cSrcweir 
996*cdf0e10cSrcweir 			if(pPageView)
997*cdf0e10cSrcweir 			{
998*cdf0e10cSrcweir 				for(sal_uInt32 b(0L); b < pPageView->PageWindowCount(); b++)
999*cdf0e10cSrcweir 				{
1000*cdf0e10cSrcweir 					// const SdrPageViewWinRec& rPageViewWinRec = rPageViewWinList[b];
1001*cdf0e10cSrcweir 					const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
1002*cdf0e10cSrcweir 
1003*cdf0e10cSrcweir 					if(rPageWindow.GetPaintWindow().OutputToWindow())
1004*cdf0e10cSrcweir 					{
1005*cdf0e10cSrcweir 						if(rPageWindow.GetOverlayManager())
1006*cdf0e10cSrcweir 						{
1007*cdf0e10cSrcweir 							Bitmap aBmpCol(CreateColorDropper(aMarkerColor));
1008*cdf0e10cSrcweir 							basegfx::B2DPoint aPosition(aPos.X(), aPos.Y());
1009*cdf0e10cSrcweir 							::sdr::overlay::OverlayObject* pNewOverlayObject = new
1010*cdf0e10cSrcweir 								::sdr::overlay::OverlayBitmapEx(
1011*cdf0e10cSrcweir 									aPosition,
1012*cdf0e10cSrcweir                                     BitmapEx(aBmpCol),
1013*cdf0e10cSrcweir 									(sal_uInt16)(aBmpCol.GetSizePixel().Width() - 1) >> 1,
1014*cdf0e10cSrcweir 									(sal_uInt16)(aBmpCol.GetSizePixel().Height() - 1) >> 1
1015*cdf0e10cSrcweir 								);
1016*cdf0e10cSrcweir 							DBG_ASSERT(pNewOverlayObject, "Got NO new IAO!");
1017*cdf0e10cSrcweir 
1018*cdf0e10cSrcweir 							// OVERLAYMANAGER
1019*cdf0e10cSrcweir 							if(pNewOverlayObject)
1020*cdf0e10cSrcweir 							{
1021*cdf0e10cSrcweir 								rPageWindow.GetOverlayManager()->add(*pNewOverlayObject);
1022*cdf0e10cSrcweir 								maOverlayGroup.append(*pNewOverlayObject);
1023*cdf0e10cSrcweir 							}
1024*cdf0e10cSrcweir 						}
1025*cdf0e10cSrcweir 					}
1026*cdf0e10cSrcweir 				}
1027*cdf0e10cSrcweir 			}
1028*cdf0e10cSrcweir 		}
1029*cdf0e10cSrcweir 	}
1030*cdf0e10cSrcweir }
1031*cdf0e10cSrcweir 
1032*cdf0e10cSrcweir Bitmap SdrHdlColor::CreateColorDropper(Color aCol)
1033*cdf0e10cSrcweir {
1034*cdf0e10cSrcweir 	// get the Bitmap
1035*cdf0e10cSrcweir 	Bitmap aRetval(aMarkerSize, 24);
1036*cdf0e10cSrcweir 	aRetval.Erase(aCol);
1037*cdf0e10cSrcweir 
1038*cdf0e10cSrcweir 	// get write access
1039*cdf0e10cSrcweir 	BitmapWriteAccess* pWrite = aRetval.AcquireWriteAccess();
1040*cdf0e10cSrcweir 	DBG_ASSERT(pWrite, "Got NO write access to a new Bitmap !!!");
1041*cdf0e10cSrcweir 
1042*cdf0e10cSrcweir 	if(pWrite)
1043*cdf0e10cSrcweir 	{
1044*cdf0e10cSrcweir 		// draw outer border
1045*cdf0e10cSrcweir 		sal_Int32 nWidth = aMarkerSize.Width();
1046*cdf0e10cSrcweir 		sal_Int32 nHeight = aMarkerSize.Height();
1047*cdf0e10cSrcweir 
1048*cdf0e10cSrcweir 		pWrite->SetLineColor(Color(COL_LIGHTGRAY));
1049*cdf0e10cSrcweir 		pWrite->DrawLine(Point(0, 0), Point(0, nHeight - 1));
1050*cdf0e10cSrcweir 		pWrite->DrawLine(Point(1, 0), Point(nWidth - 1, 0));
1051*cdf0e10cSrcweir 		pWrite->SetLineColor(Color(COL_GRAY));
1052*cdf0e10cSrcweir 		pWrite->DrawLine(Point(1, nHeight - 1), Point(nWidth - 1, nHeight - 1));
1053*cdf0e10cSrcweir 		pWrite->DrawLine(Point(nWidth - 1, 1), Point(nWidth - 1, nHeight - 2));
1054*cdf0e10cSrcweir 
1055*cdf0e10cSrcweir 		// draw lighter UpperLeft
1056*cdf0e10cSrcweir         const Color aLightColor(
1057*cdf0e10cSrcweir             (sal_uInt8)(::std::min((sal_Int16)((sal_Int16)aCol.GetRed() + (sal_Int16)0x0040), (sal_Int16)0x00ff)),
1058*cdf0e10cSrcweir             (sal_uInt8)(::std::min((sal_Int16)((sal_Int16)aCol.GetGreen() + (sal_Int16)0x0040), (sal_Int16)0x00ff)),
1059*cdf0e10cSrcweir             (sal_uInt8)(::std::min((sal_Int16)((sal_Int16)aCol.GetBlue() + (sal_Int16)0x0040), (sal_Int16)0x00ff)));
1060*cdf0e10cSrcweir 		pWrite->SetLineColor(aLightColor);
1061*cdf0e10cSrcweir 		pWrite->DrawLine(Point(1, 1), Point(1, nHeight - 2));
1062*cdf0e10cSrcweir 		pWrite->DrawLine(Point(2, 1), Point(nWidth - 2, 1));
1063*cdf0e10cSrcweir 
1064*cdf0e10cSrcweir 		// draw darker LowerRight
1065*cdf0e10cSrcweir         const Color aDarkColor(
1066*cdf0e10cSrcweir             (sal_uInt8)(::std::max((sal_Int16)((sal_Int16)aCol.GetRed() - (sal_Int16)0x0040), (sal_Int16)0x0000)),
1067*cdf0e10cSrcweir             (sal_uInt8)(::std::max((sal_Int16)((sal_Int16)aCol.GetGreen() - (sal_Int16)0x0040), (sal_Int16)0x0000)),
1068*cdf0e10cSrcweir             (sal_uInt8)(::std::max((sal_Int16)((sal_Int16)aCol.GetBlue() - (sal_Int16)0x0040), (sal_Int16)0x0000)));
1069*cdf0e10cSrcweir 		pWrite->SetLineColor(aDarkColor);
1070*cdf0e10cSrcweir 		pWrite->DrawLine(Point(2, nHeight - 2), Point(nWidth - 2, nHeight - 2));
1071*cdf0e10cSrcweir 		pWrite->DrawLine(Point(nWidth - 2, 2), Point(nWidth - 2, nHeight - 3));
1072*cdf0e10cSrcweir 
1073*cdf0e10cSrcweir 		// get rid of write access
1074*cdf0e10cSrcweir 		delete pWrite;
1075*cdf0e10cSrcweir 	}
1076*cdf0e10cSrcweir 
1077*cdf0e10cSrcweir 	return aRetval;
1078*cdf0e10cSrcweir }
1079*cdf0e10cSrcweir 
1080*cdf0e10cSrcweir Color SdrHdlColor::GetLuminance(const Color& rCol)
1081*cdf0e10cSrcweir {
1082*cdf0e10cSrcweir 	sal_uInt8 aLum = rCol.GetLuminance();
1083*cdf0e10cSrcweir 	Color aRetval(aLum, aLum, aLum);
1084*cdf0e10cSrcweir 	return aRetval;
1085*cdf0e10cSrcweir }
1086*cdf0e10cSrcweir 
1087*cdf0e10cSrcweir void SdrHdlColor::CallColorChangeLink()
1088*cdf0e10cSrcweir {
1089*cdf0e10cSrcweir 	aColorChangeHdl.Call(this);
1090*cdf0e10cSrcweir }
1091*cdf0e10cSrcweir 
1092*cdf0e10cSrcweir void SdrHdlColor::SetColor(Color aNew, sal_Bool bCallLink)
1093*cdf0e10cSrcweir {
1094*cdf0e10cSrcweir 	if(IsUseLuminance())
1095*cdf0e10cSrcweir 		aNew = GetLuminance(aNew);
1096*cdf0e10cSrcweir 
1097*cdf0e10cSrcweir 	if(aMarkerColor != aNew)
1098*cdf0e10cSrcweir 	{
1099*cdf0e10cSrcweir 		// remember new color
1100*cdf0e10cSrcweir 		aMarkerColor = aNew;
1101*cdf0e10cSrcweir 
1102*cdf0e10cSrcweir 		// create new display
1103*cdf0e10cSrcweir 		Touch();
1104*cdf0e10cSrcweir 
1105*cdf0e10cSrcweir 		// tell about change
1106*cdf0e10cSrcweir 		if(bCallLink)
1107*cdf0e10cSrcweir 			CallColorChangeLink();
1108*cdf0e10cSrcweir 	}
1109*cdf0e10cSrcweir }
1110*cdf0e10cSrcweir 
1111*cdf0e10cSrcweir void SdrHdlColor::SetSize(const Size& rNew)
1112*cdf0e10cSrcweir {
1113*cdf0e10cSrcweir 	if(rNew != aMarkerSize)
1114*cdf0e10cSrcweir 	{
1115*cdf0e10cSrcweir 		// remember new size
1116*cdf0e10cSrcweir 		aMarkerSize = rNew;
1117*cdf0e10cSrcweir 
1118*cdf0e10cSrcweir 		// create new display
1119*cdf0e10cSrcweir 		Touch();
1120*cdf0e10cSrcweir 	}
1121*cdf0e10cSrcweir }
1122*cdf0e10cSrcweir 
1123*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1124*cdf0e10cSrcweir // class SdrHdlGradient
1125*cdf0e10cSrcweir 
1126*cdf0e10cSrcweir SdrHdlGradient::SdrHdlGradient(const Point& rRef1, const Point& rRef2, sal_Bool bGrad)
1127*cdf0e10cSrcweir :	SdrHdl(rRef1, bGrad ? HDL_GRAD : HDL_TRNS),
1128*cdf0e10cSrcweir 	pColHdl1(NULL),
1129*cdf0e10cSrcweir 	pColHdl2(NULL),
1130*cdf0e10cSrcweir     a2ndPos(rRef2),
1131*cdf0e10cSrcweir     bGradient(bGrad)
1132*cdf0e10cSrcweir {
1133*cdf0e10cSrcweir }
1134*cdf0e10cSrcweir 
1135*cdf0e10cSrcweir SdrHdlGradient::~SdrHdlGradient()
1136*cdf0e10cSrcweir {
1137*cdf0e10cSrcweir }
1138*cdf0e10cSrcweir 
1139*cdf0e10cSrcweir void SdrHdlGradient::Set2ndPos(const Point& rPnt)
1140*cdf0e10cSrcweir {
1141*cdf0e10cSrcweir 	if(a2ndPos != rPnt)
1142*cdf0e10cSrcweir 	{
1143*cdf0e10cSrcweir 		// remember new position
1144*cdf0e10cSrcweir 		a2ndPos = rPnt;
1145*cdf0e10cSrcweir 
1146*cdf0e10cSrcweir 		// create new display
1147*cdf0e10cSrcweir 		Touch();
1148*cdf0e10cSrcweir 	}
1149*cdf0e10cSrcweir }
1150*cdf0e10cSrcweir 
1151*cdf0e10cSrcweir void SdrHdlGradient::CreateB2dIAObject()
1152*cdf0e10cSrcweir {
1153*cdf0e10cSrcweir 	// first throw away old one
1154*cdf0e10cSrcweir 	GetRidOfIAObject();
1155*cdf0e10cSrcweir 
1156*cdf0e10cSrcweir 	if(pHdlList)
1157*cdf0e10cSrcweir 	{
1158*cdf0e10cSrcweir 		SdrMarkView* pView = pHdlList->GetView();
1159*cdf0e10cSrcweir 
1160*cdf0e10cSrcweir 		if(pView && !pView->areMarkHandlesHidden())
1161*cdf0e10cSrcweir 		{
1162*cdf0e10cSrcweir 			SdrPageView* pPageView = pView->GetSdrPageView();
1163*cdf0e10cSrcweir 
1164*cdf0e10cSrcweir 			if(pPageView)
1165*cdf0e10cSrcweir 			{
1166*cdf0e10cSrcweir 				for(sal_uInt32 b(0L); b < pPageView->PageWindowCount(); b++)
1167*cdf0e10cSrcweir 				{
1168*cdf0e10cSrcweir 					const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
1169*cdf0e10cSrcweir 
1170*cdf0e10cSrcweir 					if(rPageWindow.GetPaintWindow().OutputToWindow())
1171*cdf0e10cSrcweir 					{
1172*cdf0e10cSrcweir 						if(rPageWindow.GetOverlayManager())
1173*cdf0e10cSrcweir 						{
1174*cdf0e10cSrcweir 							// striped line in between
1175*cdf0e10cSrcweir 							basegfx::B2DVector aVec(a2ndPos.X() - aPos.X(), a2ndPos.Y() - aPos.Y());
1176*cdf0e10cSrcweir 							double fVecLen = aVec.getLength();
1177*cdf0e10cSrcweir 							double fLongPercentArrow = (1.0 - 0.05) * fVecLen;
1178*cdf0e10cSrcweir 							double fHalfArrowWidth = (0.05 * 0.5) * fVecLen;
1179*cdf0e10cSrcweir 							aVec.normalize();
1180*cdf0e10cSrcweir 							basegfx::B2DVector aPerpend(-aVec.getY(), aVec.getX());
1181*cdf0e10cSrcweir 							sal_Int32 nMidX = (sal_Int32)(aPos.X() + aVec.getX() * fLongPercentArrow);
1182*cdf0e10cSrcweir 							sal_Int32 nMidY = (sal_Int32)(aPos.Y() + aVec.getY() * fLongPercentArrow);
1183*cdf0e10cSrcweir 							Point aMidPoint(nMidX, nMidY);
1184*cdf0e10cSrcweir 
1185*cdf0e10cSrcweir 							basegfx::B2DPoint aPosition(aPos.X(), aPos.Y());
1186*cdf0e10cSrcweir 							basegfx::B2DPoint aMidPos(aMidPoint.X(), aMidPoint.Y());
1187*cdf0e10cSrcweir 
1188*cdf0e10cSrcweir 							::sdr::overlay::OverlayObject* pNewOverlayObject = new
1189*cdf0e10cSrcweir 								::sdr::overlay::OverlayLineStriped(
1190*cdf0e10cSrcweir 									aPosition, aMidPos
1191*cdf0e10cSrcweir 								);
1192*cdf0e10cSrcweir 							DBG_ASSERT(pNewOverlayObject, "Got NO new IAO!");
1193*cdf0e10cSrcweir 
1194*cdf0e10cSrcweir 							pNewOverlayObject->setBaseColor(IsGradient() ? Color(COL_BLACK) : Color(COL_BLUE));
1195*cdf0e10cSrcweir 							rPageWindow.GetOverlayManager()->add(*pNewOverlayObject);
1196*cdf0e10cSrcweir 							maOverlayGroup.append(*pNewOverlayObject);
1197*cdf0e10cSrcweir 
1198*cdf0e10cSrcweir 							// arrowhead
1199*cdf0e10cSrcweir 							Point aLeft(aMidPoint.X() + (sal_Int32)(aPerpend.getX() * fHalfArrowWidth),
1200*cdf0e10cSrcweir 										aMidPoint.Y() + (sal_Int32)(aPerpend.getY() * fHalfArrowWidth));
1201*cdf0e10cSrcweir 							Point aRight(aMidPoint.X() - (sal_Int32)(aPerpend.getX() * fHalfArrowWidth),
1202*cdf0e10cSrcweir 										aMidPoint.Y() - (sal_Int32)(aPerpend.getY() * fHalfArrowWidth));
1203*cdf0e10cSrcweir 
1204*cdf0e10cSrcweir 							basegfx::B2DPoint aPositionLeft(aLeft.X(), aLeft.Y());
1205*cdf0e10cSrcweir 							basegfx::B2DPoint aPositionRight(aRight.X(), aRight.Y());
1206*cdf0e10cSrcweir 							basegfx::B2DPoint aPosition2(a2ndPos.X(), a2ndPos.Y());
1207*cdf0e10cSrcweir 
1208*cdf0e10cSrcweir 							pNewOverlayObject = new
1209*cdf0e10cSrcweir 								::sdr::overlay::OverlayTriangle(
1210*cdf0e10cSrcweir 									aPositionLeft,
1211*cdf0e10cSrcweir                                     aPosition2,
1212*cdf0e10cSrcweir                                     aPositionRight,
1213*cdf0e10cSrcweir                                     IsGradient() ? Color(COL_BLACK) : Color(COL_BLUE)
1214*cdf0e10cSrcweir 								);
1215*cdf0e10cSrcweir 							DBG_ASSERT(pNewOverlayObject, "Got NO new IAO!");
1216*cdf0e10cSrcweir 
1217*cdf0e10cSrcweir 							rPageWindow.GetOverlayManager()->add(*pNewOverlayObject);
1218*cdf0e10cSrcweir 							maOverlayGroup.append(*pNewOverlayObject);
1219*cdf0e10cSrcweir 						}
1220*cdf0e10cSrcweir 					}
1221*cdf0e10cSrcweir 				}
1222*cdf0e10cSrcweir 			}
1223*cdf0e10cSrcweir 		}
1224*cdf0e10cSrcweir 	}
1225*cdf0e10cSrcweir }
1226*cdf0e10cSrcweir 
1227*cdf0e10cSrcweir IMPL_LINK(SdrHdlGradient, ColorChangeHdl, SdrHdl*, /*pHdl*/)
1228*cdf0e10cSrcweir {
1229*cdf0e10cSrcweir 	if(GetObj())
1230*cdf0e10cSrcweir 		FromIAOToItem(GetObj(), sal_True, sal_True);
1231*cdf0e10cSrcweir 	return 0;
1232*cdf0e10cSrcweir }
1233*cdf0e10cSrcweir 
1234*cdf0e10cSrcweir void SdrHdlGradient::FromIAOToItem(SdrObject* _pObj, sal_Bool bSetItemOnObject, sal_Bool bUndo)
1235*cdf0e10cSrcweir {
1236*cdf0e10cSrcweir 	// from IAO positions and colors to gradient
1237*cdf0e10cSrcweir     const SfxItemSet& rSet = _pObj->GetMergedItemSet();
1238*cdf0e10cSrcweir 
1239*cdf0e10cSrcweir 	GradTransformer aGradTransformer;
1240*cdf0e10cSrcweir 	GradTransGradient aOldGradTransGradient;
1241*cdf0e10cSrcweir 	GradTransGradient aGradTransGradient;
1242*cdf0e10cSrcweir 	GradTransVector aGradTransVector;
1243*cdf0e10cSrcweir 
1244*cdf0e10cSrcweir 	String aString;
1245*cdf0e10cSrcweir 
1246*cdf0e10cSrcweir 	aGradTransVector.maPositionA = basegfx::B2DPoint(GetPos().X(), GetPos().Y());
1247*cdf0e10cSrcweir 	aGradTransVector.maPositionB = basegfx::B2DPoint(Get2ndPos().X(), Get2ndPos().Y());
1248*cdf0e10cSrcweir 	if(pColHdl1)
1249*cdf0e10cSrcweir 		aGradTransVector.aCol1 = pColHdl1->GetColor();
1250*cdf0e10cSrcweir 	if(pColHdl2)
1251*cdf0e10cSrcweir 		aGradTransVector.aCol2 = pColHdl2->GetColor();
1252*cdf0e10cSrcweir 
1253*cdf0e10cSrcweir 	if(IsGradient())
1254*cdf0e10cSrcweir 		aOldGradTransGradient.aGradient = ((XFillGradientItem&)rSet.Get(XATTR_FILLGRADIENT)).GetGradientValue();
1255*cdf0e10cSrcweir 	else
1256*cdf0e10cSrcweir 		aOldGradTransGradient.aGradient = ((XFillFloatTransparenceItem&)rSet.Get(XATTR_FILLFLOATTRANSPARENCE)).GetGradientValue();
1257*cdf0e10cSrcweir 
1258*cdf0e10cSrcweir 	// transform vector data to gradient
1259*cdf0e10cSrcweir     aGradTransformer.VecToGrad(aGradTransVector, aGradTransGradient, aOldGradTransGradient, _pObj, bMoveSingleHandle, bMoveFirstHandle);
1260*cdf0e10cSrcweir 
1261*cdf0e10cSrcweir 	if(bSetItemOnObject)
1262*cdf0e10cSrcweir 	{
1263*cdf0e10cSrcweir         SdrModel* pModel = _pObj->GetModel();
1264*cdf0e10cSrcweir 		SfxItemSet aNewSet(pModel->GetItemPool());
1265*cdf0e10cSrcweir 
1266*cdf0e10cSrcweir 		if(IsGradient())
1267*cdf0e10cSrcweir 		{
1268*cdf0e10cSrcweir 			aString = String();
1269*cdf0e10cSrcweir 			XFillGradientItem aNewGradItem(aString, aGradTransGradient.aGradient);
1270*cdf0e10cSrcweir 			aNewSet.Put(aNewGradItem);
1271*cdf0e10cSrcweir 		}
1272*cdf0e10cSrcweir 		else
1273*cdf0e10cSrcweir 		{
1274*cdf0e10cSrcweir 			aString = String();
1275*cdf0e10cSrcweir 			XFillFloatTransparenceItem aNewTransItem(aString, aGradTransGradient.aGradient);
1276*cdf0e10cSrcweir 			aNewSet.Put(aNewTransItem);
1277*cdf0e10cSrcweir 		}
1278*cdf0e10cSrcweir 
1279*cdf0e10cSrcweir 		if(bUndo && pModel->IsUndoEnabled())
1280*cdf0e10cSrcweir 		{
1281*cdf0e10cSrcweir 			pModel->BegUndo(SVX_RESSTR(IsGradient() ? SIP_XA_FILLGRADIENT : SIP_XA_FILLTRANSPARENCE));
1282*cdf0e10cSrcweir 			pModel->AddUndo(pModel->GetSdrUndoFactory().CreateUndoAttrObject(*_pObj));
1283*cdf0e10cSrcweir 			pModel->EndUndo();
1284*cdf0e10cSrcweir 		}
1285*cdf0e10cSrcweir 
1286*cdf0e10cSrcweir 		pObj->SetMergedItemSetAndBroadcast(aNewSet);
1287*cdf0e10cSrcweir 	}
1288*cdf0e10cSrcweir 
1289*cdf0e10cSrcweir 	// back transformation, set values on pIAOHandle
1290*cdf0e10cSrcweir     aGradTransformer.GradToVec(aGradTransGradient, aGradTransVector, _pObj);
1291*cdf0e10cSrcweir 
1292*cdf0e10cSrcweir 	SetPos(Point(FRound(aGradTransVector.maPositionA.getX()), FRound(aGradTransVector.maPositionA.getY())));
1293*cdf0e10cSrcweir 	Set2ndPos(Point(FRound(aGradTransVector.maPositionB.getX()), FRound(aGradTransVector.maPositionB.getY())));
1294*cdf0e10cSrcweir 	if(pColHdl1)
1295*cdf0e10cSrcweir 	{
1296*cdf0e10cSrcweir 		pColHdl1->SetPos(Point(FRound(aGradTransVector.maPositionA.getX()), FRound(aGradTransVector.maPositionA.getY())));
1297*cdf0e10cSrcweir 		pColHdl1->SetColor(aGradTransVector.aCol1);
1298*cdf0e10cSrcweir 	}
1299*cdf0e10cSrcweir 	if(pColHdl2)
1300*cdf0e10cSrcweir 	{
1301*cdf0e10cSrcweir 		pColHdl2->SetPos(Point(FRound(aGradTransVector.maPositionB.getX()), FRound(aGradTransVector.maPositionB.getY())));
1302*cdf0e10cSrcweir 		pColHdl2->SetColor(aGradTransVector.aCol2);
1303*cdf0e10cSrcweir 	}
1304*cdf0e10cSrcweir }
1305*cdf0e10cSrcweir 
1306*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1307*cdf0e10cSrcweir 
1308*cdf0e10cSrcweir SdrHdlLine::~SdrHdlLine() {}
1309*cdf0e10cSrcweir 
1310*cdf0e10cSrcweir void SdrHdlLine::CreateB2dIAObject()
1311*cdf0e10cSrcweir {
1312*cdf0e10cSrcweir 	// first throw away old one
1313*cdf0e10cSrcweir 	GetRidOfIAObject();
1314*cdf0e10cSrcweir 
1315*cdf0e10cSrcweir 	if(pHdlList)
1316*cdf0e10cSrcweir 	{
1317*cdf0e10cSrcweir 		SdrMarkView* pView = pHdlList->GetView();
1318*cdf0e10cSrcweir 
1319*cdf0e10cSrcweir 		if(pView && !pView->areMarkHandlesHidden() && pHdl1 && pHdl2)
1320*cdf0e10cSrcweir 		{
1321*cdf0e10cSrcweir 			SdrPageView* pPageView = pView->GetSdrPageView();
1322*cdf0e10cSrcweir 
1323*cdf0e10cSrcweir 			if(pPageView)
1324*cdf0e10cSrcweir 			{
1325*cdf0e10cSrcweir 				for(sal_uInt32 b(0L); b < pPageView->PageWindowCount(); b++)
1326*cdf0e10cSrcweir 				{
1327*cdf0e10cSrcweir 					const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
1328*cdf0e10cSrcweir 
1329*cdf0e10cSrcweir 					if(rPageWindow.GetPaintWindow().OutputToWindow())
1330*cdf0e10cSrcweir 					{
1331*cdf0e10cSrcweir 						if(rPageWindow.GetOverlayManager())
1332*cdf0e10cSrcweir 						{
1333*cdf0e10cSrcweir 							basegfx::B2DPoint aPosition1(pHdl1->GetPos().X(), pHdl1->GetPos().Y());
1334*cdf0e10cSrcweir 							basegfx::B2DPoint aPosition2(pHdl2->GetPos().X(), pHdl2->GetPos().Y());
1335*cdf0e10cSrcweir 
1336*cdf0e10cSrcweir 							::sdr::overlay::OverlayObject* pNewOverlayObject = new
1337*cdf0e10cSrcweir 								::sdr::overlay::OverlayLineStriped(
1338*cdf0e10cSrcweir 									aPosition1,
1339*cdf0e10cSrcweir 									aPosition2
1340*cdf0e10cSrcweir 								);
1341*cdf0e10cSrcweir 							DBG_ASSERT(pNewOverlayObject, "Got NO new IAO!");
1342*cdf0e10cSrcweir 
1343*cdf0e10cSrcweir 							// OVERLAYMANAGER
1344*cdf0e10cSrcweir 							if(pNewOverlayObject)
1345*cdf0e10cSrcweir 							{
1346*cdf0e10cSrcweir 								// color(?)
1347*cdf0e10cSrcweir 								pNewOverlayObject->setBaseColor(Color(COL_LIGHTRED));
1348*cdf0e10cSrcweir 
1349*cdf0e10cSrcweir 								rPageWindow.GetOverlayManager()->add(*pNewOverlayObject);
1350*cdf0e10cSrcweir 								maOverlayGroup.append(*pNewOverlayObject);
1351*cdf0e10cSrcweir 							}
1352*cdf0e10cSrcweir 						}
1353*cdf0e10cSrcweir 					}
1354*cdf0e10cSrcweir 				}
1355*cdf0e10cSrcweir 			}
1356*cdf0e10cSrcweir 		}
1357*cdf0e10cSrcweir 	}
1358*cdf0e10cSrcweir }
1359*cdf0e10cSrcweir 
1360*cdf0e10cSrcweir Pointer SdrHdlLine::GetPointer() const
1361*cdf0e10cSrcweir {
1362*cdf0e10cSrcweir     return Pointer(POINTER_REFHAND);
1363*cdf0e10cSrcweir }
1364*cdf0e10cSrcweir 
1365*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1366*cdf0e10cSrcweir 
1367*cdf0e10cSrcweir SdrHdlBezWgt::~SdrHdlBezWgt() {}
1368*cdf0e10cSrcweir 
1369*cdf0e10cSrcweir void SdrHdlBezWgt::CreateB2dIAObject()
1370*cdf0e10cSrcweir {
1371*cdf0e10cSrcweir 	// call parent
1372*cdf0e10cSrcweir 	SdrHdl::CreateB2dIAObject();
1373*cdf0e10cSrcweir 
1374*cdf0e10cSrcweir 	// create lines
1375*cdf0e10cSrcweir 	if(pHdlList)
1376*cdf0e10cSrcweir 	{
1377*cdf0e10cSrcweir 		SdrMarkView* pView = pHdlList->GetView();
1378*cdf0e10cSrcweir 
1379*cdf0e10cSrcweir 		if(pView && !pView->areMarkHandlesHidden())
1380*cdf0e10cSrcweir 		{
1381*cdf0e10cSrcweir 			SdrPageView* pPageView = pView->GetSdrPageView();
1382*cdf0e10cSrcweir 
1383*cdf0e10cSrcweir 			if(pPageView)
1384*cdf0e10cSrcweir 			{
1385*cdf0e10cSrcweir 				for(sal_uInt32 b(0L); b < pPageView->PageWindowCount(); b++)
1386*cdf0e10cSrcweir 				{
1387*cdf0e10cSrcweir 					const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
1388*cdf0e10cSrcweir 
1389*cdf0e10cSrcweir 					if(rPageWindow.GetPaintWindow().OutputToWindow())
1390*cdf0e10cSrcweir 					{
1391*cdf0e10cSrcweir 						if(rPageWindow.GetOverlayManager())
1392*cdf0e10cSrcweir 						{
1393*cdf0e10cSrcweir 							basegfx::B2DPoint aPosition1(pHdl1->GetPos().X(), pHdl1->GetPos().Y());
1394*cdf0e10cSrcweir 							basegfx::B2DPoint aPosition2(aPos.X(), aPos.Y());
1395*cdf0e10cSrcweir 
1396*cdf0e10cSrcweir 							if(!aPosition1.equal(aPosition2))
1397*cdf0e10cSrcweir 							{
1398*cdf0e10cSrcweir 								::sdr::overlay::OverlayObject* pNewOverlayObject = new
1399*cdf0e10cSrcweir 									::sdr::overlay::OverlayLineStriped(
1400*cdf0e10cSrcweir 										aPosition1,
1401*cdf0e10cSrcweir 										aPosition2
1402*cdf0e10cSrcweir 									);
1403*cdf0e10cSrcweir 								DBG_ASSERT(pNewOverlayObject, "Got NO new IAO!");
1404*cdf0e10cSrcweir 
1405*cdf0e10cSrcweir 								// OVERLAYMANAGER
1406*cdf0e10cSrcweir 								if(pNewOverlayObject)
1407*cdf0e10cSrcweir 								{
1408*cdf0e10cSrcweir 									// line part is not hittable
1409*cdf0e10cSrcweir 									pNewOverlayObject->setHittable(sal_False);
1410*cdf0e10cSrcweir 
1411*cdf0e10cSrcweir 									// color(?)
1412*cdf0e10cSrcweir 									pNewOverlayObject->setBaseColor(Color(COL_LIGHTBLUE));
1413*cdf0e10cSrcweir 
1414*cdf0e10cSrcweir 									rPageWindow.GetOverlayManager()->add(*pNewOverlayObject);
1415*cdf0e10cSrcweir 									maOverlayGroup.append(*pNewOverlayObject);
1416*cdf0e10cSrcweir 								}
1417*cdf0e10cSrcweir 							}
1418*cdf0e10cSrcweir 						}
1419*cdf0e10cSrcweir 					}
1420*cdf0e10cSrcweir 				}
1421*cdf0e10cSrcweir 			}
1422*cdf0e10cSrcweir 		}
1423*cdf0e10cSrcweir 	}
1424*cdf0e10cSrcweir }
1425*cdf0e10cSrcweir 
1426*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1427*cdf0e10cSrcweir 
1428*cdf0e10cSrcweir E3dVolumeMarker::E3dVolumeMarker(const basegfx::B2DPolyPolygon& rWireframePoly)
1429*cdf0e10cSrcweir {
1430*cdf0e10cSrcweir 	aWireframePoly = rWireframePoly;
1431*cdf0e10cSrcweir }
1432*cdf0e10cSrcweir 
1433*cdf0e10cSrcweir void E3dVolumeMarker::CreateB2dIAObject()
1434*cdf0e10cSrcweir {
1435*cdf0e10cSrcweir 	// create lines
1436*cdf0e10cSrcweir 	if(pHdlList)
1437*cdf0e10cSrcweir 	{
1438*cdf0e10cSrcweir 		SdrMarkView* pView = pHdlList->GetView();
1439*cdf0e10cSrcweir 
1440*cdf0e10cSrcweir 		if(pView && !pView->areMarkHandlesHidden())
1441*cdf0e10cSrcweir 		{
1442*cdf0e10cSrcweir 			SdrPageView* pPageView = pView->GetSdrPageView();
1443*cdf0e10cSrcweir 
1444*cdf0e10cSrcweir 			if(pPageView)
1445*cdf0e10cSrcweir 			{
1446*cdf0e10cSrcweir 				for(sal_uInt32 b(0L); b < pPageView->PageWindowCount(); b++)
1447*cdf0e10cSrcweir 				{
1448*cdf0e10cSrcweir 					const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
1449*cdf0e10cSrcweir 
1450*cdf0e10cSrcweir 					if(rPageWindow.GetPaintWindow().OutputToWindow())
1451*cdf0e10cSrcweir 					{
1452*cdf0e10cSrcweir 						if(rPageWindow.GetOverlayManager() && aWireframePoly.count())
1453*cdf0e10cSrcweir 							{
1454*cdf0e10cSrcweir 								::sdr::overlay::OverlayObject* pNewOverlayObject = new
1455*cdf0e10cSrcweir 								::sdr::overlay::OverlayPolyPolygonStriped(aWireframePoly);
1456*cdf0e10cSrcweir 								DBG_ASSERT(pNewOverlayObject, "Got NO new IAO!");
1457*cdf0e10cSrcweir 
1458*cdf0e10cSrcweir 								// OVERLAYMANAGER
1459*cdf0e10cSrcweir 								if(pNewOverlayObject)
1460*cdf0e10cSrcweir 								{
1461*cdf0e10cSrcweir 									pNewOverlayObject->setBaseColor(Color(COL_BLACK));
1462*cdf0e10cSrcweir 
1463*cdf0e10cSrcweir 									rPageWindow.GetOverlayManager()->add(*pNewOverlayObject);
1464*cdf0e10cSrcweir 									maOverlayGroup.append(*pNewOverlayObject);
1465*cdf0e10cSrcweir 								}
1466*cdf0e10cSrcweir 							}
1467*cdf0e10cSrcweir 						}
1468*cdf0e10cSrcweir 					}
1469*cdf0e10cSrcweir 				}
1470*cdf0e10cSrcweir 			}
1471*cdf0e10cSrcweir 		}
1472*cdf0e10cSrcweir 	}
1473*cdf0e10cSrcweir 
1474*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1475*cdf0e10cSrcweir 
1476*cdf0e10cSrcweir ImpEdgeHdl::~ImpEdgeHdl()
1477*cdf0e10cSrcweir {
1478*cdf0e10cSrcweir }
1479*cdf0e10cSrcweir 
1480*cdf0e10cSrcweir void ImpEdgeHdl::CreateB2dIAObject()
1481*cdf0e10cSrcweir {
1482*cdf0e10cSrcweir 	if(nObjHdlNum <= 1 && pObj)
1483*cdf0e10cSrcweir 	{
1484*cdf0e10cSrcweir 		// first throw away old one
1485*cdf0e10cSrcweir 		GetRidOfIAObject();
1486*cdf0e10cSrcweir 
1487*cdf0e10cSrcweir 		BitmapColorIndex eColIndex = LightCyan;
1488*cdf0e10cSrcweir 		BitmapMarkerKind eKindOfMarker = Rect_7x7;
1489*cdf0e10cSrcweir 
1490*cdf0e10cSrcweir 		if(pHdlList)
1491*cdf0e10cSrcweir 		{
1492*cdf0e10cSrcweir 			SdrMarkView* pView = pHdlList->GetView();
1493*cdf0e10cSrcweir 
1494*cdf0e10cSrcweir 			if(pView && !pView->areMarkHandlesHidden())
1495*cdf0e10cSrcweir 			{
1496*cdf0e10cSrcweir 				const SdrEdgeObj* pEdge = (SdrEdgeObj*)pObj;
1497*cdf0e10cSrcweir 
1498*cdf0e10cSrcweir 				if(pEdge->GetConnectedNode(nObjHdlNum == 0) != NULL)
1499*cdf0e10cSrcweir 					eColIndex = LightRed;
1500*cdf0e10cSrcweir 
1501*cdf0e10cSrcweir 				if(nPPntNum < 2)
1502*cdf0e10cSrcweir 				{
1503*cdf0e10cSrcweir 					// Handle with plus sign inside
1504*cdf0e10cSrcweir 					eKindOfMarker = Circ_7x7;
1505*cdf0e10cSrcweir 				}
1506*cdf0e10cSrcweir 
1507*cdf0e10cSrcweir 				SdrPageView* pPageView = pView->GetSdrPageView();
1508*cdf0e10cSrcweir 
1509*cdf0e10cSrcweir 				if(pPageView)
1510*cdf0e10cSrcweir 				{
1511*cdf0e10cSrcweir 					for(sal_uInt32 b(0); b < pPageView->PageWindowCount(); b++)
1512*cdf0e10cSrcweir 					{
1513*cdf0e10cSrcweir 						const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
1514*cdf0e10cSrcweir 
1515*cdf0e10cSrcweir 						if(rPageWindow.GetPaintWindow().OutputToWindow())
1516*cdf0e10cSrcweir 						{
1517*cdf0e10cSrcweir 							if(rPageWindow.GetOverlayManager())
1518*cdf0e10cSrcweir 							{
1519*cdf0e10cSrcweir 								basegfx::B2DPoint aPosition(aPos.X(), aPos.Y());
1520*cdf0e10cSrcweir 
1521*cdf0e10cSrcweir 								::sdr::overlay::OverlayObject* pNewOverlayObject = CreateOverlayObject(
1522*cdf0e10cSrcweir 									aPosition,
1523*cdf0e10cSrcweir 									eColIndex,
1524*cdf0e10cSrcweir 									eKindOfMarker);
1525*cdf0e10cSrcweir 
1526*cdf0e10cSrcweir 								// OVERLAYMANAGER
1527*cdf0e10cSrcweir 								if(pNewOverlayObject)
1528*cdf0e10cSrcweir 								{
1529*cdf0e10cSrcweir 									rPageWindow.GetOverlayManager()->add(*pNewOverlayObject);
1530*cdf0e10cSrcweir 									maOverlayGroup.append(*pNewOverlayObject);
1531*cdf0e10cSrcweir 								}
1532*cdf0e10cSrcweir 							}
1533*cdf0e10cSrcweir 						}
1534*cdf0e10cSrcweir 					}
1535*cdf0e10cSrcweir 				}
1536*cdf0e10cSrcweir 			}
1537*cdf0e10cSrcweir 		}
1538*cdf0e10cSrcweir 	}
1539*cdf0e10cSrcweir 	else
1540*cdf0e10cSrcweir 	{
1541*cdf0e10cSrcweir 		// call parent
1542*cdf0e10cSrcweir 		SdrHdl::CreateB2dIAObject();
1543*cdf0e10cSrcweir 	}
1544*cdf0e10cSrcweir }
1545*cdf0e10cSrcweir 
1546*cdf0e10cSrcweir void ImpEdgeHdl::SetLineCode(SdrEdgeLineCode eCode)
1547*cdf0e10cSrcweir {
1548*cdf0e10cSrcweir 	if(eLineCode != eCode)
1549*cdf0e10cSrcweir 	{
1550*cdf0e10cSrcweir 		// remember new value
1551*cdf0e10cSrcweir 		eLineCode = eCode;
1552*cdf0e10cSrcweir 
1553*cdf0e10cSrcweir 		// create new display
1554*cdf0e10cSrcweir 		Touch();
1555*cdf0e10cSrcweir 	}
1556*cdf0e10cSrcweir }
1557*cdf0e10cSrcweir 
1558*cdf0e10cSrcweir Pointer ImpEdgeHdl::GetPointer() const
1559*cdf0e10cSrcweir {
1560*cdf0e10cSrcweir     SdrEdgeObj* pEdge=PTR_CAST(SdrEdgeObj,pObj);
1561*cdf0e10cSrcweir     if (pEdge==NULL)
1562*cdf0e10cSrcweir 		return SdrHdl::GetPointer();
1563*cdf0e10cSrcweir     if (nObjHdlNum<=1)
1564*cdf0e10cSrcweir 		return Pointer(POINTER_MOVEPOINT); //Pointer(POINTER_DRAW_CONNECT);
1565*cdf0e10cSrcweir     if (IsHorzDrag())
1566*cdf0e10cSrcweir 		return Pointer(POINTER_ESIZE);
1567*cdf0e10cSrcweir     else
1568*cdf0e10cSrcweir 		return Pointer(POINTER_SSIZE);
1569*cdf0e10cSrcweir }
1570*cdf0e10cSrcweir 
1571*cdf0e10cSrcweir sal_Bool ImpEdgeHdl::IsHorzDrag() const
1572*cdf0e10cSrcweir {
1573*cdf0e10cSrcweir     SdrEdgeObj* pEdge=PTR_CAST(SdrEdgeObj,pObj);
1574*cdf0e10cSrcweir     if (pEdge==NULL)
1575*cdf0e10cSrcweir 		return sal_False;
1576*cdf0e10cSrcweir     if (nObjHdlNum<=1)
1577*cdf0e10cSrcweir 		return sal_False;
1578*cdf0e10cSrcweir 
1579*cdf0e10cSrcweir 	SdrEdgeKind eEdgeKind = ((SdrEdgeKindItem&)(pEdge->GetObjectItem(SDRATTR_EDGEKIND))).GetValue();
1580*cdf0e10cSrcweir 
1581*cdf0e10cSrcweir 	const SdrEdgeInfoRec& rInfo=pEdge->aEdgeInfo;
1582*cdf0e10cSrcweir     if (eEdgeKind==SDREDGE_ORTHOLINES || eEdgeKind==SDREDGE_BEZIER)
1583*cdf0e10cSrcweir 	{
1584*cdf0e10cSrcweir         return !rInfo.ImpIsHorzLine(eLineCode,*pEdge->pEdgeTrack);
1585*cdf0e10cSrcweir     }
1586*cdf0e10cSrcweir 	else if (eEdgeKind==SDREDGE_THREELINES)
1587*cdf0e10cSrcweir 	{
1588*cdf0e10cSrcweir         long nWink=nObjHdlNum==2 ? rInfo.nAngle1 : rInfo.nAngle2;
1589*cdf0e10cSrcweir         if (nWink==0 || nWink==18000)
1590*cdf0e10cSrcweir 			return sal_True;
1591*cdf0e10cSrcweir         else
1592*cdf0e10cSrcweir 			return sal_False;
1593*cdf0e10cSrcweir     }
1594*cdf0e10cSrcweir     return sal_False;
1595*cdf0e10cSrcweir }
1596*cdf0e10cSrcweir 
1597*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1598*cdf0e10cSrcweir 
1599*cdf0e10cSrcweir ImpMeasureHdl::~ImpMeasureHdl()
1600*cdf0e10cSrcweir {
1601*cdf0e10cSrcweir }
1602*cdf0e10cSrcweir 
1603*cdf0e10cSrcweir void ImpMeasureHdl::CreateB2dIAObject()
1604*cdf0e10cSrcweir {
1605*cdf0e10cSrcweir 	// first throw away old one
1606*cdf0e10cSrcweir 	GetRidOfIAObject();
1607*cdf0e10cSrcweir 
1608*cdf0e10cSrcweir 	if(pHdlList)
1609*cdf0e10cSrcweir 	{
1610*cdf0e10cSrcweir 		SdrMarkView* pView = pHdlList->GetView();
1611*cdf0e10cSrcweir 
1612*cdf0e10cSrcweir 		if(pView && !pView->areMarkHandlesHidden())
1613*cdf0e10cSrcweir 		{
1614*cdf0e10cSrcweir 			BitmapColorIndex eColIndex = LightCyan;
1615*cdf0e10cSrcweir 			BitmapMarkerKind eKindOfMarker = Rect_9x9;
1616*cdf0e10cSrcweir 
1617*cdf0e10cSrcweir 			if(nObjHdlNum > 1)
1618*cdf0e10cSrcweir 			{
1619*cdf0e10cSrcweir 				eKindOfMarker = Rect_7x7;
1620*cdf0e10cSrcweir 			}
1621*cdf0e10cSrcweir 
1622*cdf0e10cSrcweir 			if(bSelect)
1623*cdf0e10cSrcweir 			{
1624*cdf0e10cSrcweir 				eColIndex = Cyan;
1625*cdf0e10cSrcweir 			}
1626*cdf0e10cSrcweir 
1627*cdf0e10cSrcweir 			SdrPageView* pPageView = pView->GetSdrPageView();
1628*cdf0e10cSrcweir 
1629*cdf0e10cSrcweir 			if(pPageView)
1630*cdf0e10cSrcweir 			{
1631*cdf0e10cSrcweir 				for(sal_uInt32 b(0L); b < pPageView->PageWindowCount(); b++)
1632*cdf0e10cSrcweir 				{
1633*cdf0e10cSrcweir 					const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
1634*cdf0e10cSrcweir 
1635*cdf0e10cSrcweir 					if(rPageWindow.GetPaintWindow().OutputToWindow())
1636*cdf0e10cSrcweir 					{
1637*cdf0e10cSrcweir 						if(rPageWindow.GetOverlayManager())
1638*cdf0e10cSrcweir 						{
1639*cdf0e10cSrcweir 							basegfx::B2DPoint aPosition(aPos.X(), aPos.Y());
1640*cdf0e10cSrcweir 
1641*cdf0e10cSrcweir 							::sdr::overlay::OverlayObject* pNewOverlayObject = CreateOverlayObject(
1642*cdf0e10cSrcweir 								aPosition,
1643*cdf0e10cSrcweir 								eColIndex,
1644*cdf0e10cSrcweir 								eKindOfMarker);
1645*cdf0e10cSrcweir 
1646*cdf0e10cSrcweir 							// OVERLAYMANAGER
1647*cdf0e10cSrcweir 							if(pNewOverlayObject)
1648*cdf0e10cSrcweir 							{
1649*cdf0e10cSrcweir 								rPageWindow.GetOverlayManager()->add(*pNewOverlayObject);
1650*cdf0e10cSrcweir 								maOverlayGroup.append(*pNewOverlayObject);
1651*cdf0e10cSrcweir 							}
1652*cdf0e10cSrcweir 						}
1653*cdf0e10cSrcweir 					}
1654*cdf0e10cSrcweir 				}
1655*cdf0e10cSrcweir 			}
1656*cdf0e10cSrcweir 		}
1657*cdf0e10cSrcweir 	}
1658*cdf0e10cSrcweir }
1659*cdf0e10cSrcweir 
1660*cdf0e10cSrcweir Pointer ImpMeasureHdl::GetPointer() const
1661*cdf0e10cSrcweir {
1662*cdf0e10cSrcweir     switch (nObjHdlNum)
1663*cdf0e10cSrcweir 	{
1664*cdf0e10cSrcweir         case 0: case 1: return Pointer(POINTER_HAND);
1665*cdf0e10cSrcweir         case 2: case 3: return Pointer(POINTER_MOVEPOINT);
1666*cdf0e10cSrcweir         case 4: case 5: return SdrHdl::GetPointer(); // wird dann entsprechend gedreht
1667*cdf0e10cSrcweir     } // switch
1668*cdf0e10cSrcweir     return Pointer(POINTER_NOTALLOWED);
1669*cdf0e10cSrcweir }
1670*cdf0e10cSrcweir 
1671*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1672*cdf0e10cSrcweir 
1673*cdf0e10cSrcweir ImpTextframeHdl::ImpTextframeHdl(const Rectangle& rRect) :
1674*cdf0e10cSrcweir     SdrHdl(rRect.TopLeft(),HDL_MOVE),
1675*cdf0e10cSrcweir     maRect(rRect)
1676*cdf0e10cSrcweir {
1677*cdf0e10cSrcweir }
1678*cdf0e10cSrcweir 
1679*cdf0e10cSrcweir void ImpTextframeHdl::CreateB2dIAObject()
1680*cdf0e10cSrcweir {
1681*cdf0e10cSrcweir 	// first throw away old one
1682*cdf0e10cSrcweir 	GetRidOfIAObject();
1683*cdf0e10cSrcweir 
1684*cdf0e10cSrcweir 	if(pHdlList)
1685*cdf0e10cSrcweir 	{
1686*cdf0e10cSrcweir 		SdrMarkView* pView = pHdlList->GetView();
1687*cdf0e10cSrcweir 
1688*cdf0e10cSrcweir 		if(pView && !pView->areMarkHandlesHidden())
1689*cdf0e10cSrcweir 		{
1690*cdf0e10cSrcweir 			SdrPageView* pPageView = pView->GetSdrPageView();
1691*cdf0e10cSrcweir 
1692*cdf0e10cSrcweir 			if(pPageView)
1693*cdf0e10cSrcweir 			{
1694*cdf0e10cSrcweir 				for(sal_uInt32 b(0L); b < pPageView->PageWindowCount(); b++)
1695*cdf0e10cSrcweir 				{
1696*cdf0e10cSrcweir 					const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
1697*cdf0e10cSrcweir 
1698*cdf0e10cSrcweir 					if(rPageWindow.GetPaintWindow().OutputToWindow())
1699*cdf0e10cSrcweir 					{
1700*cdf0e10cSrcweir 						if(rPageWindow.GetOverlayManager())
1701*cdf0e10cSrcweir 						{
1702*cdf0e10cSrcweir                             const basegfx::B2DPoint aTopLeft(maRect.Left(), maRect.Top());
1703*cdf0e10cSrcweir                             const basegfx::B2DPoint aBottomRight(maRect.Right(), maRect.Bottom());
1704*cdf0e10cSrcweir                             const svtools::ColorConfig aColorConfig;
1705*cdf0e10cSrcweir                             const Color aHatchCol( aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor );
1706*cdf0e10cSrcweir 
1707*cdf0e10cSrcweir                             ::sdr::overlay::OverlayHatchRect* pNewOverlayObject = new ::sdr::overlay::OverlayHatchRect(
1708*cdf0e10cSrcweir                                 aTopLeft,
1709*cdf0e10cSrcweir                                 aBottomRight,
1710*cdf0e10cSrcweir                                 aHatchCol,
1711*cdf0e10cSrcweir                                 3.0,
1712*cdf0e10cSrcweir                                 3.0,
1713*cdf0e10cSrcweir                                 45 * F_PI180,
1714*cdf0e10cSrcweir                                 nDrehWink * -F_PI18000);
1715*cdf0e10cSrcweir                             pNewOverlayObject->setHittable(false);
1716*cdf0e10cSrcweir 
1717*cdf0e10cSrcweir                             // OVERLAYMANAGER
1718*cdf0e10cSrcweir                             if(pNewOverlayObject)
1719*cdf0e10cSrcweir                             {
1720*cdf0e10cSrcweir                                 rPageWindow.GetOverlayManager()->add(*pNewOverlayObject);
1721*cdf0e10cSrcweir                                 maOverlayGroup.append(*pNewOverlayObject);
1722*cdf0e10cSrcweir                             }
1723*cdf0e10cSrcweir                         }
1724*cdf0e10cSrcweir                     }
1725*cdf0e10cSrcweir                 }
1726*cdf0e10cSrcweir             }
1727*cdf0e10cSrcweir 		}
1728*cdf0e10cSrcweir 	}
1729*cdf0e10cSrcweir }
1730*cdf0e10cSrcweir 
1731*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1732*cdf0e10cSrcweir 
1733*cdf0e10cSrcweir class ImpSdrHdlListSorter: public ContainerSorter {
1734*cdf0e10cSrcweir public:
1735*cdf0e10cSrcweir     ImpSdrHdlListSorter(Container& rNewCont): ContainerSorter(rNewCont) {}
1736*cdf0e10cSrcweir     virtual int Compare(const void* pElem1, const void* pElem2) const;
1737*cdf0e10cSrcweir };
1738*cdf0e10cSrcweir 
1739*cdf0e10cSrcweir int ImpSdrHdlListSorter::Compare(const void* pElem1, const void* pElem2) const
1740*cdf0e10cSrcweir {
1741*cdf0e10cSrcweir     SdrHdlKind eKind1=((SdrHdl*)pElem1)->GetKind();
1742*cdf0e10cSrcweir     SdrHdlKind eKind2=((SdrHdl*)pElem2)->GetKind();
1743*cdf0e10cSrcweir     // Level 1: Erst normale Handles, dann Glue, dann User, dann Plushandles, dann Retpunkt-Handles
1744*cdf0e10cSrcweir     unsigned n1=1;
1745*cdf0e10cSrcweir     unsigned n2=1;
1746*cdf0e10cSrcweir     if (eKind1!=eKind2)
1747*cdf0e10cSrcweir 	{
1748*cdf0e10cSrcweir         if (eKind1==HDL_REF1 || eKind1==HDL_REF2 || eKind1==HDL_MIRX) n1=5;
1749*cdf0e10cSrcweir         else if (eKind1==HDL_GLUE) n1=2;
1750*cdf0e10cSrcweir         else if (eKind1==HDL_USER) n1=3;
1751*cdf0e10cSrcweir 		else if (eKind1==HDL_SMARTTAG) n1=0;
1752*cdf0e10cSrcweir         if (eKind2==HDL_REF1 || eKind2==HDL_REF2 || eKind2==HDL_MIRX) n2=5;
1753*cdf0e10cSrcweir         else if (eKind2==HDL_GLUE) n2=2;
1754*cdf0e10cSrcweir         else if (eKind2==HDL_USER) n2=3;
1755*cdf0e10cSrcweir 		else if (eKind2==HDL_SMARTTAG) n2=0;
1756*cdf0e10cSrcweir     }
1757*cdf0e10cSrcweir     if (((SdrHdl*)pElem1)->IsPlusHdl()) n1=4;
1758*cdf0e10cSrcweir     if (((SdrHdl*)pElem2)->IsPlusHdl()) n2=4;
1759*cdf0e10cSrcweir     if (n1==n2)
1760*cdf0e10cSrcweir 	{
1761*cdf0e10cSrcweir         // Level 2: PageView (Pointer)
1762*cdf0e10cSrcweir         SdrPageView* pPV1=((SdrHdl*)pElem1)->GetPageView();
1763*cdf0e10cSrcweir         SdrPageView* pPV2=((SdrHdl*)pElem2)->GetPageView();
1764*cdf0e10cSrcweir         if (pPV1==pPV2)
1765*cdf0e10cSrcweir 		{
1766*cdf0e10cSrcweir             // Level 3: Position (x+y)
1767*cdf0e10cSrcweir             SdrObject* pObj1=((SdrHdl*)pElem1)->GetObj();
1768*cdf0e10cSrcweir             SdrObject* pObj2=((SdrHdl*)pElem2)->GetObj();
1769*cdf0e10cSrcweir             if (pObj1==pObj2)
1770*cdf0e10cSrcweir 			{
1771*cdf0e10cSrcweir                 sal_uInt32 nNum1=((SdrHdl*)pElem1)->GetObjHdlNum();
1772*cdf0e10cSrcweir                 sal_uInt32 nNum2=((SdrHdl*)pElem2)->GetObjHdlNum();
1773*cdf0e10cSrcweir                 if (nNum1==nNum2)
1774*cdf0e10cSrcweir 				{ // #48763#
1775*cdf0e10cSrcweir                     if (eKind1==eKind2)
1776*cdf0e10cSrcweir                         return (long)pElem1<(long)pElem2 ? -1 : 1; // Notloesung, um immer die gleiche Sortierung zu haben
1777*cdf0e10cSrcweir                     return (sal_uInt16)eKind1<(sal_uInt16)eKind2 ? -1 : 1;
1778*cdf0e10cSrcweir                 }
1779*cdf0e10cSrcweir 				else
1780*cdf0e10cSrcweir 					return nNum1<nNum2 ? -1 : 1;
1781*cdf0e10cSrcweir             }
1782*cdf0e10cSrcweir 			else
1783*cdf0e10cSrcweir 			{
1784*cdf0e10cSrcweir                 return (long)pObj1<(long)pObj2 ? -1 : 1;
1785*cdf0e10cSrcweir             }
1786*cdf0e10cSrcweir         }
1787*cdf0e10cSrcweir 		else
1788*cdf0e10cSrcweir 		{
1789*cdf0e10cSrcweir             return (long)pPV1<(long)pPV2 ? -1 : 1;
1790*cdf0e10cSrcweir         }
1791*cdf0e10cSrcweir     }
1792*cdf0e10cSrcweir 	else
1793*cdf0e10cSrcweir 	{
1794*cdf0e10cSrcweir         return n1<n2 ? -1 : 1;
1795*cdf0e10cSrcweir     }
1796*cdf0e10cSrcweir }
1797*cdf0e10cSrcweir 
1798*cdf0e10cSrcweir SdrMarkView* SdrHdlList::GetView() const
1799*cdf0e10cSrcweir {
1800*cdf0e10cSrcweir 	return pView;
1801*cdf0e10cSrcweir }
1802*cdf0e10cSrcweir 
1803*cdf0e10cSrcweir // #105678# Help struct for re-sorting handles
1804*cdf0e10cSrcweir struct ImplHdlAndIndex
1805*cdf0e10cSrcweir {
1806*cdf0e10cSrcweir 	SdrHdl*						mpHdl;
1807*cdf0e10cSrcweir 	sal_uInt32					mnIndex;
1808*cdf0e10cSrcweir };
1809*cdf0e10cSrcweir 
1810*cdf0e10cSrcweir // #105678# Help method for sorting handles taking care of OrdNums, keeping order in
1811*cdf0e10cSrcweir // single objects and re-sorting polygon handles intuitively
1812*cdf0e10cSrcweir extern "C" int __LOADONCALLAPI ImplSortHdlFunc( const void* pVoid1, const void* pVoid2 )
1813*cdf0e10cSrcweir {
1814*cdf0e10cSrcweir 	const ImplHdlAndIndex* p1 = (ImplHdlAndIndex*)pVoid1;
1815*cdf0e10cSrcweir 	const ImplHdlAndIndex* p2 = (ImplHdlAndIndex*)pVoid2;
1816*cdf0e10cSrcweir 
1817*cdf0e10cSrcweir 	if(p1->mpHdl->GetObj() == p2->mpHdl->GetObj())
1818*cdf0e10cSrcweir 	{
1819*cdf0e10cSrcweir 		if(p1->mpHdl->GetObj() && p1->mpHdl->GetObj()->ISA(SdrPathObj))
1820*cdf0e10cSrcweir 		{
1821*cdf0e10cSrcweir 			// same object and a path object
1822*cdf0e10cSrcweir 			if((p1->mpHdl->GetKind() == HDL_POLY || p1->mpHdl->GetKind() == HDL_BWGT)
1823*cdf0e10cSrcweir 				&& (p2->mpHdl->GetKind() == HDL_POLY || p2->mpHdl->GetKind() == HDL_BWGT))
1824*cdf0e10cSrcweir 			{
1825*cdf0e10cSrcweir 				// both handles are point or control handles
1826*cdf0e10cSrcweir 				if(p1->mpHdl->GetPolyNum() == p2->mpHdl->GetPolyNum())
1827*cdf0e10cSrcweir 				{
1828*cdf0e10cSrcweir 					if(p1->mpHdl->GetPointNum() < p2->mpHdl->GetPointNum())
1829*cdf0e10cSrcweir 					{
1830*cdf0e10cSrcweir 						return -1;
1831*cdf0e10cSrcweir 					}
1832*cdf0e10cSrcweir 					else
1833*cdf0e10cSrcweir 					{
1834*cdf0e10cSrcweir 						return 1;
1835*cdf0e10cSrcweir 					}
1836*cdf0e10cSrcweir 				}
1837*cdf0e10cSrcweir 				else if(p1->mpHdl->GetPolyNum() < p2->mpHdl->GetPolyNum())
1838*cdf0e10cSrcweir 				{
1839*cdf0e10cSrcweir 					return -1;
1840*cdf0e10cSrcweir 				}
1841*cdf0e10cSrcweir 				else
1842*cdf0e10cSrcweir 				{
1843*cdf0e10cSrcweir 					return 1;
1844*cdf0e10cSrcweir 				}
1845*cdf0e10cSrcweir 			}
1846*cdf0e10cSrcweir 		}
1847*cdf0e10cSrcweir 	}
1848*cdf0e10cSrcweir 	else
1849*cdf0e10cSrcweir 	{
1850*cdf0e10cSrcweir 		if(!p1->mpHdl->GetObj())
1851*cdf0e10cSrcweir 		{
1852*cdf0e10cSrcweir 			return -1;
1853*cdf0e10cSrcweir 		}
1854*cdf0e10cSrcweir 		else if(!p2->mpHdl->GetObj())
1855*cdf0e10cSrcweir 		{
1856*cdf0e10cSrcweir 			return 1;
1857*cdf0e10cSrcweir 		}
1858*cdf0e10cSrcweir 		else
1859*cdf0e10cSrcweir 		{
1860*cdf0e10cSrcweir 			// different objects, use OrdNum for sort
1861*cdf0e10cSrcweir 			const sal_uInt32 nOrdNum1 = p1->mpHdl->GetObj()->GetOrdNum();
1862*cdf0e10cSrcweir 			const sal_uInt32 nOrdNum2 = p2->mpHdl->GetObj()->GetOrdNum();
1863*cdf0e10cSrcweir 
1864*cdf0e10cSrcweir 			if(nOrdNum1 < nOrdNum2)
1865*cdf0e10cSrcweir 			{
1866*cdf0e10cSrcweir 				return -1;
1867*cdf0e10cSrcweir 			}
1868*cdf0e10cSrcweir 			else
1869*cdf0e10cSrcweir 			{
1870*cdf0e10cSrcweir 				return 1;
1871*cdf0e10cSrcweir 			}
1872*cdf0e10cSrcweir 		}
1873*cdf0e10cSrcweir 	}
1874*cdf0e10cSrcweir 
1875*cdf0e10cSrcweir 	// fallback to indices
1876*cdf0e10cSrcweir 	if(p1->mnIndex < p2->mnIndex)
1877*cdf0e10cSrcweir 	{
1878*cdf0e10cSrcweir 		return -1;
1879*cdf0e10cSrcweir 	}
1880*cdf0e10cSrcweir 	else
1881*cdf0e10cSrcweir 	{
1882*cdf0e10cSrcweir 		return 1;
1883*cdf0e10cSrcweir 	}
1884*cdf0e10cSrcweir }
1885*cdf0e10cSrcweir 
1886*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1887*cdf0e10cSrcweir // #97016# II
1888*cdf0e10cSrcweir 
1889*cdf0e10cSrcweir void SdrHdlList::TravelFocusHdl(sal_Bool bForward)
1890*cdf0e10cSrcweir {
1891*cdf0e10cSrcweir 	// security correction
1892*cdf0e10cSrcweir 	if(mnFocusIndex != CONTAINER_ENTRY_NOTFOUND && mnFocusIndex >= GetHdlCount())
1893*cdf0e10cSrcweir 		mnFocusIndex = CONTAINER_ENTRY_NOTFOUND;
1894*cdf0e10cSrcweir 
1895*cdf0e10cSrcweir 	if(aList.Count())
1896*cdf0e10cSrcweir 	{
1897*cdf0e10cSrcweir 		// take care of old handle
1898*cdf0e10cSrcweir 		const sal_uIntPtr nOldHdlNum(mnFocusIndex);
1899*cdf0e10cSrcweir 		SdrHdl* pOld = GetHdl(nOldHdlNum);
1900*cdf0e10cSrcweir 		//SDOsal_Bool bRefresh(sal_False);
1901*cdf0e10cSrcweir 
1902*cdf0e10cSrcweir 		if(pOld)
1903*cdf0e10cSrcweir 		{
1904*cdf0e10cSrcweir 			// switch off old handle
1905*cdf0e10cSrcweir 			mnFocusIndex = CONTAINER_ENTRY_NOTFOUND;
1906*cdf0e10cSrcweir 			pOld->Touch();
1907*cdf0e10cSrcweir 			//SDObRefresh = sal_True;
1908*cdf0e10cSrcweir 		}
1909*cdf0e10cSrcweir 
1910*cdf0e10cSrcweir 		// #105678# Alloc pointer array for sorted handle list
1911*cdf0e10cSrcweir 		ImplHdlAndIndex* pHdlAndIndex = new ImplHdlAndIndex[aList.Count()];
1912*cdf0e10cSrcweir 
1913*cdf0e10cSrcweir 		// #105678# build sorted handle list
1914*cdf0e10cSrcweir 		sal_uInt32 a;
1915*cdf0e10cSrcweir 		for( a = 0; a < aList.Count(); a++)
1916*cdf0e10cSrcweir 		{
1917*cdf0e10cSrcweir 			pHdlAndIndex[a].mpHdl = (SdrHdl*)aList.GetObject(a);
1918*cdf0e10cSrcweir 			pHdlAndIndex[a].mnIndex = a;
1919*cdf0e10cSrcweir 		}
1920*cdf0e10cSrcweir 
1921*cdf0e10cSrcweir 		// #105678# qsort all entries
1922*cdf0e10cSrcweir 		qsort(pHdlAndIndex, aList.Count(), sizeof(ImplHdlAndIndex), ImplSortHdlFunc);
1923*cdf0e10cSrcweir 
1924*cdf0e10cSrcweir 		// #105678# look for old num in sorted array
1925*cdf0e10cSrcweir 		sal_uIntPtr nOldHdl(nOldHdlNum);
1926*cdf0e10cSrcweir 
1927*cdf0e10cSrcweir 		if(nOldHdlNum != CONTAINER_ENTRY_NOTFOUND)
1928*cdf0e10cSrcweir 		{
1929*cdf0e10cSrcweir 			for(a = 0; a < aList.Count(); a++)
1930*cdf0e10cSrcweir 			{
1931*cdf0e10cSrcweir 				if(pHdlAndIndex[a].mpHdl == pOld)
1932*cdf0e10cSrcweir 				{
1933*cdf0e10cSrcweir 					nOldHdl = a;
1934*cdf0e10cSrcweir 					break;
1935*cdf0e10cSrcweir 				}
1936*cdf0e10cSrcweir 			}
1937*cdf0e10cSrcweir 		}
1938*cdf0e10cSrcweir 
1939*cdf0e10cSrcweir 		// #105678# build new HdlNum
1940*cdf0e10cSrcweir 		sal_uIntPtr nNewHdl(nOldHdl);
1941*cdf0e10cSrcweir 
1942*cdf0e10cSrcweir 		// #105678# do the focus travel
1943*cdf0e10cSrcweir 		if(bForward)
1944*cdf0e10cSrcweir 		{
1945*cdf0e10cSrcweir 			if(nOldHdl != CONTAINER_ENTRY_NOTFOUND)
1946*cdf0e10cSrcweir 			{
1947*cdf0e10cSrcweir 				if(nOldHdl == aList.Count() - 1)
1948*cdf0e10cSrcweir 				{
1949*cdf0e10cSrcweir 					// end forward run
1950*cdf0e10cSrcweir 					nNewHdl = CONTAINER_ENTRY_NOTFOUND;
1951*cdf0e10cSrcweir 				}
1952*cdf0e10cSrcweir 				else
1953*cdf0e10cSrcweir 				{
1954*cdf0e10cSrcweir 					// simply the next handle
1955*cdf0e10cSrcweir 					nNewHdl++;
1956*cdf0e10cSrcweir 				}
1957*cdf0e10cSrcweir 			}
1958*cdf0e10cSrcweir 			else
1959*cdf0e10cSrcweir 			{
1960*cdf0e10cSrcweir 				// start forward run at first entry
1961*cdf0e10cSrcweir 				nNewHdl = 0;
1962*cdf0e10cSrcweir 			}
1963*cdf0e10cSrcweir 		}
1964*cdf0e10cSrcweir 		else
1965*cdf0e10cSrcweir 		{
1966*cdf0e10cSrcweir 			if(nOldHdl == CONTAINER_ENTRY_NOTFOUND)
1967*cdf0e10cSrcweir 			{
1968*cdf0e10cSrcweir 				// start backward run at last entry
1969*cdf0e10cSrcweir 				nNewHdl = aList.Count() - 1;
1970*cdf0e10cSrcweir 
1971*cdf0e10cSrcweir 			}
1972*cdf0e10cSrcweir 			else
1973*cdf0e10cSrcweir 			{
1974*cdf0e10cSrcweir 				if(nOldHdl == 0)
1975*cdf0e10cSrcweir 				{
1976*cdf0e10cSrcweir 					// end backward run
1977*cdf0e10cSrcweir 					nNewHdl = CONTAINER_ENTRY_NOTFOUND;
1978*cdf0e10cSrcweir 				}
1979*cdf0e10cSrcweir 				else
1980*cdf0e10cSrcweir 				{
1981*cdf0e10cSrcweir 					// simply the previous handle
1982*cdf0e10cSrcweir 					nNewHdl--;
1983*cdf0e10cSrcweir 				}
1984*cdf0e10cSrcweir 			}
1985*cdf0e10cSrcweir 		}
1986*cdf0e10cSrcweir 
1987*cdf0e10cSrcweir 		// #105678# build new HdlNum
1988*cdf0e10cSrcweir 		sal_uInt32 nNewHdlNum(nNewHdl);
1989*cdf0e10cSrcweir 
1990*cdf0e10cSrcweir 		// look for old num in sorted array
1991*cdf0e10cSrcweir 		if(nNewHdl != CONTAINER_ENTRY_NOTFOUND)
1992*cdf0e10cSrcweir 		{
1993*cdf0e10cSrcweir 			SdrHdl* pNew = pHdlAndIndex[nNewHdl].mpHdl;
1994*cdf0e10cSrcweir 
1995*cdf0e10cSrcweir 			for(a = 0; a < aList.Count(); a++)
1996*cdf0e10cSrcweir 			{
1997*cdf0e10cSrcweir 				if((SdrHdl*)aList.GetObject(a) == pNew)
1998*cdf0e10cSrcweir 				{
1999*cdf0e10cSrcweir 					nNewHdlNum = a;
2000*cdf0e10cSrcweir 					break;
2001*cdf0e10cSrcweir 				}
2002*cdf0e10cSrcweir 			}
2003*cdf0e10cSrcweir 		}
2004*cdf0e10cSrcweir 
2005*cdf0e10cSrcweir 		// take care of next handle
2006*cdf0e10cSrcweir 		if(nOldHdlNum != nNewHdlNum)
2007*cdf0e10cSrcweir 		{
2008*cdf0e10cSrcweir 			mnFocusIndex = nNewHdlNum;
2009*cdf0e10cSrcweir 			SdrHdl* pNew = GetHdl(mnFocusIndex);
2010*cdf0e10cSrcweir 
2011*cdf0e10cSrcweir 			if(pNew)
2012*cdf0e10cSrcweir 			{
2013*cdf0e10cSrcweir 				pNew->Touch();
2014*cdf0e10cSrcweir 				//SDObRefresh = sal_True;
2015*cdf0e10cSrcweir 			}
2016*cdf0e10cSrcweir 		}
2017*cdf0e10cSrcweir 
2018*cdf0e10cSrcweir 		// #105678# free mem again
2019*cdf0e10cSrcweir 		delete [] pHdlAndIndex;
2020*cdf0e10cSrcweir 	}
2021*cdf0e10cSrcweir }
2022*cdf0e10cSrcweir 
2023*cdf0e10cSrcweir SdrHdl* SdrHdlList::GetFocusHdl() const
2024*cdf0e10cSrcweir {
2025*cdf0e10cSrcweir 	if(mnFocusIndex != CONTAINER_ENTRY_NOTFOUND && mnFocusIndex < GetHdlCount())
2026*cdf0e10cSrcweir 		return GetHdl(mnFocusIndex);
2027*cdf0e10cSrcweir 	else
2028*cdf0e10cSrcweir 		return 0L;
2029*cdf0e10cSrcweir }
2030*cdf0e10cSrcweir 
2031*cdf0e10cSrcweir void SdrHdlList::SetFocusHdl(SdrHdl* pNew)
2032*cdf0e10cSrcweir {
2033*cdf0e10cSrcweir 	if(pNew)
2034*cdf0e10cSrcweir 	{
2035*cdf0e10cSrcweir 		SdrHdl* pActual = GetFocusHdl();
2036*cdf0e10cSrcweir 
2037*cdf0e10cSrcweir 		if(!pActual || pActual != pNew)
2038*cdf0e10cSrcweir 		{
2039*cdf0e10cSrcweir 			sal_uIntPtr nNewHdlNum = GetHdlNum(pNew);
2040*cdf0e10cSrcweir 
2041*cdf0e10cSrcweir 			if(nNewHdlNum != CONTAINER_ENTRY_NOTFOUND)
2042*cdf0e10cSrcweir 			{
2043*cdf0e10cSrcweir 				//SDOsal_Bool bRefresh(sal_False);
2044*cdf0e10cSrcweir 				mnFocusIndex = nNewHdlNum;
2045*cdf0e10cSrcweir 
2046*cdf0e10cSrcweir 				if(pActual)
2047*cdf0e10cSrcweir 				{
2048*cdf0e10cSrcweir 					pActual->Touch();
2049*cdf0e10cSrcweir 					//SDObRefresh = sal_True;
2050*cdf0e10cSrcweir 				}
2051*cdf0e10cSrcweir 
2052*cdf0e10cSrcweir 				if(pNew)
2053*cdf0e10cSrcweir 				{
2054*cdf0e10cSrcweir 					pNew->Touch();
2055*cdf0e10cSrcweir 					//SDObRefresh = sal_True;
2056*cdf0e10cSrcweir 				}
2057*cdf0e10cSrcweir 
2058*cdf0e10cSrcweir 				//OLMif(bRefresh)
2059*cdf0e10cSrcweir 				//OLM{
2060*cdf0e10cSrcweir 				//OLM	if(pView)
2061*cdf0e10cSrcweir 				//OLM		pView->RefreshAllIAOManagers();
2062*cdf0e10cSrcweir 				//OLM}
2063*cdf0e10cSrcweir 			}
2064*cdf0e10cSrcweir 		}
2065*cdf0e10cSrcweir 	}
2066*cdf0e10cSrcweir }
2067*cdf0e10cSrcweir 
2068*cdf0e10cSrcweir void SdrHdlList::ResetFocusHdl()
2069*cdf0e10cSrcweir {
2070*cdf0e10cSrcweir 	SdrHdl* pHdl = GetFocusHdl();
2071*cdf0e10cSrcweir 
2072*cdf0e10cSrcweir 	mnFocusIndex = CONTAINER_ENTRY_NOTFOUND;
2073*cdf0e10cSrcweir 
2074*cdf0e10cSrcweir 	if(pHdl)
2075*cdf0e10cSrcweir 	{
2076*cdf0e10cSrcweir 		pHdl->Touch();
2077*cdf0e10cSrcweir 	}
2078*cdf0e10cSrcweir }
2079*cdf0e10cSrcweir 
2080*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
2081*cdf0e10cSrcweir 
2082*cdf0e10cSrcweir SdrHdlList::SdrHdlList(SdrMarkView* pV)
2083*cdf0e10cSrcweir :	mnFocusIndex(CONTAINER_ENTRY_NOTFOUND),
2084*cdf0e10cSrcweir 	pView(pV),
2085*cdf0e10cSrcweir 	aList(1024,32,32)
2086*cdf0e10cSrcweir {
2087*cdf0e10cSrcweir 	nHdlSize = 3;
2088*cdf0e10cSrcweir 	bRotateShear = sal_False;
2089*cdf0e10cSrcweir 	bMoveOutside = sal_False;
2090*cdf0e10cSrcweir 	bDistortShear = sal_False;
2091*cdf0e10cSrcweir 	bFineHandles = sal_False;
2092*cdf0e10cSrcweir }
2093*cdf0e10cSrcweir 
2094*cdf0e10cSrcweir SdrHdlList::~SdrHdlList()
2095*cdf0e10cSrcweir {
2096*cdf0e10cSrcweir 	Clear();
2097*cdf0e10cSrcweir }
2098*cdf0e10cSrcweir 
2099*cdf0e10cSrcweir void SdrHdlList::SetHdlSize(sal_uInt16 nSiz)
2100*cdf0e10cSrcweir {
2101*cdf0e10cSrcweir 	if(nHdlSize != nSiz)
2102*cdf0e10cSrcweir 	{
2103*cdf0e10cSrcweir 		// remember new value
2104*cdf0e10cSrcweir 		nHdlSize = nSiz;
2105*cdf0e10cSrcweir 
2106*cdf0e10cSrcweir 		// propagate change to IAOs
2107*cdf0e10cSrcweir 		for(sal_uInt32 i=0; i<GetHdlCount(); i++)
2108*cdf0e10cSrcweir 		{
2109*cdf0e10cSrcweir 			SdrHdl* pHdl = GetHdl(i);
2110*cdf0e10cSrcweir 			pHdl->Touch();
2111*cdf0e10cSrcweir 		}
2112*cdf0e10cSrcweir 	}
2113*cdf0e10cSrcweir }
2114*cdf0e10cSrcweir 
2115*cdf0e10cSrcweir void SdrHdlList::SetMoveOutside(sal_Bool bOn)
2116*cdf0e10cSrcweir {
2117*cdf0e10cSrcweir 	if(bMoveOutside != bOn)
2118*cdf0e10cSrcweir 	{
2119*cdf0e10cSrcweir 		// remember new value
2120*cdf0e10cSrcweir 		bMoveOutside = bOn;
2121*cdf0e10cSrcweir 
2122*cdf0e10cSrcweir 		// propagate change to IAOs
2123*cdf0e10cSrcweir 		for(sal_uInt32 i=0; i<GetHdlCount(); i++)
2124*cdf0e10cSrcweir 		{
2125*cdf0e10cSrcweir 			SdrHdl* pHdl = GetHdl(i);
2126*cdf0e10cSrcweir 			pHdl->Touch();
2127*cdf0e10cSrcweir 		}
2128*cdf0e10cSrcweir 	}
2129*cdf0e10cSrcweir }
2130*cdf0e10cSrcweir 
2131*cdf0e10cSrcweir void SdrHdlList::SetRotateShear(sal_Bool bOn)
2132*cdf0e10cSrcweir {
2133*cdf0e10cSrcweir 	bRotateShear = bOn;
2134*cdf0e10cSrcweir }
2135*cdf0e10cSrcweir 
2136*cdf0e10cSrcweir void SdrHdlList::SetDistortShear(sal_Bool bOn)
2137*cdf0e10cSrcweir {
2138*cdf0e10cSrcweir 	bDistortShear = bOn;
2139*cdf0e10cSrcweir }
2140*cdf0e10cSrcweir 
2141*cdf0e10cSrcweir void SdrHdlList::SetFineHdl(sal_Bool bOn)
2142*cdf0e10cSrcweir {
2143*cdf0e10cSrcweir 	if(bFineHandles != bOn)
2144*cdf0e10cSrcweir 	{
2145*cdf0e10cSrcweir 		// remember new state
2146*cdf0e10cSrcweir 		bFineHandles = bOn;
2147*cdf0e10cSrcweir 
2148*cdf0e10cSrcweir 		// propagate change to IAOs
2149*cdf0e10cSrcweir 		for(sal_uInt32 i=0; i<GetHdlCount(); i++)
2150*cdf0e10cSrcweir 		{
2151*cdf0e10cSrcweir 			SdrHdl* pHdl = GetHdl(i);
2152*cdf0e10cSrcweir 			pHdl->Touch();
2153*cdf0e10cSrcweir 		}
2154*cdf0e10cSrcweir 	}
2155*cdf0e10cSrcweir }
2156*cdf0e10cSrcweir 
2157*cdf0e10cSrcweir SdrHdl* SdrHdlList::RemoveHdl(sal_uIntPtr nNum)
2158*cdf0e10cSrcweir {
2159*cdf0e10cSrcweir 	SdrHdl* pRetval = (SdrHdl*)aList.Remove(nNum);
2160*cdf0e10cSrcweir 
2161*cdf0e10cSrcweir 	return pRetval;
2162*cdf0e10cSrcweir }
2163*cdf0e10cSrcweir 
2164*cdf0e10cSrcweir void SdrHdlList::Clear()
2165*cdf0e10cSrcweir {
2166*cdf0e10cSrcweir 	for (sal_uIntPtr i=0; i<GetHdlCount(); i++)
2167*cdf0e10cSrcweir 	{
2168*cdf0e10cSrcweir 		SdrHdl* pHdl=GetHdl(i);
2169*cdf0e10cSrcweir 		delete pHdl;
2170*cdf0e10cSrcweir 	}
2171*cdf0e10cSrcweir 	aList.Clear();
2172*cdf0e10cSrcweir 
2173*cdf0e10cSrcweir 	bRotateShear=sal_False;
2174*cdf0e10cSrcweir 	bDistortShear=sal_False;
2175*cdf0e10cSrcweir }
2176*cdf0e10cSrcweir 
2177*cdf0e10cSrcweir void SdrHdlList::Sort()
2178*cdf0e10cSrcweir {
2179*cdf0e10cSrcweir 	// #97016# II: remember current focused handle
2180*cdf0e10cSrcweir 	SdrHdl* pPrev = GetFocusHdl();
2181*cdf0e10cSrcweir 
2182*cdf0e10cSrcweir     ImpSdrHdlListSorter aSort(aList);
2183*cdf0e10cSrcweir     aSort.DoSort();
2184*cdf0e10cSrcweir 
2185*cdf0e10cSrcweir 	// #97016# II: get now and compare
2186*cdf0e10cSrcweir 	SdrHdl* pNow = GetFocusHdl();
2187*cdf0e10cSrcweir 
2188*cdf0e10cSrcweir 	if(pPrev != pNow)
2189*cdf0e10cSrcweir 	{
2190*cdf0e10cSrcweir 		//SDOsal_Bool bRefresh(sal_False);
2191*cdf0e10cSrcweir 
2192*cdf0e10cSrcweir 		if(pPrev)
2193*cdf0e10cSrcweir 		{
2194*cdf0e10cSrcweir 			pPrev->Touch();
2195*cdf0e10cSrcweir 			//SDObRefresh = sal_True;
2196*cdf0e10cSrcweir 		}
2197*cdf0e10cSrcweir 
2198*cdf0e10cSrcweir 		if(pNow)
2199*cdf0e10cSrcweir 		{
2200*cdf0e10cSrcweir 			pNow->Touch();
2201*cdf0e10cSrcweir 			//SDObRefresh = sal_True;
2202*cdf0e10cSrcweir 		}
2203*cdf0e10cSrcweir 	}
2204*cdf0e10cSrcweir }
2205*cdf0e10cSrcweir 
2206*cdf0e10cSrcweir sal_uIntPtr SdrHdlList::GetHdlNum(const SdrHdl* pHdl) const
2207*cdf0e10cSrcweir {
2208*cdf0e10cSrcweir     if (pHdl==NULL)
2209*cdf0e10cSrcweir 		return CONTAINER_ENTRY_NOTFOUND;
2210*cdf0e10cSrcweir     sal_uIntPtr nPos=aList.GetPos(pHdl);
2211*cdf0e10cSrcweir     return nPos;
2212*cdf0e10cSrcweir }
2213*cdf0e10cSrcweir 
2214*cdf0e10cSrcweir void SdrHdlList::AddHdl(SdrHdl* pHdl, sal_Bool bAtBegin)
2215*cdf0e10cSrcweir {
2216*cdf0e10cSrcweir     if (pHdl!=NULL)
2217*cdf0e10cSrcweir 	{
2218*cdf0e10cSrcweir         if (bAtBegin)
2219*cdf0e10cSrcweir 		{
2220*cdf0e10cSrcweir             aList.Insert(pHdl,sal_uIntPtr(0));
2221*cdf0e10cSrcweir         }
2222*cdf0e10cSrcweir 		else
2223*cdf0e10cSrcweir 		{
2224*cdf0e10cSrcweir             aList.Insert(pHdl,CONTAINER_APPEND);
2225*cdf0e10cSrcweir         }
2226*cdf0e10cSrcweir         pHdl->SetHdlList(this);
2227*cdf0e10cSrcweir     }
2228*cdf0e10cSrcweir }
2229*cdf0e10cSrcweir 
2230*cdf0e10cSrcweir SdrHdl* SdrHdlList::IsHdlListHit(const Point& rPnt, sal_Bool bBack, sal_Bool bNext, SdrHdl* pHdl0) const
2231*cdf0e10cSrcweir {
2232*cdf0e10cSrcweir    SdrHdl* pRet=NULL;
2233*cdf0e10cSrcweir    sal_uIntPtr nAnz=GetHdlCount();
2234*cdf0e10cSrcweir    sal_uIntPtr nNum=bBack ? 0 : nAnz;
2235*cdf0e10cSrcweir    while ((bBack ? nNum<nAnz : nNum>0) && pRet==NULL)
2236*cdf0e10cSrcweir    {
2237*cdf0e10cSrcweir        if (!bBack)
2238*cdf0e10cSrcweir 		   nNum--;
2239*cdf0e10cSrcweir        SdrHdl* pHdl=GetHdl(nNum);
2240*cdf0e10cSrcweir        if (bNext)
2241*cdf0e10cSrcweir 	   {
2242*cdf0e10cSrcweir            if (pHdl==pHdl0)
2243*cdf0e10cSrcweir 			   bNext=sal_False;
2244*cdf0e10cSrcweir        }
2245*cdf0e10cSrcweir 	   else
2246*cdf0e10cSrcweir 	   {
2247*cdf0e10cSrcweir            if (pHdl->IsHdlHit(rPnt))
2248*cdf0e10cSrcweir 			   pRet=pHdl;
2249*cdf0e10cSrcweir        }
2250*cdf0e10cSrcweir        if (bBack)
2251*cdf0e10cSrcweir 		   nNum++;
2252*cdf0e10cSrcweir    }
2253*cdf0e10cSrcweir    return pRet;
2254*cdf0e10cSrcweir }
2255*cdf0e10cSrcweir 
2256*cdf0e10cSrcweir SdrHdl* SdrHdlList::GetHdl(SdrHdlKind eKind1) const
2257*cdf0e10cSrcweir {
2258*cdf0e10cSrcweir    SdrHdl* pRet=NULL;
2259*cdf0e10cSrcweir    for (sal_uIntPtr i=0; i<GetHdlCount() && pRet==NULL; i++)
2260*cdf0e10cSrcweir    {
2261*cdf0e10cSrcweir        SdrHdl* pHdl=GetHdl(i);
2262*cdf0e10cSrcweir        if (pHdl->GetKind()==eKind1)
2263*cdf0e10cSrcweir 		   pRet=pHdl;
2264*cdf0e10cSrcweir    }
2265*cdf0e10cSrcweir    return pRet;
2266*cdf0e10cSrcweir }
2267*cdf0e10cSrcweir 
2268*cdf0e10cSrcweir // --------------------------------------------------------------------
2269*cdf0e10cSrcweir // SdrCropHdl
2270*cdf0e10cSrcweir // --------------------------------------------------------------------
2271*cdf0e10cSrcweir 
2272*cdf0e10cSrcweir SdrCropHdl::SdrCropHdl(const Point& rPnt, SdrHdlKind eNewKind)
2273*cdf0e10cSrcweir : SdrHdl( rPnt, eNewKind )
2274*cdf0e10cSrcweir {
2275*cdf0e10cSrcweir }
2276*cdf0e10cSrcweir 
2277*cdf0e10cSrcweir // --------------------------------------------------------------------
2278*cdf0e10cSrcweir 
2279*cdf0e10cSrcweir BitmapEx SdrCropHdl::GetHandlesBitmap( bool bIsFineHdl, bool bIsHighContrast )
2280*cdf0e10cSrcweir {
2281*cdf0e10cSrcweir 	if( bIsHighContrast )
2282*cdf0e10cSrcweir 	{
2283*cdf0e10cSrcweir 		static BitmapEx* pHighContrastBitmap = 0;
2284*cdf0e10cSrcweir 		if( pHighContrastBitmap == 0 )
2285*cdf0e10cSrcweir 			pHighContrastBitmap = new BitmapEx(ResId(SIP_SA_ACCESSIBILITY_CROP_MARKERS, *ImpGetResMgr()));
2286*cdf0e10cSrcweir 		return *pHighContrastBitmap;
2287*cdf0e10cSrcweir 	}
2288*cdf0e10cSrcweir 	else if( bIsFineHdl )
2289*cdf0e10cSrcweir 	{
2290*cdf0e10cSrcweir 		static BitmapEx* pModernBitmap = 0;
2291*cdf0e10cSrcweir 		if( pModernBitmap == 0 )
2292*cdf0e10cSrcweir 			pModernBitmap = new BitmapEx(ResId(SIP_SA_CROP_FINE_MARKERS, *ImpGetResMgr()));
2293*cdf0e10cSrcweir 		return *pModernBitmap;
2294*cdf0e10cSrcweir 	}
2295*cdf0e10cSrcweir 	else
2296*cdf0e10cSrcweir 	{
2297*cdf0e10cSrcweir 		static BitmapEx* pSimpleBitmap = 0;
2298*cdf0e10cSrcweir 		if( pSimpleBitmap == 0 )
2299*cdf0e10cSrcweir 			pSimpleBitmap = new BitmapEx(ResId(SIP_SA_CROP_MARKERS, *ImpGetResMgr()));
2300*cdf0e10cSrcweir 		return *pSimpleBitmap;
2301*cdf0e10cSrcweir 	}
2302*cdf0e10cSrcweir }
2303*cdf0e10cSrcweir 
2304*cdf0e10cSrcweir // --------------------------------------------------------------------
2305*cdf0e10cSrcweir 
2306*cdf0e10cSrcweir BitmapEx SdrCropHdl::GetBitmapForHandle( const BitmapEx& rBitmap, int nSize )
2307*cdf0e10cSrcweir {
2308*cdf0e10cSrcweir 	int nPixelSize = 0, nX = 0, nY = 0, nOffset = 0;
2309*cdf0e10cSrcweir 
2310*cdf0e10cSrcweir 	if( nSize <= 3 )
2311*cdf0e10cSrcweir 	{
2312*cdf0e10cSrcweir 		nPixelSize = 13;
2313*cdf0e10cSrcweir 		nOffset = 0;
2314*cdf0e10cSrcweir 	}
2315*cdf0e10cSrcweir 	else if( nSize <=4 )
2316*cdf0e10cSrcweir 	{
2317*cdf0e10cSrcweir 		nPixelSize = 17;
2318*cdf0e10cSrcweir 		nOffset = 36;
2319*cdf0e10cSrcweir 	}
2320*cdf0e10cSrcweir 	else
2321*cdf0e10cSrcweir 	{
2322*cdf0e10cSrcweir 		nPixelSize = 21;
2323*cdf0e10cSrcweir 		nOffset = 84;
2324*cdf0e10cSrcweir 	}
2325*cdf0e10cSrcweir 
2326*cdf0e10cSrcweir 	switch( eKind )
2327*cdf0e10cSrcweir 	{
2328*cdf0e10cSrcweir 		case HDL_UPLFT: nX = 0; nY = 0; break;
2329*cdf0e10cSrcweir 		case HDL_UPPER: nX = 1; nY = 0; break;
2330*cdf0e10cSrcweir 		case HDL_UPRGT: nX = 2; nY = 0; break;
2331*cdf0e10cSrcweir 		case HDL_LEFT:  nX = 0; nY = 1; break;
2332*cdf0e10cSrcweir 		case HDL_RIGHT: nX = 2; nY = 1; break;
2333*cdf0e10cSrcweir 		case HDL_LWLFT: nX = 0; nY = 2; break;
2334*cdf0e10cSrcweir 		case HDL_LOWER: nX = 1; nY = 2; break;
2335*cdf0e10cSrcweir 		case HDL_LWRGT: nX = 2; nY = 2; break;
2336*cdf0e10cSrcweir 		default: break;
2337*cdf0e10cSrcweir 	}
2338*cdf0e10cSrcweir 
2339*cdf0e10cSrcweir 	Rectangle aSourceRect( Point( nX * (nPixelSize-1) + nOffset,  nY * (nPixelSize-1)), Size(nPixelSize, nPixelSize) );
2340*cdf0e10cSrcweir 
2341*cdf0e10cSrcweir 	BitmapEx aRetval(rBitmap);
2342*cdf0e10cSrcweir 	aRetval.Crop(aSourceRect);
2343*cdf0e10cSrcweir 	return aRetval;
2344*cdf0e10cSrcweir }
2345*cdf0e10cSrcweir 
2346*cdf0e10cSrcweir // --------------------------------------------------------------------
2347*cdf0e10cSrcweir 
2348*cdf0e10cSrcweir void SdrCropHdl::CreateB2dIAObject()
2349*cdf0e10cSrcweir {
2350*cdf0e10cSrcweir 	// first throw away old one
2351*cdf0e10cSrcweir 	GetRidOfIAObject();
2352*cdf0e10cSrcweir 
2353*cdf0e10cSrcweir 	SdrMarkView* pView = pHdlList ? pHdlList->GetView() : 0;
2354*cdf0e10cSrcweir 	SdrPageView* pPageView = pView ? pView->GetSdrPageView() : 0;
2355*cdf0e10cSrcweir 
2356*cdf0e10cSrcweir 	if( pPageView && !pView->areMarkHandlesHidden() )
2357*cdf0e10cSrcweir 	{
2358*cdf0e10cSrcweir 		sal_Bool bIsFineHdl(pHdlList->IsFineHdl());
2359*cdf0e10cSrcweir 		const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
2360*cdf0e10cSrcweir 		sal_Bool bIsHighContrast(rStyleSettings.GetHighContrastMode());
2361*cdf0e10cSrcweir 		int nHdlSize = pHdlList->GetHdlSize();
2362*cdf0e10cSrcweir 		if( bIsHighContrast )
2363*cdf0e10cSrcweir 			nHdlSize = 4;
2364*cdf0e10cSrcweir 
2365*cdf0e10cSrcweir 		const BitmapEx aHandlesBitmap( GetHandlesBitmap( bIsFineHdl, bIsHighContrast ) );
2366*cdf0e10cSrcweir 		BitmapEx aBmpEx1( GetBitmapForHandle( aHandlesBitmap, nHdlSize ) );
2367*cdf0e10cSrcweir 
2368*cdf0e10cSrcweir 		for(sal_uInt32 b(0L); b < pPageView->PageWindowCount(); b++)
2369*cdf0e10cSrcweir 		{
2370*cdf0e10cSrcweir 			// const SdrPageViewWinRec& rPageViewWinRec = rPageViewWinList[b];
2371*cdf0e10cSrcweir 			const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
2372*cdf0e10cSrcweir 
2373*cdf0e10cSrcweir 			if(rPageWindow.GetPaintWindow().OutputToWindow())
2374*cdf0e10cSrcweir 			{
2375*cdf0e10cSrcweir 				if(rPageWindow.GetOverlayManager())
2376*cdf0e10cSrcweir 				{
2377*cdf0e10cSrcweir 					basegfx::B2DPoint aPosition(aPos.X(), aPos.Y());
2378*cdf0e10cSrcweir 
2379*cdf0e10cSrcweir 					::sdr::overlay::OverlayObject* pOverlayObject = 0L;
2380*cdf0e10cSrcweir 
2381*cdf0e10cSrcweir 					// animate focused handles
2382*cdf0e10cSrcweir 					if(IsFocusHdl() && (pHdlList->GetFocusHdl() == this))
2383*cdf0e10cSrcweir 					{
2384*cdf0e10cSrcweir 						if( nHdlSize >= 2 )
2385*cdf0e10cSrcweir 							nHdlSize = 1;
2386*cdf0e10cSrcweir 
2387*cdf0e10cSrcweir 						BitmapEx aBmpEx2( GetBitmapForHandle( aHandlesBitmap, nHdlSize + 1 ) );
2388*cdf0e10cSrcweir 
2389*cdf0e10cSrcweir 						const sal_uInt32 nBlinkTime = sal::static_int_cast<sal_uInt32>(rStyleSettings.GetCursorBlinkTime());
2390*cdf0e10cSrcweir 
2391*cdf0e10cSrcweir 						pOverlayObject = new ::sdr::overlay::OverlayAnimatedBitmapEx(aPosition, aBmpEx1, aBmpEx2, nBlinkTime,
2392*cdf0e10cSrcweir 							(sal_uInt16)(aBmpEx1.GetSizePixel().Width() - 1) >> 1,
2393*cdf0e10cSrcweir 							(sal_uInt16)(aBmpEx1.GetSizePixel().Height() - 1) >> 1,
2394*cdf0e10cSrcweir 							(sal_uInt16)(aBmpEx2.GetSizePixel().Width() - 1) >> 1,
2395*cdf0e10cSrcweir 							(sal_uInt16)(aBmpEx2.GetSizePixel().Height() - 1) >> 1);
2396*cdf0e10cSrcweir 					}
2397*cdf0e10cSrcweir 					else
2398*cdf0e10cSrcweir 					{
2399*cdf0e10cSrcweir 						// create centered handle as default
2400*cdf0e10cSrcweir 						pOverlayObject = new ::sdr::overlay::OverlayBitmapEx(aPosition, aBmpEx1,
2401*cdf0e10cSrcweir 							(sal_uInt16)(aBmpEx1.GetSizePixel().Width() - 1) >> 1,
2402*cdf0e10cSrcweir 							(sal_uInt16)(aBmpEx1.GetSizePixel().Height() - 1) >> 1);
2403*cdf0e10cSrcweir 					}
2404*cdf0e10cSrcweir 
2405*cdf0e10cSrcweir 					// OVERLAYMANAGER
2406*cdf0e10cSrcweir 					if(pOverlayObject)
2407*cdf0e10cSrcweir 					{
2408*cdf0e10cSrcweir 						rPageWindow.GetOverlayManager()->add(*pOverlayObject);
2409*cdf0e10cSrcweir 						maOverlayGroup.append(*pOverlayObject);
2410*cdf0e10cSrcweir 					}
2411*cdf0e10cSrcweir 				}
2412*cdf0e10cSrcweir 			}
2413*cdf0e10cSrcweir 		}
2414*cdf0e10cSrcweir 	}
2415*cdf0e10cSrcweir }
2416*cdf0e10cSrcweir 
2417*cdf0e10cSrcweir // --------------------------------------------------------------------
2418