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