3 * Copyright 2012 Samsung Electronics Co., Ltd
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
9 * http://www.tizenopensource.org/license
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.
20 #include <appcore-efl.h>
21 #include <Elementary.h>
24 #include <unicode/utf8.h>
25 #include <unicode/ustring.h>
27 #include "worldclock.h"
28 #include "worldclock_dlog.h"
29 #include "worldclock_util.h"
30 #include "worldclock_detail_view.h"
32 /**********************************************************************
33 ******************define, struct ,typedef, union, enum, global val *************************************
34 ***********************************************************************/
36 Evas_Object *eo_parent; //parent
37 Evas_Object *eo_navibar; //navi_bar
38 Elm_Object_Item *ei_naviframe;
39 Evas_Object *eo_controlbar; //controlbar
40 /*Evas_Object *eo_btn_lft, *eo_btn_rht; //button */
41 /*Elm_Object_Item *eci_btn_lft, *eci_btn_rht; */
42 Evas_Object *eo_btn_back; //button back
43 Evas_Object *eo_layout; //layout
44 Evas_Object *eo_content; //content
46 Evas_Object *eo_genlist; //genlist
47 Evas_Object *eo_radio_grp;
48 /*int total_number; //total number */
50 Wcl_Return_Cb return_cb;
53 Elm_Object_Item *egi_item[WCL_DST_TYPES_COUNT];
56 /**********************************************************************
57 ******************Local function declear, extern function declear*************************************
58 ***********************************************************************/
59 static void __detailview_quit_cb(void *data, Evas_Object * obj,
61 static void __detailview_onoff_changed_cb(void *data, Evas_Object * obj,
63 static char *__detailview_gl_label_get(void *data, Evas_Object * obj,
65 static Evas_Object *__detailview_gl_icon_get(void *data, Evas_Object * obj,
67 static Eina_Bool __detailview_gl_state_get(void *data, Evas_Object * obj,
69 static void __detailview_gl_del(void *data, Evas_Object * obj);
70 static void __detailview_genlist_item_sel(void *data, Evas_Object * obj,
72 static void __detailview_genlist_dst_items_del();
73 static void __detailview_genlist_dst_items_add(Evas_Object * parent,
75 static Evas_Object *__detailview_genlist_add(Evas_Object * parent, void *data);
76 static Evas_Object *__detailview_radiobox_add(Evas_Object * parent);
78 /**********************************************************************
79 ******************Global val , static global val*************************************
80 ***********************************************************************/
82 static view_data *g_view_data = NULL;
84 static Elm_Genlist_Item_Class g_ts = {
85 .item_style = "dialogue/1text.1icon",
86 .func.text_get = __detailview_gl_label_get,
87 .func.content_get = __detailview_gl_icon_get,
88 .func.state_get = __detailview_gl_state_get,
89 .func.del = __detailview_gl_del,
92 static Elm_Genlist_Item_Class g_ts2 = {
93 .item_style = "dialogue/1text.1icon.2",
94 .func.text_get = __detailview_gl_label_get,
95 .func.content_get = __detailview_gl_icon_get,
96 .func.state_get = __detailview_gl_state_get,
97 .func.del = __detailview_gl_del,
100 /**********************************************************************
101 ******************Local function ref*************************************
102 ***********************************************************************/
104 * Callback function used for quit event caused by Evas_Object event
106 * @param[in] data data used for this function
107 * @param[in] obj object which caused this function
108 * @param[in] event_info event data
112 static void __detailview_quit_cb(void *data, Evas_Object * obj,
115 ret_if(!g_view_data);
116 view_data *view = g_view_data;
118 if (view->return_cb) {
119 view->return_cb(data, EINA_FALSE);
120 view->return_cb = NULL;
122 EVAS_OBJECT_DELIF(view->eo_genlist);
123 EVAS_OBJECT_DELIF(view->eo_radio_grp);
124 elm_naviframe_item_pop(view->eo_navibar);
128 static void __detailview_onoff_changed_cb(void *data, Evas_Object * obj,
131 ret_if(!g_view_data);
132 view_data *view = g_view_data;
133 Wcl_CitySet *cs = view->cs;
136 cs->dst_enabled = !cs->dst_enabled;
137 elm_check_state_set(obj, cs->dst_enabled);
138 // update dst disable flag
139 if (0 == cs->dst_enabled) {
140 __detailview_genlist_dst_items_del();
142 __detailview_genlist_dst_items_add(view->eo_genlist, data);
146 //////////////////////////// genlist related /////////////////////////////////////////////////
148 * Callback function used for get label as member in genlist item
150 * @param[in] data data used for this function
151 * @param[in] obj object which caused this function
152 * @param[in] part part name of the label member in genlist item
153 * @return pointer to content of label
155 static char *__detailview_gl_label_get(void *data, Evas_Object * obj,
158 int index = (int)data;
159 char buf[BUF_SIZE] = { '\0' };
161 if (!strcmp(part, "elm.text")) {
164 snprintf(buf, BUF_SIZE, _("Auto"));
167 snprintf(buf, BUF_SIZE, S_("IDS_COM_BODY_1_HOUR"));
169 case WCL_DST_2_HOURS:
170 snprintf(buf, BUF_SIZE, S_("IDS_COM_POP_PD_HOURS"),
174 snprintf(buf, BUF_SIZE, _("Daylight saving time"),
187 * Get icon of given part in genlist item
189 * @param[in] data Data used in this function
190 * @param[in] obj Evas_Object who emit this event
191 * @param[in] part Name of the part in genlist item
193 * @return NULL if meet error
194 * Pointer to new icon
196 static Evas_Object *__detailview_gl_icon_get(void *data, Evas_Object * obj,
199 int index = (int)data;
200 //Evas_Object *icon = NULL;
201 retv_if(!g_view_data, NULL);
202 Wcl_CitySet *cs = g_view_data->cs;
205 if (!strcmp(part, "elm.icon")) {
209 case WCL_DST_2_HOURS:
210 g_view_data->icon = elm_radio_add(obj);
211 elm_radio_state_value_set(g_view_data->icon, index);
212 elm_radio_group_add(g_view_data->icon, g_view_data->eo_radio_grp);
213 if (cs && index == cs->dst_type) {
214 elm_radio_value_set(g_view_data->icon, cs->dst_type);
216 evas_object_size_hint_weight_set(g_view_data->icon, EVAS_HINT_EXPAND,
218 evas_object_size_hint_align_set(g_view_data->icon, EVAS_HINT_FILL,
222 g_view_data->icon = elm_check_add(obj);
223 elm_object_style_set(g_view_data->icon, "on&off");
224 if (cs && 0 == cs->dst_enabled) {
225 elm_check_state_set(g_view_data->icon, EINA_FALSE);
227 elm_check_state_set(g_view_data->icon, EINA_TRUE);
229 evas_object_smart_callback_add(g_view_data->icon, "changed",
230 __detailview_onoff_changed_cb,
232 evas_object_propagate_events_set(g_view_data->icon, EINA_FALSE);
238 return g_view_data->icon;
241 static Eina_Bool __detailview_gl_state_get(void *data, Evas_Object * obj,
247 static void __detailview_gl_del(void *data, Evas_Object * obj)
253 * Callback function which used for genlist selection event processing
255 * @param[in] data data which used in this function
256 * @param[in] obj the object which emit the selection event
257 * @param[in] event_info information about selection event
261 static void __detailview_genlist_item_sel(void *data, Evas_Object * obj,
265 Elm_Object_Item *gli = (Elm_Object_Item *) (event_info);
266 elm_genlist_item_selected_set(gli, 0);
267 Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *) event_info;
268 ret_if(ev && (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD));
270 int index = ((int)elm_object_item_data_get(gli));
271 ret_if(!g_view_data);
272 Wcl_CitySet *cs = g_view_data->cs;
274 if (WCL_DST_OFF == index) {
275 __detailview_onoff_changed_cb(g_view_data, g_view_data->icon, NULL);
278 cs->dst_type = index;
279 elm_genlist_item_update(gli);
283 static void __detailview_genlist_dst_items_del()
285 ret_if(!g_view_data);
287 for (index = 0; index < WCL_DST_TYPES_COUNT; index++) {
288 // append data to genlist
289 if (g_view_data->egi_item[index]) {
290 elm_object_item_del(g_view_data->egi_item[index]);
291 g_view_data->egi_item[index] = NULL;
296 static void __detailview_genlist_dst_items_add(Evas_Object * parent, void *data)
299 ret_if(!g_view_data);
302 for (index = 0; index < WCL_DST_TYPES_COUNT; index++) {
303 if (g_view_data->egi_item[index]) {
304 elm_object_item_del(g_view_data->egi_item[index]);
306 // append data to genlist
307 g_view_data->egi_item[index] =
308 elm_genlist_item_append(parent, &g_ts2, (void *)index,
309 NULL, ELM_GENLIST_ITEM_NONE,
310 __detailview_genlist_item_sel,
316 * Add new genlist which used for displaying all cities which could be append
319 * @param[in] parent The parent object of the new genlist object
320 * @param[in] data Data used in this function
322 * @return NULL if create genlist failed.
323 * Pointer to the new genlist object if create genlist successfully.
325 static Evas_Object *__detailview_genlist_add(Evas_Object * parent, void *data)
327 retv_if(!data, NULL);
328 Wcl_CitySet *cs = (Wcl_CitySet *) data;
330 Evas_Object *genlist = elm_genlist_add(parent);
331 evas_object_show(genlist);
332 // append data to genlist
333 elm_genlist_item_append(genlist, &g_ts, (void *)(WCL_DST_OFF),
334 NULL, ELM_GENLIST_ITEM_NONE,
335 __detailview_genlist_item_sel, data);
336 if (cs->dst_enabled) {
337 __detailview_genlist_dst_items_add(genlist, data);
339 elm_object_part_content_set(parent, "elm.swallow.content", genlist);
343 /////////////////////////////////// genlist related finish /////////////////////////////////////////
345 static Evas_Object *__detailview_radiobox_add(Evas_Object * parent)
347 retv_if(!parent, NULL);
348 Evas_Object *radio_box = elm_radio_add(parent);
349 retv_if(!radio_box, NULL);
350 elm_radio_state_value_set(radio_box, 0);
351 elm_radio_value_set(radio_box, 0);
356 /**********************************************************************
357 ******************Global function ref*************************************
358 ***********************************************************************/
360 * Create add view for append new city into the selection list of worldclock
362 * @param[in] parent Evas_Object which is the parent of add view
363 * @param[in] data data which used in this function
364 * @param[in] func Callback function which used for invoking when exit from add view
366 * @return FAILED if create add view failed.
367 * SUCCESS if create add view successfully.
369 int worldclock_detailview_add(Evas_Object * parent, void *data,
370 Wcl_Return_Cb func, Wcl_CitySet * cs)
372 retv_if(!data || !cs, FAILED);
373 struct appdata *ad = (struct appdata *)data;
377 view_data *view = CALLOC(1, view_data);
378 retv_if(!view, FAILED);
379 memset(view, 0, sizeof(view_data));
382 view->eo_parent = parent;
383 view->eo_navibar = ad->navi_bar;
385 view->return_cb = func;
387 ad->page = WCL_PAGE_DETAIL;
390 view->eo_layout = widget_create_layout(view->eo_parent);
391 retv_if(!view->eo_layout, FAILED);
392 /* detail radio box */
393 view->eo_radio_grp = __detailview_radiobox_add(view->eo_layout);
394 retv_if(!view->eo_radio_grp, FAILED);
396 view->eo_genlist = __detailview_genlist_add(view->eo_layout, view->cs);
397 retv_if(!view->eo_genlist, FAILED);
398 // create left button
400 widget_create_button(view->eo_layout, "naviframe/end_btn/default",
401 NULL, NULL, __detailview_quit_cb, view->cs);
402 // set segment control as title about layout
404 widget_naviframe_push(view->eo_navibar, S_("IDS_COM_BODY_DETAILS"),
405 view->eo_btn_back, NULL, view->eo_layout,
411 * Release all resources which used in add view when exit from add view
413 * @param[in] data data which used in this function
417 void worldclock_detailview_free(void *data)
420 __detailview_quit_cb(NULL, NULL, NULL);