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