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