Tizen 2.1 base
[framework/osp/uifw.git] / src / ui / controls / FUiCtrl_SliderOverlay.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://floralicense.org/license/
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 /**
18  * @file                FUiCtrl_SliderOverlay.cpp
19  * @brief       This is the implementation file for the _SliderOverlay class.
20  */
21
22 #include <FBaseSysLog.h>
23 #include <FBaseErrorDefine.h>
24 #include <FGrp_BitmapImpl.h>
25 #include "FUiAnim_VisualElement.h"
26 #include "FUiCtrl_SliderOverlay.h"
27 #include "FUi_ResourceManager.h"
28
29 using namespace Tizen::Graphics;
30
31 namespace Tizen { namespace Ui { namespace Controls
32 {
33
34 _SliderOverlay::_SliderOverlay(void)
35         : __pOverlayBgBitmap(null)
36         , __pOverlayBgEffectBitmap(null)
37         , __pOverlayBottomBgBitmap(null)
38         , __pOverlayBottomBgEffectBitmap(null)
39         , __overlayBgColor(0)
40         , __overlayTextColor(0)
41         , __pFont(null)
42 {
43         Tizen::Ui::Animations::_VisualElement* pBase = GetVisualElement();
44
45         if (pBase != null)
46         {
47                 pBase->SetSurfaceOpaque(false);
48         }
49 }
50
51 _SliderOverlay::~_SliderOverlay(void)
52 {
53         delete __pOverlayBgBitmap;
54         __pOverlayBgBitmap = null;
55
56         delete __pOverlayBgEffectBitmap;
57         __pOverlayBgEffectBitmap = null;
58
59         delete __pOverlayBottomBgBitmap;
60         __pOverlayBgBitmap = null;
61
62         delete __pOverlayBottomBgEffectBitmap;
63         __pOverlayBgEffectBitmap = null;
64
65 }
66
67
68 result
69 _SliderOverlay::Construct(void)
70 {
71         result r = E_SUCCESS;
72         _ControlOrientation orientation = _ControlManager::GetInstance()->GetOrientation();
73
74 #if defined(MULTI_WINDOW)
75         r = CreateRootVisualElement();
76         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
77
78         SetActivationEnabled(false);
79 #endif
80
81         AcquireHandle();
82
83         r = GET_COLOR_CONFIG(SLIDER::OVERLAY_BG_NORMAL, __overlayBgColor);
84         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
85
86         r = GET_COLOR_CONFIG(SLIDER::OVERLAY_TEXT_NORMAL, __overlayTextColor);
87         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
88
89         Dimension dim(0, 0);
90         r = GET_SHAPE_CONFIG(SLIDER::OVERLAY_WIDTH, orientation, dim.width);
91         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
92
93         r = GET_SHAPE_CONFIG(SLIDER::OVERLAY_HEIGHT, orientation, dim.height);
94         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
95
96         r = LoadBitmaps(dim);
97         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
98
99         return r;
100 }
101
102 result
103 _SliderOverlay::SetSliderRect(Rectangle& sliderRect, Rectangle& sliderTouchRect)
104 {
105         __sliderRect = sliderRect;
106         __sliderTouchRect = sliderTouchRect;
107
108         return E_SUCCESS;
109 }
110
111 void
112 _SliderOverlay::SetFont(Tizen::Graphics::Font* pFont)
113 {
114         __pFont = pFont;
115         return;
116 }
117
118 result
119 _SliderOverlay::LoadBitmaps(Dimension& dim)
120 {
121         result r = E_SUCCESS;
122
123         Bitmap* pBitmap = null;
124         Bitmap* pReplacementBitmap = null;
125
126         r = GET_BITMAP_CONFIG_N(SLIDER::UPWARD_OVERLAY_BG_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, pBitmap);
127         SysTryReturnResult(NID_UI_CTRL, (r == E_SUCCESS), r, "Propagating.");
128
129         pReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*pBitmap, Color::GetColor(COLOR_ID_MAGENTA), __overlayBgColor);
130         r = GetLastResult();
131         SysTryCatch(NID_UI_CTRL, pReplacementBitmap != null, , r, "[%s] Propagating.", GetErrorMessage(r));
132
133         delete __pOverlayBgBitmap;
134         __pOverlayBgBitmap = pReplacementBitmap;
135
136         delete pBitmap;
137         pBitmap = null;
138
139         r = GET_BITMAP_CONFIG_N(SLIDER::DOWNWARD_OVERLAY_BG_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, pBitmap);
140         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.");
141
142         pReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*pBitmap, Color::GetColor(COLOR_ID_MAGENTA), __overlayBgColor);
143         r = GetLastResult();
144         SysTryCatch(NID_UI_CTRL, pReplacementBitmap != null, , r, "[%s] Propagating.", GetErrorMessage(r));
145
146         delete __pOverlayBottomBgBitmap;
147         __pOverlayBottomBgBitmap = pReplacementBitmap;
148
149         delete pBitmap;
150         pBitmap = null;
151
152
153         r = GET_BITMAP_CONFIG_N(SLIDER::UPWARD_OVERLAY_BG_EFFECT, BITMAP_PIXEL_FORMAT_ARGB8888, pBitmap);
154         SysTryReturnResult(NID_UI_CTRL, (r == E_SUCCESS), r, "Propagating.");
155
156         delete __pOverlayBgEffectBitmap;
157         __pOverlayBgEffectBitmap = pBitmap;
158
159         r = GET_BITMAP_CONFIG_N(SLIDER::DOWNWARD_OVERLAY_BG_EFFECT, BITMAP_PIXEL_FORMAT_ARGB8888, pBitmap);
160         SysTryReturnResult(NID_UI_CTRL, (r == E_SUCCESS), r, "Propagating.");
161
162         delete __pOverlayBottomBgEffectBitmap;
163         __pOverlayBottomBgEffectBitmap = pBitmap;
164
165         return r;
166
167 CATCH:
168         delete pBitmap;
169         pBitmap = null;
170
171         return r;
172 }
173
174 result
175 _SliderOverlay::DrawSliderOverlay(int positionX, int handleWidth, int value)
176 {
177         result r = E_SUCCESS;
178
179         int overlayWidth = 0;
180         int overlayHeight = 0;
181         int overlayBottomMargin = 0;
182         int overlayTextSize = 0;
183         int overlayBodyHeight = 0;
184         int overlayY = 0;
185         int overlayOffset = 0;
186         Point textPoint(0, 0);
187
188         Bitmap* pBgBitmap = __pOverlayBgBitmap;
189         Bitmap* pEffectBgBitmap = __pOverlayBgEffectBitmap;
190
191         Tizen::Base::String text;
192         text.Append(value);
193         _ControlOrientation orientation = _ControlManager::GetInstance()->GetOrientation();
194
195         r = GET_SHAPE_CONFIG(SLIDER::OVERLAY_WIDTH, orientation, overlayWidth);
196         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
197
198         r = GET_SHAPE_CONFIG(SLIDER::OVERLAY_HEIGHT, orientation, overlayHeight);
199         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
200
201         r = GET_SHAPE_CONFIG(SLIDER::OVERLAY_BOTTOM_MARGIN, orientation, overlayBottomMargin);
202         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
203
204         r = GET_SHAPE_CONFIG(SLIDER::OVERLAY_HEIGHT_WITHOUT_ARROW, orientation, overlayBodyHeight);
205         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
206
207         if (text.GetLength() == SLIDER_OVERLAY_THREE_DIGIT)
208         {
209                 r = GET_SHAPE_CONFIG(SLIDER::OVERLAY_TEXT_SIZE_THREE_CHARACTERS, orientation, overlayTextSize);
210                 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
211         }
212         else if (text.GetLength() == SLIDER_OVERLAY_TWO_DIGIT)
213         {
214                 r = GET_SHAPE_CONFIG(SLIDER::OVERLAY_TEXT_SIZE_TWO_CHARACTERS, orientation, overlayTextSize);
215                 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
216         }
217         else
218         {
219                 r = GET_SHAPE_CONFIG(SLIDER::OVERLAY_TEXT_SIZE_ONE_CHARACTER, orientation, overlayTextSize);
220                 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
221         }
222
223         if (__sliderTouchRect.y > 0)
224         {
225                 overlayY = __sliderTouchRect.y;
226         }
227
228         __sliderOverlayRect = Rectangle(__sliderRect.x + positionX + (handleWidth - overlayWidth) / 2,
229                                                                         __sliderRect.y + overlayY - (overlayHeight + overlayBottomMargin),
230                                                                         overlayWidth, overlayHeight);
231
232         if (__sliderOverlayRect.y <= 0)
233         {
234                 if (__sliderRect.height < (__sliderTouchRect.y + __sliderTouchRect.height))
235                 {
236                         overlayOffset = __sliderRect.height;
237                 }
238                 else
239                 {
240                         overlayOffset = __sliderTouchRect.y + __sliderTouchRect.height;
241                 }
242                 __sliderOverlayRect.y = __sliderRect.y + overlayOffset + overlayBottomMargin;
243                 pBgBitmap = __pOverlayBottomBgBitmap;
244                 pEffectBgBitmap = __pOverlayBottomBgEffectBitmap;
245                 textPoint.y = overlayHeight - overlayBodyHeight;
246         }
247
248         // Check SliderOverlay Position
249         if (__sliderOverlayRect.x < __sliderRect.x)
250         {
251                 __sliderOverlayRect.x = __sliderRect.x;
252         }
253         if (__sliderOverlayRect.x + __sliderOverlayRect.width > __sliderRect.x + __sliderRect.width)
254         {
255                 __sliderOverlayRect.x = __sliderRect.x + __sliderRect.width - __sliderOverlayRect.width;
256         }
257         SetBounds(__sliderOverlayRect);
258
259         // Get canvas & Clear BG
260         Canvas* pCanvas = GetCanvasN();
261         SysTryReturn(NID_UI_CTRL, pCanvas != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
262
263         pCanvas->SetBackgroundColor(Color(0x00000000));
264         pCanvas->Clear();
265
266         (_FontImpl::GetInstance(*__pFont))->SetSize(overlayTextSize);
267
268         pCanvas->SetFont(*__pFont);
269
270         // Draw BG
271         Rectangle overlayRect = Rectangle(0, 0, __sliderOverlayRect.width, __sliderOverlayRect.height);
272         Dimension textDim(0, 0);
273
274
275         __pFont->GetTextExtent(text, text.GetLength(), textDim);
276
277         if (pBgBitmap->IsNinePatchedBitmap())
278         {
279                 r = pCanvas->DrawNinePatchedBitmap(overlayRect, *pBgBitmap);
280         }
281         else
282         {
283                 r = pCanvas->DrawBitmap(overlayRect, *pBgBitmap);
284         }
285         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
286
287         if (pEffectBgBitmap->IsNinePatchedBitmap())
288         {
289                 r = pCanvas->DrawNinePatchedBitmap(overlayRect, *pEffectBgBitmap);
290         }
291         else
292         {
293                 r = pCanvas->DrawBitmap(overlayRect, *pEffectBgBitmap);
294         }
295         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
296
297         // Draw Value Text
298         __pFont->GetTextExtent(text, text.GetLength(), textDim);
299         textPoint.x = (__sliderOverlayRect.width - textDim.width) / 2;
300         textPoint.y = textPoint.y + ((overlayBodyHeight - textDim.height) / 2);
301         pCanvas->SetForegroundColor(__overlayTextColor);
302         pCanvas->DrawText(textPoint, text);
303
304         delete pCanvas;
305         pCanvas = null;
306
307         return r;
308 CATCH:
309         delete pCanvas;
310         return E_SYSTEM;
311 }
312
313 bool
314 _SliderOverlay::IsActivatedOnOpen(void) const
315 {
316         return false;
317 }
318
319 }}} // Tizen::Ui::Controls