Tizen 2.1 base
[sdk/ide/native-sample.git] / samples / native / partner / cpp / Sample / Tizen C++ / CalendarViewer / CalendarViewer / project / src / CalendarViewerForm.cpp
1 //\r
2 // Open Service Platform (or Tizen C++ SDK)\r
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.\r
4 //\r
5 // Licensed under the Flora License, Version 1.0 (the License);\r
6 // you may not use this file except in compliance with the License.\r
7 // You may obtain a copy of the License at\r
8 //\r
9 //     http://www.tizenopensource.org/license\r
10 //\r
11 // Unless required by applicable law or agreed to in writing, software\r
12 // distributed under the License is distributed on an AS IS BASIS,\r
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14 // See the License for the specific language governing permissions and\r
15 // limitations under the License.\r
16 //\r
17 \r
18 \r
19 #include "CalendarViewerForm.h"\r
20 \r
21 using namespace Osp::Base;\r
22 using namespace Osp::Graphics;\r
23 using namespace Osp::System;\r
24 using namespace Osp::App;\r
25 using namespace Osp::Ui;\r
26 using namespace Osp::Ui::Controls;\r
27 using namespace Osp::Locales;\r
28 \r
29 \r
30 CalendarViewerForm::CalendarViewerForm() :\r
31 __pPanelWeekDay(null),\r
32 __pEditYear(null),\r
33 __pEditMonth(null),\r
34 __pBtnPrev_Month(null),\r
35 __pBtnNext_Month(null),\r
36 __pBtnPrev_Year(null),\r
37 __pBtnNext_Year(null)\r
38 {\r
39         // TODO Auto-generated constructor stub\r
40         __pCalendar_FirstDay = Calendar::CreateInstanceN();\r
41 }\r
42 \r
43 CalendarViewerForm::~CalendarViewerForm() {\r
44         // TODO Auto-generated destructor stub\r
45         delete __pCalendar_FirstDay;\r
46 }\r
47 \r
48 bool\r
49 CalendarViewerForm::Initialize(void)\r
50 {\r
51         this->Construct(FORM_STYLE_NORMAL | FORM_STYLE_HEADER | FORM_STYLE_INDICATOR);\r
52         return true;\r
53 }\r
54 \r
55 result CalendarViewerForm::OnInitializing(void)\r
56 {\r
57         Header* pHeader = null;\r
58         pHeader = GetHeader();\r
59         if(pHeader)\r
60         {\r
61                 pHeader->SetStyle(HEADER_STYLE_TITLE);\r
62                 pHeader->SetTitleText(L"Calendar Viewer");\r
63         }\r
64         //Date Setting\r
65         InitMemberVariable();\r
66 \r
67         //LINE 1 Display : Year, month\r
68         InitYearMonth();\r
69 \r
70         //LINE 2 Display : Week\r
71         InitWeekDay();\r
72 \r
73         //LINE 3 Display : Day\r
74         InitDay();\r
75         DisplayDay();\r
76 \r
77         RequestRedraw(true);\r
78 \r
79         return E_SUCCESS;\r
80 }\r
81 \r
82 result CalendarViewerForm::OnTerminating(void)\r
83 {\r
84         delete __pSelectCalendar;\r
85 \r
86         return E_SUCCESS;\r
87 }\r
88 \r
89 bool CalendarViewerForm::InitMemberVariable()\r
90 {\r
91         //Current Date Setting\r
92         DateTime CurDateTime;\r
93         SystemTime::GetCurrentTime(CurDateTime);\r
94 \r
95         __pSelectCalendar = Calendar::CreateInstanceN();\r
96         __pSelectCalendar->SetTime(CurDateTime);\r
97 \r
98         AppLog("GetCurrentTime : %d/%d/%d"\r
99                                                   , __pSelectCalendar->GetTimeField(TIME_FIELD_YEAR)\r
100                                                   ,__pSelectCalendar->GetTimeField(TIME_FIELD_MONTH)\r
101                                                   ,__pSelectCalendar->GetTimeField(TIME_FIELD_DAY_OF_MONTH));\r
102 \r
103         return true;\r
104 }\r
105 \r
106 bool CalendarViewerForm::InitYearMonth()\r
107 {\r
108         String editYear = L"";\r
109         String editMonth = L"";\r
110 \r
111         editYear.Append(__pSelectCalendar->GetTimeField(TIME_FIELD_YEAR));\r
112         editMonth.Append(__pSelectCalendar->GetTimeField(TIME_FIELD_MONTH));\r
113 \r
114         const int BUTTON_WIDTH = 50;\r
115         const int EDITFIELDYEAR_WIDTH = 100;\r
116         const int EDITFIELDMONTH_WIDTH = 75;\r
117 \r
118         int xpos1, xpos2, xpos3, xpos4, xpos5, xpos6;\r
119 \r
120         xpos1 = ID_PART1_POS_X;\r
121         xpos2 = xpos1 + BUTTON_WIDTH + 15;\r
122         xpos3 = xpos2 + BUTTON_WIDTH + 20;\r
123         xpos4 = xpos3 + EDITFIELDYEAR_WIDTH + 10;\r
124         xpos5 = xpos4 + EDITFIELDMONTH_WIDTH + 20;\r
125         xpos6 = xpos5 + BUTTON_WIDTH + 15;\r
126 \r
127         //Year Prev Button\r
128         __pBtnPrev_Year = new Button();\r
129         __pBtnPrev_Year->SetName( L"__pBtnPrev_Year" );\r
130         __pBtnPrev_Year->Construct( Rectangle( xpos1, ID_PART1_POS_Y, BUTTON_WIDTH, ID_PART1_POS_H ), L"<" );\r
131         __pBtnPrev_Year->SetActionId(ID_BUTTON_PREV_YEAR);\r
132         __pBtnPrev_Year->AddActionEventListener( *this );\r
133         AddControl( *__pBtnPrev_Year );\r
134 \r
135         //Month Prev Button\r
136         __pBtnPrev_Month = new Button();\r
137         __pBtnPrev_Month->SetName( L"__pBtnPrev_Month" );\r
138         __pBtnPrev_Month->Construct( Rectangle( xpos2, ID_PART1_POS_Y, BUTTON_WIDTH, ID_PART1_POS_H ), L"<" );\r
139         __pBtnPrev_Month->SetActionId(ID_BUTTON_PREV_MONTH);\r
140         __pBtnPrev_Month->AddActionEventListener( *this );\r
141         AddControl( *__pBtnPrev_Month );\r
142 \r
143         //EditField - Year\r
144         __pEditYear = new EditField;\r
145         __pEditYear->Construct(Rectangle(xpos3, ID_PART1_POS_Y, EDITFIELDYEAR_WIDTH, ID_PART1_POS_H)\r
146                                      , EDIT_FIELD_STYLE_NORMAL, INPUT_STYLE_FULLSCREEN, false, 4);\r
147         __pEditYear->SetCurrentInputModeCategory(EDIT_INPUTMODE_NUMERIC);\r
148         __pEditYear->SetText(editYear);\r
149         __pEditYear->AddTextEventListener(*this);\r
150         __pEditYear->SetSize(EDITFIELDYEAR_WIDTH, ID_PART1_POS_H);\r
151         AddControl(*__pEditYear);\r
152 \r
153         //EditField - Month\r
154         __pEditMonth = new EditField;\r
155         __pEditMonth->Construct(Rectangle(xpos4, ID_PART1_POS_Y, EDITFIELDMONTH_WIDTH, ID_PART1_POS_H)\r
156                                                   , EDIT_FIELD_STYLE_NORMAL, INPUT_STYLE_FULLSCREEN, false, 2);\r
157         __pEditMonth->SetCurrentInputModeCategory(EDIT_INPUTMODE_NUMERIC);\r
158         __pEditMonth->SetTextAlignment(ALIGNMENT_CENTER);\r
159         __pEditMonth->SetText(editMonth);\r
160         __pEditMonth->AddTextEventListener(*this);\r
161         __pEditMonth->SetSize(EDITFIELDMONTH_WIDTH, ID_PART1_POS_H);\r
162         AddControl(*__pEditMonth);\r
163 \r
164         //Month Next Button\r
165         __pBtnNext_Month = new Button();\r
166         __pBtnNext_Month->SetName( L"__pBtnNext_Month" );\r
167         __pBtnNext_Month->Construct(Rectangle(xpos5, ID_PART1_POS_Y, BUTTON_WIDTH, ID_PART1_POS_H ), L">" );\r
168         __pBtnNext_Month->SetActionId(ID_BUTTON_NEXT_MONTH);\r
169         __pBtnNext_Month->AddActionEventListener( *this );\r
170         AddControl( *__pBtnNext_Month);\r
171 \r
172         //Year Next Button\r
173         __pBtnNext_Year = new Button();\r
174         __pBtnNext_Year->SetName( L"__pBtnNext_Year" );\r
175         __pBtnNext_Year->Construct(Rectangle(xpos6, ID_PART1_POS_Y, BUTTON_WIDTH, ID_PART1_POS_H ), L">" );\r
176         __pBtnNext_Year->SetActionId(ID_BUTTON_NEXT_YEAR);\r
177         __pBtnNext_Year->AddActionEventListener( *this );\r
178         AddControl( *__pBtnNext_Year);\r
179 \r
180         return true;\r
181 }\r
182 \r
183 bool CalendarViewerForm::InitWeekDay()\r
184 {\r
185         //Display Week\r
186         String aryWeekDay[7] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};\r
187 \r
188         __pPanelWeekDay = new Panel();\r
189         __pPanelWeekDay->Construct(Rectangle(ID_PART2_POS_X, ID_PART2_POS_Y, 440, ID_PART2_POS_H));\r
190         __pPanelWeekDay->SetBackgroundColor(Color::GetColor(COLOR_ID_BLACK));\r
191 \r
192         for(int i=0; i<7; i++)\r
193         {\r
194                 __pLabelWeekDay[i] = new Label();\r
195                 __pLabelWeekDay[i]->Construct(Rectangle(7 + ID_PART2_DAY_POS_W * i, 15, ID_PART2_DAY_POS_W, 30), aryWeekDay[i]);\r
196                 __pLabelWeekDay[i]->SetBackgroundColor(Color::GetColor(COLOR_ID_BLACK));\r
197                 switch (i)\r
198                 {\r
199                 case 0:\r
200                         __pLabelWeekDay[i]->SetTextColor(Color::GetColor(COLOR_ID_RED));\r
201                         break;\r
202                 case 6:\r
203                         __pLabelWeekDay[i]->SetTextColor(Color::GetColor(COLOR_ID_BLUE));\r
204                         break;\r
205                 default:\r
206                         __pLabelWeekDay[i]->SetTextColor(Color::GetColor(COLOR_ID_WHITE));\r
207                         break;\r
208                 }\r
209 \r
210                 __pLabelWeekDay[i]->SetTextConfig(16, LABEL_TEXT_STYLE_NORMAL);\r
211                 __pPanelWeekDay->AddControl(*__pLabelWeekDay[i]);\r
212         }\r
213 \r
214         AddControl(*__pPanelWeekDay);\r
215 \r
216         return true;\r
217 }\r
218 \r
219 bool CalendarViewerForm::InitDay()\r
220 {\r
221         //Create Button\r
222         for(int i=0; i<6; i++)\r
223         {\r
224                 for(int j=0; j<7; j++)\r
225                 {\r
226                         __pBtnDay[i][j] = new Button();\r
227                         __pBtnDay[i][j]->Construct( Rectangle( ID_PART3_POS_X + ID_PART3_POS_W * j, ID_PART3_POS_Y + ID_PART3_POS_H * i, ID_PART3_POS_W, ID_PART3_POS_H ), L"" );\r
228                         __pBtnDay[i][j]->SetEnabled(true);\r
229 \r
230                         //Set Color\r
231                         switch (j)\r
232                         {\r
233                         case 0:\r
234                                 __pBtnDay[i][j]->SetTextColor(Color::GetColor(COLOR_ID_RED));\r
235                                 break;\r
236                         case 6:\r
237                                 __pBtnDay[i][j]->SetTextColor(Color::GetColor(COLOR_ID_BLUE));\r
238                                 break;\r
239                         default:\r
240                                 __pBtnDay[i][j]->SetTextColor(Color::GetColor(COLOR_ID_BLACK));\r
241                                 break;\r
242                         }\r
243 \r
244                         AddControl( *__pBtnDay[i][j]);\r
245                 }\r
246         }\r
247 \r
248         return true;\r
249 }\r
250 \r
251 bool CalendarViewerForm::DisplayDay()\r
252 {\r
253         //Get WeekDay\r
254 \r
255         __pCalendar_FirstDay->SetTime(__pSelectCalendar->GetTimeField(TIME_FIELD_YEAR)\r
256                                                           , __pSelectCalendar->GetTimeField(TIME_FIELD_MONTH)\r
257                                                           , 1);\r
258         int nGetWeekDay = __pCalendar_FirstDay->GetTimeField(TIME_FIELD_DAY_OF_WEEK);\r
259 \r
260         //Get LastDay\r
261         int nMaxDay = __pCalendar_FirstDay->GetActualMaxTimeField(TIME_FIELD_DAY_OF_MONTH);\r
262 \r
263 \r
264         //Display Button\r
265         int iDisplayBtnCount = 0;\r
266         for(int i=0; i<6; i++)\r
267         {\r
268                 for(int j=0; j<7; j++)\r
269                 {\r
270                         if ((i == 0 and j < nGetWeekDay - 1) or iDisplayBtnCount > nMaxDay - 1)\r
271                         {\r
272                                 __pBtnDay[i][j]->SetText(L"");\r
273                                 __pBtnDay[i][j]->SetShowState(false);\r
274                         }\r
275                         else\r
276                         {\r
277                                 String sDisplayBtnCount = L"";\r
278                                 sDisplayBtnCount.Append(iDisplayBtnCount + 1);\r
279                                 __pBtnDay[i][j]->SetText(sDisplayBtnCount);\r
280                                 __pBtnDay[i][j]->SetShowState(true);\r
281                                 iDisplayBtnCount++;\r
282                         }\r
283                 }\r
284         }\r
285 \r
286         //Display Year - EditField / Month - EditField\r
287         String editYearMonth = L"";\r
288         editYearMonth.Append(__pSelectCalendar->GetTimeField(TIME_FIELD_YEAR));\r
289         __pEditYear->SetText(editYearMonth);\r
290 \r
291         editYearMonth = L"";\r
292         editYearMonth.Append(__pSelectCalendar->GetTimeField(TIME_FIELD_MONTH));\r
293         __pEditMonth->SetText(editYearMonth);\r
294 \r
295         SetFocus();\r
296 \r
297         RequestRedraw(true);\r
298 \r
299         return true;\r
300 }\r
301 \r
302 bool CalendarViewerForm::CalCalendar(TimeField timefield, int amount)\r
303 {\r
304         __pSelectCalendar->AddTimeField(timefield, amount);\r
305         AppLog("CalCalendar : %d/%d/%d"\r
306                          ,__pSelectCalendar->GetTimeField(TIME_FIELD_YEAR)\r
307                          ,__pSelectCalendar->GetTimeField(TIME_FIELD_MONTH)\r
308                          ,__pSelectCalendar->GetTimeField(TIME_FIELD_DAY_OF_MONTH));\r
309 \r
310         return true;\r
311 }\r
312 \r
313 void CalendarViewerForm::OnActionPerformed(const Control& source, int actionId)\r
314 {\r
315         int year = 0, month = 0;\r
316 \r
317         switch (actionId)\r
318         {\r
319         case ID_BUTTON_PREV_MONTH:\r
320                 year = __pSelectCalendar->GetTimeField(TIME_FIELD_YEAR);\r
321                 month = __pSelectCalendar->GetTimeField(TIME_FIELD_MONTH);\r
322 \r
323                 if (year == 1 && month == 1)\r
324                         break;\r
325 \r
326                 CalCalendar(TIME_FIELD_MONTH, -1);\r
327                 DisplayDay();\r
328                 break;\r
329 \r
330         case ID_BUTTON_NEXT_MONTH:\r
331                 year = __pSelectCalendar->GetTimeField(TIME_FIELD_YEAR);\r
332                 month = __pSelectCalendar->GetTimeField(TIME_FIELD_MONTH);\r
333 \r
334                 if (year == 9999 && month == 12)\r
335                         break;\r
336 \r
337                 CalCalendar(TIME_FIELD_MONTH, 1);\r
338                 DisplayDay();\r
339                 break;\r
340 \r
341         case ID_BUTTON_PREV_YEAR:\r
342                 year = __pSelectCalendar->GetTimeField(TIME_FIELD_YEAR);\r
343                 if (year != 1)\r
344                 {\r
345                         CalCalendar(TIME_FIELD_YEAR, -1);\r
346                         DisplayDay();\r
347                 }\r
348 \r
349                 break;\r
350 \r
351         case ID_BUTTON_NEXT_YEAR:\r
352                 year = __pSelectCalendar->GetTimeField(TIME_FIELD_YEAR);\r
353 \r
354                 if (year != 9999)\r
355                 {\r
356                         CalCalendar(TIME_FIELD_YEAR, 1);\r
357                         DisplayDay();\r
358                 }\r
359                 break;\r
360 \r
361         default:\r
362                 break;\r
363         }\r
364 }\r
365 \r
366 void\r
367 CalendarViewerForm::OnTextValueChanged(const Control& source)\r
368 {\r
369         const Control* pObject = &source;\r
370 \r
371         if( pObject == __pEditYear )\r
372         {\r
373                 int year = 0;\r
374 \r
375                 String str = __pEditYear->GetText();\r
376                 str.Trim();\r
377 \r
378                 Osp::Base::Integer::Parse(str, year);\r
379 \r
380                 if (year > 0)\r
381                 {\r
382                         __pSelectCalendar->SetTime(year\r
383                                                                 ,__pSelectCalendar->GetTimeField(TIME_FIELD_MONTH)\r
384                                                                 ,__pSelectCalendar->GetTimeField(TIME_FIELD_DAY_OF_MONTH));\r
385                 }\r
386         }\r
387         else if( pObject == __pEditMonth )\r
388         {\r
389                 int month = 0;\r
390 \r
391                 String str = __pEditMonth->GetText();\r
392                 str.Trim();\r
393 \r
394                 Osp::Base::Integer::Parse(str, month);\r
395 \r
396                 if (1 <= month && month <= 12)\r
397                 {\r
398                         __pSelectCalendar->SetTime(__pSelectCalendar->GetTimeField(TIME_FIELD_YEAR)\r
399                                                                   , month\r
400                                                                   , __pSelectCalendar->GetTimeField(TIME_FIELD_DAY_OF_MONTH));\r
401                 }\r
402         }\r
403 \r
404         DisplayDay();\r
405 }\r
406 \r
407 void\r
408 CalendarViewerForm::OnTextValueChangeCanceled(const Osp::Ui::Control& source)\r
409 {\r
410         SetFocus();\r
411 }\r