Tizen 2.1 base
[framework/osp/uifw.git] / src / ui / controls / FUiCtrl_DatePickerImpl.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_DatePickerImpl.cpp
19  * @brief               This is the implementation file for the _DatePickerImpl class.
20  */
21
22 #include <FSysSystemTime.h>
23 #include <FBaseSysLog.h>
24 #include "FUiCtrl_DatePickerImpl.h"
25 #include "FUiCtrl_FrameImpl.h"
26 #include "FUiCtrl_DateTimePicker.h"
27 #include "FUi_ControlImplManager.h"
28 #include "FUi_ResourceSizeInfo.h"
29 #include "FUi_ResourceManager.h"
30 #include "FUiCtrl_Form.h"
31
32 using namespace Tizen::Ui::Animations;
33 using namespace Tizen::Ui::Controls;
34 using namespace Tizen::Base;
35 using namespace Tizen::System;
36 using namespace Tizen::Graphics;
37
38
39 namespace Tizen { namespace Ui { namespace Controls
40 {
41
42 Dimension
43 _DatePickerImpl::DatePickerSizeInfo::GetDefaultMinimumSize(_ControlOrientation orientation) const
44 {
45         Dimension pickerSize(0, 0);
46         Dimension screenSize(0, 0);
47
48         screenSize = _ControlManager::GetInstance()->GetScreenSize();
49         pickerSize = screenSize;
50         if (orientation == _CONTROL_ORIENTATION_LANDSCAPE)
51         {
52                 pickerSize.width = screenSize.height;
53                 pickerSize.height = screenSize.width;
54         }
55
56         return pickerSize;
57 }
58
59 Dimension
60 _DatePickerImpl::DatePickerSizeInfo::GetDefaultMaximumSize(_ControlOrientation orientation) const
61 {
62         Dimension pickerSize(0, 0);
63         Dimension screenSize(0, 0);
64
65         screenSize = _ControlManager::GetInstance()->GetScreenSize();
66         pickerSize = screenSize;
67         if (orientation == _CONTROL_ORIENTATION_LANDSCAPE)
68         {
69                 pickerSize.width = screenSize.height;
70                 pickerSize.height = screenSize.width;
71         }
72
73         return pickerSize;
74 }
75
76 _DatePickerImpl::_DatePickerImpl(DatePicker* pPublic, _DateTimePicker* pCore)
77         : _WindowImpl(pPublic, pCore)
78         , __pPublicDateTimeChangeEvent(null)
79 {
80 }
81
82 _DatePickerImpl::~_DatePickerImpl(void)
83 {
84         if (__pPublicDateTimeChangeEvent != null)
85         {
86                 delete __pPublicDateTimeChangeEvent;
87                 __pPublicDateTimeChangeEvent = null;
88         }
89 }
90
91 _DatePickerImpl*
92 _DatePickerImpl::CreateDatePickerImplN(DatePicker* pControl, const String& title)
93 {
94         ClearLastResult();
95
96         result r = E_SUCCESS;
97
98         _DateTimePicker* pCore = _DateTimePicker::CreateDateTimePickerN(DATETIME_OUTPUT_STYLE_DATE, title);
99         SysTryReturn(NID_UI_CTRL, (pCore != null), null, r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
100
101         _DatePickerImpl* pPickerImpl = new (std::nothrow) _DatePickerImpl(pControl, pCore);
102         r = CheckConstruction(pCore, pPickerImpl);
103         SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), null, r, "[%s] Propagating.", GetErrorMessage(r));
104
105         pPickerImpl->__pPublicDateTimeChangeEvent = new (std::nothrow) _PublicDateTimeChangeEvent(*pControl);
106         SysTryCatch(NID_UI_CTRL, (pPickerImpl->__pPublicDateTimeChangeEvent != null), , E_OUT_OF_MEMORY,
107                            "[E_OUT_OF_MEMORY] Memory allocation failed.");
108
109         r = pPickerImpl->InitializeBoundsProperties(GET_SIZE_INFO(DatePicker), pCore->GetOrientation());
110         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
111
112         r = pCore->AddDateTimeChangeEventListener(*pPickerImpl);
113         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
114
115         return pPickerImpl;
116
117 CATCH:
118         delete pPickerImpl;
119
120         return null;
121 }
122
123 const char*
124 _DatePickerImpl::GetPublicClassName(void) const
125 {
126         return "Tizen::Ui::Controls::DatePicker";
127 }
128
129 const DatePicker&
130 _DatePickerImpl::GetPublic(void) const
131 {
132         return static_cast <const DatePicker&>(_ControlImpl::GetPublic());
133 }
134
135 DatePicker&
136 _DatePickerImpl::GetPublic(void)
137 {
138         return static_cast <DatePicker&>(_ControlImpl::GetPublic());
139 }
140
141 const _DateTimePicker&
142 _DatePickerImpl::GetCore(void) const
143 {
144         return static_cast <const _DateTimePicker&>(_ControlImpl::GetCore());
145 }
146
147 _DateTimePicker&
148 _DatePickerImpl::GetCore(void)
149 {
150         return static_cast <_DateTimePicker&>(_ControlImpl::GetCore());
151 }
152
153 _DatePickerImpl*
154 _DatePickerImpl::GetInstance(DatePicker& datePicker)
155 {
156         return static_cast<_DatePickerImpl*> (_ControlImpl::GetInstance(datePicker));
157 }
158
159 const _DatePickerImpl*
160 _DatePickerImpl::GetInstance(const DatePicker& datePicker)
161 {
162         return static_cast<const _DatePickerImpl*> (_ControlImpl::GetInstance(datePicker));
163 }
164
165 result
166 _DatePickerImpl::AddDateChangeEventListener(Tizen::Ui::IDateChangeEventListener& listener)
167 {
168         ClearLastResult();
169
170         SysTryReturnResult(NID_UI_CTRL, (__pPublicDateTimeChangeEvent != null), E_SYSTEM,
171                                            "A system error has occurred. The _PublicDateTimeChangeEvent instance is null.");
172
173         result r = __pPublicDateTimeChangeEvent->AddListener(listener);
174         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
175
176         return r;
177 }
178
179 result
180 _DatePickerImpl::RemoveDateChangeEventListener(Tizen::Ui::IDateChangeEventListener& listener)
181 {
182         ClearLastResult();
183
184         SysTryReturnResult(NID_UI_CTRL, (__pPublicDateTimeChangeEvent != null), E_SYSTEM,
185                                            "A system error has occurred. The _PublicDateTimeChangeEvent instance is null.");
186
187         result r = __pPublicDateTimeChangeEvent->RemoveListener(listener);
188         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
189
190         return r;
191 }
192
193 DateTime
194 _DatePickerImpl::GetDate(void) const
195 {
196         ClearLastResult();
197
198         DateTime dateTime;
199         dateTime.SetValue(GetYear(), GetMonth(), GetDay(), 0, 0, 0);
200         return dateTime;
201 }
202
203 int
204 _DatePickerImpl::GetDay(void) const
205 {
206         ClearLastResult();
207
208         Variant dayValue = GetCore().GetPropertyDay();
209
210         return dayValue.ToInt();
211 }
212
213 int
214 _DatePickerImpl::GetMonth(void) const
215 {
216         ClearLastResult();
217
218         Variant monthValue = GetCore().GetPropertyMonth();
219
220         return monthValue.ToInt();
221 }
222
223 int
224 _DatePickerImpl::GetYear(void) const
225 {
226         ClearLastResult();
227
228         Variant yearValue = GetCore().GetPropertyYear();
229
230         return yearValue.ToInt();
231 }
232
233 void
234 _DatePickerImpl::SetDate(const DateTime& date)
235 {
236         ClearLastResult();
237
238         SetYear(date.GetYear());
239         SetMonth(date.GetMonth());
240         SetDay(date.GetDay());
241 }
242
243 void
244 _DatePickerImpl::SetCurrentDate(void)
245 {
246         ClearLastResult();
247
248         DateTime dateTime;
249         SystemTime::GetCurrentTime(WALL_TIME, dateTime);
250         SetDate(dateTime);
251 }
252
253 result
254 _DatePickerImpl::SetYear(int year)
255 {
256         ClearLastResult();
257
258         Variant yearValue(year);
259
260         return GetCore().SetPropertyYear(yearValue);
261 }
262
263 result
264 _DatePickerImpl::SetMonth(int month)
265 {
266         ClearLastResult();
267
268         Variant monthValue(month);
269
270         return GetCore().SetPropertyMonth(monthValue);
271 }
272
273 result
274 _DatePickerImpl::SetDay(int day)
275 {
276         ClearLastResult();
277
278         Variant dayValue(day);
279
280         return GetCore().SetPropertyDay(dayValue);
281 }
282
283 result
284 _DatePickerImpl::SetYearRange(int minYear, int maxYear)
285 {
286         ClearLastResult();
287
288         result r = E_SUCCESS;
289
290         Variant currentMinYearValue = GetCore().GetPropertyMinYearRange();
291         Variant minYearValue(minYear);
292         Variant maxYearValue(maxYear);
293
294         r = GetCore().SetPropertyMinYearRange(minYearValue);
295         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.", GetErrorMessage(r));
296
297         r = GetCore().SetPropertyMaxYearRange(maxYearValue);
298         if (r != E_SUCCESS)
299         {
300                 // rollback minYearValue
301                 GetCore().SetPropertyMinYearRange(minYearValue);
302                 SysLogException(NID_UI_CTRL, r, "[%s] Propagating.", GetErrorMessage(r));
303         }
304
305         return r;
306 }
307
308 result
309 _DatePickerImpl::GetYearRange(int& minYear, int& maxYear) const
310 {
311         ClearLastResult();
312
313         Variant minYearValue = GetCore().GetPropertyMinYearRange();
314         Variant maxYearValue = GetCore().GetPropertyMaxYearRange();
315
316         minYear = minYearValue.ToInt();
317         maxYear = maxYearValue.ToInt();
318
319         return E_SUCCESS;
320 }
321
322 void
323 _DatePickerImpl::OnDateTimeChanged(const Tizen::Ui::_Control& source, int year, int month, int day, int hour, int minute)
324 {
325         ClearLastResult();
326
327         if (__pPublicDateTimeChangeEvent == null)
328         {
329                 return;
330         }
331
332         _PublicDateTimeChangeEventArg* pEventArg = new (std::nothrow) _PublicDateTimeChangeEventArg(DATE_PUBLIC_CHANGE_SAVED);
333         SysTryReturnVoidResult(NID_UI_CTRL, (pEventArg != null), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
334
335         pEventArg->SetDate(year, month, day);
336         pEventArg->SetTime(hour, minute);
337
338         __pPublicDateTimeChangeEvent->Fire(*pEventArg);
339 }
340
341 void
342 _DatePickerImpl::OnDateTimeChangeCanceled(const Tizen::Ui::_Control& source)
343 {
344         ClearLastResult();
345
346         if (__pPublicDateTimeChangeEvent == null)
347         {
348                 return;
349         }
350
351         _PublicDateTimeChangeEventArg* pEventArg = new (std::nothrow) _PublicDateTimeChangeEventArg(DATE_PUBLIC_CHANGE_CANCELED);
352         SysTryReturnVoidResult(NID_UI_CTRL, (pEventArg != null), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
353
354         __pPublicDateTimeChangeEvent->Fire(*pEventArg);
355 }
356
357 void
358 _DatePickerImpl::OnChangeLayout(Tizen::Ui::_ControlOrientation orientation)
359 {
360         ClearLastResult();
361
362         InitializeBoundsProperties(GET_SIZE_INFO(DatePicker), orientation);
363         _ControlImpl::OnChangeLayout(orientation);
364 }
365
366 result
367 _DatePickerImpl::OnAttachedToMainTree(void)
368 {
369         result r = E_SUCCESS;
370
371         if (GetOwner() == null)
372         {
373                 _FrameImpl* pFrameImpl = dynamic_cast <_FrameImpl*>(_ControlImplManager::GetInstance()->GetCurrentFrame());
374                 SysTryReturn(NID_UI_CTRL, pFrameImpl != null, E_SYSTEM,
375                         E_SYSTEM, "[E_SYSTEM] This instance is not constructed.");
376
377                 _Form* pForm = pFrameImpl->GetCore().GetCurrentForm();
378                 if (pForm != null)
379                 {
380                         GetCore().SetOwner(pForm);
381                 }
382                 else
383                 {
384                         GetCore().SetOwner(&pFrameImpl->GetCore());
385                 }
386         }
387         SetVisibleState(true);
388
389   _WindowImpl::OnAttachedToMainTree();
390         return r;
391 }
392
393 }}} // Tizen::Ui::Controls