1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_drawinglayer.hxx" 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/controlprimitive2d.hxx> 28*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp> 29*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx> 30*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XWindow2.hpp> 31*b1cdbd2cSJim Jagielski #include <drawinglayer/geometry/viewinformation2d.hxx> 32*b1cdbd2cSJim Jagielski #include <vcl/virdev.hxx> 33*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx> 34*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/PosSize.hpp> 35*b1cdbd2cSJim Jagielski #include <vcl/bitmapex.hxx> 36*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/bitmapprimitive2d.hxx> 37*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h> 38*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygontools.hxx> 39*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx> 40*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/polygonprimitive2d.hxx> 41*b1cdbd2cSJim Jagielski #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx> 42*b1cdbd2cSJim Jagielski #include <svtools/optionsdrawinglayer.hxx> 43*b1cdbd2cSJim Jagielski #include <toolkit/awt/vclxwindow.hxx> 44*b1cdbd2cSJim Jagielski #include <vcl/window.hxx> 45*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrixtools.hxx> 46*b1cdbd2cSJim Jagielski 47*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski using namespace com::sun::star; 50*b1cdbd2cSJim Jagielski 51*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 52*b1cdbd2cSJim Jagielski 53*b1cdbd2cSJim Jagielski namespace drawinglayer 54*b1cdbd2cSJim Jagielski { 55*b1cdbd2cSJim Jagielski namespace primitive2d 56*b1cdbd2cSJim Jagielski { createXControl()57*b1cdbd2cSJim Jagielski void ControlPrimitive2D::createXControl() 58*b1cdbd2cSJim Jagielski { 59*b1cdbd2cSJim Jagielski if(!mxXControl.is() && getControlModel().is()) 60*b1cdbd2cSJim Jagielski { 61*b1cdbd2cSJim Jagielski uno::Reference< beans::XPropertySet > xSet(getControlModel(), uno::UNO_QUERY); 62*b1cdbd2cSJim Jagielski 63*b1cdbd2cSJim Jagielski if(xSet.is()) 64*b1cdbd2cSJim Jagielski { 65*b1cdbd2cSJim Jagielski uno::Any aValue(xSet->getPropertyValue(rtl::OUString::createFromAscii("DefaultControl"))); 66*b1cdbd2cSJim Jagielski rtl::OUString aUnoControlTypeName; 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielski if(aValue >>= aUnoControlTypeName) 69*b1cdbd2cSJim Jagielski { 70*b1cdbd2cSJim Jagielski if(aUnoControlTypeName.getLength()) 71*b1cdbd2cSJim Jagielski { 72*b1cdbd2cSJim Jagielski uno::Reference< lang::XMultiServiceFactory > xFactory( comphelper::getProcessServiceFactory() ); 73*b1cdbd2cSJim Jagielski 74*b1cdbd2cSJim Jagielski if(xFactory.is()) 75*b1cdbd2cSJim Jagielski { 76*b1cdbd2cSJim Jagielski uno::Reference< awt::XControl > xXControl(xFactory->createInstance(aUnoControlTypeName), uno::UNO_QUERY); 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski if(xXControl.is()) 79*b1cdbd2cSJim Jagielski { 80*b1cdbd2cSJim Jagielski xXControl->setModel(getControlModel()); 81*b1cdbd2cSJim Jagielski 82*b1cdbd2cSJim Jagielski // remember XControl 83*b1cdbd2cSJim Jagielski mxXControl = xXControl; 84*b1cdbd2cSJim Jagielski } 85*b1cdbd2cSJim Jagielski } 86*b1cdbd2cSJim Jagielski } 87*b1cdbd2cSJim Jagielski } 88*b1cdbd2cSJim Jagielski } 89*b1cdbd2cSJim Jagielski } 90*b1cdbd2cSJim Jagielski } 91*b1cdbd2cSJim Jagielski createBitmapDecomposition(const geometry::ViewInformation2D & rViewInformation) const92*b1cdbd2cSJim Jagielski Primitive2DReference ControlPrimitive2D::createBitmapDecomposition(const geometry::ViewInformation2D& rViewInformation) const 93*b1cdbd2cSJim Jagielski { 94*b1cdbd2cSJim Jagielski Primitive2DReference xRetval; 95*b1cdbd2cSJim Jagielski const uno::Reference< awt::XControl >& rXControl(getXControl()); 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielski if(rXControl.is()) 98*b1cdbd2cSJim Jagielski { 99*b1cdbd2cSJim Jagielski uno::Reference< awt::XWindow > xControlWindow(rXControl, uno::UNO_QUERY); 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski if(xControlWindow.is()) 102*b1cdbd2cSJim Jagielski { 103*b1cdbd2cSJim Jagielski // get decomposition to get size 104*b1cdbd2cSJim Jagielski basegfx::B2DVector aScale, aTranslate; 105*b1cdbd2cSJim Jagielski double fRotate, fShearX; 106*b1cdbd2cSJim Jagielski getTransform().decompose(aScale, aTranslate, fRotate, fShearX); 107*b1cdbd2cSJim Jagielski 108*b1cdbd2cSJim Jagielski // get absolute discrete size (no mirror or rotate here) 109*b1cdbd2cSJim Jagielski aScale = basegfx::absolute(aScale); 110*b1cdbd2cSJim Jagielski basegfx::B2DVector aDiscreteSize(rViewInformation.getObjectToViewTransformation() * aScale); 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski // limit to a maximum square size, e.g. 300x150 pixels (45000) 113*b1cdbd2cSJim Jagielski const SvtOptionsDrawinglayer aDrawinglayerOpt; 114*b1cdbd2cSJim Jagielski const double fDiscreteMax(aDrawinglayerOpt.GetQuadraticFormControlRenderLimit()); 115*b1cdbd2cSJim Jagielski const double fDiscreteQuadratic(aDiscreteSize.getX() * aDiscreteSize.getY()); 116*b1cdbd2cSJim Jagielski const bool bScaleUsed(fDiscreteQuadratic > fDiscreteMax); 117*b1cdbd2cSJim Jagielski double fFactor(1.0); 118*b1cdbd2cSJim Jagielski 119*b1cdbd2cSJim Jagielski if(bScaleUsed) 120*b1cdbd2cSJim Jagielski { 121*b1cdbd2cSJim Jagielski // get factor and adapt to scaled size 122*b1cdbd2cSJim Jagielski fFactor = sqrt(fDiscreteMax / fDiscreteQuadratic); 123*b1cdbd2cSJim Jagielski aDiscreteSize *= fFactor; 124*b1cdbd2cSJim Jagielski } 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski // go to integer 127*b1cdbd2cSJim Jagielski const sal_Int32 nSizeX(basegfx::fround(aDiscreteSize.getX())); 128*b1cdbd2cSJim Jagielski const sal_Int32 nSizeY(basegfx::fround(aDiscreteSize.getY())); 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski if(nSizeX > 0 && nSizeY > 0) 131*b1cdbd2cSJim Jagielski { 132*b1cdbd2cSJim Jagielski // prepare VirtualDevice 133*b1cdbd2cSJim Jagielski VirtualDevice aVirtualDevice(*Application::GetDefaultDevice()); 134*b1cdbd2cSJim Jagielski const Size aSizePixel(nSizeX, nSizeY); 135*b1cdbd2cSJim Jagielski aVirtualDevice.SetOutputSizePixel(aSizePixel); 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski // set size at control 138*b1cdbd2cSJim Jagielski xControlWindow->setPosSize(0, 0, nSizeX, nSizeY, awt::PosSize::POSSIZE); 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski // get graphics and view 141*b1cdbd2cSJim Jagielski uno::Reference< awt::XGraphics > xGraphics(aVirtualDevice.CreateUnoGraphics()); 142*b1cdbd2cSJim Jagielski uno::Reference< awt::XView > xControlView(rXControl, uno::UNO_QUERY); 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski if(xGraphics.is() && xControlView.is()) 145*b1cdbd2cSJim Jagielski { 146*b1cdbd2cSJim Jagielski // link graphics and view 147*b1cdbd2cSJim Jagielski xControlView->setGraphics(xGraphics); 148*b1cdbd2cSJim Jagielski 149*b1cdbd2cSJim Jagielski { // #i93162# For painting the control setting a Zoom (using setZoom() at the xControlView) 150*b1cdbd2cSJim Jagielski // is needed to define the font size. Normally this is done in 151*b1cdbd2cSJim Jagielski // ViewObjectContactOfUnoControl::createPrimitive2DSequence by using positionControlForPaint(). 152*b1cdbd2cSJim Jagielski // For some reason the difference between MAP_TWIPS and MAP_100TH_MM still plays 153*b1cdbd2cSJim Jagielski // a role there so that for Draw/Impress/Calc (the MAP_100TH_MM users) i need to set a zoom 154*b1cdbd2cSJim Jagielski // here, too. The factor includes the needed scale, but is calculated by pure comparisons. It 155*b1cdbd2cSJim Jagielski // is somehow related to the twips/100thmm relationship. 156*b1cdbd2cSJim Jagielski bool bUserIs100thmm(false); 157*b1cdbd2cSJim Jagielski const uno::Reference< awt::XControl > xControl(xControlView, uno::UNO_QUERY); 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski if(xControl.is()) 160*b1cdbd2cSJim Jagielski { 161*b1cdbd2cSJim Jagielski uno::Reference< awt::XWindowPeer > xWindowPeer(xControl->getPeer()); 162*b1cdbd2cSJim Jagielski 163*b1cdbd2cSJim Jagielski if(xWindowPeer.is()) 164*b1cdbd2cSJim Jagielski { 165*b1cdbd2cSJim Jagielski VCLXWindow* pVCLXWindow = VCLXWindow::GetImplementation(xWindowPeer); 166*b1cdbd2cSJim Jagielski 167*b1cdbd2cSJim Jagielski if(pVCLXWindow) 168*b1cdbd2cSJim Jagielski { 169*b1cdbd2cSJim Jagielski Window* pWindow = pVCLXWindow->GetWindow(); 170*b1cdbd2cSJim Jagielski 171*b1cdbd2cSJim Jagielski if(pWindow) 172*b1cdbd2cSJim Jagielski { 173*b1cdbd2cSJim Jagielski pWindow = pWindow->GetParent(); 174*b1cdbd2cSJim Jagielski 175*b1cdbd2cSJim Jagielski if(pWindow) 176*b1cdbd2cSJim Jagielski { 177*b1cdbd2cSJim Jagielski if(MAP_100TH_MM == pWindow->GetMapMode().GetMapUnit()) 178*b1cdbd2cSJim Jagielski { 179*b1cdbd2cSJim Jagielski bUserIs100thmm = true; 180*b1cdbd2cSJim Jagielski } 181*b1cdbd2cSJim Jagielski } 182*b1cdbd2cSJim Jagielski } 183*b1cdbd2cSJim Jagielski } 184*b1cdbd2cSJim Jagielski } 185*b1cdbd2cSJim Jagielski } 186*b1cdbd2cSJim Jagielski 187*b1cdbd2cSJim Jagielski if(bUserIs100thmm) 188*b1cdbd2cSJim Jagielski { 189*b1cdbd2cSJim Jagielski // calc screen zoom for text display. fFactor is already added indirectly in aDiscreteSize 190*b1cdbd2cSJim Jagielski basegfx::B2DVector aScreenZoom( 191*b1cdbd2cSJim Jagielski basegfx::fTools::equalZero(aScale.getX()) ? 1.0 : aDiscreteSize.getX() / aScale.getX(), 192*b1cdbd2cSJim Jagielski basegfx::fTools::equalZero(aScale.getY()) ? 1.0 : aDiscreteSize.getY() / aScale.getY()); 193*b1cdbd2cSJim Jagielski static double fZoomScale(28.0); // do not ask for this constant factor, but it gets the zoom right 194*b1cdbd2cSJim Jagielski aScreenZoom *= fZoomScale; 195*b1cdbd2cSJim Jagielski 196*b1cdbd2cSJim Jagielski // set zoom at control view for text scaling 197*b1cdbd2cSJim Jagielski xControlView->setZoom((float)aScreenZoom.getX(), (float)aScreenZoom.getY()); 198*b1cdbd2cSJim Jagielski } 199*b1cdbd2cSJim Jagielski } 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski try 202*b1cdbd2cSJim Jagielski { 203*b1cdbd2cSJim Jagielski // try to paint it to VirtualDevice 204*b1cdbd2cSJim Jagielski xControlView->draw(0, 0); 205*b1cdbd2cSJim Jagielski 206*b1cdbd2cSJim Jagielski // get bitmap 207*b1cdbd2cSJim Jagielski const Bitmap aContent(aVirtualDevice.GetBitmap(Point(), aSizePixel)); 208*b1cdbd2cSJim Jagielski 209*b1cdbd2cSJim Jagielski // to avoid scaling, use the Bitmap pixel size as primitive size 210*b1cdbd2cSJim Jagielski const Size aBitmapSize(aContent.GetSizePixel()); 211*b1cdbd2cSJim Jagielski basegfx::B2DVector aBitmapSizeLogic( 212*b1cdbd2cSJim Jagielski rViewInformation.getInverseObjectToViewTransformation() * 213*b1cdbd2cSJim Jagielski basegfx::B2DVector(aBitmapSize.getWidth() - 1, aBitmapSize.getHeight() - 1)); 214*b1cdbd2cSJim Jagielski 215*b1cdbd2cSJim Jagielski if(bScaleUsed) 216*b1cdbd2cSJim Jagielski { 217*b1cdbd2cSJim Jagielski // if scaled adapt to scaled size 218*b1cdbd2cSJim Jagielski aBitmapSizeLogic /= fFactor; 219*b1cdbd2cSJim Jagielski } 220*b1cdbd2cSJim Jagielski 221*b1cdbd2cSJim Jagielski // short form for scale and translate transformation 222*b1cdbd2cSJim Jagielski const basegfx::B2DHomMatrix aBitmapTransform(basegfx::tools::createScaleTranslateB2DHomMatrix( 223*b1cdbd2cSJim Jagielski aBitmapSizeLogic.getX(), aBitmapSizeLogic.getY(), aTranslate.getX(), aTranslate.getY())); 224*b1cdbd2cSJim Jagielski 225*b1cdbd2cSJim Jagielski // create primitive 226*b1cdbd2cSJim Jagielski xRetval = new BitmapPrimitive2D(BitmapEx(aContent), aBitmapTransform); 227*b1cdbd2cSJim Jagielski } 228*b1cdbd2cSJim Jagielski catch( const uno::Exception& ) 229*b1cdbd2cSJim Jagielski { 230*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 231*b1cdbd2cSJim Jagielski } 232*b1cdbd2cSJim Jagielski } 233*b1cdbd2cSJim Jagielski } 234*b1cdbd2cSJim Jagielski } 235*b1cdbd2cSJim Jagielski } 236*b1cdbd2cSJim Jagielski 237*b1cdbd2cSJim Jagielski return xRetval; 238*b1cdbd2cSJim Jagielski } 239*b1cdbd2cSJim Jagielski createPlaceholderDecomposition(const geometry::ViewInformation2D &) const240*b1cdbd2cSJim Jagielski Primitive2DReference ControlPrimitive2D::createPlaceholderDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const 241*b1cdbd2cSJim Jagielski { 242*b1cdbd2cSJim Jagielski // create a gray placeholder hairline polygon in object size 243*b1cdbd2cSJim Jagielski basegfx::B2DRange aObjectRange(0.0, 0.0, 1.0, 1.0); 244*b1cdbd2cSJim Jagielski aObjectRange.transform(getTransform()); 245*b1cdbd2cSJim Jagielski const basegfx::B2DPolygon aOutline(basegfx::tools::createPolygonFromRect(aObjectRange)); 246*b1cdbd2cSJim Jagielski const basegfx::BColor aGrayTone(0xc0 / 255.0, 0xc0 / 255.0, 0xc0 / 255.0); 247*b1cdbd2cSJim Jagielski 248*b1cdbd2cSJim Jagielski // The replacement object may also get a text like 'empty group' here later 249*b1cdbd2cSJim Jagielski Primitive2DReference xRetval(new PolygonHairlinePrimitive2D(aOutline, aGrayTone)); 250*b1cdbd2cSJim Jagielski 251*b1cdbd2cSJim Jagielski return xRetval; 252*b1cdbd2cSJim Jagielski } 253*b1cdbd2cSJim Jagielski create2DDecomposition(const geometry::ViewInformation2D & rViewInformation) const254*b1cdbd2cSJim Jagielski Primitive2DSequence ControlPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const 255*b1cdbd2cSJim Jagielski { 256*b1cdbd2cSJim Jagielski // try to create a bitmap decomposition. If that fails for some reason, 257*b1cdbd2cSJim Jagielski // at least create a replacement decomposition. 258*b1cdbd2cSJim Jagielski Primitive2DReference xReference(createBitmapDecomposition(rViewInformation)); 259*b1cdbd2cSJim Jagielski 260*b1cdbd2cSJim Jagielski if(!xReference.is()) 261*b1cdbd2cSJim Jagielski { 262*b1cdbd2cSJim Jagielski xReference = createPlaceholderDecomposition(rViewInformation); 263*b1cdbd2cSJim Jagielski } 264*b1cdbd2cSJim Jagielski 265*b1cdbd2cSJim Jagielski return Primitive2DSequence(&xReference, 1L); 266*b1cdbd2cSJim Jagielski } 267*b1cdbd2cSJim Jagielski ControlPrimitive2D(const basegfx::B2DHomMatrix & rTransform,const uno::Reference<awt::XControlModel> & rxControlModel)268*b1cdbd2cSJim Jagielski ControlPrimitive2D::ControlPrimitive2D( 269*b1cdbd2cSJim Jagielski const basegfx::B2DHomMatrix& rTransform, 270*b1cdbd2cSJim Jagielski const uno::Reference< awt::XControlModel >& rxControlModel) 271*b1cdbd2cSJim Jagielski : BufferedDecompositionPrimitive2D(), 272*b1cdbd2cSJim Jagielski maTransform(rTransform), 273*b1cdbd2cSJim Jagielski mxControlModel(rxControlModel), 274*b1cdbd2cSJim Jagielski mxXControl(), 275*b1cdbd2cSJim Jagielski maLastViewScaling() 276*b1cdbd2cSJim Jagielski { 277*b1cdbd2cSJim Jagielski } 278*b1cdbd2cSJim Jagielski ControlPrimitive2D(const basegfx::B2DHomMatrix & rTransform,const uno::Reference<awt::XControlModel> & rxControlModel,const uno::Reference<awt::XControl> & rxXControl)279*b1cdbd2cSJim Jagielski ControlPrimitive2D::ControlPrimitive2D( 280*b1cdbd2cSJim Jagielski const basegfx::B2DHomMatrix& rTransform, 281*b1cdbd2cSJim Jagielski const uno::Reference< awt::XControlModel >& rxControlModel, 282*b1cdbd2cSJim Jagielski const uno::Reference< awt::XControl >& rxXControl) 283*b1cdbd2cSJim Jagielski : BufferedDecompositionPrimitive2D(), 284*b1cdbd2cSJim Jagielski maTransform(rTransform), 285*b1cdbd2cSJim Jagielski mxControlModel(rxControlModel), 286*b1cdbd2cSJim Jagielski mxXControl(rxXControl), 287*b1cdbd2cSJim Jagielski maLastViewScaling() 288*b1cdbd2cSJim Jagielski { 289*b1cdbd2cSJim Jagielski } 290*b1cdbd2cSJim Jagielski getXControl() const291*b1cdbd2cSJim Jagielski const uno::Reference< awt::XControl >& ControlPrimitive2D::getXControl() const 292*b1cdbd2cSJim Jagielski { 293*b1cdbd2cSJim Jagielski if(!mxXControl.is()) 294*b1cdbd2cSJim Jagielski { 295*b1cdbd2cSJim Jagielski const_cast< ControlPrimitive2D* >(this)->createXControl(); 296*b1cdbd2cSJim Jagielski } 297*b1cdbd2cSJim Jagielski 298*b1cdbd2cSJim Jagielski return mxXControl; 299*b1cdbd2cSJim Jagielski } 300*b1cdbd2cSJim Jagielski operator ==(const BasePrimitive2D & rPrimitive) const301*b1cdbd2cSJim Jagielski bool ControlPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const 302*b1cdbd2cSJim Jagielski { 303*b1cdbd2cSJim Jagielski // use base class compare operator 304*b1cdbd2cSJim Jagielski if(BufferedDecompositionPrimitive2D::operator==(rPrimitive)) 305*b1cdbd2cSJim Jagielski { 306*b1cdbd2cSJim Jagielski const ControlPrimitive2D& rCompare = (ControlPrimitive2D&)rPrimitive; 307*b1cdbd2cSJim Jagielski 308*b1cdbd2cSJim Jagielski if(getTransform() == rCompare.getTransform()) 309*b1cdbd2cSJim Jagielski { 310*b1cdbd2cSJim Jagielski // check if ControlModel references both are/are not 311*b1cdbd2cSJim Jagielski bool bRetval(getControlModel().is() == rCompare.getControlModel().is()); 312*b1cdbd2cSJim Jagielski 313*b1cdbd2cSJim Jagielski if(bRetval && getControlModel().is()) 314*b1cdbd2cSJim Jagielski { 315*b1cdbd2cSJim Jagielski // both exist, check for equality 316*b1cdbd2cSJim Jagielski bRetval = (getControlModel() == rCompare.getControlModel()); 317*b1cdbd2cSJim Jagielski } 318*b1cdbd2cSJim Jagielski 319*b1cdbd2cSJim Jagielski if(bRetval) 320*b1cdbd2cSJim Jagielski { 321*b1cdbd2cSJim Jagielski // check if XControl references both are/are not 322*b1cdbd2cSJim Jagielski bRetval = (getXControl().is() == rCompare.getXControl().is()); 323*b1cdbd2cSJim Jagielski } 324*b1cdbd2cSJim Jagielski 325*b1cdbd2cSJim Jagielski if(bRetval && getXControl().is()) 326*b1cdbd2cSJim Jagielski { 327*b1cdbd2cSJim Jagielski // both exist, check for equality 328*b1cdbd2cSJim Jagielski bRetval = (getXControl() == rCompare.getXControl()); 329*b1cdbd2cSJim Jagielski } 330*b1cdbd2cSJim Jagielski 331*b1cdbd2cSJim Jagielski return bRetval; 332*b1cdbd2cSJim Jagielski } 333*b1cdbd2cSJim Jagielski } 334*b1cdbd2cSJim Jagielski 335*b1cdbd2cSJim Jagielski return false; 336*b1cdbd2cSJim Jagielski } 337*b1cdbd2cSJim Jagielski getB2DRange(const geometry::ViewInformation2D &) const338*b1cdbd2cSJim Jagielski basegfx::B2DRange ControlPrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const 339*b1cdbd2cSJim Jagielski { 340*b1cdbd2cSJim Jagielski // simply derivate from unit range 341*b1cdbd2cSJim Jagielski basegfx::B2DRange aRetval(0.0, 0.0, 1.0, 1.0); 342*b1cdbd2cSJim Jagielski aRetval.transform(getTransform()); 343*b1cdbd2cSJim Jagielski return aRetval; 344*b1cdbd2cSJim Jagielski } 345*b1cdbd2cSJim Jagielski get2DDecomposition(const geometry::ViewInformation2D & rViewInformation) const346*b1cdbd2cSJim Jagielski Primitive2DSequence ControlPrimitive2D::get2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const 347*b1cdbd2cSJim Jagielski { 348*b1cdbd2cSJim Jagielski // this primitive is view-dependent related to the scaling. If scaling has changed, 349*b1cdbd2cSJim Jagielski // destroy existing decomposition. To detect change, use size of unit size in view coordinates 350*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 351*b1cdbd2cSJim Jagielski const basegfx::B2DVector aNewScaling(rViewInformation.getObjectToViewTransformation() * basegfx::B2DVector(1.0, 1.0)); 352*b1cdbd2cSJim Jagielski 353*b1cdbd2cSJim Jagielski if(getBuffered2DDecomposition().hasElements()) 354*b1cdbd2cSJim Jagielski { 355*b1cdbd2cSJim Jagielski if(!maLastViewScaling.equal(aNewScaling)) 356*b1cdbd2cSJim Jagielski { 357*b1cdbd2cSJim Jagielski // conditions of last local decomposition have changed, delete 358*b1cdbd2cSJim Jagielski const_cast< ControlPrimitive2D* >(this)->setBuffered2DDecomposition(Primitive2DSequence()); 359*b1cdbd2cSJim Jagielski } 360*b1cdbd2cSJim Jagielski } 361*b1cdbd2cSJim Jagielski 362*b1cdbd2cSJim Jagielski if(!getBuffered2DDecomposition().hasElements()) 363*b1cdbd2cSJim Jagielski { 364*b1cdbd2cSJim Jagielski // remember ViewTransformation 365*b1cdbd2cSJim Jagielski const_cast< ControlPrimitive2D* >(this)->maLastViewScaling = aNewScaling; 366*b1cdbd2cSJim Jagielski } 367*b1cdbd2cSJim Jagielski 368*b1cdbd2cSJim Jagielski // use parent implementation 369*b1cdbd2cSJim Jagielski return BufferedDecompositionPrimitive2D::get2DDecomposition(rViewInformation); 370*b1cdbd2cSJim Jagielski } 371*b1cdbd2cSJim Jagielski 372*b1cdbd2cSJim Jagielski // provide unique ID 373*b1cdbd2cSJim Jagielski ImplPrimitrive2DIDBlock(ControlPrimitive2D, PRIMITIVE2D_ID_CONTROLPRIMITIVE2D) 374*b1cdbd2cSJim Jagielski 375*b1cdbd2cSJim Jagielski } // end of namespace primitive2d 376*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer 377*b1cdbd2cSJim Jagielski 378*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////// 379*b1cdbd2cSJim Jagielski // eof 380