tizen 2.3.1 release
[apps/home/settings.git] / setting-common / src / setting-common-draw-naviframe.c
1 /*
2  * setting
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
5  *
6  * Contact: MyoungJune Park <mj2004.park@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21 #include <setting-common-draw-widget.h>
22 #include <glib.h>
23 #include <utilX.h>
24 #include <Ecore_X.h>
25 #include <Elementary.h>
26 #include <efl_assist.h>
27
28 extern Eina_List *elm_widget_scrollable_children_get(Evas_Object *obj);
29
30 #define HALF_SCREEN_STR_LEN 20
31 #define ONE_THIRD_SCREEN_STR_LEN 13
32
33 #define ADD_MULTI_LANGUAGE_AUTO_UPDATE(eo_view, navi_it, title_str, lbutton_str, mbutton_str,rbutton_str) \
34         {\
35                 evas_object_data_set(eo_view, "navi_it", navi_it);\
36                 evas_object_data_set(eo_view, "navi_title", title_str);\
37                 evas_object_data_set(eo_view, "lbutton_str", lbutton_str);\
38                 evas_object_data_set(eo_view, "mbutton_str", mbutton_str);\
39                 evas_object_data_set(eo_view, "rbutton_str", rbutton_str);\
40                 /*vconf_notify_key_changed(VCONFKEY_LANGSET, __navi_eo_view_lang_change_cb, eo_view);*/\
41                 evas_object_event_callback_add(eo_view, EVAS_CALLBACK_DEL, __eo_view_del_cb, NULL);\
42         }
43
44 /*
45 static void __navi_eo_view_lang_change_cb(keynode_t *key, void *data)
46 {
47         SETTING_TRACE_BEGIN;
48         setting_retm_if(NULL == key, "key is NULL");
49         setting_retm_if(NULL == data, "data is NULL");
50         Evas_Object *eo_view = data;
51         char *vconf_name = vconf_keynode_get_name(key);
52         if (!safeStrCmp(vconf_name, VCONFKEY_LANGSET))
53         {
54                 Elm_Object_Item *navi_it = evas_object_data_get(eo_view, "navi_it");
55                 char *navi_title = evas_object_data_get(eo_view, "navi_title");
56                 char *lbutton_str = evas_object_data_get(eo_view, "lbutton_str");
57                 char *mbutton_str = evas_object_data_get(eo_view, "mbutton_str");
58                 char *rbutton_str = evas_object_data_get(eo_view, "rbutton_str");
59                 const char *eo_view_t = evas_object_type_get(eo_view);
60                 SETTING_TRACE("navi_title  [%s]:%s", _(navi_title), navi_title);
61                 SETTING_TRACE("eo_view_t:%s", eo_view_t);
62                 SETTING_TRACE("lbutton_str:%s", lbutton_str);
63                 SETTING_TRACE("mbutton_str:%s", mbutton_str);
64                 SETTING_TRACE("rbutton_str:%s", rbutton_str);
65                 if (!safeStrCmp("elm_gengrid", eo_view_t))
66                         elm_gengrid_realized_items_update(eo_view);
67                 else if(!safeStrCmp("elm_genlist", eo_view_t))
68                         elm_genlist_realized_items_update(eo_view);
69
70                 if (navi_it)
71                 {
72                         SETTING_TRACE("Update navi_item, navi_title:%s", navi_title);
73                         if (navi_title)
74                                 elm_object_item_text_set(navi_it, _(navi_title));
75
76                         //l,m,r
77                         Evas_Object *toolbar = elm_object_item_part_content_get(navi_it, "toolbar");
78
79                         char *btn_str[3] = {0, };
80                         int idx = 0;
81                         if (lbutton_str && 0 != safeStrCmp(_(lbutton_str), _("IDS_COM_BODY_BACK")))
82                                 btn_str[idx++] = g_strdup(lbutton_str);
83
84                         if (rbutton_str)
85                                 btn_str[idx++] = g_strdup(rbutton_str);
86
87                         if (mbutton_str)
88                                 btn_str[idx++] = g_strdup(mbutton_str);
89
90
91                         Elm_Object_Item *it = NULL;
92                         Elm_Object_Item *next_it = NULL;
93                         //char *text = NULL;
94                         it = elm_toolbar_first_item_get(toolbar);
95                         idx = 0;
96                         while (it) {
97                                 next_it = elm_toolbar_item_next_get(it);
98                                 //text = (char *)elm_object_item_text_get(it);
99                                 elm_object_item_text_set(it, _(btn_str[idx]));
100                                 idx++;
101                                 it = next_it;
102                         }
103                 }
104         }
105 }
106 */
107 static void __eo_view_del_cb(void *data, Evas *e, Evas_Object *eo_view, void *event_info)
108 {
109         SETTING_TRACE_BEGIN;
110         ret_if(!eo_view);
111         /*(void)vconf_ignore_key_changed(VCONFKEY_LANGSET, __navi_eo_view_lang_change_cb); */
112         evas_object_data_set(eo_view, "navi_it", NULL);
113         evas_object_data_set(eo_view, "navi_title", NULL);
114         evas_object_data_set(eo_view, "lbutton_str", NULL);
115         evas_object_data_set(eo_view, "mbutton_str", NULL);
116         evas_object_data_set(eo_view, "rbutton_str", NULL);
117
118         SETTING_TRACE_END;
119 }
120
121 EXPORT_PUBLIC
122 void setting_navi_items_update(Evas_Object *navigate_bar)
123 {
124         SETTING_TRACE_BEGIN;
125         /*setting_retm_if(NULL == key, "key is NULL"); */
126         setting_retm_if(NULL == navigate_bar, "data is NULL");
127         Eina_List *list = elm_naviframe_items_get(navigate_bar);
128         Evas_Object *eo_view = NULL;
129         Evas_Object *btn = NULL;
130         char *btn_text = NULL;
131
132         while (list) {
133                 Elm_Object_Item *item = (Elm_Object_Item *) eina_list_data_get(list);
134                 if (NULL == item) {
135                         SETTING_TRACE("item is null");
136                         list = eina_list_next(list);
137                         continue;
138                 }
139
140                 btn = elm_object_item_part_content_get(item, "title_right_btn");
141                 if (btn) {
142                         btn_text = evas_object_data_get(btn, "text");
143                         if (btn_text)
144                                 elm_object_text_set(btn, _(btn_text));
145                 }
146
147                 btn = elm_object_item_part_content_get(item, "title_left_btn");
148                 if (btn) {
149                         btn_text = evas_object_data_get(btn, "text");
150                         if (btn_text)
151                                 elm_object_text_set(btn, _(btn_text));
152                 }
153
154                 eo_view = elm_object_item_content_get(item);
155                 if (NULL == eo_view) {
156                         SETTING_TRACE("eo_view is null");
157                         list = eina_list_next(list);
158                         continue;
159                 }
160
161                 Elm_Object_Item *navi_it = evas_object_data_get(eo_view, "navi_it");
162                 if (navi_it != item) {
163                         SETTING_TRACE("navi_it is null");
164                         list = eina_list_next(list);
165                         continue;
166                 }
167
168                 const char *navi_title = evas_object_data_get(eo_view, "navi_title");
169                 const char *lbutton_str = evas_object_data_get(eo_view, "lbutton_str");
170                 const char *mbutton_str = evas_object_data_get(eo_view, "mbutton_str");
171                 const char *rbutton_str = evas_object_data_get(eo_view, "rbutton_str");
172                 const char *eo_view_t = evas_object_type_get(eo_view);
173                 /*SETTING_TRACE("navi_title  [%s]:%s", _(navi_title), navi_title); */
174                 /*SETTING_TRACE("eo_view_t:%s", eo_view_t); */
175                 /*SETTING_TRACE("lbutton_str:%s", lbutton_str); */
176                 /*SETTING_TRACE("mbutton_str:%s", mbutton_str); */
177                 /*SETTING_TRACE("rbutton_str:%s", rbutton_str); */
178                 if (!safeStrCmp("elm_gengrid", eo_view_t))
179                         elm_gengrid_realized_items_update(eo_view);
180                 else if (!safeStrCmp("elm_genlist", eo_view_t))
181                         elm_genlist_realized_items_update(eo_view);
182
183                 if (navi_it) {
184                         /*SETTING_TRACE("Update navi_item, navi_title:%s", navi_title); */
185                         if (navi_title)
186                                 elm_object_item_text_set(navi_it, _(navi_title));
187
188                         /*l,m,r */
189                         Evas_Object *toolbar = elm_object_item_part_content_get(navi_it, "toolbar");
190
191                         char *btn_str[3] = {0, };
192                         int idx = 0;
193                         if (lbutton_str && 0 != safeStrCmp(_(lbutton_str), _("IDS_COM_BODY_BACK")))
194                                 btn_str[idx++] = g_strdup(lbutton_str);
195
196                         if (rbutton_str)
197                                 btn_str[idx++] = g_strdup(rbutton_str);
198
199                         if (mbutton_str)
200                                 btn_str[idx++] = g_strdup(mbutton_str);
201
202
203                         Elm_Object_Item *it = NULL;
204                         Elm_Object_Item *next_it = NULL;
205                         /*char *text = NULL; */
206                         it = elm_toolbar_first_item_get(toolbar);
207                         idx = 0;
208                         while (it) {
209                                 next_it = elm_toolbar_item_next_get(it);
210                                 /*text = (char *)elm_object_item_text_get(it); */
211                                 elm_object_item_text_set(it, _(btn_str[idx]));
212                                 idx++;
213                                 it = next_it;
214                         }
215                         G_FREE(btn_str[0]);
216                         G_FREE(btn_str[1]);
217                         G_FREE(btn_str[2]);
218                 }
219
220                 /*if not matched,to check next node. */
221                 list = eina_list_next(list);
222                 item = NULL;
223         }
224         SETTING_TRACE_END;
225 }
226
227 static void __dismissed_cb(void *data, Evas_Object *obj, void *event_info)
228 {
229         SETTING_TRACE_BEGIN;
230         ret_if(!data);
231         Setting_Btn_Data *btn_data = data;
232         if (btn_data->ctxpopup) {
233                 evas_object_del(btn_data->ctxpopup);
234                 btn_data->ctxpopup = NULL;
235         }
236 }
237
238 static void __btn_click_cb(void *data, Evas_Object *obj, void *event_info)
239 {
240         SETTING_TRACE_BEGIN;
241         ret_if(!data);
242         Setting_Btn_Data *btn_data = data;
243         btn_data->btn_click_cb(btn_data->btn_cb_data, obj, event_info);
244         if (btn_data->ctxpopup) {
245                 evas_object_del(btn_data->ctxpopup);
246                 btn_data->ctxpopup = NULL;
247         }
248 }
249
250 static void __rotate_ctxpopup_cb(void *data, Evas_Object *obj, void *event_info)
251 {
252         SETTING_TRACE_BEGIN;
253         ret_if(data == NULL);
254         Setting_Btn_Data *btn_data = (Setting_Btn_Data *)data;
255         Evas_Coord w, h;
256         int pos = -1;
257         ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
258         pos = elm_win_rotation_get(ug_get_window());
259         SETTING_TRACE_DEBUG("pos: %d, w: %d, h: %d", pos, w, h);
260         if (pos == 90) {
261                 evas_object_move(btn_data->ctxpopup, 0, w);
262         } else if (pos == 270) {
263                 evas_object_move(btn_data->ctxpopup, h, w);
264         } else {
265                 evas_object_move(btn_data->ctxpopup, 0, h);
266         }
267 }
268
269 static void __ctxpopup_lang_change_cb(keynode_t *key, void *data)
270 {
271         setting_retm_if(NULL == key, "key is NULL");
272         setting_retm_if(NULL == data, "data is NULL");
273         Setting_Btn_Data *btn_data = (Setting_Btn_Data *)data;
274         char *vconf_name = vconf_keynode_get_name(key);
275         if (!safeStrCmp(vconf_name, VCONFKEY_LANGSET)) {
276                 /*setting_popup_lang_update(popup); */
277                 int i = 0;
278                 while (btn_data->btn_text[i]) {
279                         elm_object_item_text_set(btn_data->item[i], _(btn_data->btn_text[i]));
280                         i++;
281                 }
282         }
283 }
284
285 static void __delete_rotate_ctxpopup_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
286 {
287         /*SETTING_TRACE_BEGIN; */
288         ret_if(data == NULL);
289         Setting_Btn_Data *btn_data = (Setting_Btn_Data *)data;
290         Evas_Object *ctxpopup = btn_data->ctxpopup;
291
292         Ecore_Event_Handler *event_handler = evas_object_data_get(ctxpopup, "event_handler");
293         ecore_event_handler_del(event_handler);
294         evas_object_data_set(ctxpopup, "event_handler", NULL);
295
296         (void)vconf_ignore_key_changed(VCONFKEY_LANGSET, __ctxpopup_lang_change_cb);
297         evas_object_smart_callback_del(elm_object_top_widget_get(ctxpopup), "rotation,changed", __rotate_ctxpopup_cb);
298 }
299
300 static Eina_Bool __ctxpopup_key_press_cb(void *data, int type, void *event)
301 {
302         SETTING_TRACE_BEGIN;
303         Evas_Event_Key_Down *ev = event;
304         if (!ev || !data) {
305                 SETTING_TRACE("Invalid event object");
306                 return ECORE_CALLBACK_RENEW;
307         }
308         SETTING_TRACE("Pressed %s", ev->keyname);
309         Evas_Object *ctxpopup = data;
310
311         if (!strcmp(ev->keyname, KEY_HOME)) {
312                 elm_ctxpopup_dismiss(ctxpopup);
313         }
314         return ECORE_CALLBACK_RENEW;
315 }
316
317 EXPORT_PUBLIC void setting_create_more_btn_click_cb(void *data, Evas_Object *obj, void *event_info)
318 {
319         SETTING_TRACE_BEGIN;
320         ret_if(!data);
321         Setting_Btn_Data *btn_data = data;
322
323         if (btn_data->ctxpopup) {
324                 evas_object_del(btn_data->ctxpopup);
325                 btn_data->ctxpopup = NULL;
326         }
327
328         Evas_Object *ctxpopup = elm_ctxpopup_add(btn_data->parent);
329         elm_object_style_set(ctxpopup, "more/default");
330         elm_ctxpopup_auto_hide_disabled_set(ctxpopup, EINA_TRUE); /*to disable the rotating dismiss issue */
331         ea_object_event_callback_add(ctxpopup, EA_CALLBACK_BACK, ea_ctxpopup_back_cb, NULL); /*to make ctxpopup get the "Back" key event */
332         ea_object_event_callback_add(ctxpopup, EA_CALLBACK_MORE, ea_ctxpopup_back_cb, NULL);/*to make ctxpopup get the "More" key event */
333         Ecore_Event_Handler *event_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, __ctxpopup_key_press_cb, ctxpopup);
334         evas_object_data_set(ctxpopup, "event_handler", event_handler);
335
336         evas_object_smart_callback_add(ctxpopup, "dismissed", __dismissed_cb, btn_data);
337         evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL, __delete_rotate_ctxpopup_cb, btn_data);
338         evas_object_smart_callback_add(elm_object_top_widget_get(ctxpopup), "rotation,changed", __rotate_ctxpopup_cb, btn_data);
339         vconf_notify_key_changed(VCONFKEY_LANGSET, __ctxpopup_lang_change_cb, btn_data);
340
341         SETTING_TRACE("Clicked a more button, the call back of selecting objects in context popup is not the same as button callback");
342         Evas_Object *icon = NULL;
343
344         int i = 0;
345         /*while(btn_data->btn_text[i]) */
346         for (i = 0; i < MAX_BUTTON_NUM; i++) {
347                 /*SETTING_TRACE("btn_data->btn_text[%d]:%s", i, btn_data->btn_text[i]); */
348                 if (isEmptyStr(btn_data->btn_text[i])) continue;
349                 if (btn_data->btn_icon[i]) {
350                         icon = elm_image_add(ctxpopup);
351                         elm_image_file_set(icon, btn_data->btn_icon[i], NULL);
352
353                 }
354                 btn_data->item[i] = elm_ctxpopup_item_append(ctxpopup, _(btn_data->btn_text[i]), icon, __btn_click_cb, btn_data);
355         }
356
357         btn_data->ctxpopup = ctxpopup;
358
359         Evas_Coord w , h;
360
361         int pos = -1;
362         ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
363         pos = elm_win_rotation_get(ug_get_window());
364         if (pos == 90) {
365                 evas_object_move(ctxpopup, 0, w);
366         } else if (pos == 270) {
367                 evas_object_move(ctxpopup, h, w);
368         } else {
369                 evas_object_move(ctxpopup, 0, h);
370         }
371         evas_object_show(ctxpopup);
372 }
373
374 EXPORT_PUBLIC void setting_create_more_btn_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
375 {
376         SETTING_TRACE_BEGIN;
377         ret_if(!data);
378         Setting_Btn_Data *btn_data = data;
379
380         evas_object_smart_callback_del(btn_data->ctxpopup, "dismissed", __dismissed_cb);
381         if (btn_data->ctxpopup) {
382                 evas_object_del(btn_data->ctxpopup);
383                 btn_data->ctxpopup = NULL;
384         }
385         int i = 0;
386         /*while(btn_data->btn_text[i]) */
387         for (i = 0; i < MAX_BUTTON_NUM; i++) {
388                 FREE(btn_data->btn_text[i]);
389                 FREE(btn_data->btn_icon[i]);
390         }
391         FREE(btn_data);/*delete the date. */
392         SETTING_TRACE_END;
393         /*evas_object_data_set(obj, "more_btn_data", NULL); */
394 }
395
396 EXPORT_PUBLIC
397 Evas_Object *setting_create_win_layout(Evas_Object *win_layout,
398                                        Evas_Object *win_obj)
399 {
400         Evas_Object *layout = NULL;
401         /*  Base Layout */
402         layout = elm_layout_add(win_obj);
403         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
404         setting_retvm_if(layout == NULL, FALSE, "layout == NULL");
405
406         elm_layout_theme_set(layout, "layout", "application", "default");
407
408         Evas_Object *bg = setting_create_bg(layout, win_obj, NULL);
409         elm_object_part_content_set(layout, "elm.swallow.bg", bg);
410         evas_object_show(layout);
411         return layout;
412 }
413
414 EXPORT_PUBLIC
415 Elm_Object_Item *setting_create_guild_layout(Evas_Object *navi_bar,
416                                              char *title_str,
417                                              char *lbutton_str,
418                                              char *rbutton_str,
419                                              char *mbutton_str,
420                                              setting_call_back_func lbutton_click_cb,
421                                              setting_call_back_func rbutton_click_cb,
422                                              setting_call_back_func mbutton_click_cb,
423                                              char *content_str1,
424                                              char **png_list,
425                                              char *content_str2,
426                                              char *content_button_str,
427                                              setting_call_back_func content_button_click_cb,
428                                              void *cb_data)
429 {
430         Evas_Object *scroller = elm_genlist_add(navi_bar);
431         retvm_if(scroller == NULL, NULL, "Cannot set scroller object  as contento of layout");
432         elm_genlist_realization_mode_set(scroller, EINA_TRUE);
433         elm_object_style_set(scroller, "dialogue");
434         elm_genlist_clear(scroller);    /* first to clear list */
435         elm_genlist_mode_set(scroller, ELM_LIST_COMPRESS);
436         evas_object_smart_callback_add(scroller, "realized", __gl_realized_cb, NULL);
437
438         ADD_GL_LABLE(scroller, content_str1);
439         ADD_GL_GIF(scroller, png_list)
440         ADD_GL_LABLE(scroller, content_str2);
441         ADD_GL_BUTTON(scroller, content_button_str, content_button_click_cb, cb_data)
442
443         return setting_push_layout_navi_bar(title_str,
444                                             lbutton_str, rbutton_str, NULL,
445                                             lbutton_click_cb,
446                                             rbutton_click_cb,
447                                             NULL, cb_data, scroller, navi_bar, NULL);
448 }
449
450 EXPORT_PUBLIC
451 Elm_Object_Item *setting_create_guild_layout2(Evas_Object *navi_bar,
452                                               char *title_str,
453                                               char *lbutton_str,
454                                               char *rbutton_str,
455                                               char *mbutton_str,
456                                               setting_call_back_func lbutton_click_cb,
457                                               setting_call_back_func rbutton_click_cb,
458                                               setting_call_back_func mbutton_click_cb,
459                                               char *content_str1,
460                                               Evas_Object **ug_layout,
461                                               char *content_str2,
462                                               char *content_button_str,
463                                               setting_call_back_func content_button_click_cb,
464                                               void *cb_data)
465 {
466         Evas_Object *scroller;
467         Elm_Object_Item *item = setting_push_layout_navi_bar_scroller(navi_bar,
468                                                                       title_str,
469                                                                       lbutton_str, rbutton_str,
470                                                                       lbutton_click_cb,
471                                                                       rbutton_click_cb,
472                                                                       cb_data, &scroller,
473                                                                       navi_bar);
474         Evas_Object *outer_box = setting_create_client_bx(navi_bar);
475         /*add top text window.. */
476         if (content_str1) {
477                 const char *str = setting_customize_text(content_str1, 0, NULL, NULL);
478                 Evas_Object *lable = setting_create_textbox(navi_bar, str);
479                 setting_disable_evas_object(lable);
480                 elm_box_pack_end(outer_box, lable);
481                 FREE(str);
482         }
483
484         /*add UG window.. */
485         if (ug_layout) {
486                 Evas_Object *ug_win = elm_layout_add(navi_bar);
487                 evas_object_size_hint_weight_set(ug_win, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
488                 setting_retvm_if(ug_win == NULL, NULL, "layout == NULL");
489                 elm_layout_theme_set(ug_win, "layout", "application", "default");
490                 elm_object_part_content_set(ug_win, "elm.swallow.bg", setting_create_blank_rect_customize(navi_bar, 720, 850));
491                 /*elm_object_part_content_set(layout, "elm.swallow.content", navi); */
492                 elm_box_pack_end(outer_box, ug_win);
493                 evas_object_show(ug_win);
494                 *ug_layout = ug_win;
495         }
496
497         /*add bottom text */
498         if (content_str2) {
499                 const char *str = setting_customize_text(content_str2, 0, NULL, NULL);
500                 Evas_Object *lable = setting_create_textbox(navi_bar, str);
501                 setting_disable_evas_object(lable);
502                 elm_box_pack_end(outer_box, lable);
503                 FREE(str);
504         }
505
506         /*add bottom button */
507         if (content_button_str) {
508                 Evas_Object *layout = elm_layout_add(navi_bar);
509                 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
510                 elm_layout_theme_set(layout, "layout", "application", "default");
511                 elm_object_part_content_set(layout, "elm.swallow.bg", setting_create_blank_rect_customize(navi_bar, 680, 100));
512                 Evas_Object *btn = elm_button_add(navi_bar);
513                 elm_object_text_set(btn, content_button_str);
514                 evas_object_propagate_events_set(btn, EINA_FALSE);
515                 evas_object_smart_callback_add(btn, "clicked", content_button_click_cb, cb_data);
516                 elm_object_part_content_set(layout, "elm.swallow.content", btn);
517                 evas_object_show(btn);
518                 evas_object_show(layout);
519                 elm_box_pack_end(outer_box, layout);
520         }
521
522         elm_object_content_set(scroller, outer_box);
523         return item;
524 }
525
526 EXPORT_PUBLIC
527 Evas_Object *setting_create_navi_bar(Evas_Object *layout)
528 {
529
530         Evas_Object *navi = NULL;
531         navi = elm_naviframe_add(layout);
532
533         elm_naviframe_prev_btn_auto_pushed_set(navi, EINA_FALSE);
534
535         ea_object_event_callback_add(navi, EA_CALLBACK_BACK, ea_naviframe_back_cb, NULL);
536         ea_object_event_callback_add(navi, EA_CALLBACK_MORE, ea_naviframe_more_cb, NULL);
537
538         /*elm_object_item_signal_callback_event(navi */
539
540         if (navi == NULL) {
541                 SETTING_TRACE(" *** elm_naviframe_add returns NULL *** ");
542                 return NULL;
543         }
544         elm_object_part_content_set(layout, "elm.swallow.content", navi);
545         evas_object_show(navi);
546         return navi;
547 }
548
549 /**
550 * The API to Create title buttons of naviframe
551 * if sip is shown,the buttons created by this API will be shown,it sip is hidden,they will be hiden too
552 * @return non
553 * eg:
554 *       //4 common buttons
555 *       setting_append_naviframe_title_buttons(ad->navi_it, ad->navi_bar,
556 *                                              "1", "2", "3" ,"4",
557 *                                              _back_cb,
558 *                                              _back_cb,
559 *                                              _back_cb,
560 *                                              _back_cb);
561 *
562 *       //more button +2 common buttons + '<-'button
563 *       setting_append_naviframe_title_buttons(ad->navi_it, ad->navi_bar,
564 *                                              NULL, "2", "3" ,NULL,
565 *                                              _back_cb,
566 *                                              _back_cb,
567 *                                              _back_cb,
568 *                                              _back_cb);
569 *
570 *       //1common buton + '<-'button
571 *       setting_append_naviframe_title_buttons(ad->navi_it, ad->navi_bar,
572 *                                              NULL, NULL, _("IDS_COM_SK_DONE") ,NULL,
573 *                                              NULL,
574 *                                              NULL,
575 *                                              _back_cb,
576 *                                              _back_cb);
577 */
578 EXPORT_PUBLIC
579 void setting_append_naviframe_title_buttons(Elm_Object_Item *navi_it,
580                                             Evas_Object *navigate_bar,
581                                             char *more_button_str,
582                                             char *left_button_str,
583                                             char *right_button_str,
584                                             char *back_button_str,
585                                             setting_call_back_func more_button_click_cb,
586                                             setting_call_back_func left_button_click_cb,
587                                             setting_call_back_func right_button_click_cb,
588                                             setting_call_back_func back_button_click_cb,
589                                             void *cb_data)
590 {
591         SETTING_TRACE_BEGIN;
592         Evas_Object *btn = NULL;
593         /*  create buttons */
594         if (more_button_click_cb) {
595                 if (!more_button_str) {
596
597                         /*btn = setting_create_button(navigate_bar, NULL, "naviframe/more/default", more_button_click_cb, cb_data); */
598                         btn = elm_button_add(navigate_bar);
599                         elm_object_style_set(btn, "naviframe/more/default");
600                         evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
601                         evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.5);
602                         evas_object_smart_callback_add(btn, "clicked", more_button_click_cb, cb_data);
603                         evas_object_show(btn);
604                 } else {
605                         btn = setting_create_button(navigate_bar, more_button_str, "naviframe/title/default", more_button_click_cb, cb_data);
606
607                 }
608                 elm_object_item_part_content_set(navi_it, "title_more_btn", btn);
609         }
610
611         if (left_button_click_cb) {
612                 btn = setting_create_button(navigate_bar, left_button_str, "naviframe/title/default", left_button_click_cb, cb_data);
613                 elm_object_item_part_content_set(navi_it, "title_toolbar_button1", btn);
614         }
615
616         if (right_button_click_cb) {
617                 btn = setting_create_button(navigate_bar, right_button_str, "naviframe/title/default", right_button_click_cb, cb_data);
618                 elm_object_item_part_content_set(navi_it, "title_toolbar_button2", btn);
619         }
620
621         if (back_button_click_cb) {
622                 if (!back_button_str) {
623                         /*btn = setting_create_button(navigate_bar, NULL, "naviframe/back_btn/default", back_button_click_cb, cb_data); */
624                         btn = elm_button_add(navigate_bar);
625                         elm_object_style_set(btn, "naviframe/back_btn/default");
626                         evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
627                         evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.5);
628                         evas_object_smart_callback_add(btn, "clicked", back_button_click_cb, cb_data);
629                         evas_object_show(btn);
630                 } else {
631                         btn = setting_create_button(navigate_bar, back_button_str, "naviframe/title/default", back_button_click_cb, cb_data);
632
633                 }
634                 elm_object_item_part_content_set(navi_it, "title_prev_btn", btn);
635         }
636 }
637
638 /*"title_more_btn" won't be supported any more, so don't pass mbutton_str */
639 EXPORT_PUBLIC
640 Elm_Object_Item *setting_create_navi_bar_top_buttons(char *title_str,
641                                                      char *lbutton_str,
642                                                      char *rbutton_str,
643                                                      char *mbutton_str,
644                                                      setting_call_back_func lbutton_click_cb,
645                                                      setting_call_back_func rbutton_click_cb,
646                                                      setting_call_back_func mbutton_click_cb,
647                                                      void *cb_data, Evas_Object *eo_view,/*any container obj */
648                                                      Evas_Object *navigate_bar)
649 {
650         /*SETTING_TRACE_BEGIN; */
651         Evas_Object *l_button = NULL;
652         Evas_Object *r_button = NULL;
653         Evas_Object *m_button = NULL;
654         Elm_Object_Item *navi_it = NULL;
655
656         if (lbutton_str) {
657                 /*  create buttons */
658                 l_button = setting_create_button(navigate_bar, lbutton_str,
659                                                  "naviframe/toolbar/default",
660                                                  lbutton_click_cb, cb_data);
661         }
662         if (rbutton_str) {
663                 r_button = setting_create_button(navigate_bar, rbutton_str,
664                                                  "naviframe/end_btn/default",
665                                                  rbutton_click_cb, cb_data);
666         }
667         if (mbutton_str) {
668                 m_button = setting_create_button(navigate_bar, mbutton_str,
669                                                  NULL,
670                                                  mbutton_click_cb, cb_data);
671         }
672         navi_it = elm_naviframe_item_push(navigate_bar, title_str,
673                                           NULL, NULL, eo_view,
674                                           NULL);
675         retv_if(!navi_it, NULL);
676
677         /*  arrange buttons into  navi_it*/
678         if (l_button) { /* done */
679                 elm_object_item_part_content_set(navi_it, "title_toolbar_button1", l_button);
680         }
681         if (r_button) { /* cancel */
682                 elm_object_item_part_content_set(navi_it, "title_prev_btn", r_button);
683         }
684         if (m_button) { /* none */
685                 elm_object_item_part_content_set(navi_it, "title_more_btn", m_button);
686         }
687         return navi_it;
688 }
689
690 Elm_Object_Item *__create_navi_bar_bottom_buttons(char *title_str, char *lbutton_str, char *rbutton_str,
691                                                   char *mbutton_str, setting_call_back_func lbutton_click_cb,/* MORE */
692                                                   setting_call_back_func rbutton_click_cb,
693                                                   setting_call_back_func mbutton_click_cb,
694                                                   void *cb_data, Evas_Object *eo_view,/*any container obj */
695                                                   Evas_Object *navigate_bar,    /*the specialized navigation bar */
696                                                   Evas_Object *titleobj)
697 {
698         SETTING_TRACE_BEGIN;
699         Elm_Object_Item *navi_it = NULL;
700         /*Evas_Object *mbtn = NULL; */
701         /*Evas_Object *rbtn = NULL; */
702         Evas_Object *lbtn = NULL;
703         Evas_Object *toolbar = NULL;
704
705         /*  arrange buttons into  controlbar*/
706         if (0 == safeStrCmp(_(lbutton_str), _("IDS_COM_BODY_BACK"))) {
707                 lbtn = setting_create_button(navigate_bar, _(lbutton_str),
708                                              NAVI_BACK_BUTTON_STYLE,
709                                              NULL, NULL);
710                 /*lbutton_click_cb, cb_data); */
711 #if SUPPORT_TTS
712                 setting_set_tts_info(lbtn, _(lbutton_str), NULL, NULL, TTS_CONTENT_BACK_CLICK_INFO);
713 #endif
714                 navi_it = elm_naviframe_item_push(navigate_bar, title_str, lbtn, NULL, eo_view, NULL);  /* add new button */
715                 if (navi_it) {
716                         if (0 != safeStrCmp(title_str, dgettext(SETTING_PACKAGE, title_str)))
717                                 elm_object_item_domain_text_translatable_set(navi_it, SETTING_PACKAGE, EINA_TRUE);
718                         else
719                                 elm_object_item_domain_text_translatable_set(navi_it, "sys_string", EINA_TRUE);
720
721                         elm_object_style_set(lbtn, NAVI_BACK_BUTTON_STYLE);     /* take into effect */
722                         elm_naviframe_item_pop_cb_set(navi_it, (Elm_Naviframe_Item_Pop_Cb)lbutton_click_cb, cb_data);
723                         ADD_MULTI_LANGUAGE_AUTO_UPDATE(eo_view, navi_it, title_str, lbutton_str, mbutton_str, rbutton_str);
724                 }
725
726                 /* more handler */
727                 /*elm_object_item_signal_callback_add(navi_it, "elm,action,more,event", more_cb, cb_data); */
728
729                 if (!rbutton_str && !mbutton_str) {
730                         /*do nothing.. */
731                 } else if (rbutton_str && mbutton_str) {        /* both exist.. */
732                         toolbar = elm_toolbar_add(navigate_bar);
733                         if (toolbar) {
734                                 elm_object_style_set(toolbar, "default");
735                                 elm_toolbar_select_mode_set(toolbar, ELM_OBJECT_SELECT_MODE_NONE);
736                                 elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
737                                 elm_toolbar_transverse_expanded_set(toolbar, EINA_TRUE);
738                                 elm_toolbar_item_append(toolbar, NULL, _(mbutton_str), mbutton_click_cb, cb_data);
739                                 elm_toolbar_item_append(toolbar, NULL, _(rbutton_str), rbutton_click_cb, cb_data);
740
741                                 elm_object_item_part_content_set(navi_it, "toolbar", toolbar);
742                         }
743                         /*mbtn = setting_create_button(navigate_bar, mbutton_str, NAVI_DEF_BUTTON_STYLE, mbutton_click_cb, cb_data); */
744                         /*rbtn = setting_create_button(navigate_bar, rbutton_str, NAVI_DEF_BUTTON_STYLE, rbutton_click_cb, cb_data); */
745                         /*elm_object_item_part_content_set(navi_it, "toolbar_button1", mbtn); */
746                         /*elm_object_item_part_content_set(navi_it, "toolbar_button2", rbtn); */
747                 } else if (rbutton_str) {       /* r_btn exist.. */
748                         toolbar = elm_toolbar_add(navigate_bar);
749                         if (toolbar) {
750                                 elm_object_style_set(toolbar, "default");
751                                 elm_toolbar_select_mode_set(toolbar, ELM_OBJECT_SELECT_MODE_NONE);
752                                 elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
753                                 elm_toolbar_transverse_expanded_set(toolbar, EINA_TRUE);
754                                 elm_toolbar_item_append(toolbar, NULL, _(rbutton_str), rbutton_click_cb, cb_data);
755
756                                 elm_object_item_part_content_set(navi_it, "toolbar", toolbar);
757                         }
758                         /*rbtn = setting_create_button(navigate_bar, rbutton_str, NAVI_DEF_BUTTON_STYLE, rbutton_click_cb, cb_data); */
759                         /*elm_object_item_part_content_set(navi_it, "toolbar_button1", rbtn); */
760                         /*elm_object_item_part_content_set(navi_it, "toolbar_button2", setting_create_button(navigate_bar, "", NULL, NULL, NULL)); */
761                 } else if (mbutton_str) {       /* m_btn exist.. */
762                         toolbar = elm_toolbar_add(navigate_bar);
763                         if (toolbar) {
764                                 elm_object_style_set(toolbar, "default");
765                                 elm_toolbar_select_mode_set(toolbar, ELM_OBJECT_SELECT_MODE_NONE);
766                                 elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
767                                 elm_toolbar_transverse_expanded_set(toolbar, EINA_TRUE);
768                                 elm_toolbar_item_append(toolbar, NULL, _(mbutton_str), mbutton_click_cb, cb_data);
769
770                                 elm_object_item_part_content_set(navi_it, "toolbar", toolbar);
771                         }
772                         /*mbtn = setting_create_button(navigate_bar, mbutton_str, NAVI_DEF_BUTTON_STYLE, mbutton_click_cb, cb_data); */
773                         /*elm_object_item_part_content_set(navi_it, "toolbar_button1", mbtn); */
774                         /*elm_object_item_part_content_set(navi_it, "toolbar_button2", setting_create_button(navigate_bar, "", NULL, NULL, NULL)); */
775                 }
776                 return navi_it;
777         }
778         navi_it = elm_naviframe_item_push(navigate_bar, title_str, NULL, NULL, eo_view, NULL);
779         if (navi_it) {
780                 SETTING_TRACE("dgettext(SETTING_PACKAGE, title_str):%s", dgettext(SETTING_PACKAGE, title_str));
781                 SETTING_TRACE("dgettext(SYSTEM_PACKAGE, title_str):%s", dgettext(SYSTEM_PACKAGE, title_str));
782                 if (0 != safeStrCmp(title_str, dgettext(SETTING_PACKAGE, title_str)))
783                         elm_object_item_domain_text_translatable_set(navi_it, SETTING_PACKAGE, EINA_TRUE);
784                 else
785                         elm_object_item_domain_text_translatable_set(navi_it, "sys_string", EINA_TRUE);
786                 ADD_MULTI_LANGUAGE_AUTO_UPDATE(eo_view, navi_it, title_str, lbutton_str, mbutton_str, rbutton_str);
787         }
788         if (rbutton_str || mbutton_str) {
789                 toolbar = elm_toolbar_add(navigate_bar);
790                 if (toolbar) {
791                         elm_object_style_set(toolbar, "default");
792                         elm_toolbar_select_mode_set(toolbar, ELM_OBJECT_SELECT_MODE_NONE);
793                         elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
794                         elm_toolbar_transverse_expanded_set(toolbar, EINA_TRUE);
795                 }
796         }
797         if (lbutton_str && mbutton_str && rbutton_str) {
798                 lbtn = setting_create_button(navigate_bar, lbutton_str, NAVI_DEF_BUTTON_STYLE, lbutton_click_cb, cb_data);
799                 elm_object_item_part_content_set(navi_it, "toolbar_more_btn", lbtn);
800                 /*mbtn = setting_create_button(navigate_bar, mbutton_str, NAVI_DEF_BUTTON_STYLE, mbutton_click_cb, cb_data); */
801                 /*elm_object_item_part_content_set(navi_it, "toolbar_button1", mbtn); */
802                 /*rbtn = setting_create_button(navigate_bar, rbutton_str, NAVI_DEF_BUTTON_STYLE, rbutton_click_cb, cb_data); */
803                 /*elm_object_item_part_content_set(navi_it, "toolbar_button2", rbtn); */
804
805                 elm_toolbar_item_append(toolbar, NULL, _(mbutton_str), mbutton_click_cb, cb_data);
806                 elm_toolbar_item_append(toolbar, NULL, _(rbutton_str), rbutton_click_cb, cb_data);
807
808                 if (0 == safeStrCmp(_(lbutton_str), _("IDS_COM_SK_CANCEL")))
809                         elm_naviframe_item_pop_cb_set(navi_it, (Elm_Naviframe_Item_Pop_Cb)lbutton_click_cb, cb_data);
810         } else {
811                 /*bool has_btn_flag = FALSE;//first "toolbar_button1", then "toolbar_button2". */
812                 if (lbutton_str) {
813                         /*lbtn = setting_create_button(navigate_bar, lbutton_str, NAVI_DEF_BUTTON_STYLE, lbutton_click_cb, cb_data); */
814                         /*elm_object_item_part_content_set(navi_it, "toolbar_button1", lbtn); */
815                         elm_toolbar_item_append(toolbar, NULL, _(lbutton_str), lbutton_click_cb, cb_data);
816                         /*has_btn_flag = TRUE; */
817
818                         if (0 == safeStrCmp(_(lbutton_str), _("IDS_COM_SK_CANCEL")))
819                                 elm_naviframe_item_pop_cb_set(navi_it, (Elm_Naviframe_Item_Pop_Cb)lbutton_click_cb, cb_data);
820                 }
821                 if (mbutton_str) {
822                         /*mbtn = setting_create_button(navigate_bar, mbutton_str, NAVI_DEF_BUTTON_STYLE, mbutton_click_cb, cb_data); */
823                         /*elm_object_item_part_content_set(navi_it, has_btn_flag ? "toolbar_button2" : "toolbar_button1", mbtn); */
824                         elm_toolbar_item_append(toolbar, NULL, _(mbutton_str), mbutton_click_cb, cb_data);
825                         /*has_btn_flag = TRUE; */
826                 }
827                 if (rbutton_str) {
828                         /*rbtn = setting_create_button(navigate_bar, rbutton_str, NAVI_DEF_BUTTON_STYLE, rbutton_click_cb, cb_data); */
829                         /*elm_object_item_part_content_set(navi_it, has_btn_flag ? "toolbar_button2" : "toolbar_button1", rbtn); */
830                         elm_toolbar_item_append(toolbar, NULL, _(rbutton_str), rbutton_click_cb, cb_data);
831                         /*has_btn_flag = TRUE; */
832                 }
833         }
834         elm_object_item_part_content_set(navi_it, "toolbar", toolbar);
835         return navi_it;
836
837 }
838
839
840 /**
841 * Create buttons on the specialized navigation bar
842 *
843 * @param[in] eo_view    navigation bar's content
844 * @param[in] controlbar   title obj of navigation bar
845 *
846 */
847 EXPORT_PUBLIC
848 void setting_create_navi_bar_buttons(char *title_str, char *lbutton_str, char *rbutton_str,
849                                      char *mbutton_str, setting_call_back_func lbutton_click_cb,
850                                      setting_call_back_func rbutton_click_cb,
851                                      setting_call_back_func mbutton_click_cb,
852                                      void *cb_data, Evas_Object *eo_view,/*any container obj */
853                                      Evas_Object *navigate_bar, /*the specialized navigation bar */
854                                      Evas_Object *titleobj)
855 {
856         /* controlbar */
857         __create_navi_bar_bottom_buttons(title_str, lbutton_str,
858                                          rbutton_str, mbutton_str,
859                                          lbutton_click_cb,
860                                          rbutton_click_cb,
861                                          mbutton_click_cb,
862                                          cb_data, eo_view,
863                                          navigate_bar, titleobj);
864         return;
865 }
866
867 /**
868 * The general API to create a layout with navigation bar,
869 *   which contents any evas container object(@param[eo_view]) as its content
870 *
871 * @param[in] eo_view    navigation bar's content
872 * @param[out] titleobj   title obj of navigation bar
873 *
874 * return main layout of UG or App..
875 */
876 EXPORT_PUBLIC
877 Evas_Object *setting_create_layout_navi_bar(Evas_Object *win_layout, Evas_Object *win_obj, char *title_str, char *lbutton_str, char *rbutton_str, char *mbutton_str, setting_call_back_func lbutton_click_cb, setting_call_back_func rbutton_click_cb, setting_call_back_func mbutton_click_cb, void *cb_data, Evas_Object *eo_view,    /*any container obj constructed on any evas obj */
878                                             Evas_Object **navi_bar,
879                                             Evas_Object **titleobj)
880 {
881
882         Evas_Object *layout = setting_create_win_layout(win_layout, win_obj);
883         *navi_bar = setting_create_navi_bar(layout);
884
885         setting_create_navi_bar_buttons(title_str,
886                                         lbutton_str, rbutton_str, mbutton_str,
887                                         lbutton_click_cb, rbutton_click_cb,
888                                         mbutton_click_cb, cb_data, eo_view /*content */ ,
889                                         *navi_bar, NULL);
890         return layout;
891 }
892
893 /**
894 * The API to create a layout with navigation bar,
895 *   which contents a scroller object as its content
896 *
897 * @param[out] scroller   navigation bar's content
898 *
899 * @return a layout with a special navigation bar and at most 2 buttons
900 */
901 EXPORT_PUBLIC
902 Evas_Object *setting_create_layout_navi_bar_scroller(Evas_Object *win_layout,
903                                                      Evas_Object *win_obj,
904                                                      char *title_str,
905                                                      char *lbutton_str,
906                                                      char *rbutton_str,
907                                                      setting_call_back_func
908                                                      lbutton_click_cb,
909                                                      setting_call_back_func
910                                                      rbutton_click_cb,
911                                                      void *cb_data,
912                                                      Evas_Object **scroller,
913                                                      Evas_Object **navi_bar)
914 {
915
916         Evas_Object *layout = setting_create_win_layout(win_layout, win_obj);
917         *navi_bar = setting_create_navi_bar(layout);
918
919         /*****/
920         /*  create scroller as CONTENT */
921         Evas_Object *scrl = NULL;
922         /* Evas_Object *ret = NULL; */
923         if (scroller != NULL) {
924                 /* scrl =*scroller = elm_scroller_add(win_layout); */
925                 scrl = *scroller = elm_scroller_add(layout);
926                 retvm_if(*scroller == NULL, NULL,
927                          "Cannot set scroller object as contento of layout");
928                 elm_scroller_bounce_set(*scroller, EINA_FALSE, EINA_TRUE);
929                 elm_scroller_policy_set(*scroller, ELM_SCROLLER_POLICY_OFF,
930                                         ELM_SCROLLER_POLICY_AUTO);
931                 evas_object_show(*scroller);
932         }
933
934         /*****/
935
936         setting_create_navi_bar_buttons(title_str,
937                                         lbutton_str, rbutton_str, NULL,
938                                         lbutton_click_cb, rbutton_click_cb,
939                                         NULL, cb_data, scrl /*content */ ,
940                                         *navi_bar, NULL);
941         return layout;
942 }
943
944 /**
945 * The API to create a layout with navigation bar ,
946 *       which contents a genlist object as its content
947 *
948 * @return a layout with a special navigation bar and at most 2 buttons
949 */
950 EXPORT_PUBLIC
951 Evas_Object *setting_create_layout_navi_bar_genlist(Evas_Object *win_layout,
952                                                     Evas_Object *win_obj,
953                                                     char *title_str,
954                                                     char *lbutton_str,
955                                                     char *rbutton_str,
956                                                     setting_call_back_func
957                                                     lbutton_click_cb,
958                                                     setting_call_back_func
959                                                     rbutton_click_cb,
960                                                     void *cb_data,
961                                                     Evas_Object **genlist,
962                                                     Evas_Object **navi_bar)
963 {
964         /*  win_layout -> layout */
965         Evas_Object *layout = setting_create_win_layout(win_layout, win_obj);
966         *navi_bar = setting_create_navi_bar(layout);
967
968         *genlist = elm_genlist_add(*navi_bar);
969         retvm_if(*genlist == NULL, NULL,
970                  "Cannot set scroller object as contento of layout");
971         elm_genlist_realization_mode_set(*genlist, EINA_TRUE);
972         elm_object_style_set(*genlist, "dialogue");
973         elm_genlist_clear(*genlist);    /* first to clear list */
974         evas_object_smart_callback_add(*genlist, "realized", __gl_realized_cb, NULL);
975
976         setting_create_navi_bar_buttons(title_str,
977                                         lbutton_str, rbutton_str, NULL,
978                                         lbutton_click_cb, rbutton_click_cb,
979                                         NULL, cb_data, *genlist, *navi_bar,
980                                         NULL);
981         return layout;
982 }
983
984 EXPORT_PUBLIC
985 Elm_Object_Item *__push_navi_bar_bottom_buttons(char *title_str,
986                                                 char *lbutton_str, char *rbutton_str,
987                                                 char *mbutton_str,
988                                                 setting_call_back_func lbutton_click_cb,
989                                                 setting_call_back_func rbutton_click_cb,
990                                                 setting_call_back_func mbutton_click_cb,
991                                                 void *cb_data, Evas_Object *eo_view,
992                                                 Evas_Object *navigate_bar, Evas_Object **titleobj)
993 {
994         Elm_Object_Item *navi_it = NULL;
995         /*Evas_Object *mbtn = NULL; */
996         /*Evas_Object *rbtn = NULL; */
997         Evas_Object *lbtn = NULL;
998         Evas_Object *toolbar = NULL;
999
1000         /*  arrange buttons into  controlbar*/
1001         if (0 == safeStrCmp(_(lbutton_str), _("IDS_COM_BODY_BACK"))) {
1002                 lbtn = setting_create_button(navigate_bar, _(lbutton_str),
1003                                              NAVI_BACK_BUTTON_STYLE,
1004                                              NULL, NULL);
1005                 /*lbutton_click_cb, cb_data); */
1006 #if SUPPORT_TTS
1007                 setting_set_tts_info(lbtn, _(lbutton_str), NULL, NULL, TTS_CONTENT_BACK_CLICK_INFO);
1008 #endif
1009                 navi_it = elm_naviframe_item_push(navigate_bar, title_str, lbtn, NULL, eo_view, NULL);
1010                 if (0 != safeStrCmp(title_str, dgettext(SETTING_PACKAGE, title_str)))
1011                         elm_object_item_domain_text_translatable_set(navi_it, SETTING_PACKAGE, EINA_TRUE);
1012                 else
1013                         elm_object_item_domain_text_translatable_set(navi_it, "sys_string", EINA_TRUE);
1014                 ADD_MULTI_LANGUAGE_AUTO_UPDATE(eo_view, navi_it, title_str, lbutton_str, mbutton_str, rbutton_str);
1015
1016                 elm_object_style_set(lbtn, NAVI_BACK_BUTTON_STYLE);     /* take into effect */
1017                 if (lbutton_click_cb)
1018                         elm_naviframe_item_pop_cb_set(navi_it, (Elm_Naviframe_Item_Pop_Cb)lbutton_click_cb, cb_data);
1019
1020                 if (!rbutton_str && !mbutton_str) {
1021                         return navi_it;
1022                 }
1023
1024                 toolbar = elm_toolbar_add(navigate_bar);
1025                 elm_object_style_set(toolbar, "default");
1026                 elm_toolbar_select_mode_set(toolbar, ELM_OBJECT_SELECT_MODE_NONE);
1027                 elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
1028                 elm_toolbar_transverse_expanded_set(toolbar, EINA_TRUE);
1029
1030                 if (rbutton_str && mbutton_str) {
1031                         if (safeStrLen(_(mbutton_str)) <= MAX_BUTTON_TEXT_LEN
1032                             && safeStrLen(_(rbutton_str)) <= MAX_BUTTON_TEXT_LEN) {
1033                                 /*mbtn = setting_create_button(navigate_bar, mbutton_str, NAVI_DEF_BUTTON_STYLE, mbutton_click_cb, cb_data); */
1034                                 /*rbtn = setting_create_button(navigate_bar, rbutton_str, NAVI_DEF_BUTTON_STYLE, rbutton_click_cb, cb_data); */
1035
1036                                 elm_toolbar_item_append(toolbar, NULL, _(mbutton_str), mbutton_click_cb, cb_data);
1037                                 elm_toolbar_item_append(toolbar, NULL, _(rbutton_str), rbutton_click_cb, cb_data);
1038
1039                                 elm_object_item_part_content_set(navi_it, "toolbar", toolbar);
1040
1041                                 /*elm_object_item_part_content_set(navi_it, "toolbar_button1", mbtn); */
1042                                 /*elm_object_item_part_content_set(navi_it, "toolbar_button2", rbtn); */
1043                         } else {
1044                                 elm_toolbar_item_append(toolbar, NULL, _(mbutton_str), mbutton_click_cb, cb_data);
1045
1046                                 elm_object_item_part_content_set(navi_it, "toolbar", toolbar);
1047                                 /*mbtn = setting_create_button(navigate_bar, mbutton_str, NAVI_DEF_BUTTON_STYLE, mbutton_click_cb, cb_data); */
1048                                 /*elm_object_item_part_content_set(navi_it, "toolbar_button1", mbtn); */
1049
1050                                 Evas_Object *more_btn = elm_button_add(navigate_bar);
1051                                 if (!more_btn) return NULL;
1052                                 elm_object_style_set(more_btn, NAVI_MORE_BUTTON_STYLE);
1053
1054                                 Setting_Btn_Data *btn_data = calloc(1, sizeof(Setting_Btn_Data));
1055                                 setting_retvm_if(!btn_data, NULL, "calloc failed");
1056                                 btn_data->btn_text[0] = strdup(rbutton_str);
1057                                 btn_data->btn_click_cb = rbutton_click_cb;
1058                                 btn_data->btn_cb_data = cb_data;
1059                                 btn_data->parent = navigate_bar;
1060                                 /*evas_object_data_set(more_btn, "more_btn_data", btn_data); */
1061                                 evas_object_event_callback_add(more_btn, EVAS_CALLBACK_DEL, setting_create_more_btn_del_cb, btn_data);
1062                                 evas_object_smart_callback_add(more_btn, "clicked", setting_create_more_btn_click_cb, btn_data);
1063
1064                                 elm_object_item_part_content_set(navi_it, "toolbar_more_btn", more_btn);
1065                         }
1066                 } else if (rbutton_str) {
1067                         elm_toolbar_item_append(toolbar, NULL, _(rbutton_str), rbutton_click_cb, cb_data);
1068
1069                         elm_object_item_part_content_set(navi_it, "toolbar", toolbar);
1070                         /*rbtn = setting_create_button(navigate_bar, rbutton_str, NAVI_DEF_BUTTON_STYLE, rbutton_click_cb, cb_data); */
1071                         /*elm_object_item_part_content_set(navi_it, "toolbar_button1", rbtn); */
1072                         /*elm_object_item_part_content_set(navi_it, "toolbar_button2", setting_create_button(navigate_bar, "", NULL, NULL, NULL)); */
1073                 } else if (mbutton_str) {
1074                         elm_toolbar_item_append(toolbar, NULL, _(mbutton_str), mbutton_click_cb, cb_data);
1075
1076                         elm_object_item_part_content_set(navi_it, "toolbar", toolbar);
1077                         /*mbtn = setting_create_button(navigate_bar, mbutton_str, NAVI_DEF_BUTTON_STYLE, mbutton_click_cb, cb_data); */
1078                         /*elm_object_item_part_content_set(navi_it, "toolbar_button1", mbtn); */
1079                         /*elm_object_item_part_content_set(navi_it, "toolbar_button2", setting_create_button(navigate_bar, "", NULL, NULL, NULL)); */
1080                 }
1081         } else {        /*  no need back button on navi_bar */
1082                 navi_it = elm_naviframe_item_push(navigate_bar, title_str, NULL, NULL, eo_view, NULL);
1083                 if (0 != safeStrCmp(title_str, dgettext(SETTING_PACKAGE, title_str)))
1084                         elm_object_item_domain_text_translatable_set(navi_it, SETTING_PACKAGE, EINA_TRUE);
1085                 else
1086                         elm_object_item_domain_text_translatable_set(navi_it, "sys_string", EINA_TRUE);
1087                 ADD_MULTI_LANGUAGE_AUTO_UPDATE(eo_view, navi_it, title_str, lbutton_str, mbutton_str, rbutton_str);
1088                 if (!lbutton_str && !rbutton_str && !mbutton_str) {
1089                         return navi_it;
1090                 }
1091
1092                 toolbar = elm_toolbar_add(navigate_bar);
1093                 elm_object_style_set(toolbar, "default");
1094                 elm_toolbar_select_mode_set(toolbar, ELM_OBJECT_SELECT_MODE_NONE);
1095                 elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
1096                 elm_toolbar_transverse_expanded_set(toolbar, EINA_TRUE);
1097
1098                 /*remove '<-' button, insteadly using controlbar */
1099                 Evas_Object *back_btn = elm_object_item_part_content_get(navi_it, "prev_btn");
1100                 elm_object_item_part_content_set(navi_it, "prev_btn", NULL);
1101                 evas_object_del(back_btn);
1102
1103                 if (lbutton_str && mbutton_str && rbutton_str) {
1104                         lbtn = setting_create_button(navigate_bar, _(lbutton_str), NAVI_DEF_BUTTON_STYLE, lbutton_click_cb, cb_data);
1105                         elm_object_item_part_content_set(navi_it, "toolbar_more_btn", lbtn);
1106                         /*mbtn = setting_create_button(navigate_bar, mbutton_str, NAVI_DEF_BUTTON_STYLE, mbutton_click_cb, cb_data); */
1107                         /*elm_object_item_part_content_set(navi_it, "toolbar_button1", mbtn); */
1108                         /*rbtn = setting_create_button(navigate_bar, rbutton_str, NAVI_DEF_BUTTON_STYLE, rbutton_click_cb, cb_data); */
1109                         /*elm_object_item_part_content_set(navi_it, "toolbar_button2", rbtn); */
1110
1111                         elm_toolbar_item_append(toolbar, NULL, _(mbutton_str), mbutton_click_cb, cb_data);
1112                         elm_toolbar_item_append(toolbar, NULL, _(rbutton_str), rbutton_click_cb, cb_data);
1113                 } else {
1114                         /*bool has_btn_flag = FALSE;//first "toolbar_button1", then "toolbar_button2". */
1115                         if (lbutton_str) {
1116                                 /*lbtn = setting_create_button(navigate_bar, lbutton_str, NAVI_DEF_BUTTON_STYLE, lbutton_click_cb, cb_data); */
1117                                 /*elm_object_item_part_content_set(navi_it, "toolbar_button1", lbtn); */
1118                                 elm_toolbar_item_append(toolbar, NULL, _(lbutton_str), lbutton_click_cb, cb_data);
1119                                 /*has_btn_flag = TRUE; */
1120                         }
1121                         if (mbutton_str) {
1122                                 /*mbtn = setting_create_button(navigate_bar, mbutton_str, NAVI_DEF_BUTTON_STYLE, mbutton_click_cb, cb_data); */
1123                                 /*elm_object_item_part_content_set(navi_it, has_btn_flag ? "toolbar_button2" : "toolbar_button1", mbtn); */
1124                                 elm_toolbar_item_append(toolbar, NULL, _(mbutton_str), mbutton_click_cb, cb_data);
1125                                 /*has_btn_flag = TRUE; */
1126                         }
1127                         if (rbutton_str) {
1128                                 /*rbtn = setting_create_button(navigate_bar, rbutton_str, NAVI_DEF_BUTTON_STYLE, rbutton_click_cb, cb_data); */
1129                                 /*elm_object_item_part_content_set(navi_it, has_btn_flag ? "toolbar_button2" : "toolbar_button1", rbtn); */
1130                                 elm_toolbar_item_append(toolbar, NULL, _(rbutton_str), rbutton_click_cb, cb_data);
1131                                 /*has_btn_flag = TRUE; */
1132                         }
1133                 }
1134                 elm_object_item_part_content_set(navi_it, "toolbar", toolbar);
1135         }
1136
1137         return navi_it;
1138 }
1139
1140
1141 /**
1142 * The general API to push any evas object(@param[eo_view]) to the specialized navi_bar,
1143 *   which contents at most 3 buttons
1144 */
1145 EXPORT_PUBLIC
1146 Elm_Object_Item *
1147 setting_push_layout_navi_bar(char *title_str,
1148                              char *lbutton_str, char *rbutton_str,
1149                              char *mbutton_str,
1150                              setting_call_back_func lbutton_click_cb,
1151                              setting_call_back_func rbutton_click_cb,
1152                              setting_call_back_func mbutton_click_cb,
1153                              void *cb_data, Evas_Object *eo_view,
1154                              Evas_Object *navi_bar, Evas_Object **titleobj)
1155 {
1156         return __push_navi_bar_bottom_buttons(title_str,
1157                                               lbutton_str, rbutton_str, mbutton_str,
1158                                               lbutton_click_cb,
1159                                               rbutton_click_cb,
1160                                               mbutton_click_cb,
1161                                               cb_data, eo_view, navi_bar, titleobj);
1162 }
1163
1164 /**
1165 * The API to push a scroller object(@param[scroller]) to the specialized navi_bar,
1166 *   which contents at most 2 buttons
1167 */
1168
1169 EXPORT_PUBLIC
1170 Elm_Object_Item *
1171 setting_push_layout_navi_bar_scroller(Evas_Object *win_main, char *title_str,
1172                                       char *lbutton_str, char *rbutton_str,
1173                                       setting_call_back_func lbutton_click_cb,
1174                                       setting_call_back_func rbutton_click_cb,
1175                                       void *cb_data,
1176                                       Evas_Object **scroller,
1177                                       Evas_Object *navi_bar)
1178 {
1179         /*  create scroller */
1180         Evas_Object *scrl = NULL;
1181         if (scroller != NULL) {
1182                 scrl = *scroller = elm_scroller_add(navi_bar);
1183                 retvm_if(*scroller == NULL, NULL,
1184                          "Cannot set scroller as contento of layout");
1185                 elm_scroller_bounce_set(*scroller, EINA_FALSE, EINA_TRUE);
1186                 elm_scroller_policy_set(*scroller, ELM_SCROLLER_POLICY_OFF,
1187                                         ELM_SCROLLER_POLICY_AUTO);
1188
1189                 evas_object_show(*scroller);
1190         }
1191
1192         return setting_push_layout_navi_bar(title_str,
1193                                             lbutton_str, rbutton_str, NULL,
1194                                             lbutton_click_cb,
1195                                             rbutton_click_cb,
1196                                             NULL, cb_data, scrl, navi_bar, NULL);
1197 }
1198
1199 /**
1200 * @ The API to push a genlist object(@param[genlist]) to the specialized navi_bar,
1201 *   which contents at most 2 buttons
1202 */
1203 EXPORT_PUBLIC
1204 Elm_Object_Item *
1205 setting_push_layout_navi_bar_genlist(Evas_Object *win_layout,
1206                                      Evas_Object *win_obj, char *title_str,
1207                                      char *lbutton_str, char *rbutton_str,
1208                                      setting_call_back_func lbutton_click_cb,
1209                                      setting_call_back_func rbutton_click_cb,
1210                                      void *cb_data, Evas_Object **genlist,
1211                                      Evas_Object *navi_bar)
1212 {
1213         /*  create scroller */
1214         Evas_Object *gl = NULL;
1215         if (genlist != NULL) {
1216                 *genlist = elm_genlist_add(navi_bar);
1217                 retvm_if(*genlist == NULL, NULL,
1218                          "Cannot set scroller object  as contento of layout");
1219                 elm_genlist_realization_mode_set(*genlist, EINA_TRUE);
1220                 gl = *genlist;
1221                 elm_object_style_set(*genlist, "dialogue");
1222                 elm_genlist_clear(gl);  /* first to clear list */
1223                 evas_object_smart_callback_add(gl, "realized", __gl_realized_cb, NULL);
1224         }
1225
1226         return setting_push_layout_navi_bar(title_str,
1227                                             lbutton_str, rbutton_str, NULL,
1228                                             lbutton_click_cb,
1229                                             rbutton_click_cb,
1230                                             NULL, cb_data, gl, navi_bar, NULL);
1231 }
1232
1233 EXPORT_PUBLIC
1234 void setting_go_to_top(Evas_Object *content)
1235 {
1236         setting_retm_if(content == NULL, "content is NULL");
1237         const char *type = elm_object_widget_type_get(content);
1238         SETTING_TRACE("content type:%s", type);
1239
1240         if (0 == safeStrCmp(type, "elm_genlist")) {
1241                 Elm_Object_Item *first_item = elm_genlist_first_item_get(content);
1242                 if (first_item) {
1243                         elm_genlist_item_show(first_item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1244                 }
1245         } else if (0 == safeStrCmp(type, "elm_scroller")) {
1246                 elm_scroller_region_show(content, 0, 0, 0, 0);
1247         } else if (0 == safeStrCmp(type, "elm_gengrid")) {
1248                 Elm_Object_Item *first_item = elm_gengrid_first_item_get(content);
1249                 if (first_item) {
1250                         elm_gengrid_item_show(first_item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1251                 }
1252         } else if (NULL != type) {
1253                 Eina_List *sub_objs = (Eina_List *)elm_widget_scrollable_children_get(content);
1254                 ret_if(!sub_objs);
1255                 Evas_Object *sub_obj = NULL;
1256                 Eina_List *l = NULL;
1257                 const char *sub_type = NULL;
1258
1259                 /*just only search the first objects level */
1260                 EINA_LIST_FOREACH(sub_objs, l, sub_obj) {
1261                         if (!sub_obj) {
1262                                 continue;
1263                         }
1264
1265                         sub_type = elm_object_widget_type_get(sub_obj);
1266                         SETTING_TRACE("sub content type :%s", sub_type);
1267                         if (0 == safeStrCmp(sub_type, "elm_genlist")) {
1268                                 Elm_Object_Item *first_item = elm_genlist_first_item_get(sub_obj);
1269                                 if (first_item) {
1270                                         elm_genlist_item_show(first_item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1271                                 }
1272                         } else if (0 == safeStrCmp(sub_type, "elm_scroller")) {
1273                                 elm_scroller_region_show(sub_obj, 0, 0, 0, 0);
1274                         } else if (0 == safeStrCmp(sub_type, "elm_gengrid")) {
1275                                 Elm_Object_Item *first_item = elm_gengrid_first_item_get(sub_obj);
1276                                 if (first_item) {
1277                                         elm_gengrid_item_show(first_item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1278                                 }
1279                         } else {
1280                                 /* do nothing */
1281                         }
1282                 }
1283         } else {
1284                 /* do nothing */
1285         }
1286 }
1287
1288 /*
1289 * To go to top of list in top view of navibar.
1290 * @param[in] navibar
1291 */
1292 EXPORT_PUBLIC
1293 void setting_go_to_navibar_list_top(Evas_Object *navibar)
1294 {
1295         Elm_Object_Item *navi_it = elm_naviframe_top_item_get(navibar);
1296         if (navi_it) {
1297                 Evas_Object *content = elm_object_item_part_content_get(navi_it, "default");
1298
1299                 setting_go_to_top(content);
1300         }
1301 }
1302
1303 EXPORT_PUBLIC void setting_nf_check_vconf_cb(keynode_t *key, void *data)
1304 {
1305         ret_if(data == NULL);
1306         Evas_Object *check = data;
1307         char *vconf_name = vconf_keynode_get_name(key);
1308         int status = vconf_keynode_get_bool(key);
1309         SETTING_TRACE("Vconf[%s] has changed to be %d just now", vconf_name, status);
1310         elm_check_state_set(check, status);
1311 }
1312
1313 EXPORT_PUBLIC void setting_nf_check_change_cb(void *data, Evas_Object *obj, void *event_info)
1314 {
1315         SETTING_TRACE_BEGIN;
1316         ret_if(!data);
1317         const char *vconf = data;
1318         Eina_Bool state = elm_check_state_get(obj);
1319         vconf_set_bool(vconf, state);
1320 }
1321
1322 EXPORT_PUBLIC void setting_nf_check_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1323 {
1324         SETTING_TRACE_BEGIN;
1325         ret_if(!data);
1326         const char *vconf = data;
1327         (void)vconf_ignore_key_changed(vconf, setting_nf_check_vconf_cb);
1328 }
1329