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