LCOV - code coverage report
Current view: top level - libreoffice/svx/source/svdraw - svdhdl.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 42 974 4.3 %
Date: 2012-12-27 Functions: 9 89 10.1 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10