1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <svx/sdr/overlay/overlayrectangle.hxx>
28*b1cdbd2cSJim Jagielski #include <vcl/outdev.hxx>
29*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrix.hxx>
30*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygontools.hxx>
31*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx>
32*b1cdbd2cSJim Jagielski #include <basegfx/numeric/ftools.hxx>
33*b1cdbd2cSJim Jagielski #include <svx/sdr/overlay/overlaytools.hxx>
34*b1cdbd2cSJim Jagielski #include <svx/sdr/overlay/overlaymanager.hxx>
35*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski namespace sdr
40*b1cdbd2cSJim Jagielski {
41*b1cdbd2cSJim Jagielski 	namespace overlay
42*b1cdbd2cSJim Jagielski 	{
createOverlayObjectPrimitive2DSequence()43*b1cdbd2cSJim Jagielski 		drawinglayer::primitive2d::Primitive2DSequence OverlayRectangle::createOverlayObjectPrimitive2DSequence()
44*b1cdbd2cSJim Jagielski 		{
45*b1cdbd2cSJim Jagielski             const basegfx::B2DRange aHatchRange(getBasePosition(), getSecondPosition());
46*b1cdbd2cSJim Jagielski             basegfx::BColor aColor(getBaseColor().getBColor());
47*b1cdbd2cSJim Jagielski             static double fChange(0.1); // just small optical change, do not make it annoying
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski             if(mbOverlayState)
50*b1cdbd2cSJim Jagielski             {
51*b1cdbd2cSJim Jagielski                 aColor += basegfx::B3DTuple(fChange, fChange, fChange);
52*b1cdbd2cSJim Jagielski                 aColor.clamp();
53*b1cdbd2cSJim Jagielski             }
54*b1cdbd2cSJim Jagielski             else
55*b1cdbd2cSJim Jagielski             {
56*b1cdbd2cSJim Jagielski                 aColor -= basegfx::B3DTuple(fChange, fChange, fChange);
57*b1cdbd2cSJim Jagielski                 aColor.clamp();
58*b1cdbd2cSJim Jagielski             }
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski             const drawinglayer::primitive2d::Primitive2DReference aReference(
61*b1cdbd2cSJim Jagielski                 new drawinglayer::primitive2d::OverlayRectanglePrimitive(
62*b1cdbd2cSJim Jagielski                     aHatchRange,
63*b1cdbd2cSJim Jagielski                     aColor,
64*b1cdbd2cSJim Jagielski                     getTransparence(),
65*b1cdbd2cSJim Jagielski                     getDiscreteGrow(),
66*b1cdbd2cSJim Jagielski                     getDiscreteShrink(),
67*b1cdbd2cSJim Jagielski                     getRotation()));
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski             return drawinglayer::primitive2d::Primitive2DSequence(&aReference, 1);
70*b1cdbd2cSJim Jagielski 		}
71*b1cdbd2cSJim Jagielski 
OverlayRectangle(const basegfx::B2DPoint & rBasePosition,const basegfx::B2DPoint & rSecondPosition,const Color & rHatchColor,double fTransparence,double fDiscreteGrow,double fDiscreteShrink,double fRotation,sal_uInt32 nBlinkTime,bool bAnimate)72*b1cdbd2cSJim Jagielski         OverlayRectangle::OverlayRectangle(
73*b1cdbd2cSJim Jagielski             const basegfx::B2DPoint& rBasePosition,
74*b1cdbd2cSJim Jagielski             const basegfx::B2DPoint& rSecondPosition,
75*b1cdbd2cSJim Jagielski             const Color& rHatchColor,
76*b1cdbd2cSJim Jagielski             double fTransparence,
77*b1cdbd2cSJim Jagielski             double fDiscreteGrow,
78*b1cdbd2cSJim Jagielski             double fDiscreteShrink,
79*b1cdbd2cSJim Jagielski             double fRotation,
80*b1cdbd2cSJim Jagielski             sal_uInt32 nBlinkTime,
81*b1cdbd2cSJim Jagielski             bool bAnimate)
82*b1cdbd2cSJim Jagielski 		:	OverlayObjectWithBasePosition(rBasePosition, rHatchColor),
83*b1cdbd2cSJim Jagielski             maSecondPosition(rSecondPosition),
84*b1cdbd2cSJim Jagielski             mfTransparence(fTransparence),
85*b1cdbd2cSJim Jagielski             mfDiscreteGrow(fDiscreteGrow),
86*b1cdbd2cSJim Jagielski             mfDiscreteShrink(fDiscreteShrink),
87*b1cdbd2cSJim Jagielski             mfRotation(fRotation),
88*b1cdbd2cSJim Jagielski             mnBlinkTime(nBlinkTime),
89*b1cdbd2cSJim Jagielski             mbOverlayState(false)
90*b1cdbd2cSJim Jagielski 		{
91*b1cdbd2cSJim Jagielski             if(Application::GetSettings().GetStyleSettings().GetHighContrastMode())
92*b1cdbd2cSJim Jagielski             {
93*b1cdbd2cSJim Jagielski                 // no animation in high contrast mode
94*b1cdbd2cSJim Jagielski                 bAnimate = false;
95*b1cdbd2cSJim Jagielski             }
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski             // set AllowsAnimation flag to mark this object as animation capable
98*b1cdbd2cSJim Jagielski             mbAllowsAnimation = bAnimate;
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski             // #i53216# check blink time value range
101*b1cdbd2cSJim Jagielski             mnBlinkTime = impCheckBlinkTimeValueRange(mnBlinkTime);
102*b1cdbd2cSJim Jagielski 		}
103*b1cdbd2cSJim Jagielski 
setSecondPosition(const basegfx::B2DPoint & rNew)104*b1cdbd2cSJim Jagielski 		void OverlayRectangle::setSecondPosition(const basegfx::B2DPoint& rNew)
105*b1cdbd2cSJim Jagielski 		{
106*b1cdbd2cSJim Jagielski 			if(rNew != maSecondPosition)
107*b1cdbd2cSJim Jagielski 			{
108*b1cdbd2cSJim Jagielski 				// remember new value
109*b1cdbd2cSJim Jagielski 				maSecondPosition = rNew;
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 				// register change (after change)
112*b1cdbd2cSJim Jagielski 				objectChange();
113*b1cdbd2cSJim Jagielski 			}
114*b1cdbd2cSJim Jagielski 		}
115*b1cdbd2cSJim Jagielski 
setBlinkTime(sal_uInt32 nNew)116*b1cdbd2cSJim Jagielski         void OverlayRectangle::setBlinkTime(sal_uInt32 nNew)
117*b1cdbd2cSJim Jagielski 		{
118*b1cdbd2cSJim Jagielski 			if(mnBlinkTime != nNew)
119*b1cdbd2cSJim Jagielski 			{
120*b1cdbd2cSJim Jagielski 				// remember new value
121*b1cdbd2cSJim Jagielski 				mnBlinkTime = nNew;
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski 				// #i53216# check blink time value range
124*b1cdbd2cSJim Jagielski 				mnBlinkTime = impCheckBlinkTimeValueRange(mnBlinkTime);
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 				// register change (after change)
127*b1cdbd2cSJim Jagielski 				objectChange();
128*b1cdbd2cSJim Jagielski 			}
129*b1cdbd2cSJim Jagielski 		}
130*b1cdbd2cSJim Jagielski 
Trigger(sal_uInt32 nTime)131*b1cdbd2cSJim Jagielski 		void OverlayRectangle::Trigger(sal_uInt32 nTime)
132*b1cdbd2cSJim Jagielski 		{
133*b1cdbd2cSJim Jagielski 			if(getOverlayManager())
134*b1cdbd2cSJim Jagielski 			{
135*b1cdbd2cSJim Jagielski 				// #i53216# produce event after nTime + x
136*b1cdbd2cSJim Jagielski 				SetTime(nTime + mnBlinkTime);
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski 				// switch state
139*b1cdbd2cSJim Jagielski 				if(mbOverlayState)
140*b1cdbd2cSJim Jagielski 				{
141*b1cdbd2cSJim Jagielski 					mbOverlayState = false;
142*b1cdbd2cSJim Jagielski 				}
143*b1cdbd2cSJim Jagielski 				else
144*b1cdbd2cSJim Jagielski 				{
145*b1cdbd2cSJim Jagielski 					mbOverlayState = true;
146*b1cdbd2cSJim Jagielski 				}
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 				// re-insert me as event
149*b1cdbd2cSJim Jagielski 				getOverlayManager()->InsertEvent(this);
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski                 // register change (after change)
152*b1cdbd2cSJim Jagielski 				objectChange();
153*b1cdbd2cSJim Jagielski 			}
154*b1cdbd2cSJim Jagielski 		}
155*b1cdbd2cSJim Jagielski 	} // end of namespace overlay
156*b1cdbd2cSJim Jagielski } // end of namespace sdr
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
159*b1cdbd2cSJim Jagielski // eof
160