2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <appcore-efl.h>
19 #include <Elementary.h>
22 #include <unicode/utf8.h>
23 #include <unicode/ustring.h>
25 #include "worldclock.h"
26 #include "worldclock_data.h"
27 #include "worldclock_dlog.h"
28 #include "worldclock_util.h"
29 #include "worldclock_add_view.h"
31 #include "clock_fwk_icu_label.h"
33 #define MAX_LEN_CITY_NAME 16
34 #define MAX_LEN_COUNTRY_NAME 24
35 #define MAX_LEN_GMT 10
36 #define MAX_LEN_INPUT 20
37 #define FIRST_UPDATE_ITEM_COUNT 14
39 static struct appdata *g_ad = NULL;
40 static Wcl_Return_Cb g_return_cb = NULL;
41 static Elm_Object_Item *g_btn_sort_by_name = NULL;
42 static Elm_Object_Item *g_btn_sort_by_time = NULL;
43 static char g_index_buf[BUF_MIN_SIZE] = { '\0' };
44 static char *g_alphabetic_buf = NULL;
46 static Evas_Object *searchbar_layout = NULL;
55 static ADDVIEW_CALL_FLAG g_call_flag = CALL_NONE;
57 static char *__addview_genlist_label_get(void *data, Evas_Object *obj,
59 static Evas_Object *__addview_genlist_icon_get(void *data, Evas_Object *obj,
61 static void __addview_genlist_item_del(void *data, Evas_Object *obj);
62 static Evas_Object *__addview_index_add(Evas_Object *parent, void *data);
63 static Eina_Bool __addview_index_update(Evas_Object *index,
64 Wcl_Addlist_Sort_Type sort, char *buf,
67 static Elm_Genlist_Item_Class g_ts = {
68 .item_style = "worldclock_addview_list",
69 //.item_style = "3text",
70 .func.text_get = __addview_genlist_label_get,
71 .func.content_get = __addview_genlist_icon_get,
72 .func.state_get = NULL,
73 .func.del = __addview_genlist_item_del,
77 * Callback function used for quit event caused by Evas_Object event
79 * @param[in] data data used for this function
80 * @param[in] obj object which caused this function
81 * @param[in] event_info event data
85 static void __addview_quit_cb(void *data, Evas_Object *obj, void *event_info)
90 struct appdata *ad = g_ad;
92 // execute callback function from previous view,
93 // which used to reload previous view
95 g_return_cb(data, EINA_FALSE);
98 // remove default list used to store all appendable cities
99 if (ad->default_list) {
100 worldclock_util_glist_remove_all(ad->default_list, EINA_TRUE);
101 ad->default_list = NULL;
104 if (g_ad->add_view_update_timer) {
105 ecore_timer_del(g_ad->add_view_update_timer);
106 g_ad->add_view_update_timer = NULL;
108 if (g_ad->add_view_update_last_timer) {
109 ecore_timer_del(g_ad->add_view_update_last_timer);
110 g_ad->add_view_update_last_timer = NULL;
112 if (g_ad->add_view_quit_timer) {
113 ecore_timer_del(g_ad->add_view_quit_timer);
114 g_ad->add_view_quit_timer = NULL;
117 g_call_flag = CALL_NONE;
123 * Quit function called when exit event caused by timer
125 * @param[in] data data used for this function
129 static Eina_Bool __addview_exit_cb(void *data)
131 __addview_quit_cb(data, NULL, NULL);
136 * Callback function used for selection info changed
140 static void __addview_notify_cb(const char *msg)
145 if (!g_ad->add_selectioninfo) {
147 g_ad->add_selectioninfo = elm_notify_add(g_ad->add_ly);
148 elm_notify_orient_set(g_ad->add_selectioninfo,
149 ELM_NOTIFY_ORIENT_BOTTOM);
151 // selectioninfo layout add
152 g_ad->add_selectioninfo_layout = elm_layout_add(g_ad->add_ly);
154 elm_layout_theme_set(g_ad->add_selectioninfo_layout,
155 "standard", "selectioninfo",
156 "vertical/bottom_12");
157 // selectioninfo layout content set to notify
158 elm_object_content_set(g_ad->add_selectioninfo,
159 g_ad->add_selectioninfo_layout);
161 // text set and timeout set
162 edje_object_part_text_set(_EDJ(g_ad->add_selectioninfo_layout),
164 elm_notify_timeout_set(g_ad->add_selectioninfo, 5);
165 evas_object_show(g_ad->add_selectioninfo);
170 //////////////////////////// gen list related /////////////////////////////////////////////////
172 * Callback function used for get label as member in genlist item
174 * @param[in] data data used for this function
175 * @param[in] obj object which caused this function
176 * @param[in] part part name of the label member in genlist item
177 * @return pointer to content of label
179 static char *__addview_genlist_label_get(void *data, Evas_Object *obj,
183 retv_if(NULL == data || NULL == g_ad, NULL);
185 Wcl_CitySet *gmt = (Wcl_CitySet *)data;
186 char buf[BUF_SIZE] = "";
188 //float gmt_diff = 0.0;
190 retv_if(NULL == part, NULL);
191 if (!strcmp(part, "elm.text.1")) {
193 snprintf(buf, BUF_SIZE, "%s", gmt->city);
194 } else if (!strcmp(part, "elm.text.2")) {
196 snprintf(buf, BUF_SIZE, "%s", gmt->country);
197 } else if (!strcmp(part, "elm.text.3")) {
199 snprintf(buf, BUF_SIZE, "%s", gmt->timezone);
200 } else if (!strcmp(part, "elm.text.city")) {
202 snprintf(buf, BUF_SIZE, "%s", _(gmt->city));
203 } else if (!strcmp(part, "elm.text.country")) {
205 snprintf(buf, BUF_SIZE, "%s", _(gmt->country));
206 } else if (!strcmp(part, "elm.text.gmt")) {
208 snprintf(buf, BUF_SIZE, "%s", gmt->timezone);
216 * Get icon of given part in genlist item
218 * @param[in] data Data used in this function
219 * @param[in] obj Evas_Object who emit this event
220 * @param[in] part Name of the part in genlist item
222 * @return NULL if meet error
223 * Pointer to new icon
225 static Evas_Object *__addview_genlist_icon_get(void *data, Evas_Object *obj,
229 retv_if(!data || !g_ad, NULL);
230 Wcl_CitySet *gmt = (Wcl_CitySet *)data;
231 char buf[BUF_SIZE] = "";
232 retv_if(NULL == part, NULL);
233 Evas_Object *label = NULL;
234 if (!strcmp(part, "elm.swallow.city")) {
235 label = elm_label_add(obj);
236 snprintf(buf, BUF_SIZE,
237 "<+ font=SLP:style=Medium font_size=28 color=#000000>%s</>",
238 worldclock_searchword_in_string(gmt->city,
241 elm_object_text_set(label, buf);
242 evas_object_show(label);
244 } else if (!strcmp(part, "elm.swallow.country")) {
245 label = elm_label_add(obj);
246 elm_label_ellipsis_set(label, EINA_TRUE);
247 elm_label_wrap_width_set(label, 336);
248 snprintf(buf, BUF_SIZE,
249 "<+ font=SLP:style=Roman font_size=20 color=#6c6c6c>%s</>",
250 worldclock_searchword_in_string(gmt->country,
252 MAX_LEN_COUNTRY_NAME));
253 elm_object_text_set(label, buf);
254 evas_object_show(label);
256 } else if (!strcmp(part, "elm.swallow.gmt")) {
257 label = elm_label_add(obj);
258 snprintf(buf, BUF_SIZE,
259 "<+ font=SLP:style=Medium font_size=20 color=#6c6c6c>%s</>",
260 worldclock_searchword_in_string(gmt->timezone,
263 elm_object_text_set(label, buf);
264 evas_object_show(label);
271 static void __addview_genlist_item_del(void *data, Evas_Object *obj)
273 //Wcl_CitySet *cs = NULL;
274 //cs = (Wcl_CitySet*)data;
281 * Check whether this city has been selected
283 * @param[in] data appointed citydata used for this function
285 * @return EINA_TRUE this city was already selected
286 * EINA_FALSE this city was not selected
288 static Eina_Bool __addview_genlist_check_whether_selected(const void *data)
291 retv_if((!data || !g_ad), EINA_FALSE);
293 Eina_Bool ret = EINA_FALSE;
295 Wcl_CitySet *cs = (Wcl_CitySet *)data;
296 Wcl_CitySet *tmp = NULL;
297 Eina_List *el = NULL;
299 // get the pointer to data list which containing all selected cities
300 el = g_ad->eina_list;
302 tmp = (Wcl_CitySet *)el->data;
303 // compare selected city
304 if (!strcmp(cs->city, tmp->city)
305 && !strcmp(cs->country, tmp->country)) {
306 //if city has been selected
310 // get next selected cities
319 * Callback function which used for genlist selection event processing
321 * @param[in] data data which used in this function
322 * @param[in] obj the object which emit the selection event
323 * @param[in] event_info information about selection event
327 static void __addview_genlist_item_sel(void *data, Evas_Object *obj,
332 Elm_Object_Item *gli = NULL;
333 // get selected genlist item
334 gli = elm_genlist_selected_item_get(obj);
335 elm_genlist_item_selected_set(gli, 0);
341 * Callback function used for genlist item selection event processing
342 * three things may happen to this funcion
343 * 1. replace an item of main list
344 * 2. add an item to main list
345 * 3. set system GMT and return to caller
347 * @param[in] data data which used for this function
348 * @param[in] obj Evas_Object which emit the selection event
349 * @param[in] event_info Information about event
353 static void __addview_genlist_item_selected_cb(void *data, Evas_Object *obj,
359 CLK_INFO("normal now\n");
361 Elm_Object_Item *gli = NULL;
362 const Wcl_CitySet *cs = NULL;
364 // get selected genlist item
365 gli = (Elm_Object_Item *)(event_info);
366 // get the data of selected item
367 cs = elm_object_item_data_get(gli);
370 if (g_ad->add_view_quit_timer) {
371 ecore_timer_del(g_ad->add_view_quit_timer);
372 g_ad->add_view_quit_timer = NULL;
377 g_ad->add_view_quit_timer =
378 ecore_timer_add(0.02, __addview_exit_cb, NULL);
381 ////////// replace or append operation to mainview //////////
382 if (CALL_FROM_MAIN_VIEW == g_call_flag) {
383 ////////// this is normal select, this item will be append to main list //////////
384 if (__addview_genlist_check_whether_selected(cs)) {
385 CLK_INFO("this city has been selected, show notify\n");
386 // if city already selected, show popup
387 __addview_notify_cb(_("IDS_WCL_POP_ADDED"));
391 // create new structure to store new city
392 Wcl_CitySet *t_cs = calloc(1, sizeof(Wcl_CitySet));
394 // if create failed, exit
395 g_ad->add_view_quit_timer =
396 ecore_timer_add(0.02, __addview_exit_cb,
401 memcpy(t_cs, cs, sizeof(Wcl_CitySet));
404 //t_cs->dst = worldclock_dst_get(cs);
407 g_ad->add_view_quit_timer =
408 ecore_timer_add(0.02, __addview_exit_cb, t_cs);
413 /////////////// return city data to UI gadget /////////////
414 else if (CALL_FROM_UI_GADGET == g_call_flag) {
415 // create new structure to store new city
416 Wcl_CitySet *t_cs = calloc(1, sizeof(Wcl_CitySet));
418 // copy selected data
419 memcpy(t_cs, cs, sizeof(Wcl_CitySet));
420 // get current dst value, and set it into result data
421 t_cs->dst = worldclock_dst_get(cs);
422 // save return data for UG
423 g_ad->return_data = t_cs;
425 CLK_ERR("CALLOC ERROR!!!");
427 g_ad->return_data = NULL;
430 // exit when save successfully
431 g_ad->add_view_quit_timer =
432 ecore_timer_add(0.02, __addview_exit_cb, g_ad);
438 static Eina_Bool __addview_genlist_update_last(void *data)
441 retv_if(!data || !g_ad, EINA_FALSE);
442 Eina_List *el = (Eina_List *)data;
443 Wcl_CitySet *cs = NULL; // elm_genlist_item_data_get(gli);
444 Elm_Object_Item *gli = NULL;
445 Eina_Bool ret = EINA_TRUE;
447 retv_if(!g_ad->add_genlist, EINA_FALSE);
448 retv_if(!g_ad->add_index, EINA_FALSE);
450 if (g_ad->add_view_update_last_timer) {
451 ecore_timer_del(g_ad->add_view_update_last_timer);
452 g_ad->add_view_update_last_timer = NULL;
459 // append data to genlist
460 gli = elm_genlist_item_append(g_ad->add_genlist, &g_ts, cs, /* item data */
462 ELM_GENLIST_ITEM_NONE, __addview_genlist_item_sel, /* func */
466 // update index with genlist item
468 __addview_index_update(g_ad->add_index, g_ad->sort,
478 evas_object_show(g_ad->add_index);
485 * Update genlist which displaying in add view
487 * @param[in] data data used for this function
491 static Eina_Bool __addview_genlist_update(void *data)
494 retv_if(!data, EINA_FALSE);
495 retv_if(!g_ad, EINA_FALSE);
497 struct appdata *ad = (struct appdata *)data;
498 Elm_Object_Item *gli = NULL;
499 Eina_List *el = NULL;
500 Wcl_CitySet *cs = NULL;
502 //char *ppos = NULL, *pbegin = NULL;
505 memset(g_index_buf, 0X0, BUF_MIN_SIZE * sizeof(char));
508 if (ad->default_list) {
509 worldclock_util_glist_remove_all(ad->default_list, EINA_TRUE);
510 ad->default_list = NULL;
513 if (g_ad->add_view_update_timer) {
514 ecore_timer_del(g_ad->add_view_update_timer);
515 g_ad->add_view_update_timer = NULL;
517 if (g_ad->add_view_update_last_timer) {
518 ecore_timer_del(g_ad->add_view_update_last_timer);
519 g_ad->add_view_update_last_timer = NULL;
522 retv_if(NULL == ad->search_text, EINA_FALSE);
523 if (!strcmp(ad->search_text, "")) {
524 // if searchbar is been clicked, be filled in ""
525 CLK_INFO("ad->search_text=%s\n", ad->search_text);
526 // get all appendable cities
528 worldclock_data_get_default_city_list(ad->selectionFlag);
530 CLK_INFO("ad->search_text=%s\n", ad->search_text);
532 worldclock_data_get_search_city_list(ad->search_text,
533 WCL_SEARCH_BY_ALL_KEYWORDS,
537 if (WCL_SORT_BY_NAME == ad->sort) {
539 snprintf(g_index_buf, BUF_MIN_SIZE, "%c", 'Z');
542 eina_list_sort(ad->default_list,
543 eina_list_count(ad->default_list),
544 worldclock_city_compare_cb);
545 } else if (WCL_SORT_BY_TIMEZONE == ad->sort) {
547 snprintf(g_index_buf, BUF_MIN_SIZE, "%s", "-18");
550 eina_list_sort(ad->default_list,
551 eina_list_count(ad->default_list),
552 worldclock_time_compare_cb);
555 elm_genlist_clear(ad->add_genlist);
557 //elm_index_item_clear(ad->add_index);
558 evas_object_del(ad->add_index);
559 ad->add_index = NULL;
562 ad->add_index = __addview_index_add(ad->add_layout, ad);
563 retv_if(!ad->add_index, EINA_FALSE);
565 el = ad->default_list;
570 // append data to genlist
571 gli = elm_genlist_item_append(ad->add_genlist, &g_ts, cs, /* item data */
573 ELM_GENLIST_ITEM_NONE, __addview_genlist_item_sel, /* func */
576 if (el == ad->default_list) {
577 elm_genlist_item_show(gli,
578 ELM_GENLIST_ITEM_SCROLLTO_TOP);
580 // update index with genlist item
581 __addview_index_update(ad->add_index, ad->sort,
585 if (FIRST_UPDATE_ITEM_COUNT <= count) {
587 ad->add_view_update_last_timer =
589 __addview_genlist_update_last,
599 if (FIRST_UPDATE_ITEM_COUNT > count) {
601 evas_object_show(ad->add_index);
609 * Add new genlist which used for displaying all cities which could be append
612 * @param[in] parent The parent object of the new genlist object
613 * @param[in] data Data used in this function
615 * @return NULL if create genlist failed.
616 * Pointer to the new genlist object if create genlist successfully.
618 static Evas_Object *__addview_genlist_add(Evas_Object *parent, void *data)
621 retv_if(!data, NULL);
623 Evas_Object *genlist = NULL;
625 genlist = elm_genlist_add(parent);
626 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND,
628 evas_object_size_hint_align_set(genlist, -1.0, -1.0);
630 edje_object_part_swallow(_EDJ(parent), "add/genlist", genlist);
632 evas_object_show(genlist);
633 // register callback function for select event on genlist
634 evas_object_smart_callback_add(genlist, "selected",
635 __addview_genlist_item_selected_cb,
638 // To use multiline textblock/entry/editfield in genlist, set height_for_width mode
639 // then the item's height is calculated while the item's width fits to genlist width.
640 elm_genlist_mode_set(genlist, EINA_TRUE);
642 // set selected theme
643 char *theme_name = vconf_get_str(SETTING_THEME_SELECTED_THEME);
645 g_ts.item_style = "worldclock_addview_list_black";
656 /////////////////////////////////// genlist related finish /////////////////////////////////////////
658 ////////////////////////// index ///////////////////////////////////////////////////////////
660 * Callback function which is used for elm_index when level up event processing
662 * @param[in] data data used for this function
663 * @param[in] obj Evas_Object which emit level up event
664 * @param[in] event_info Information about this event
668 static void __addview_index_level_up(void *data, Evas_Object *obj,
674 // get current index level
675 int level = elm_index_item_level_get(obj);
678 Elm_Object_Item *it = NULL;
679 char buf[BUF_SIZE] = { '\0', };
681 // get selected index item
682 it = elm_index_selected_item_get(obj, level - 1);
683 it = (Elm_Object_Item *)elm_object_item_data_get(it);
685 elm_index_item_clear(obj);
686 // get data of selected index
687 Wcl_CitySet *pi = (Wcl_CitySet *)elm_object_item_data_get(it);
689 snprintf(buf, BUF_SIZE, "%c", 'A');
693 Wcl_CitySet *gmt = (Wcl_CitySet *)elm_object_item_data_get(it);
694 // append index item if do not exist
695 if (!strncmp(pi->city, gmt->city, 1)) {
696 if (buf[0] != gmt->city[1]) {
697 snprintf(buf, BUF_SIZE, "%c", gmt->city[1]);
698 Elm_Object_Item *item =
699 elm_index_item_append(obj, buf, NULL, NULL);
700 elm_object_item_data_set(item, it);
703 // get next genlist item
704 it = elm_genlist_item_next_get(it);
706 // goto item at level
707 elm_index_level_go(obj, level);
712 * Callback function which used for elm_index about delay change event processing
714 * @param[in] data Data which used in this function
715 * @param[in] obj Evas_Object which emit this event
716 * @param[in] event_info Information about this event
720 static void __addview_index_index_changed_bring(void *data, Evas_Object *obj,
723 elm_genlist_item_bring_in(event_info, ELM_GENLIST_ITEM_SCROLLTO_TOP);
727 * Callback function which used for elm_index about index selection event processing
729 * @param[in] data Data which used in this function
730 * @param[in] obj Evas_Object which emit this event
731 * @param[in] event_info Information about this event
735 static void __addview_index_index_selected(void *data, Evas_Object *obj,
738 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
739 it = (Elm_Object_Item *)elm_object_item_data_get(it);
740 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
744 * Create new elm_index used in add view
746 * @param[in] index the elm_index which will be updated
747 * @param[in] sort the sort type of genlist which bind index
748 * @param[in] buf the buffer used to store pre data which append in elm_index
749 * @param[in] data pointer to elm_genlist_item which need to be append
754 static Eina_Bool __addview_index_update(Evas_Object *index,
755 Wcl_Addlist_Sort_Type sort, char *buf,
758 char buf_name[BUF_MIN_SIZE] = { 0, };
759 char buf_zone[BUF_MIN_SIZE] = { 0, };
760 char *ppos = NULL, *pbegin = NULL;
761 Elm_Object_Item *gli = (Elm_Object_Item *)data;
762 Wcl_CitySet *cs = elm_object_item_data_get(gli);
763 retv_if(!index, EINA_FALSE);
764 memset(buf_name, 0x0, BUF_MIN_SIZE * sizeof(char));
765 if (WCL_SORT_BY_NAME == sort) {
766 // append index to elm_index
767 char *bufalphabetic =
768 get_alphabetic_index_name(get_alphabetic_index
770 if (NULL == g_alphabetic_buf) {
771 g_alphabetic_buf = bufalphabetic;
772 Elm_Object_Item *it =
773 elm_index_item_append(index, bufalphabetic,
775 elm_object_item_data_set(it, gli);
778 if (NULL != bufalphabetic) {
779 if (IS_STR_NOT_EQUAL(g_alphabetic_buf, bufalphabetic)) {
780 g_alphabetic_buf = bufalphabetic;
781 Elm_Object_Item *it =
782 elm_index_item_append(index, bufalphabetic, NULL,
784 elm_object_item_data_set(it, gli);
787 } else if (WCL_SORT_BY_TIMEZONE == sort) {
789 pbegin = cs->timezone + 3;
791 ppos = strstr(pbegin, ":");
793 // if timezone is not integer, get the integer part
794 g_strlcpy(buf_zone, pbegin, ppos - pbegin + 1);
796 // get timezone if it is integer
797 g_strlcpy(buf_zone, pbegin, BUF_MIN_SIZE);
798 buf_zone[strlen(cs->timezone)] = '\0';
801 if (strcmp(buf, buf_zone)) {
802 // append timezone into index list if it is not exist
803 snprintf(buf, BUF_MIN_SIZE, "%s", buf_zone);
804 Elm_Object_Item *it =
805 elm_index_item_append(index, buf, NULL, NULL);
806 elm_object_item_data_set(it, gli);
814 * Create new elm_index used in add view
816 * @param[in] parent Evas_Object which is the parent of new elm_index
817 * @param[in] date data which used int this function
819 * @return NULL if create failed
820 * Pointer to new elm_index if create successflly
822 static Evas_Object *__addview_index_add(Evas_Object *parent, void *data)
825 retv_if((!parent || !data), NULL);
827 Evas_Object *index = NULL;
829 index = elm_index_add(parent);
830 evas_object_size_hint_weight_set(index, EVAS_HINT_EXPAND,
832 //evas_object_resize(index, ad->root_w,ad->root_h - TB_PORTRAIT_H - SK_PORTRAIT_H);
833 //evas_object_move(index, ad->root_x, ad->root_y + TB_PORTRAIT_H + 12);
835 edje_object_part_swallow(_EDJ(parent), "add/index", index);
837 evas_object_show(index);
839 // register callback function to index
840 evas_object_smart_callback_add(index, "level,up",
841 __addview_index_level_up, NULL);
842 //evas_object_smart_callback_add(index, "level,down", __addview_index_level_down, NULL);
843 evas_object_smart_callback_add(index, "delay,changed",
844 __addview_index_index_changed_bring,
846 //evas_object_smart_callback_add(index, "changed", __addview_index_index_changed, NULL);
847 evas_object_smart_callback_add(index, "selected",
848 __addview_index_index_selected, NULL);
850 // goto the top of index
851 elm_index_level_go(index, 0);
857 ////////////////////////// index finished ///////////////////////////////////////////////////////////
859 /////////////////////// search bar ////////////////////////////
861 * Callback function which used for searchbar object about click event processing
863 * @param[in] data data used for this function
864 * @param[in] obj Evas_Object which emit this event
865 * @param[in] event_info Information about this event
869 static void __addview_searchbar_clicked_cb(void *data, Evas_Object *obj,
874 if (!elm_entry_is_empty(obj))
875 elm_object_signal_emit(searchbar_layout,
876 "elm,state,eraser,show", "elm");
877 elm_object_signal_emit(searchbar_layout, "elm,state,guidetext,hide",
879 elm_object_signal_emit(searchbar_layout, "cancel,in", "");
881 struct appdata *ad = (struct appdata *)data;
883 Evas_Object *entry = elm_object_part_content_get(searchbar_layout,
884 "elm.swallow.content");
886 elm_object_focus_set(obj, EINA_TRUE);
887 // get text from search bar
888 str = (char *)elm_object_text_get(entry);
891 if (!strcmp(str, S_("IDS_COM_SK_SEARCH"))) {
892 memset(ad->search_text, '\0', BUF_SIZE);
893 elm_object_text_set(entry, "");
896 Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(entry);
897 if (NULL != imf_context) {
898 // set default input language
899 ecore_imf_context_input_panel_language_set(imf_context,
900 ECORE_IMF_INPUT_PANEL_LANG_ALPHABET);
902 ecore_imf_context_input_panel_show(imf_context);
911 * Callback function which used for entry object about content changing event processing
913 * @param[in] data data used for this function
914 * @param[in] obj Evas_Object which emit this event
915 * @param[in] event_info Information about this event
919 static void __addview_searchbar_changed_cb(void *data, Evas_Object *obj,
922 struct appdata *ad = NULL;
925 char input_text[BUF_SIZE] = { '\0' };
926 Eina_Bool isNeedUpdate = EINA_TRUE;
929 ret_if(NULL == data);
930 ad = (struct appdata *)data;
931 if (elm_object_focus_get(searchbar_layout)) {
932 if (elm_entry_is_empty(obj))
933 elm_object_signal_emit(searchbar_layout,
934 "elm,state,eraser,hide", "elm");
936 elm_object_signal_emit(searchbar_layout,
937 "elm,state,eraser,show", "elm");
939 Evas_Object *entry = elm_object_part_content_get(searchbar_layout,
940 "elm.swallow.content");
941 // get text from search bar
942 str = (char *)elm_object_text_get(entry);
945 CLK_INFO("str get from entry: %s\n", str);
946 // get displaying part
947 worldclock_str_get_displaying_part(str, input_text);
948 CLK_INFO("str display in entry: %s\n", input_text);
949 // get previous search text
950 ret_if(NULL == ad->search_text);
951 CLK_INFO("ad->search_text: %s\n", ad->search_text);
952 ret_if(!strcmp(input_text, ad->search_text));
954 // if string contains html flag, it is said that string do not been confirmed
956 Eina_Bool html_flag = worldclock_str_is_contain_html(input_text);
958 if (EINA_TRUE == html_flag) {
959 CLK_INFO("HTML flag exist!\n");
963 if (!strcmp(ad->search_text, "")
964 && !strcmp(input_text, S_("IDS_COM_SK_SEARCH"))) {
965 CLK_INFO("Not Update\n");
966 isNeedUpdate = EINA_FALSE;
969 // Evas_Object *entry = elm_searchbar_entry_get(ad->add_search_bar);
971 // get size of unicode string
972 UChar ustr[BUF_SIZE] = { 0 };
973 u_uastrncpy(ustr, input_text, BUF_SIZE);
974 strLength = u_strlen(ustr);
975 CLK_INFO("string length : %d\n", strLength);
976 if (strLength > MAX_LEN_INPUT) {
977 // the content of entry won't change if enter too many characters
978 elm_object_text_set(entry, ad->search_text);
979 // set cursor to the end of entry
980 elm_entry_cursor_end_set(entry);
981 // if input too long, show popup
982 //worldclock_show_popup(g_ad->add_ly, &(g_ad->popup), _("Input too long!"));
986 if (input_text != NULL) {
988 memset(ad->search_text, '\0', BUF_SIZE);
989 if (strcmp(input_text, S_("IDS_COM_SK_SEARCH"))
990 && strcmp(input_text, "")) {
992 g_strlcpy(ad->search_text, input_text, BUF_SIZE);
994 CLK_INFO("ad->search_text:%s\n", ad->search_text);
997 CLK_INFO("ad->search_text:%s\n", ad->search_text);
998 // if search text in search_bar is not "Search", update genlist
999 if (EINA_TRUE == isNeedUpdate) {
1000 CLK_INFO("Update the search view text, search_text=%s\n",
1002 if (g_ad->add_view_update_timer) {
1003 ecore_timer_del(g_ad->add_view_update_timer);
1004 g_ad->add_view_update_timer = NULL;
1007 ad->add_view_update_timer =
1008 ecore_timer_add(0.01, __addview_genlist_update, ad);
1017 * Callback function which used for searchbar object about cancel event processing
1019 * @param[in] data data used for this function
1020 * @param[in] obj Evas_Object which emit this event
1021 * @param[in] event_info Information about this event
1025 static void __addview_searchbar_cancel_clicked_cb(void *data, Evas_Object *obj,
1030 struct appdata *ad = (struct appdata *)data;
1031 ret_if(!ad->add_search_bar);
1034 Evas_Object *entry = elm_object_part_content_get(searchbar_layout,
1035 "elm.swallow.content");
1037 evas_object_hide(obj);
1038 elm_object_signal_emit(searchbar_layout, "cancel,out", "");
1039 text = elm_entry_entry_get(entry);
1040 if (text != NULL && strlen(text) > 0)
1041 elm_entry_entry_set(entry, NULL);
1042 elm_object_focus_set(entry, EINA_FALSE);
1044 Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(entry);
1046 if (ECORE_IMF_INPUT_PANEL_STATE_HIDE !=
1047 ecore_imf_context_input_panel_state_get(imf_context)) {
1049 ecore_imf_context_input_panel_hide(imf_context);
1052 CLK_INFO("ad->search_text: %s\n", ad->search_text);
1054 if (strcmp(ad->search_text, "")) {
1056 if (g_ad->add_view_update_timer) {
1057 ecore_timer_del(g_ad->add_view_update_timer);
1058 g_ad->add_view_update_timer = NULL;
1060 ad->add_view_update_timer =
1061 ecore_timer_add(0.01, __addview_genlist_update, ad);
1063 // reset search text
1064 memset(ad->search_text, '\0', BUF_SIZE);
1066 //elm_searchbar_text_set(ad->add_search_bar, S_("IDS_COM_SK_SEARCH"));
1072 * Callback function used for processing unfocused event about searchbar.
1073 * When touch out of searchbar , hide input panel
1075 * @param[in] data data used for this function
1076 * @param[in] obj Evas_Object which emit this event
1077 * @param[in] event_info Information about this event
1081 static void __addview_searchbar_unfocused_cb(void *data, Evas_Object *obj,
1086 struct appdata *ad = (struct appdata *)data;
1088 if (elm_entry_is_empty(obj))
1089 elm_object_signal_emit(searchbar_layout,
1090 "elm,state,guidetext,show", "elm");
1091 elm_object_signal_emit(searchbar_layout, "elm,state,eraser,hide",
1093 Ecore_IMF_Context *imf_context = NULL;
1094 if (ad->add_search_bar) {
1095 // get entry from searchbar
1096 Evas_Object *entry =
1097 elm_object_part_content_get(searchbar_layout,
1098 "elm.swallow.content");
1099 // get imf context from entry
1100 imf_context = elm_entry_imf_context_get(entry);
1103 CLK_INFO("\nto hide keypad\n\n");
1104 // hide imf context keypad
1105 ecore_imf_context_input_panel_hide(imf_context);
1111 static void _eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) // When X marked button is clicked, empty entry's contents.
1113 elm_entry_entry_set(data, "");
1116 static void _bg_clicked_cb(void *data, Evas_Object *obj, const char *emission,
1119 elm_object_focus_set(data, EINA_TRUE);
1122 static void _searchsymbol_clicked_cb(void *data, Evas_Object *obj,
1123 const char *emission, const char *source)
1125 elm_object_focus_set(data, EINA_TRUE);
1126 printf("\n[Search Bar] SearchSymbol Callback Called\n");
1130 static void __addview_input_panel_event_cb(void *data, Ecore_IMF_Context *ctx,
1135 struct appdata *ad = (struct appdata *)data;
1136 ret_if(!ad->add_layout);
1137 if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
1138 // ISE state has changed to ECORE_IMF_INPUT_PANEL_STATE_SHOW status
1139 edje_object_signal_emit(_EDJ(ad->add_layout), "abbrev_genlist",
1141 edje_object_signal_emit(_EDJ(ad->add_layout), "abbrev_index",
1143 } else if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
1144 // ISE state has changed to ECORE_IMF_INPUT_PANEL_STATE_HIDE status
1145 edje_object_signal_emit(_EDJ(ad->add_layout), "expand_genlist",
1147 edje_object_signal_emit(_EDJ(ad->add_layout), "expand_index",
1154 * Add new searchbar object which used for search cities which selected by user.
1156 * @param[in] parent The parent object of the new genlist object
1157 * @param[in] data Data used in this function
1159 * @return NULL if create genlist failed.
1160 * Pointer to the new searchbar object if create successfully.
1162 static Evas_Object *__addview_searchbar_add(Evas_Object *parent, void *data)
1165 retv_if((!parent || !data), NULL);
1167 //Evas_Object *searchbar_layout = NULL;
1168 Evas_Object *entry = NULL;
1169 Evas_Object *cancel_btn = NULL;
1171 //search_bar = elm_searchbar_add(parent);
1173 // edje_object_part_external_object_get(_EDJ(parent), "searchbar");
1174 //retv_if(!search_bar, NULL);
1175 searchbar_layout = elm_layout_add(parent);
1176 elm_layout_theme_set(searchbar_layout, "layout", "searchbar",
1178 elm_object_part_content_set(parent, "searchbar", searchbar_layout);
1179 entry = elm_entry_add(searchbar_layout);
1180 elm_entry_scrollable_set(entry, EINA_TRUE);
1181 elm_entry_single_line_set(entry, EINA_TRUE);
1182 elm_object_part_content_set(searchbar_layout, "elm.swallow.content",
1184 elm_object_part_text_set(searchbar_layout, "elm.guidetext", "Search");
1185 //// enable animation
1186 //elm_searchbar_cancel_button_animation_set(search_bar, EINA_TRUE);
1188 //Evas_Object *entry = elm_searchbar_entry_get(search_bar);
1189 evas_object_smart_callback_add(entry, "changed",
1190 __addview_searchbar_changed_cb, data);
1191 evas_object_smart_callback_add(entry, "focused",
1192 __addview_searchbar_clicked_cb, data);
1193 evas_object_smart_callback_add(entry, "unfocused",
1194 __addview_searchbar_unfocused_cb, data);
1195 elm_object_signal_callback_add(searchbar_layout, "elm,eraser,clicked",
1196 "elm", _eraser_clicked_cb, entry);
1197 elm_object_signal_callback_add(searchbar_layout, "elm,bg,clicked",
1198 "elm", _bg_clicked_cb, entry);
1199 elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
1200 // disable input panel
1201 elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
1202 // disable the context menu
1203 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
1205 evas_object_size_hint_weight_set(searchbar_layout, EVAS_HINT_EXPAND,
1207 evas_object_size_hint_align_set(searchbar_layout, EVAS_HINT_FILL,
1209 cancel_btn = elm_button_add(searchbar_layout);
1210 elm_object_part_content_set(searchbar_layout, "button_cancel",
1212 elm_object_style_set(cancel_btn, "searchbar/default");
1213 elm_object_text_set(cancel_btn, "Cancel");
1214 evas_object_smart_callback_add(cancel_btn, "clicked",
1215 __addview_searchbar_cancel_clicked_cb,
1217 // disable cancel btn animation
1218 elm_object_signal_callback_add(searchbar_layout, "elm,action,click", "",
1219 _searchsymbol_clicked_cb, entry);
1220 //elm_searchbar_text_set(search_bar, S_("IDS_COM_SK_SEARCH"));
1223 // register callback functions to search bar
1224 // evas_object_smart_callback_add(entry, "unfocused",
1225 // __addview_searchbar_unfocused_cb, data);
1226 // evas_object_smart_callback_add(entry, "changed",
1227 // __addview_searchbar_changed_cb, data);
1228 // evas_object_smart_callback_add(searchbar_layout, "clicked",
1229 // __addview_searchbar_clicked_cb, data);
1230 // evas_object_smart_callback_add(searchbar_layout, "cancel,clicked",
1231 // __addview_searchbar_cancel_clicked_cb,
1235 //edje_object_part_swallow(_EDJ(parent), "add/search", search_bar);
1237 //evas_object_show(search_bar);
1240 return searchbar_layout;
1243 /////////////////////// search bar finished ////////////////////////////
1246 * Callback function which used for change sorting type about genlist
1248 * @param[in] data data which used in this function
1249 * @param[in] obj Evas_Object which emit this event
1250 * @param[in] event_info Information about such event.
1254 static void __addview_sortbar_clicked_cb(void *data, Evas_Object *obj,
1260 struct appdata *ad = (struct appdata *)data;
1263 //Evas_Object *entry = elm_searchbar_entry_get(ad->add_search_bar);
1264 //elm_object_focus(entry);
1265 //// disable the context menu
1266 //elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
1267 //elm_entry_context_menu_disabled_set(entry, EINA_FALSE);
1269 Elm_Object_Item *select_item =
1270 elm_segment_control_item_selected_get(obj);
1272 // set sort flag, and update genlist
1273 if (select_item == g_btn_sort_by_time) {
1274 ad->sort = WCL_SORT_BY_TIMEZONE;
1275 } else if (select_item == g_btn_sort_by_name) {
1276 ad->sort = WCL_SORT_BY_NAME;
1279 if (g_ad->add_view_update_timer) {
1280 ecore_timer_del(g_ad->add_view_update_timer);
1281 g_ad->add_view_update_timer = NULL;
1283 ad->add_view_update_timer =
1284 ecore_timer_add(0.01, __addview_genlist_update, ad);
1290 * Add new sortbar object which used for sort cities which selected by user.
1292 * @param[in] parent The parent object of the new genlist object
1293 * @param[in] data data which used in this function
1295 * @return NULL if create genlist failed.
1296 * Pointer to the new sortbar object if create successfully.
1298 static Evas_Object *__addview_sortbar_add(Evas_Object *parent, void *data)
1300 retv_if((!parent || !data), NULL);
1301 /* create controlbar */
1302 Evas_Object *ctrlbar = widget_create_controlbar(parent, NULL);
1303 /* create segment control on controlbar */
1304 Evas_Object *segment_ly = elm_layout_add(ctrlbar);
1305 retv_if(segment_ly == NULL, NULL);
1306 elm_layout_file_set(segment_ly, WCL_EDJ_NAME, GRP_SEGMENT_PANEL);
1307 evas_object_size_hint_weight_set(segment_ly, EVAS_HINT_EXPAND,
1309 evas_object_size_hint_align_set(segment_ly, EVAS_HINT_FILL,
1311 evas_object_show(segment_ly);
1313 // create segment control
1314 Evas_Object *segment = elm_segment_control_add(ctrlbar);
1315 g_btn_sort_by_name =
1316 elm_segment_control_item_add(segment, NULL,
1317 S_("IDS_COM_BODY_DETAILS_NAME"));
1318 g_btn_sort_by_time =
1319 elm_segment_control_item_add(segment, NULL, S_("IDS_COM_POP_TIME"));
1320 evas_object_show(segment);
1321 // set default sort type
1322 elm_segment_control_item_selected_set(g_btn_sort_by_name, EINA_TRUE);
1323 // register callback to segment control
1324 evas_object_smart_callback_add(segment, "changed",
1325 __addview_sortbar_clicked_cb, data);
1326 Elm_Object_Item *eci;
1327 elm_object_part_content_set(segment_ly, "segment", segment);
1328 eci = elm_toolbar_item_append(ctrlbar, NULL, NULL, NULL, NULL);
1329 elm_object_item_disabled_set(eci, EINA_TRUE);
1330 Elm_Object_Item *item =
1331 elm_toolbar_item_append(ctrlbar, NULL, NULL, NULL, NULL);
1332 elm_object_item_part_content_set(item, "object", segment_ly);
1333 eci = elm_toolbar_item_append(ctrlbar, NULL, NULL, NULL, NULL);
1334 elm_object_item_disabled_set(eci, EINA_TRUE);
1338 static Evas_Object *__addview_layout_add(Evas_Object *parent)
1341 retv_if(!parent, NULL);
1343 // create window layout
1344 Evas_Object *layout = elm_layout_add(parent);
1345 retv_if(layout == NULL, NULL);
1347 elm_layout_theme_set(layout, "layout", "application", "searchbar_base");
1348 elm_object_signal_emit(layout, "elm,state,show,searchbar", "elm");
1349 //evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1350 //evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, 0);
1351 //elm_bg_color_set(layout, 0, 0, 0);
1352 //elm_object_style_set(layout, "group_list");
1354 //evas_object_show(layout);
1360 * Create add view for append new city into the selection list of worldclock
1362 * @param[in] parent Evas_Object which is the parent of add view
1363 * @param[in] data data which used in this function
1364 * @param[in] func Callback function which used for invoking when exit from add view
1366 * @return FAILED if create add view failed.
1367 * SUCCESS if create add view successfully.
1369 int worldclock_addview_add(Evas_Object *parent, void *data, Wcl_Return_Cb func)
1372 retv_if(!data, FAILED);
1374 struct appdata *ad = (struct appdata *)data;
1376 init_alphabetic_index();
1378 ad->page = WCL_PAGE_ADD;
1381 const char *group_name = NULL;
1382 const char *title_name = NULL;
1384 // select call_flag & group name by caller
1385 switch (ad->caller) {
1386 case WCL_CALLER_IS_APP_IT_SELF:
1387 g_call_flag = CALL_FROM_MAIN_VIEW;
1388 group_name = GRP_ADD2;
1389 title_name = S_("IDS_COM_ADD");
1391 case WCL_CALLER_IS_SHARED_LIBRARY:
1392 g_call_flag = CALL_FROM_MAIN_VIEW;
1393 group_name = GRP_ADD2;
1394 title_name = S_("IDS_COM_ADD");
1396 case WCL_CALLER_IS_UI_GADGET:
1397 g_call_flag = CALL_FROM_UI_GADGET;
1398 group_name = GRP_ADD2;
1399 title_name = _("IDS_WCL_BODY_TIME_ZONE");
1406 retv_if(EINA_FALSE == worldclock_data_open_database(), FAILED);
1409 ad->add_ly = __addview_layout_add(parent);
1410 retv_if(ad->add_ly == NULL, FAILED);
1412 /* init search data */
1413 memset(ad->search_text, 0x0, BUF_SIZE * sizeof(char));
1416 ad->add_search_bar = __addview_searchbar_add(ad->add_ly, data);
1417 retv_if(ad->add_search_bar == NULL, FAILED);
1421 worldclock_load_edj(ad->add_ly, WCL_EDJ_NAME, group_name);
1422 retv_if(ad->add_layout == NULL, FAILED);
1423 elm_object_part_content_set(ad->add_ly, "elm.swallow.content",
1426 // index to quick search
1427 //ad->add_index = __addview_index_add(ad->add_layout, data);
1430 ad->sort = WCL_SORT_BY_NAME; // sory by name
1431 ad->add_genlist = __addview_genlist_add(ad->add_layout, data);
1432 retv_if(ad->add_genlist == NULL, FAILED);
1434 Evas_Object *add_sortbar = __addview_sortbar_add(ad->navi_bar, data);
1435 retv_if(add_sortbar == NULL, FAILED);
1437 // create left button
1438 Evas_Object *back_btn = elm_button_add(ad->navi_bar);
1439 elm_object_style_set(back_btn, "naviframe/end_btn/default");
1440 evas_object_smart_callback_add(back_btn, "clicked", __addview_quit_cb,
1443 // set segment control as title about layout
1444 Elm_Object_Item *elm_item =
1445 elm_naviframe_item_push(ad->navi_bar, title_name, back_btn, NULL,
1447 elm_object_item_part_content_set(elm_item, "controlbar", add_sortbar);
1448 elm_naviframe_item_title_visible_set(elm_item, EINA_FALSE);
1451 if (g_ad->add_view_update_timer) {
1452 ecore_timer_del(g_ad->add_view_update_timer);
1453 g_ad->add_view_update_timer = NULL;
1455 ad->add_view_update_timer =
1456 ecore_timer_add(0.01, __addview_genlist_update, ad);
1463 * Release all resources which used in add view when exit from add view
1465 * @param[in] data data which used in this function
1469 void worldclock_addview_free(void *data)
1474 uninit_alphabetic_index();
1476 struct appdata *ad = (struct appdata *)data;
1478 __addview_quit_cb(NULL, NULL, NULL);
1483 #undef MAX_LEN_CITY_NAME
1484 #undef MAX_LEN_COUNTRY_NAME
1486 #undef MAX_LEN_INPUT