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