xref: /AOO41X/main/svx/source/sidebar/area/AreaTransparencyGradientControl.cxx (revision ff0525f24f03981d56b7579b645949f111420994)
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 #include "AreaTransparencyGradientControl.hxx"
23 #include "AreaPropertyPanel.hxx"
24 #include "AreaPropertyPanel.hrc"
25 
26 #include <svx/dialogs.hrc>
27 #include <svx/dialmgr.hxx>
28 #include <svx/xflftrit.hxx>
29 #include <sfx2/sidebar/propertypanel.hrc>
30 #include <sfx2/bindings.hxx>
31 #include <sfx2/dispatch.hxx>
32 
33 namespace svx { namespace sidebar {
34 
35 // positioning helpers
36 
37 #define APOS1_1 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL), MAP_APPFONT))
38 #define APOS2_1 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL + FIXED_TEXT_HEIGHT + TEXT_CONTROL_SPACING_VERTICAL), MAP_APPFONT))
39 #define APOS1_2 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL+CONTROL_WIDTH+CONTROL_SPACING_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL), MAP_APPFONT))
40 #define APOS2_2 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL+CONTROL_WIDTH+CONTROL_SPACING_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL + FIXED_TEXT_HEIGHT + TEXT_CONTROL_SPACING_VERTICAL), MAP_APPFONT))
41 #define APOS1_3 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL + FIXED_TEXT_HEIGHT + TEXT_CONTROL_SPACING_VERTICAL+MBOX_HEIGHT+CONTROL_SPACING_VERTICAL), MAP_APPFONT))
42 #define APOS1_4 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL + 2*(FIXED_TEXT_HEIGHT + TEXT_CONTROL_SPACING_VERTICAL)+MBOX_HEIGHT+CONTROL_SPACING_VERTICAL), MAP_APPFONT))
43 #define APOS2_3 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL+CONTROL_WIDTH+CONTROL_SPACING_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL + FIXED_TEXT_HEIGHT + TEXT_CONTROL_SPACING_VERTICAL+MBOX_HEIGHT+CONTROL_SPACING_VERTICAL), MAP_APPFONT))
44 #define APOS2_4 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL+CONTROL_WIDTH+CONTROL_SPACING_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL + 2*(FIXED_TEXT_HEIGHT + TEXT_CONTROL_SPACING_VERTICAL)+MBOX_HEIGHT+CONTROL_SPACING_VERTICAL), MAP_APPFONT))
45 #define APOS1_5 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL + 2*(FIXED_TEXT_HEIGHT + TEXT_CONTROL_SPACING_VERTICAL+MBOX_HEIGHT+CONTROL_SPACING_VERTICAL)), MAP_APPFONT))
46 #define APOS1_6 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL + 3*(FIXED_TEXT_HEIGHT + TEXT_CONTROL_SPACING_VERTICAL)+2*(MBOX_HEIGHT+CONTROL_SPACING_VERTICAL)), MAP_APPFONT))
47 #define APOS2_5 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL+CONTROL_WIDTH+CONTROL_SPACING_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL + 2*(FIXED_TEXT_HEIGHT + TEXT_CONTROL_SPACING_VERTICAL+MBOX_HEIGHT+CONTROL_SPACING_VERTICAL)), MAP_APPFONT))
48 #define APOS2_6 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL+CONTROL_WIDTH+CONTROL_SPACING_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL + 3*(FIXED_TEXT_HEIGHT + TEXT_CONTROL_SPACING_VERTICAL)+2*(MBOX_HEIGHT+CONTROL_SPACING_VERTICAL)), MAP_APPFONT))
49 #define APOS1_7 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL + 3*(FIXED_TEXT_HEIGHT + TEXT_CONTROL_SPACING_VERTICAL+MBOX_HEIGHT+CONTROL_SPACING_VERTICAL)), MAP_APPFONT))
50 #define APOS1_8 Point(LogicToPixel(Point(POPUPPANEL_MARGIN_HORIZONTAL,POPUPPANEL_MARGIN_VERTICAL + 4*(FIXED_TEXT_HEIGHT + TEXT_CONTROL_SPACING_VERTICAL)+3*(MBOX_HEIGHT+CONTROL_SPACING_VERTICAL)), MAP_APPFONT))
51 #define APOS_Left_Right_1 Point(LogicToPixel(Point(LEFT_RIGHT_X1,LEFT_RIGHT_Y1), MAP_APPFONT))
52 #define APOS_Left_Right_2 Point(LogicToPixel(Point(LEFT_RIGHT_X2,LEFT_RIGHT_Y1), MAP_APPFONT))
53 #define APOS_Left_Right_3 Point(LogicToPixel(Point(LEFT_RIGHT_X1,LEFT_RIGHT_Y2), MAP_APPFONT))
54 #define APOS_Left_Right_4 Point(LogicToPixel(Point(LEFT_RIGHT_X2,LEFT_RIGHT_Y2), MAP_APPFONT))
55 
56 
57 
58 
59 AreaTransparencyGradientControl::AreaTransparencyGradientControl (
60     Window* pParent,
61     AreaPropertyPanel& rPanel)
62     : PopupControl( pParent,SVX_RES(RID_POPUPPANEL_AREAPAGE_TRGR)),
63       maFtTrgrCenterX(this, SVX_RES(FT_TRGR_CENTER_X)),
64       maMtrTrgrCenterX(this, SVX_RES(MTR_TRGR_CENTER_X)),
65       maFtTrgrCenterY(this, SVX_RES(FT_TRGR_CENTER_Y)),
66       maMtrTrgrCenterY(this, SVX_RES(MTR_TRGR_CENTER_Y)),
67       maFtTrgrAngle(this, SVX_RES(FT_TRGR_ANGLE)),
68       maMtrTrgrAngle(this, SVX_RES(MTR_TRGR_ANGLE)),
69       maFtTrgrStartValue(this, SVX_RES(FT_TRGR_START_VALUE)),
70       maMtrTrgrStartValue(this, SVX_RES(MTR_TRGR_START_VALUE)),
71       maFtTrgrEndValue(this, SVX_RES(FT_TRGR_END_VALUE)),
72       maMtrTrgrEndValue(this, SVX_RES(MTR_TRGR_END_VALUE)),
73       maFtTrgrBorder(this, SVX_RES(FT_TRGR_BORDER)),
74       maMtrTrgrBorder(this, SVX_RES(MTR_TRGR_BORDER)),
75       maBtnLeft45(this, SVX_RES(BTN_LEFT_SECOND)),
76       maBtnRight45(this, SVX_RES(BTN_RIGHT_FIRST)),
77       maRotLeft( SVX_RES(IMG_ROT_LEFT)),
78       maRotRight( SVX_RES(IMG_ROT_RIGHT)),
79       mrAreaPropertyPanel(rPanel),
80       mpBindings(NULL)
81 {
82     Link aLink = LINK( this, AreaTransparencyGradientControl, ModifiedTrgrHdl_Impl);
83     maMtrTrgrCenterX.SetModifyHdl( aLink );
84     maMtrTrgrCenterY.SetModifyHdl( aLink );
85     maMtrTrgrAngle.SetModifyHdl( aLink );
86     maMtrTrgrBorder.SetModifyHdl( aLink );
87     maMtrTrgrStartValue.SetModifyHdl( aLink );
88     maMtrTrgrEndValue.SetModifyHdl( aLink );
89     aLink = LINK( this, AreaTransparencyGradientControl, Left_Click45_Impl);
90     maBtnLeft45.SetSelectHdl( aLink );
91     aLink = LINK( this, AreaTransparencyGradientControl, Right_Click45_Impl);
92     maBtnRight45.SetSelectHdl( aLink );
93     maBtnLeft45.SetItemImage(1,maRotLeft);
94     Size aTbxSize = maBtnLeft45.CalcWindowSizePixel();
95     maBtnLeft45.SetOutputSizePixel( aTbxSize );
96     maBtnLeft45.SetQuickHelpText(1, String(SVX_RES(STR_HELP_LEFT)));    //acc wj
97 
98     maBtnRight45.SetItemImage(1,maRotRight);
99     aTbxSize = maBtnRight45.CalcWindowSizePixel();
100     maBtnRight45.SetOutputSizePixel( aTbxSize );
101     maBtnRight45.SetQuickHelpText(1, String(SVX_RES(STR_HELP_RIGHT)));  //acc wj
102 
103     maBtnLeft45.SetBackground(Wallpaper());
104     maBtnLeft45.SetPaintTransparent(true);
105     maBtnRight45.SetBackground(Wallpaper());
106     maBtnRight45.SetPaintTransparent(true);
107 
108     FreeResource();
109     mpBindings = mrAreaPropertyPanel.GetBindings();
110 }
111 
112 
113 
114 
115 AreaTransparencyGradientControl::~AreaTransparencyGradientControl (void)
116 {
117 }
118 
119 
120 
121 
122 void AreaTransparencyGradientControl::ToGetFocus()
123 {
124     if(maMtrTrgrCenterX.IsVisible())
125         maMtrTrgrCenterX.GrabFocus();
126     else
127         maMtrTrgrAngle.GrabFocus();
128 }
129 
130 
131 
132 
133 void AreaTransparencyGradientControl::Rearrange(XFillFloatTransparenceItem* pGradientItem)
134 {
135     InitStatus(pGradientItem);
136     const XGradient& rGradient = pGradientItem->GetGradientValue();
137     XGradientStyle eXGS(rGradient.GetGradientStyle());
138     Size aSize(POP_WIDTH,POP_HEIGHT);
139     aSize = LogicToPixel( aSize, MapMode(MAP_APPFONT) );
140     Size aSize2(POP_WIDTH,POP_HEIGHT2);
141     aSize2 = LogicToPixel( aSize2, MapMode(MAP_APPFONT) );
142     long aPosY = 0;
143     Point aPointAngle;
144     Size aSizeAngle = maMtrTrgrAngle.GetSizePixel();
145     Size aTbxSize = maBtnLeft45.CalcWindowSizePixel();
146 
147     switch(eXGS)
148     {
149     case XGRAD_LINEAR:
150     case XGRAD_AXIAL:
151         maFtTrgrCenterX.Hide();
152         maMtrTrgrCenterX.Hide();
153         maFtTrgrCenterY.Hide();
154         maMtrTrgrCenterY.Hide();
155         maFtTrgrAngle.Show();
156         maFtTrgrAngle.SetPosPixel(APOS1_1);
157         maMtrTrgrAngle.Show();
158         maMtrTrgrAngle.SetPosPixel(APOS2_1);
159         maFtTrgrStartValue.SetPosPixel(APOS1_3);
160         maMtrTrgrStartValue.SetPosPixel(APOS1_4);
161         maFtTrgrEndValue.SetPosPixel(APOS2_3);
162         maMtrTrgrEndValue.SetPosPixel(APOS2_4);
163         maFtTrgrBorder.SetPosPixel(APOS1_5);
164         maMtrTrgrBorder.SetPosPixel(APOS1_6);
165 
166         maBtnLeft45.Show();
167         maBtnRight45.Show();
168 
169         aPointAngle = maMtrTrgrAngle.GetPosPixel();
170         aPosY = aPointAngle.getY() + aSizeAngle.getHeight() - aTbxSize.getHeight();
171 
172         maBtnLeft45.SetPosPixel(Point(APOS_Left_Right_1.getX(), aPosY));
173         maBtnRight45.SetPosPixel(Point(APOS_Left_Right_2.getX(), aPosY));
174 
175         SetSizePixel(aSize2);
176         break;
177 
178     case XGRAD_RADIAL:
179         maFtTrgrCenterX.Show();
180         maFtTrgrCenterX.SetPosPixel(APOS1_1);
181         maMtrTrgrCenterX.Show();
182         maMtrTrgrCenterX.SetPosPixel(APOS2_1);
183         maFtTrgrCenterY.Show();
184         maFtTrgrCenterY.SetPosPixel(APOS1_2);
185         maMtrTrgrCenterY.Show();
186         maMtrTrgrCenterY.SetPosPixel(APOS2_2);
187         maFtTrgrAngle.Hide();
188         maMtrTrgrAngle.Hide();
189         maFtTrgrStartValue.SetPosPixel(APOS1_3);
190         maMtrTrgrStartValue.SetPosPixel(APOS1_4);
191         maFtTrgrEndValue.SetPosPixel(APOS2_3);
192         maMtrTrgrEndValue.SetPosPixel(APOS2_4);
193         maFtTrgrBorder.SetPosPixel(APOS1_5);
194         maMtrTrgrBorder.SetPosPixel(APOS1_6);
195 
196         maBtnLeft45.Hide();
197         maBtnRight45.Hide();
198 
199         SetSizePixel(aSize2);
200 
201         break;
202 
203     case XGRAD_ELLIPTICAL:
204     case XGRAD_SQUARE:
205     case XGRAD_RECT:
206         maFtTrgrCenterX.Show();
207         maFtTrgrCenterX.SetPosPixel(APOS1_1);
208         maMtrTrgrCenterX.Show();
209         maMtrTrgrCenterX.SetPosPixel(APOS2_1);
210         maFtTrgrCenterY.Show();
211         maFtTrgrCenterY.SetPosPixel(APOS1_2);
212         maMtrTrgrCenterY.Show();
213         maMtrTrgrCenterY.SetPosPixel(APOS2_2);
214         maFtTrgrAngle.Show();
215         maFtTrgrAngle.SetPosPixel(APOS1_3);
216         maMtrTrgrAngle.Show();
217         maMtrTrgrAngle.SetPosPixel(APOS1_4);
218 
219         maFtTrgrStartValue.SetPosPixel(APOS1_5);
220         maMtrTrgrStartValue.SetPosPixel(APOS1_6);
221         maFtTrgrEndValue.SetPosPixel(APOS2_5);
222         maMtrTrgrEndValue.SetPosPixel(APOS2_6);
223         maFtTrgrBorder.SetPosPixel(APOS1_7);
224         maMtrTrgrBorder.SetPosPixel(APOS1_8);
225 
226         maBtnLeft45.Show();
227         maBtnRight45.Show();
228 
229         aPointAngle = maMtrTrgrAngle.GetPosPixel();
230         aPosY = aPointAngle.getY() + aSizeAngle.getHeight() - aTbxSize.getHeight();
231 
232         maBtnLeft45.SetPosPixel(Point(APOS_Left_Right_3.getX(), aPosY));
233         maBtnRight45.SetPosPixel(Point(APOS_Left_Right_4.getX(), aPosY));
234 
235         SetSizePixel(aSize);
236 
237         break;
238     }
239 }
240 
241 
242 
243 
244 void AreaTransparencyGradientControl::InitStatus(XFillFloatTransparenceItem* pGradientItem)
245 {
246     const XGradient& rGradient = pGradientItem->GetGradientValue();
247 
248     XGradient aGradient;
249 
250     if (rGradient.GetXOffset() == AreaPropertyPanel::DEFAULT_CENTERX
251         && rGradient.GetYOffset() == AreaPropertyPanel::DEFAULT_CENTERY
252         && (rGradient.GetAngle() / 10) == AreaPropertyPanel::DEFAULT_ANGLE
253         && ((sal_uInt16)((((sal_uInt16)rGradient.GetStartColor().GetRed() + 1) * 100) / 255))
254             == AreaPropertyPanel::DEFAULT_STARTVALUE
255         && ((sal_uInt16)((((sal_uInt16)rGradient.GetEndColor().GetRed() + 1) * 100) / 255))
256             == AreaPropertyPanel::DEFAULT_ENDVALUE
257         && rGradient.GetBorder() == AreaPropertyPanel::DEFAULT_BORDER)
258     {
259         aGradient = mrAreaPropertyPanel.GetGradient(rGradient.GetGradientStyle());
260     }
261     else
262     {
263         aGradient = rGradient;
264     }
265     maMtrTrgrCenterX.SetValue(aGradient.GetXOffset());
266     maMtrTrgrCenterY.SetValue(aGradient.GetYOffset());
267     maMtrTrgrAngle.SetValue(aGradient.GetAngle() / 10);
268     maMtrTrgrStartValue.SetValue((sal_uInt16)((((sal_uInt16)aGradient.GetStartColor().GetRed() + 1) * 100) / 255));
269     maMtrTrgrEndValue.SetValue((sal_uInt16)((((sal_uInt16)aGradient.GetEndColor().GetRed() + 1) * 100) / 255));
270     maMtrTrgrBorder.SetValue(aGradient.GetBorder());
271 }
272 
273 
274 
275 
276 void AreaTransparencyGradientControl::ExecuteValueModify( sal_uInt8 nStartCol, sal_uInt8 nEndCol )
277 {
278     //Added
279     sal_Int16 aMtrValue = (sal_Int16)maMtrTrgrAngle.GetValue();
280     while(aMtrValue<0)
281         aMtrValue += 360;
282     sal_uInt16 nVal = aMtrValue/360;
283     nVal = aMtrValue - nVal*360;
284     maMtrTrgrAngle.SetValue(nVal);
285     //End of new code
286     XGradient aTmpGradient(
287         Color(nStartCol, nStartCol, nStartCol),
288         Color(nEndCol, nEndCol, nEndCol),
289         (XGradientStyle)(mrAreaPropertyPanel.GetSelectedTransparencyTypeIndex()-2),
290         (sal_uInt16)maMtrTrgrAngle.GetValue() * 10,
291         (sal_uInt16)maMtrTrgrCenterX.GetValue(),
292         (sal_uInt16)maMtrTrgrCenterY.GetValue(),
293         (sal_uInt16)maMtrTrgrBorder.GetValue(),
294         100, 100);
295 
296     mrAreaPropertyPanel.SetGradient(aTmpGradient);
297 
298     SfxItemPool* pPool = NULL;
299     bool bEnable = true;
300     XFillFloatTransparenceItem aGradientItem(pPool,aTmpGradient, bEnable );
301 
302     mpBindings->GetDispatcher()->Execute( SID_ATTR_FILL_FLOATTRANSPARENCE, SFX_CALLMODE_RECORD, &aGradientItem, 0L );
303 }
304 
305 
306 
307 
308 IMPL_LINK(AreaTransparencyGradientControl, ModifiedTrgrHdl_Impl, void *, pControl)
309 {
310     sal_uInt8 nStartCol = (sal_uInt8)(((sal_uInt16)maMtrTrgrStartValue.GetValue() * 255) / 100);
311     sal_uInt8 nEndCol = (sal_uInt8)(((sal_uInt16)maMtrTrgrEndValue.GetValue() * 255) / 100);
312     ExecuteValueModify( nStartCol, nEndCol );
313     return( 0L );
314 }
315 
316 
317 
318 
319 IMPL_LINK(AreaTransparencyGradientControl, Left_Click45_Impl, void *, pControl)
320 {
321     sal_uInt8 nStartCol = (sal_uInt8)(((sal_uInt16)maMtrTrgrStartValue.GetValue() * 255) / 100);
322     sal_uInt8 nEndCol = (sal_uInt8)(((sal_uInt16)maMtrTrgrEndValue.GetValue() * 255) / 100);
323     sal_uInt16 aTemp = (sal_uInt16)maMtrTrgrAngle.GetValue();
324     if(aTemp>=315)
325         aTemp -= 360;
326     aTemp += 45;
327     maMtrTrgrAngle.SetValue(aTemp);
328     ExecuteValueModify( nStartCol, nEndCol );
329     return( 0L );
330 }
331 
332 
333 
334 
335 IMPL_LINK(AreaTransparencyGradientControl, Right_Click45_Impl, void *, pControl)
336 {
337     sal_uInt8 nStartCol = (sal_uInt8)(((sal_uInt16)maMtrTrgrStartValue.GetValue() * 255) / 100);
338     sal_uInt8 nEndCol = (sal_uInt8)(((sal_uInt16)maMtrTrgrEndValue.GetValue() * 255) / 100);
339     sal_uInt16 aTemp = (sal_uInt16)maMtrTrgrAngle.GetValue();
340     if(aTemp<45)
341         aTemp += 360;
342     aTemp -= 45;
343     maMtrTrgrAngle.SetValue(aTemp);
344     ExecuteValueModify( nStartCol, nEndCol );
345     return( 0L );
346 }
347 
348 } } // end of namespace svx::sidebar
349