1 /************************************************************************* * 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2008 by Sun Microsystems, Inc. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * $RCSfile: postit.cxx,v $ 10 * $Revision: 1.8.42.11 $ 11 * 12 * This file is part of OpenOffice.org. 13 * 14 * OpenOffice.org is free software: you can redistribute it and/or modify 15 * it under the terms of the GNU Lesser General Public License version 3 16 * only, as published by the Free Software Foundation. 17 * 18 * OpenOffice.org is distributed in the hope that it will be useful, 19 * but WITHOUT ANY WARRANTY; without even the implied warranty of 20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21 * GNU Lesser General Public License version 3 for more details 22 * (a copy is included in the LICENSE file that accompanied this code). 23 * 24 * You should have received a copy of the GNU Lesser General Public License 25 * version 3 along with OpenOffice.org. If not, see 26 * <http://www.openoffice.org/license.html> 27 * for a copy of the LGPLv3 License. 28 * 29 ************************************************************************/ 30 31 32 #include "precompiled_sw.hxx" 33 34 #include <ShadowOverlayObject.hxx> 35 36 #include <view.hxx> 37 #include <svx/sdrpaintwindow.hxx> 38 #include <svx/svdview.hxx> 39 #include <svx/sdr/overlay/overlaymanager.hxx> 40 41 #include <sw_primitivetypes2d.hxx> 42 #include <drawinglayer/primitive2d/primitivetools2d.hxx> 43 #include <drawinglayer/primitive2d/fillgradientprimitive2d.hxx> 44 45 namespace sw { namespace sidebarwindows { 46 47 ////////////////////////////////////////////////////////////////////////////// 48 // helper SwPostItShadowPrimitive 49 // 50 // Used to allow view-dependent primitive definition. For that purpose, the 51 // initially created primitive (this one) always has to be view-independent, 52 // but the decomposition is made view-dependent. Very simple primitive which 53 // just remembers the discrete data and applies it at decomposition time. 54 55 class ShadowPrimitive : public drawinglayer::primitive2d::DiscreteMetricDependentPrimitive2D 56 { 57 private: 58 basegfx::B2DPoint maBasePosition; 59 basegfx::B2DPoint maSecondPosition; 60 ShadowState maShadowState; 61 62 protected: 63 virtual drawinglayer::primitive2d::Primitive2DSequence create2DDecomposition( 64 const drawinglayer::geometry::ViewInformation2D& rViewInformation) const; 65 66 public: 67 ShadowPrimitive( 68 const basegfx::B2DPoint& rBasePosition, 69 const basegfx::B2DPoint& rSecondPosition, 70 ShadowState aShadowState) 71 : drawinglayer::primitive2d::DiscreteMetricDependentPrimitive2D(), 72 maBasePosition(rBasePosition), 73 maSecondPosition(rSecondPosition), 74 maShadowState(aShadowState) 75 {} 76 77 // data access 78 const basegfx::B2DPoint& getBasePosition() const { return maBasePosition; } 79 const basegfx::B2DPoint& getSecondPosition() const { return maSecondPosition; } 80 ShadowState getShadowState() const { return maShadowState; } 81 82 virtual bool operator==( const drawinglayer::primitive2d::BasePrimitive2D& rPrimitive ) const; 83 84 DeclPrimitrive2DIDBlock() 85 }; 86 87 drawinglayer::primitive2d::Primitive2DSequence ShadowPrimitive::create2DDecomposition( 88 const drawinglayer::geometry::ViewInformation2D& /*rViewInformation*/) const 89 { 90 // get logic sizes in object coordinate system 91 drawinglayer::primitive2d::Primitive2DSequence xRetval; 92 basegfx::B2DRange aRange(getBasePosition()); 93 94 switch(maShadowState) 95 { 96 case SS_NORMAL: 97 { 98 aRange.expand(basegfx::B2DTuple(getSecondPosition().getX(), getSecondPosition().getY() + (2.0 * getDiscreteUnit()))); 99 const ::drawinglayer::attribute::FillGradientAttribute aFillGradientAttribute( 100 drawinglayer::attribute::GRADIENTSTYLE_LINEAR, 101 0.0, 102 0.5, 103 0.5, 104 1800.0 * F_PI1800, 105 basegfx::BColor(230.0/255.0,230.0/255.0,230.0/255.0), 106 basegfx::BColor(180.0/255.0,180.0/255.0,180.0/255.0), 107 2); 108 109 const drawinglayer::primitive2d::Primitive2DReference xReference( 110 new drawinglayer::primitive2d::FillGradientPrimitive2D( 111 aRange, 112 aFillGradientAttribute)); 113 114 xRetval = drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1); 115 break; 116 } 117 case SS_VIEW: 118 { 119 aRange.expand(basegfx::B2DTuple(getSecondPosition().getX(), getSecondPosition().getY() + (4.0 * getDiscreteUnit()))); 120 const drawinglayer::attribute::FillGradientAttribute aFillGradientAttribute( 121 drawinglayer::attribute::GRADIENTSTYLE_LINEAR, 122 0.0, 123 0.5, 124 0.5, 125 1800.0 * F_PI1800, 126 basegfx::BColor(230.0/255.0,230.0/255.0,230.0/255.0), 127 basegfx::BColor(180.0/255.0,180.0/255.0,180.0/255.0), 128 4); 129 130 const drawinglayer::primitive2d::Primitive2DReference xReference( 131 new drawinglayer::primitive2d::FillGradientPrimitive2D( 132 aRange, 133 aFillGradientAttribute)); 134 135 xRetval = drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1); 136 break; 137 } 138 case SS_EDIT: 139 { 140 aRange.expand(basegfx::B2DTuple(getSecondPosition().getX(), getSecondPosition().getY() + (4.0 * getDiscreteUnit()))); 141 const drawinglayer::attribute::FillGradientAttribute aFillGradientAttribute( 142 drawinglayer::attribute::GRADIENTSTYLE_LINEAR, 143 0.0, 144 0.5, 145 0.5, 146 1800.0 * F_PI1800, 147 basegfx::BColor(230.0/255.0,230.0/255.0,230.0/255.0), 148 basegfx::BColor(83.0/255.0,83.0/255.0,83.0/255.0), 149 4); 150 151 const drawinglayer::primitive2d::Primitive2DReference xReference( 152 new drawinglayer::primitive2d::FillGradientPrimitive2D( 153 aRange, 154 aFillGradientAttribute)); 155 156 xRetval = drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1); 157 break; 158 } 159 default: 160 { 161 break; 162 } 163 } 164 165 return xRetval; 166 } 167 168 bool ShadowPrimitive::operator==( const drawinglayer::primitive2d::BasePrimitive2D& rPrimitive ) const 169 { 170 if(drawinglayer::primitive2d::DiscreteMetricDependentPrimitive2D::operator==(rPrimitive)) 171 { 172 const ShadowPrimitive& rCompare = static_cast< const ShadowPrimitive& >(rPrimitive); 173 174 return (getBasePosition() == rCompare.getBasePosition() 175 && getSecondPosition() == rCompare.getSecondPosition() 176 && getShadowState() == rCompare.getShadowState()); 177 } 178 179 return false; 180 } 181 182 ImplPrimitrive2DIDBlock(ShadowPrimitive, PRIMITIVE2D_ID_SWSIDEBARSHADOWPRIMITIVE) 183 184 /****** ShadowOverlayObject **************************************************/ 185 /* static */ ShadowOverlayObject* ShadowOverlayObject::CreateShadowOverlayObject( SwView& rDocView ) 186 { 187 ShadowOverlayObject* pShadowOverlayObject( 0 ); 188 189 if ( rDocView.GetDrawView() ) 190 { 191 SdrPaintWindow* pPaintWindow = rDocView.GetDrawView()->GetPaintWindow(0); 192 if( pPaintWindow ) 193 { 194 sdr::overlay::OverlayManager* pOverlayManager = pPaintWindow->GetOverlayManager(); 195 196 if ( pOverlayManager ) 197 { 198 pShadowOverlayObject = new ShadowOverlayObject( basegfx::B2DPoint(0,0), 199 basegfx::B2DPoint(0,0), 200 Color(0,0,0), 201 SS_NORMAL ); 202 pOverlayManager->add(*pShadowOverlayObject); 203 } 204 } 205 } 206 207 return pShadowOverlayObject; 208 } 209 210 /* static */ void ShadowOverlayObject::DestroyShadowOverlayObject( ShadowOverlayObject* pShadow ) 211 { 212 if ( pShadow ) 213 { 214 if ( pShadow->getOverlayManager() ) 215 { 216 pShadow->getOverlayManager()->remove(*pShadow); 217 } 218 delete pShadow; 219 } 220 } 221 222 ShadowOverlayObject::ShadowOverlayObject( const basegfx::B2DPoint& rBasePos, 223 const basegfx::B2DPoint& rSecondPosition, 224 Color aBaseColor, 225 ShadowState aState ) 226 : OverlayObjectWithBasePosition(rBasePos, aBaseColor) 227 , maSecondPosition(rSecondPosition) 228 , mShadowState(aState) 229 { 230 } 231 232 ShadowOverlayObject::~ShadowOverlayObject() 233 { 234 } 235 236 drawinglayer::primitive2d::Primitive2DSequence ShadowOverlayObject::createOverlayObjectPrimitive2DSequence() 237 { 238 const drawinglayer::primitive2d::Primitive2DReference aReference( 239 new ShadowPrimitive( getBasePosition(), 240 GetSecondPosition(), 241 GetShadowState() ) ); 242 return drawinglayer::primitive2d::Primitive2DSequence(&aReference, 1); 243 } 244 245 void ShadowOverlayObject::SetShadowState(ShadowState aState) 246 { 247 if (mShadowState != aState) 248 { 249 mShadowState = aState; 250 251 objectChange(); 252 } 253 } 254 255 void ShadowOverlayObject::SetPosition( const basegfx::B2DPoint& rPoint1, 256 const basegfx::B2DPoint& rPoint2) 257 { 258 if(!rPoint1.equal(getBasePosition()) || !rPoint2.equal(GetSecondPosition())) 259 { 260 maBasePosition = rPoint1; 261 maSecondPosition = rPoint2; 262 263 objectChange(); 264 } 265 } 266 267 } } // end of namespace sw::sidebarwindows 268 269