Tizen 2.1 base
[framework/osp/uifw.git] / src / ui / controls / FUiCtrl_ProgressPresenter.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_ProgressPresenter.cpp
19  * @brief               This is the implementation file for the _ProgressPresenter class.
20  */
21
22 #include <FBaseErrorDefine.h>
23 #include <FBaseSysLog.h>
24 #include <FGrp_BitmapImpl.h>
25 #include "FUi_ResourceManager.h"
26 #include "FUiCtrl_ProgressPresenter.h"
27 #include "FUiCtrl_ProgressModel.h"
28 #include "FUiCtrl_Progress.h"
29
30 using namespace Tizen::Graphics;
31
32 namespace Tizen { namespace Ui { namespace Controls
33 {
34
35 _ProgressPresenter::_ProgressPresenter(void)
36         : __pProgress(null)
37         , __pProgressModel(null)
38         , __pResourceBitmap(null)
39         , __pBarResourceEffectBitmap(null)
40         , __pBarBgResourceEffectBitmap(null)
41         , __pBarColorReplacementBitmap(null)
42         , __pBarBgColorReplacementBitmap(null)
43 {
44 }
45
46 _ProgressPresenter::~_ProgressPresenter(void)
47 {
48         delete __pProgressModel;
49         __pProgressModel = null;
50
51         delete __pResourceBitmap;
52         __pResourceBitmap = null;
53
54         delete __pBarResourceEffectBitmap;
55         __pBarResourceEffectBitmap = null;
56
57         delete __pBarBgResourceEffectBitmap;
58         __pBarBgResourceEffectBitmap = null;
59
60         delete __pBarColorReplacementBitmap;
61         __pBarColorReplacementBitmap = null;
62
63         delete __pBarBgColorReplacementBitmap;
64         __pBarBgColorReplacementBitmap = null;
65 }
66
67 _ProgressPresenter*
68 _ProgressPresenter::CreateInstanceN(const _Progress& progress)
69 {
70         result r = E_SUCCESS;
71         _ProgressPresenter* pProgressPresenter = new (std::nothrow) _ProgressPresenter;
72         SysTryReturn(NID_UI_CTRL, pProgressPresenter != null, null, E_OUT_OF_MEMORY,
73                                 "[E_OUT_OF_MEMORY] Memory allocation failed.");
74
75         pProgressPresenter->__pProgress = const_cast <_Progress*>(&progress);
76         SysTryCatch(NID_UI_CTRL, pProgressPresenter->__pProgress != null, , E_SYSTEM,
77                                 "[E_SYSTEM] A system error has occurred. The Progress control core is null");
78
79         pProgressPresenter->__pProgressModel = new (std::nothrow) _ProgressModel;
80         SysTryCatch(NID_UI_CTRL, pProgressPresenter->__pProgressModel != null, , E_OUT_OF_MEMORY,
81                                 "[E_OUT_OF_MEMORY] Memory allocation failed.");
82
83         r = pProgressPresenter->LoadResource();
84         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] A system error has occurred. The loading of resource failed");
85
86         return pProgressPresenter;
87
88 CATCH:
89         delete pProgressPresenter;
90         pProgressPresenter = null;
91
92         return null;
93 }
94
95 void
96 _ProgressPresenter::SetValue(int value)
97 {
98         int maxValue = __pProgressModel->GetMaxValue();
99         int minValue = __pProgressModel->GetMinValue();
100
101         if (value > maxValue)
102         {
103                 value = maxValue;
104         }
105         else if (value < minValue)
106         {
107                 value = minValue;
108         }
109
110         __pProgressModel->SetValue(value);
111
112         return;
113 }
114
115 void
116 _ProgressPresenter::SetMinValue(int minValue)
117 {
118         __pProgressModel->SetMinValue(minValue);
119
120         if (__pProgressModel->GetValue() < minValue)
121         {
122                 __pProgressModel->SetValue(minValue);
123         }
124
125         return;
126 }
127
128 void
129 _ProgressPresenter::SetMaxValue(int maxValue)
130 {
131         __pProgressModel->SetMaxValue(maxValue);
132
133         if (__pProgressModel->GetValue() > maxValue)
134         {
135                 __pProgressModel->SetValue(maxValue);
136         }
137         return;
138 }
139
140 int
141 _ProgressPresenter::GetValue(void) const
142 {
143         return __pProgressModel->GetValue();
144 }
145
146 int
147 _ProgressPresenter::GetMinValue(void) const
148 {
149         return __pProgressModel->GetMinValue();
150 }
151
152 int
153 _ProgressPresenter::GetMaxValue(void) const
154 {
155         return __pProgressModel->GetMaxValue();
156 }
157
158 int
159 _ProgressPresenter::GetPercentComplete(void) const
160 {
161         int percentValue = 0;
162         int span = __pProgressModel->GetMaxValue() - __pProgressModel->GetMinValue();
163
164         if (span != 0)
165         {
166                 percentValue = (int) ((((double) __pProgressModel->GetValue() - __pProgressModel->GetMinValue()) / span) * 100);
167         }
168
169         return percentValue;
170 }
171
172 result
173 _ProgressPresenter::LoadResource(void)
174 {
175         result r = E_SUCCESS;
176
177         int opacity = 0;
178
179         Color bgColor;
180         Color barColor;
181
182         r = GET_COLOR_CONFIG(SLIDER::BAR_BG_NORMAL, bgColor);
183         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
184
185         r = GET_COLOR_CONFIG(SLIDER::BAR_NORMAL, barColor);
186         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
187
188         r = GET_BITMAP_CONFIG_N(SLIDER::BAR_BG_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, __pResourceBitmap);
189         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
190
191         __pBarBgColorReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*__pResourceBitmap,Color::GetColor(COLOR_ID_MAGENTA), bgColor);
192         r = GetLastResult();
193         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
194
195         delete __pResourceBitmap;
196         __pResourceBitmap = null;
197
198         r = GET_BITMAP_CONFIG_N(SLIDER::PROGRESS_BAR_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, __pResourceBitmap);
199         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
200
201         __pBarColorReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*__pResourceBitmap,Color::GetColor(COLOR_ID_MAGENTA), barColor);
202         r = GetLastResult();
203         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
204
205         r = GET_BITMAP_CONFIG_N(SLIDER::BAR_BG_EFFECT, BITMAP_PIXEL_FORMAT_ARGB8888, __pBarBgResourceEffectBitmap);
206         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
207
208         r = GET_BITMAP_CONFIG_N(SLIDER::PROGRESS_BAR_EFFECT, BITMAP_PIXEL_FORMAT_ARGB8888, __pBarResourceEffectBitmap);
209         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
210
211         opacity = barColor.GetAlpha();
212         __pBarColorReplacementBitmap->SetAlphaConstant(opacity);
213
214         __currentBarColor = barColor;
215
216         return r;
217
218 CATCH:
219
220         delete __pResourceBitmap;
221         __pResourceBitmap = null;
222
223         delete __pBarResourceEffectBitmap;
224         __pBarResourceEffectBitmap = null;
225
226         delete __pBarBgResourceEffectBitmap;
227         __pBarBgResourceEffectBitmap = null;
228
229         delete __pBarColorReplacementBitmap;
230         __pBarColorReplacementBitmap = null;
231
232         delete __pBarBgColorReplacementBitmap;
233         __pBarBgColorReplacementBitmap = null;
234
235         return r;
236 }
237
238 result
239 _ProgressPresenter::DrawBitmap(Canvas& canvas, const Rectangle& bounds, Bitmap* pBitmap)
240 {
241         result r = E_SUCCESS;
242
243         if (pBitmap->IsNinePatchedBitmap())
244         {
245                 r = canvas.DrawNinePatchedBitmap(bounds, *pBitmap);
246                 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
247         }
248         else
249         {
250                 r = canvas.DrawBitmap(bounds, *pBitmap);
251                 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
252         }
253         return r;
254 }
255
256 result
257 _ProgressPresenter::Draw(void)
258 {
259         result r = E_SUCCESS;
260
261         Rectangle bounds = __pProgress->GetBounds();
262         Canvas* pCanvas = __pProgress->GetCanvasN();
263         SysTryReturn(NID_UI_CTRL, pCanvas != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to get a canvas.");
264
265         int minValue = __pProgressModel->GetMinValue();
266         int maxValue = __pProgressModel->GetMaxValue();
267         int width = 0;
268         int height = 0;
269         int opacity = 0;
270         int leftMargin = 0;
271         int topMargin = 0;
272         int minimumWidth = 0;
273         int minimumHeight = 0;
274         int offset = 0;
275         Bitmap* pReplacementBitmap = null;
276
277         GET_SHAPE_CONFIG(SLIDER::BAR_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, height);
278         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
279
280         GET_SHAPE_CONFIG(SLIDER::BAR_LEFT_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, leftMargin);
281         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
282
283         r = GET_SHAPE_CONFIG(SLIDER::MINIMUM_SIZE_WITHOUT_ICON, _CONTROL_ORIENTATION_PORTRAIT, minimumWidth);
284         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
285
286         r = GET_SHAPE_CONFIG(SLIDER::BAR_TOP_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, topMargin);
287         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
288
289         r = GET_SHAPE_CONFIG(SLIDER::BAR_OFFSET, _CONTROL_ORIENTATION_PORTRAIT, offset);
290         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
291
292         minimumHeight = 2 * topMargin + height;
293
294         if (bounds.width < minimumWidth)
295         {
296                 bounds.width = minimumWidth;
297         }
298
299         if (bounds.height < minimumHeight)
300         {
301                 bounds.height = minimumHeight;
302         }
303
304         pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
305         pCanvas->Clear();
306
307         width = bounds.width - (2 * leftMargin) - (2 * offset);
308         if (maxValue == __pProgressModel->GetValue())
309         {
310                 width = bounds.width - (2 * leftMargin) - (2 * offset);
311         }
312         else
313         {
314                 width = (width) * ((__pProgressModel->GetValue() - minValue) * 100 / (maxValue - minValue)) / 100;
315         }
316
317         if (__pProgress->IsEnabled() == false)  // disabled
318         {
319                 __pBarBgColorReplacementBitmap->SetAlphaConstant(0x4C);
320         }
321         else
322         {
323                 opacity = __pProgress->GetBarColor().GetAlpha();
324                 __pBarBgColorReplacementBitmap->SetAlphaConstant(opacity);
325         }
326
327         r = DrawBitmap(*pCanvas, Rectangle(leftMargin, (bounds.height - height) / 2, (bounds.width - (2 * leftMargin)), height), __pBarBgColorReplacementBitmap);
328         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
329
330         r = DrawBitmap(*pCanvas, Rectangle(leftMargin, (bounds.height - height) / 2, (bounds.width - (2 * leftMargin)), height), __pBarBgResourceEffectBitmap);
331         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
332
333         if (width > 0)
334         {
335                 if (__pProgress->GetBarColor() != __currentBarColor)
336                 {
337                         pReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*__pResourceBitmap, Color::GetColor(COLOR_ID_MAGENTA), __pProgress->GetBarColor());
338                         r = GetLastResult();
339                         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to get replacement color.", GetErrorMessage(r));
340                         delete __pBarColorReplacementBitmap;
341                         __pBarColorReplacementBitmap = null;
342
343                         __pBarColorReplacementBitmap = pReplacementBitmap;
344                         __currentBarColor = __pProgress->GetBarColor();
345                 }
346                 if (__pProgress->IsEnabled() == false)  // disabled
347                 {
348                         __pBarColorReplacementBitmap->SetAlphaConstant(0x4C);
349                 }
350                 else
351                 {
352                         opacity = __pProgress->GetBarColor().GetAlpha();
353                         __pBarColorReplacementBitmap->SetAlphaConstant(opacity);
354                 }
355
356                 r = DrawBitmap(*pCanvas, Rectangle((leftMargin + offset), (bounds.height - height) / 2, width, height), __pBarColorReplacementBitmap);
357                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
358
359                 r = DrawBitmap(*pCanvas, Rectangle((leftMargin + offset), (bounds.height - height) / 2, width, height), __pBarResourceEffectBitmap);
360                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
361
362         }
363
364         delete pCanvas;
365         pCanvas = null;
366
367         return r;
368
369 CATCH:
370
371         delete pCanvas;
372         pCanvas = null;
373
374         return r;
375 }
376
377 }}} // Tizen::Ui::Controls