xref: /AOO41X/main/svx/source/sdr/overlay/overlayobject.cxx (revision 54628ca40d27d15cc98fe861da7fff7e60c2f7d6)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 #include <svx/sdr/overlay/overlayobject.hxx>
27 #include <svx/sdr/overlay/overlaymanager.hxx>
28 #include <tools/debug.hxx>
29 #include <basegfx/matrix/b2dhommatrix.hxx>
30 #include <basegfx/vector/b2dvector.hxx>
31 #include <vcl/outdev.hxx>
32 #include <vcl/salbtype.hxx>
33 #include <basegfx/polygon/b2dpolygon.hxx>
34 #include <basegfx/polygon/b2dpolypolygon.hxx>
35 #include <basegfx/polygon/b2dpolygontools.hxx>
36 #include <basegfx/polygon/b2dpolypolygontools.hxx>
37 #include <svx/sdr/contact/objectcontacttools.hxx>
38 #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
39 
40 //////////////////////////////////////////////////////////////////////////////
41 
42 namespace sdr
43 {
44     namespace overlay
45     {
46         void OverlayObject::objectChange()
47         {
48             const basegfx::B2DRange aPreviousRange(maBaseRange);
49             maBaseRange.reset();
50             setPrimitive2DSequence(drawinglayer::primitive2d::Primitive2DSequence());
51 
52             if(getOverlayManager() && !aPreviousRange.isEmpty())
53             {
54                 getOverlayManager()->invalidateRange(aPreviousRange);
55             }
56 
57             const basegfx::B2DRange& rCurrentRange = getBaseRange();
58 
59             if(getOverlayManager() && rCurrentRange != aPreviousRange && !rCurrentRange.isEmpty())
60             {
61                 getOverlayManager()->invalidateRange(rCurrentRange);
62             }
63         }
64 
65         // OverlayObject implementations.
66         drawinglayer::primitive2d::Primitive2DSequence OverlayObject::createOverlayObjectPrimitive2DSequence()
67         {
68             // Default implementation has to assert a missing implementation. It cannot
69             // be useful to have overlay object derivations which have no visualisation
70             // at all
71             OSL_ENSURE(false, "OverlayObject derivation without visualisation definition (missing createOverlayObjectPrimitive2DSequence implementation) (!)");
72             return drawinglayer::primitive2d::Primitive2DSequence();
73         }
74 
75         void OverlayObject::allowAntiAliase(bool bNew)
76         {
77             if(bNew != (bool)mbAllowsAntiAliase)
78             {
79                 // remember new value
80                 mbAllowsAntiAliase = bNew;
81 
82                 // register change (after change)
83                 objectChange();
84             }
85         }
86 
87         OverlayObject::OverlayObject(Color aBaseColor)
88         :   Event(0),
89             mpOverlayManager(0),
90             maBaseColor(aBaseColor),
91             mbIsVisible(true),
92             mbIsHittable(true),
93             mbAllowsAnimation(false),
94             mbAllowsAntiAliase(true)
95         {
96         }
97 
98         OverlayObject::~OverlayObject()
99         {
100             OSL_ENSURE(0 == getOverlayManager(), "OverlayObject is destructed which is still registered at OverlayManager (!)");
101         }
102 
103         drawinglayer::primitive2d::Primitive2DSequence OverlayObject::getOverlayObjectPrimitive2DSequence() const
104         {
105             if(!getPrimitive2DSequence().hasElements())
106             {
107                 // no existing sequence; create one
108                 const_cast< OverlayObject* >(this)->setPrimitive2DSequence(
109                     const_cast< OverlayObject* >(this)->createOverlayObjectPrimitive2DSequence());
110             }
111 
112             return getPrimitive2DSequence();
113         }
114 
115         const basegfx::B2DRange& OverlayObject::getBaseRange() const
116         {
117             if(getOverlayManager() && maBaseRange.isEmpty())
118             {
119                 const drawinglayer::primitive2d::Primitive2DSequence& rSequence = getOverlayObjectPrimitive2DSequence();
120 
121                 if(rSequence.hasElements())
122                 {
123                     const drawinglayer::geometry::ViewInformation2D aViewInformation2D(getOverlayManager()->getCurrentViewInformation2D());
124 
125                     const_cast< sdr::overlay::OverlayObject* >(this)->maBaseRange =
126                         drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(rSequence, aViewInformation2D);
127                 }
128             }
129 
130             return maBaseRange;
131         }
132 
133         void OverlayObject::setVisible(bool bNew)
134         {
135             if(bNew != (bool)mbIsVisible)
136             {
137                 // remember new value
138                 mbIsVisible = bNew;
139 
140                 // register change (after change)
141                 objectChange();
142             }
143         }
144 
145         void OverlayObject::setHittable(bool bNew)
146         {
147             if(bNew != (bool)mbIsHittable)
148             {
149                 // remember new value
150                 mbIsHittable = bNew;
151 
152                 // register change (after change)
153                 objectChange();
154             }
155         }
156 
157         void OverlayObject::setBaseColor(Color aNew)
158         {
159             if(aNew != maBaseColor)
160             {
161                 // remember new value
162                 maBaseColor = aNew;
163 
164                 // register change (after change)
165                 objectChange();
166             }
167         }
168 
169         void OverlayObject::Trigger(sal_uInt32 /*nTime*/)
170         {
171             // default does not register again
172         }
173 
174         void OverlayObject::stripeDefinitionHasChanged()
175         {
176             // default does not need to do anything
177         }
178     } // end of namespace overlay
179 } // end of namespace sdr
180 
181 //////////////////////////////////////////////////////////////////////////////
182 
183 namespace sdr
184 {
185     namespace overlay
186     {
187         OverlayObjectWithBasePosition::OverlayObjectWithBasePosition(const basegfx::B2DPoint& rBasePos, Color aBaseColor)
188         :   OverlayObject(aBaseColor),
189             maBasePosition(rBasePos)
190         {
191         }
192 
193         OverlayObjectWithBasePosition::~OverlayObjectWithBasePosition()
194         {
195         }
196 
197         void OverlayObjectWithBasePosition::setBasePosition(const basegfx::B2DPoint& rNew)
198         {
199             if(rNew != maBasePosition)
200             {
201                 // remember new value
202                 maBasePosition = rNew;
203 
204                 // register change (after change)
205                 objectChange();
206             }
207         }
208     } // end of namespace overlay
209 } // end of namespace sdr
210 
211 //////////////////////////////////////////////////////////////////////////////
212 // eof
213