xref: /AOO41X/main/svx/source/sdr/overlay/overlayobject.cxx (revision bbfc4cc7abdab5a8f4a1ef75ba4f9b278c9ffcde)
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