3 * Copyright 2012 Samsung Electronics Co., Ltd
5 * Licensed under the Flora License, Version 1.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.tizenopensource.org/license
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
20 #include <appcore-efl.h>
21 #include <Elementary.h>
24 #include <unicode/utf8.h>
25 #include <unicode/ustring.h>
27 #include "worldclock.h"
28 #include "worldclock_data.h"
29 #include "worldclock_dlog.h"
30 #include "worldclock_util.h"
31 #include "worldclock_add_view.h"
32 #include "clock_fwk_icu_label.h"
34 #define MAX_LEN_CITY_NAME 16
35 #define MAX_LEN_COUNTRY_NAME 24
36 #define MAX_LEN_GMT 10
37 #define MAX_LEN_INPUT 20
38 #define FIRST_UPDATE_ITEM_COUNT 14
40 static struct appdata *g_ad = NULL;
41 static Wcl_Return_Cb g_return_cb = NULL;
42 static Elm_Object_Item *g_btn_sort_by_name = NULL;
43 static Elm_Object_Item *g_btn_sort_by_time = NULL;
44 static char g_index_buf[BUF_MIN_SIZE] = { '\0' };
46 static Evas_Object *searchbar_layout = NULL;
55 static ADDVIEW_CALL_FLAG g_call_flag = CALL_NONE;
57 static char *__ugview_genlist_label_get(void *data, Evas_Object * obj,
59 static Evas_Object *__ugview_genlist_icon_get(void *data, Evas_Object * obj,
61 static void __ugview_genlist_item_del(void *data, Evas_Object * obj);
62 static Evas_Object *__ugview_index_add(Evas_Object * parent, void *data);
63 static Eina_Bool __ugview_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 = __ugview_genlist_label_get,
71 .func.content_get = __ugview_genlist_icon_get,
72 .func.state_get = NULL,
73 .func.del = __ugview_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 __ugview_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 __ugview_exit_cb(void *data)
131 __ugview_quit_cb(data, NULL, NULL);
136 * Callback function used for selection info changed
140 static void __ugview_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 *__ugview_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 *__ugview_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 __ugview_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 __ugview_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;
297 // synchronize city status from db
298 ret = worldclock_ug_data_get_city_status_from_db(cs);
300 if (EINA_TRUE == ret) {
301 if (0 == cs->selected) {
311 * Callback function which used for genlist selection event processing
313 * @param[in] data data which used in this function
314 * @param[in] obj the object which emit the selection event
315 * @param[in] event_info information about selection event
319 static void __ugview_genlist_item_sel(void *data, Evas_Object * obj,
324 Elm_Object_Item *gli = NULL;
325 // get selected genlist item
326 gli = elm_genlist_selected_item_get(obj);
327 elm_genlist_item_selected_set(gli, 0);
333 * Callback function used for genlist item selection event processing
334 * three things may happen to this funcion
335 * 1. replace an item of main list
336 * 2. add an item to main list
337 * 3. set system GMT and return to caller
339 * @param[in] data data which used for this function
340 * @param[in] obj Evas_Object which emit the selection event
341 * @param[in] event_info Information about event
345 static void __ugview_genlist_item_selected_cb(void *data, Evas_Object * obj,
351 CLK_INFO("normal now\n");
353 Elm_Object_Item *gli = NULL;
354 const Wcl_CitySet *cs = NULL;
356 // get selected genlist item
357 gli = (Elm_Object_Item *) (event_info);
358 // get the data of selected item
359 cs = elm_object_item_data_get(gli);
362 if (g_ad->add_view_quit_timer) {
363 ecore_timer_del(g_ad->add_view_quit_timer);
364 g_ad->add_view_quit_timer = NULL;
369 g_ad->add_view_quit_timer =
370 ecore_timer_add(0.02, __ugview_exit_cb, NULL);
373 ////////// replace or append operation to mainview //////////
374 if (CALL_FROM_MAIN_VIEW == g_call_flag) {
375 ////////// this is normal select, this item will be append to main list //////////
376 if (__ugview_genlist_check_whether_selected(cs)) {
377 CLK_INFO("this city has been selected, show notify\n");
378 // if city already selected, show popup
379 __ugview_notify_cb(S_("IDS_COM_OPT_ADDED"));
383 // create new structure to store new city
384 Wcl_CitySet *t_cs = calloc(1, sizeof(Wcl_CitySet));
386 // if create failed, exit
387 g_ad->add_view_quit_timer =
388 ecore_timer_add(0.02, __ugview_exit_cb,
393 memcpy(t_cs, cs, sizeof(Wcl_CitySet));
396 //t_cs->dst = worldclock_dst_get(cs);
399 g_ad->add_view_quit_timer =
400 ecore_timer_add(0.02, __ugview_exit_cb, t_cs);
402 // save return data for UG
403 g_ad->return_data = t_cs;
409 /////////////// return city data to UI gadget /////////////
410 else if (CALL_FROM_UI_GADGET == g_call_flag) {
411 // create new structure to store new city
412 Wcl_CitySet *t_cs = calloc(1, sizeof(Wcl_CitySet));
414 // copy selected data
415 memcpy(t_cs, cs, sizeof(Wcl_CitySet));
416 // get current dst value, and set it into result data
417 t_cs->dst = worldclock_dst_get(cs);
418 // save return data for UG
419 g_ad->return_data = t_cs;
421 CLK_ERR("CALLOC ERROR!!!");
423 g_ad->return_data = NULL;
426 // exit when save successfully
427 g_ad->add_view_quit_timer =
428 ecore_timer_add(0.02, __ugview_exit_cb, g_ad);
435 * Search substring in string by UChar type
437 * @param[in] string The string to search
438 * @param[in] substring The substring to find
440 * @return A pointer to the first occurrence of substring in string
442 const UChar *__ugview_search_in_ustring(const UChar *string,
446 const UChar *pstr = string;
447 int substr_len = u_strlen(substring);
448 int str_len = u_strlen(string);
450 if (0 == substr_len) {
454 else if (substr_len > str_len) {
459 for (i = 0; i < str_len - substr_len + 1; i++) {
460 if (!u_strncasecmp(substring, &pstr[i], substr_len, 0)) {
470 static Eina_Bool __ugview_genlist_update_last(void *data)
473 retv_if(!data || !g_ad, EINA_FALSE);
474 Eina_List *el = (Eina_List *) data;
475 Wcl_CitySet *cs = NULL; // elm_object_item_data_get(gli);
476 Elm_Object_Item *gli = NULL;
477 Eina_Bool ret = EINA_TRUE;
478 UChar u_search_text[CITY_BUF_SIZE] = { 0 };
480 retv_if(!g_ad->add_genlist, EINA_FALSE);
481 retv_if(!g_ad->add_index, EINA_FALSE);
483 if (g_ad->add_view_update_last_timer) {
484 ecore_timer_del(g_ad->add_view_update_last_timer);
485 g_ad->add_view_update_last_timer = NULL;
488 u_uastrncpy(u_search_text, g_ad->search_text, CITY_BUF_SIZE);
494 UChar u_city_name[CITY_BUF_SIZE] = { 0 };
495 u_uastrncpy(u_city_name, _(cs->city), CITY_BUF_SIZE);
496 if (__ugview_search_in_ustring(u_city_name, u_search_text)) {
497 // append data to genlist
498 gli = elm_genlist_item_append(g_ad->add_genlist, &g_ts, cs, /* item data */
500 ELM_GENLIST_ITEM_NONE, __ugview_genlist_item_sel, /* func */
504 // update index with genlist item
506 __ugview_index_update(g_ad->add_index, g_ad->sort,
520 evas_object_show(g_ad->add_index);
526 * Update genlist which displaying in add view
528 * @param[in] data data used for this function
532 static Eina_Bool __ugview_genlist_update(void *data)
535 retv_if(!data, EINA_FALSE);
536 retv_if(!g_ad, EINA_FALSE);
538 struct appdata *ad = (struct appdata *)data;
539 Elm_Object_Item *gli = NULL;
540 Eina_List *el = NULL;
541 Wcl_CitySet *cs = NULL;
543 UChar u_search_text[CITY_BUF_SIZE] = { 0 };
546 memset(g_index_buf, 0X0, BUF_MIN_SIZE * sizeof(char));
549 if (!ad->default_list) {
550 // get all appendable cities
552 worldclock_ug_data_get_default_city_list(ad->selectionFlag);
555 if (g_ad->add_view_update_timer) {
556 ecore_timer_del(g_ad->add_view_update_timer);
557 g_ad->add_view_update_timer = NULL;
559 if (g_ad->add_view_update_last_timer) {
560 ecore_timer_del(g_ad->add_view_update_last_timer);
561 g_ad->add_view_update_last_timer = NULL;
564 retv_if(NULL == ad->search_text, EINA_FALSE);
565 if (!strcmp(ad->search_text, "")) {
566 // if searchbar is been clicked, be filled in ""
567 CLK_INFO("ad->search_text=%s\n", ad->search_text);
569 CLK_INFO("ad->search_text=%s\n", ad->search_text);
570 u_uastrncpy(u_search_text, ad->search_text, CITY_BUF_SIZE);
573 if (WCL_SORT_BY_NAME == ad->sort) {
575 snprintf(g_index_buf, BUF_MIN_SIZE, "%c", 'Z');
578 eina_list_sort(ad->default_list,
579 eina_list_count(ad->default_list),
580 worldclock_city_compare_cb);
581 } else if (WCL_SORT_BY_TIMEZONE == ad->sort) {
583 snprintf(g_index_buf, BUF_MIN_SIZE, "%s", "-18");
586 eina_list_sort(ad->default_list,
587 eina_list_count(ad->default_list),
588 worldclock_time_compare_cb);
591 elm_genlist_clear(ad->add_genlist);
593 //elm_index_item_clear(ad->add_index);
594 evas_object_del(ad->add_index);
595 ad->add_index = NULL;
598 ad->add_index = __ugview_index_add(ad->add_layout, ad);
599 retv_if(!ad->add_index, EINA_FALSE);
601 el = ad->default_list;
604 cs = (Wcl_CitySet *)el->data;
606 UChar u_city_name[CITY_BUF_SIZE] = { 0 };
607 u_uastrncpy(u_city_name, _(cs->city), CITY_BUF_SIZE);
608 if(__ugview_search_in_ustring(u_city_name, u_search_text)) {
609 // append data to genlist
610 gli = elm_genlist_item_append(ad->add_genlist, &g_ts, cs, /* item data */
612 ELM_GENLIST_ITEM_NONE, __ugview_genlist_item_sel, /* func */
615 if (el == ad->default_list) {
616 elm_genlist_item_show(gli,
617 ELM_GENLIST_ITEM_SCROLLTO_TOP);
619 // update index with genlist item
620 __ugview_index_update(ad->add_index, ad->sort,
624 if (FIRST_UPDATE_ITEM_COUNT <= count) {
626 ad->add_view_update_last_timer =
628 __ugview_genlist_update_last,
645 if (FIRST_UPDATE_ITEM_COUNT > count) {
647 evas_object_show(ad->add_index);
655 * Add new genlist which used for displaying all cities which could be append
658 * @param[in] parent The parent object of the new genlist object
659 * @param[in] data Data used in this function
661 * @return NULL if create genlist failed.
662 * Pointer to the new genlist object if create genlist successfully.
664 static Evas_Object *__ugview_genlist_add(Evas_Object * parent, void *data)
667 retv_if(!data, NULL);
669 Evas_Object *genlist = NULL;
671 genlist = elm_genlist_add(parent);
672 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND,
674 evas_object_size_hint_align_set(genlist, -1.0, -1.0);
676 edje_object_part_swallow(_EDJ(parent), "add/genlist", genlist);
678 evas_object_show(genlist);
679 // register callback function for select event on genlist
680 evas_object_smart_callback_add(genlist, "selected",
681 __ugview_genlist_item_selected_cb, data);
683 // To use multiline textblock/entry/editfield in genlist, set height_for_width mode
684 // then the item's height is calculated while the item's width fits to genlist width.
685 elm_genlist_mode_set(genlist, EINA_TRUE);
690 /////////////////////////////////// genlist related finish /////////////////////////////////////////
692 ////////////////////////// index ///////////////////////////////////////////////////////////
694 * Callback function which is used for elm_index when level up event processing
696 * @param[in] data data used for this function
697 * @param[in] obj Evas_Object which emit level up event
698 * @param[in] event_info Information about this event
702 static void __ugview_index_level_up(void *data, Evas_Object * obj,
708 // get current index level
709 int level = elm_index_item_level_get(obj);
712 Elm_Object_Item *it = NULL;
713 char buf[BUF_SIZE] = { '\0', };
715 // get selected index item
716 it = elm_index_selected_item_get(obj, level - 1);
717 it = (Elm_Object_Item *) elm_object_item_data_get(it);
719 elm_index_item_clear(obj);
720 // get data of selected index
721 Wcl_CitySet *pi = (Wcl_CitySet *) elm_object_item_data_get(it);
723 snprintf(buf, BUF_SIZE, "%c", 'A');
727 Wcl_CitySet *gmt = (Wcl_CitySet *) elm_object_item_data_get(it);
728 // append index item if do not exist
729 if (!strncmp(pi->city, gmt->city, 1)) {
730 if (buf[0] != gmt->city[1]) {
731 snprintf(buf, BUF_SIZE, "%c", gmt->city[1]);
732 Elm_Object_Item *item =
733 elm_index_item_append(obj, buf, NULL, NULL);
734 elm_object_item_data_set(item, it);
737 // get next genlist item
738 it = elm_genlist_item_next_get(it);
740 // goto item at level
741 elm_index_level_go(obj, level);
746 * Callback function which used for elm_index about delay change event processing
748 * @param[in] data Data which used in this function
749 * @param[in] obj Evas_Object which emit this event
750 * @param[in] event_info Information about this event
754 static void __ugview_index_index_changed_bring(void *data, Evas_Object * obj,
757 elm_genlist_item_bring_in(event_info, ELM_GENLIST_ITEM_SCROLLTO_TOP);
761 * Callback function which used for elm_index about index selection event processing
763 * @param[in] data Data which used in this function
764 * @param[in] obj Evas_Object which emit this event
765 * @param[in] event_info Information about this event
769 static void __ugview_index_index_selected(void *data, Evas_Object * obj,
772 Elm_Object_Item *it = (Elm_Object_Item *) event_info;
773 it = (Elm_Object_Item *) elm_object_item_data_get(it);
774 elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
778 * Create new elm_index used in add view
780 * @param[in] index the elm_index which will be updated
781 * @param[in] sort the sort type of genlist which bind index
782 * @param[in] buf the buffer used to store pre data which append in elm_index
783 * @param[in] data pointer to elm_genlist_item which need to be append
787 static Eina_Bool __ugview_index_update(Evas_Object * index,
788 Wcl_Addlist_Sort_Type sort, char *buf,
791 char buf_name[BUF_MIN_SIZE] = { 0, };
792 char buf_zone[BUF_MIN_SIZE] = { 0, };
793 char *ppos = NULL, *pbegin = NULL;
794 Elm_Object_Item *gli = (Elm_Object_Item *) data;
795 Wcl_CitySet *cs = elm_object_item_data_get(gli);
796 retv_if(!index, EINA_FALSE);
797 static char *g_alphabetic_buf = NULL;
799 memset(buf_name, 0x0, BUF_MIN_SIZE * sizeof(char));
800 if (WCL_SORT_BY_NAME == sort) {
801 // append index to elm_index
802 char *bufalphabetic =
803 get_alphabetic_index_name(get_alphabetic_index
805 if (NULL == g_alphabetic_buf) {
806 g_alphabetic_buf = bufalphabetic;
807 Elm_Object_Item *it =
808 elm_index_item_append(index, bufalphabetic,
810 elm_object_item_data_set(it, gli);
812 if (NULL != bufalphabetic) {
813 if (IS_STR_NOT_EQUAL(g_alphabetic_buf, bufalphabetic)) {
814 g_alphabetic_buf = bufalphabetic;
815 Elm_Object_Item *it =
816 elm_index_item_append(index, bufalphabetic,
818 elm_object_item_data_set(it, gli);
821 } else if (WCL_SORT_BY_TIMEZONE == sort) {
823 pbegin = cs->timezone + 3;
825 ppos = strstr(pbegin, ":");
827 // if timezone is not integer, get the integer part
828 g_strlcpy(buf_zone, pbegin, ppos - pbegin + 1);
830 // get timezone if it is integer
831 g_strlcpy(buf_zone, pbegin, BUF_MIN_SIZE);
832 buf_zone[strlen(cs->timezone)] = '\0';
835 if (strcmp(buf, buf_zone)) {
836 // append timezone into index list if it is not exist
837 snprintf(buf, BUF_MIN_SIZE, "%s", buf_zone);
838 Elm_Object_Item *it =
839 elm_index_item_append(index, buf, NULL, NULL);
840 elm_object_item_data_set(it, gli);
848 * Create new elm_index used in add view
850 * @param[in] parent Evas_Object which is the parent of new elm_index
851 * @param[in] date data which used int this function
853 * @return NULL if create failed
854 * Pointer to new elm_index if create successflly
856 static Evas_Object *__ugview_index_add(Evas_Object * parent, void *data)
859 retv_if((!parent || !data), NULL);
861 Evas_Object *index = NULL;
863 index = elm_index_add(parent);
864 evas_object_size_hint_weight_set(index, EVAS_HINT_EXPAND,
866 //evas_object_resize(index, ad->root_w,ad->root_h - TB_PORTRAIT_H - SK_PORTRAIT_H);
867 //evas_object_move(index, ad->root_x, ad->root_y + TB_PORTRAIT_H + 12);
869 edje_object_part_swallow(_EDJ(parent), "add/index", index);
871 evas_object_show(index);
873 // register callback function to index
874 evas_object_smart_callback_add(index, "level,up",
875 __ugview_index_level_up, NULL);
876 //evas_object_smart_callback_add(index, "level,down", __ugview_index_level_down, NULL);
877 evas_object_smart_callback_add(index, "delay,changed",
878 __ugview_index_index_changed_bring,
880 //evas_object_smart_callback_add(index, "changed", __ugview_index_index_changed, NULL);
881 evas_object_smart_callback_add(index, "selected",
882 __ugview_index_index_selected, NULL);
884 // goto the top of index
885 elm_index_level_go(index, 0);
891 ////////////////////////// index finished ///////////////////////////////////////////////////////////
893 /////////////////////// search bar ////////////////////////////
895 * Callback function which used for searchbar object about click event processing
897 * @param[in] data data used for this function
898 * @param[in] obj Evas_Object which emit this event
899 * @param[in] event_info Information about this event
903 static void __ugview_searchbar_clicked_cb(void *data, Evas_Object * obj,
908 if (!elm_entry_is_empty(obj))
909 elm_object_signal_emit(searchbar_layout,
910 "elm,state,eraser,show", "elm");
911 elm_object_signal_emit(searchbar_layout, "elm,state,guidetext,hide",
913 elm_object_signal_emit(searchbar_layout, "cancel,in", "");
915 struct appdata *ad = (struct appdata *)data;
918 Evas_Object *entry = elm_object_part_content_get(searchbar_layout,
919 "elm.swallow.content");
921 elm_object_focus_set(obj, EINA_TRUE);
922 // get text from search bar
923 str = (char *)elm_object_text_get(entry);
926 if (!strcmp(str, S_("IDS_COM_SK_SEARCH"))) {
927 memset(ad->search_text, '\0', BUF_SIZE);
928 elm_object_text_set(entry, "");
931 Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(entry);
932 if (NULL != imf_context) {
933 // set default input language
934 ecore_imf_context_input_panel_language_set(imf_context,
935 ECORE_IMF_INPUT_PANEL_LANG_ALPHABET);
937 ecore_imf_context_input_panel_show(imf_context);
946 * Callback function which used for entry object about content changing event processing
948 * @param[in] data data used for this function
949 * @param[in] obj Evas_Object which emit this event
950 * @param[in] event_info Information about this event
954 static void __ugview_searchbar_changed_cb(void *data, Evas_Object * obj,
958 struct appdata *ad = NULL;
961 char input_text[BUF_SIZE] = { '\0' };
962 Eina_Bool isNeedUpdate = EINA_TRUE;
965 ret_if(NULL == data);
966 ad = (struct appdata *)data;
968 if (elm_object_focus_get(searchbar_layout)) {
969 if (elm_entry_is_empty(obj))
970 elm_object_signal_emit(searchbar_layout,
971 "elm,state,eraser,hide", "elm");
973 elm_object_signal_emit(searchbar_layout,
974 "elm,state,eraser,show", "elm");
977 Evas_Object *entry = elm_object_part_content_get(searchbar_layout,
978 "elm.swallow.content");
980 // get text from search bar
981 str = (char *)elm_object_text_get(entry);
984 CLK_INFO("str get from entry: %s\n", str);
985 // get displaying part
986 worldclock_str_get_displaying_part(str, input_text);
987 CLK_INFO("str display in entry: %s\n", input_text);
988 // get previous search text
989 ret_if(NULL == ad->search_text);
990 CLK_INFO("ad->search_text: %s\n", ad->search_text);
991 ret_if(!strcmp(input_text, ad->search_text));
993 // if string contains html flag, it is said that string do not been confirmed
995 Eina_Bool html_flag = worldclock_str_is_contain_html(input_text);
997 if (EINA_TRUE == html_flag) {
998 CLK_INFO("HTML flag exist!\n");
1002 if (!strcmp(ad->search_text, "")
1003 && !strcmp(input_text, S_("IDS_COM_SK_SEARCH"))) {
1004 CLK_INFO("Not Update\n");
1005 isNeedUpdate = EINA_FALSE;
1008 // Evas_Object *entry = elm_searchbar_entry_get(ad->add_search_bar);
1010 // get size of unicode string
1011 UChar ustr[BUF_SIZE] = { 0 };
1012 u_uastrncpy(ustr, input_text, BUF_SIZE);
1013 strLength = u_strlen(ustr);
1014 CLK_INFO("string length : %d\n", strLength);
1015 if (strLength > MAX_LEN_INPUT) {
1016 // the content of entry won't change if enter too many characters
1017 elm_object_text_set(entry, ad->search_text);
1018 // set cursor to the end of entry
1019 elm_entry_cursor_end_set(entry);
1020 // if input too long, show popup
1021 //worldclock_show_popup(g_ad->add_ly, &(g_ad->popup), _("Input too long!"));
1025 if (input_text != NULL) {
1026 // reset search text
1027 memset(ad->search_text, '\0', BUF_SIZE);
1028 if (strcmp(input_text, S_("IDS_COM_SK_SEARCH"))
1029 && strcmp(input_text, "")) {
1030 g_strlcpy(ad->search_text, input_text, strlen(input_text)+1);
1032 CLK_INFO_GREEN("ad->search_text:%s\n", ad->search_text);
1035 CLK_INFO("ad->search_text:%s\n", ad->search_text);
1036 // if search text in search_bar is not "Search", update genlist
1037 if (EINA_TRUE == isNeedUpdate) {
1038 CLK_INFO("Update the search view text, search_text=%s\n",
1040 if (g_ad->add_view_update_timer) {
1041 ecore_timer_del(g_ad->add_view_update_timer);
1042 g_ad->add_view_update_timer = NULL;
1045 ad->add_view_update_timer =
1046 ecore_timer_add(0.01, __ugview_genlist_update, ad);
1055 * Callback function which used for searchbar object about cancel event processing
1057 * @param[in] data data used for this function
1058 * @param[in] obj Evas_Object which emit this event
1059 * @param[in] event_info Information about this event
1063 static void __ugview_searchbar_cancel_clicked_cb(void *data, Evas_Object * obj,
1068 struct appdata *ad = (struct appdata *)data;
1069 ret_if(!ad->add_search_bar);
1072 Evas_Object *entry = elm_object_part_content_get(searchbar_layout,
1073 "elm.swallow.content");
1075 evas_object_hide(obj);
1076 elm_object_signal_emit(searchbar_layout, "cancel,out", "");
1077 text = elm_entry_entry_get(entry);
1078 if (text != NULL && strlen(text) > 0)
1079 elm_entry_entry_set(entry, NULL);
1080 elm_object_focus_set(entry, EINA_FALSE);
1083 Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(entry);
1085 if (ECORE_IMF_INPUT_PANEL_STATE_HIDE !=
1086 ecore_imf_context_input_panel_state_get(imf_context)) {
1088 ecore_imf_context_input_panel_hide(imf_context);
1091 CLK_INFO("ad->search_text: %s\n", ad->search_text);
1093 if (strcmp(ad->search_text, "")) {
1095 if (g_ad->add_view_update_timer) {
1096 ecore_timer_del(g_ad->add_view_update_timer);
1097 g_ad->add_view_update_timer = NULL;
1099 ad->add_view_update_timer =
1100 ecore_timer_add(0.01, __ugview_genlist_update, ad);
1102 // reset search text
1103 memset(ad->search_text, '\0', BUF_SIZE);
1105 //elm_searchbar_text_set(ad->add_search_bar, S_("IDS_COM_SK_SEARCH"));
1111 * Callback function used for processing unfocused event about searchbar.
1112 * When touch out of searchbar , hide input panel
1114 * @param[in] data data used for this function
1115 * @param[in] obj Evas_Object which emit this event
1116 * @param[in] event_info Information about this event
1120 static void __ugview_searchbar_unfocused_cb(void *data, Evas_Object * obj,
1125 struct appdata *ad = (struct appdata *)data;
1127 if (elm_entry_is_empty(obj))
1128 elm_object_signal_emit(searchbar_layout,
1129 "elm,state,guidetext,show", "elm");
1130 elm_object_signal_emit(searchbar_layout, "elm,state,eraser,hide",
1133 Ecore_IMF_Context *imf_context = NULL;
1134 if (ad->add_search_bar) {
1135 // get entry from searchbar
1136 Evas_Object *entry =
1137 elm_object_part_content_get(searchbar_layout,
1138 "elm.swallow.content");
1139 // get imf context from entry
1140 imf_context = elm_entry_imf_context_get(entry);
1143 CLK_INFO("\nto hide keypad\n\n");
1144 // hide imf context keypad
1145 ecore_imf_context_input_panel_hide(imf_context);
1151 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.
1153 elm_entry_entry_set(data, "");
1156 static void _bg_clicked_cb(void *data, Evas_Object * obj, const char *emission,
1159 elm_object_focus_set(data, EINA_TRUE);
1162 static void _searchsymbol_clicked_cb(void *data, Evas_Object * obj,
1163 const char *emission, const char *source)
1165 elm_object_focus_set(data, EINA_TRUE);
1166 printf("\n[Search Bar] SearchSymbol Callback Called\n");
1170 static void __ugview_input_panel_event_cb(void *data, Ecore_IMF_Context * ctx,
1175 struct appdata *ad = (struct appdata *)data;
1176 ret_if(!ad->add_layout);
1177 if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
1178 // ISE state has changed to ECORE_IMF_INPUT_PANEL_STATE_SHOW status
1179 edje_object_signal_emit(_EDJ(ad->add_layout), "abbrev_genlist",
1181 edje_object_signal_emit(_EDJ(ad->add_layout), "abbrev_index",
1183 } else if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
1184 // ISE state has changed to ECORE_IMF_INPUT_PANEL_STATE_HIDE status
1185 edje_object_signal_emit(_EDJ(ad->add_layout), "expand_genlist",
1187 edje_object_signal_emit(_EDJ(ad->add_layout), "expand_index",
1194 * Add new searchbar object which used for search cities which selected by user.
1196 * @param[in] parent The parent object of the new genlist object
1197 * @param[in] data Data used in this function
1199 * @return NULL if create genlist failed.
1200 * Pointer to the new searchbar object if create successfully.
1202 static Evas_Object *__ugview_searchbar_add(Evas_Object * parent, void *data)
1205 retv_if((!parent || !data), NULL);
1207 //Evas_Object *searchbar_layout = NULL;
1208 Evas_Object *entry = NULL;
1209 Evas_Object *cancel_btn = NULL;
1211 //search_bar = elm_searchbar_add(parent);
1213 // edje_object_part_external_object_get(_EDJ(parent), "searchbar");
1214 //retv_if(!search_bar, NULL);
1215 searchbar_layout = elm_layout_add(parent);
1216 elm_layout_theme_set(searchbar_layout, "layout", "searchbar",
1218 elm_object_part_content_set(parent, "searchbar", searchbar_layout);
1219 entry = elm_entry_add(searchbar_layout);
1220 elm_entry_prediction_allow_set(entry, EINA_FALSE);
1221 elm_entry_scrollable_set(entry, EINA_TRUE);
1222 elm_entry_single_line_set(entry, EINA_TRUE);
1223 elm_object_part_content_set(searchbar_layout, "elm.swallow.content",
1225 elm_object_part_text_set(searchbar_layout, "elm.guidetext", "Search");
1226 //evas_object_show(entry); // entry should be shown before setting focus.
1227 //// enable animation
1228 //elm_searchbar_cancel_button_animation_set(search_bar, EINA_TRUE);
1230 //Evas_Object *entry = elm_searchbar_entry_get(search_bar);
1231 evas_object_smart_callback_add(entry, "changed",
1232 __ugview_searchbar_changed_cb, data);
1233 evas_object_smart_callback_add(entry, "focused",
1234 __ugview_searchbar_clicked_cb, data);
1235 evas_object_smart_callback_add(entry, "unfocused",
1236 __ugview_searchbar_unfocused_cb, data);
1238 elm_object_signal_callback_add(searchbar_layout, "elm,eraser,clicked",
1239 "elm", _eraser_clicked_cb, entry);
1240 elm_object_signal_callback_add(searchbar_layout, "elm,bg,clicked",
1241 "elm", _bg_clicked_cb, entry);
1242 elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
1243 // disable input panel
1244 elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
1245 // disable the context menu
1246 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
1248 evas_object_size_hint_weight_set(searchbar_layout, EVAS_HINT_EXPAND,
1250 evas_object_size_hint_align_set(searchbar_layout, EVAS_HINT_FILL,
1253 cancel_btn = elm_button_add(searchbar_layout);
1254 elm_object_part_content_set(searchbar_layout, "button_cancel",
1256 elm_object_style_set(cancel_btn, "searchbar/default");
1257 elm_object_text_set(cancel_btn, "Cancel");
1258 evas_object_smart_callback_add(cancel_btn, "clicked",
1259 __ugview_searchbar_cancel_clicked_cb,
1261 elm_object_signal_callback_add(searchbar_layout, "elm,action,click", "",
1262 _searchsymbol_clicked_cb, entry);
1265 // register callback functions to search bar
1266 // evas_object_smart_callback_add(entry, "unfocused",
1267 // __ugview_searchbar_unfocused_cb, data);
1268 // evas_object_smart_callback_add(entry, "changed",
1269 // __ugview_searchbar_changed_cb, data);
1270 // evas_object_smart_callback_add(searchbar_layout, "clicked",
1271 // __ugview_searchbar_clicked_cb, data);
1272 // evas_object_smart_callback_add(searchbar_layout, "cancel,clicked",
1273 // __ugview_searchbar_cancel_clicked_cb,
1277 //edje_object_part_swallow(_EDJ(parent), "add/search", searchbar_layout);
1279 //evas_object_show(searchbar_layout);
1282 return searchbar_layout;
1285 /////////////////////// search bar finished ////////////////////////////
1288 * Callback function which used for change sorting type about genlist
1290 * @param[in] data data which used in this function
1291 * @param[in] obj Evas_Object which emit this event
1292 * @param[in] event_info Information about such event.
1296 static void __ugview_sortbar_clicked_cb(void *data, Evas_Object * obj,
1302 struct appdata *ad = (struct appdata *)data;
1305 //Evas_Object *entry = elm_searchbar_entry_get(ad->add_search_bar);
1306 //elm_object_focus_set(entry, EINA_TRUE);
1307 //// disable the context menu
1308 //elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
1309 //elm_entry_context_menu_disabled_set(entry, EINA_FALSE);
1311 Elm_Object_Item *select_item =
1312 elm_segment_control_item_selected_get(obj);
1314 // set sort flag, and update genlist
1315 if (select_item == g_btn_sort_by_time) {
1316 ad->sort = WCL_SORT_BY_TIMEZONE;
1317 } else if (select_item == g_btn_sort_by_name) {
1318 ad->sort = WCL_SORT_BY_NAME;
1321 if (g_ad->add_view_update_timer) {
1322 ecore_timer_del(g_ad->add_view_update_timer);
1323 g_ad->add_view_update_timer = NULL;
1325 ad->add_view_update_timer =
1326 ecore_timer_add(0.01, __ugview_genlist_update, ad);
1332 * Add new sortbar object which used for sort cities which selected by user.
1334 * @param[in] parent The parent object of the new genlist object
1335 * @param[in] data data which used in this function
1337 * @return NULL if create genlist failed.
1338 * Pointer to the new sortbar object if create successfully.
1340 static Evas_Object *__ugview_sortbar_add(Evas_Object * parent, void *data)
1342 retv_if((!parent || !data), NULL);
1343 /* create controlbar */
1344 Evas_Object *ctrlbar = widget_create_controlbar(parent, NULL);
1345 /* create segment control on controlbar */
1346 Evas_Object *segment_ly = elm_layout_add(ctrlbar);
1347 retv_if(segment_ly == NULL, NULL);
1348 elm_layout_file_set(segment_ly, WCL_EDJ_NAME, GRP_SEGMENT_PANEL);
1349 evas_object_size_hint_weight_set(segment_ly, EVAS_HINT_EXPAND,
1351 evas_object_size_hint_align_set(segment_ly, EVAS_HINT_FILL,
1353 evas_object_show(segment_ly);
1355 // create segment control
1356 Evas_Object *segment = elm_segment_control_add(ctrlbar);
1357 g_btn_sort_by_name =
1358 elm_segment_control_item_add(segment, NULL,
1359 S_("IDS_COM_BODY_DETAILS_NAME"));
1360 g_btn_sort_by_time =
1361 elm_segment_control_item_add(segment, NULL, S_("IDS_COM_POP_TIME"));
1362 evas_object_show(segment);
1363 // set default sort type
1364 elm_segment_control_item_selected_set(g_btn_sort_by_name, EINA_TRUE);
1365 // register callback to segment control
1366 evas_object_smart_callback_add(segment, "changed",
1367 __ugview_sortbar_clicked_cb, data);
1369 elm_object_part_content_set(segment_ly, "segment", segment);
1371 Elm_Object_Item *item = NULL;
1373 item = elm_toolbar_item_append(ctrlbar, NULL, NULL, NULL, NULL);
1374 elm_object_item_disabled_set(item, EINA_TRUE);
1376 item = elm_toolbar_item_append(ctrlbar, NULL, NULL, NULL, NULL);
1377 elm_object_item_part_content_set(item, "object", segment_ly);
1379 item = elm_toolbar_item_append(ctrlbar, NULL, NULL, NULL, NULL);
1380 elm_object_item_disabled_set(item, EINA_TRUE);
1384 static Evas_Object *__ugview_layout_add(Evas_Object * parent)
1387 retv_if(!parent, NULL);
1389 // create window layout
1390 Evas_Object *layout = elm_layout_add(parent);
1391 retv_if(layout == NULL, NULL);
1393 elm_layout_theme_set(layout, "layout", "application", "searchbar_base");
1394 elm_object_signal_emit(layout, "elm,state,show,searchbar", "elm");
1396 //elm_layout_theme_set(layout, "layout", "application", "searchbar");
1397 //elm_object_signal_emit(layout, "elm,state,show,searchbar", "elm");
1398 //evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1399 //evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, 0);
1400 //elm_bg_color_set(layout, 0, 0, 0);
1401 //elm_object_style_set(layout, "group_list");
1403 //evas_object_show(layout);
1409 * Create add view for append new city into the selection list of worldclock
1411 * @param[in] parent Evas_Object which is the parent of add view
1412 * @param[in] data data which used in this function
1413 * @param[in] func Callback function which used for invoking when exit from add view
1415 * @return FAILED if create add view failed.
1416 * SUCCESS if create add view successfully.
1418 int worldclock_ugview_add(Evas_Object * parent, void *data, Wcl_Return_Cb func)
1421 retv_if(!data, FAILED);
1423 struct appdata *ad = (struct appdata *)data;
1424 init_alphabetic_index();
1425 ad->page = WCL_PAGE_ADD;
1428 const char *group_name = NULL;
1429 const char *title_name = NULL;
1431 // select call_flag & group name by caller
1432 switch (ad->caller) {
1433 case WCL_CALLER_IS_APP_IT_SELF:
1434 g_call_flag = CALL_FROM_MAIN_VIEW;
1435 group_name = GRP_ADD2;
1436 title_name = _("IDS_WCL_HEADER_SELECT_TIME_ZONE");
1438 case WCL_CALLER_IS_SHARED_LIBRARY:
1439 g_call_flag = CALL_FROM_MAIN_VIEW;
1440 group_name = GRP_ADD2;
1441 title_name = _("IDS_WCL_HEADER_SELECT_TIME_ZONE");
1443 case WCL_CALLER_IS_UI_GADGET:
1444 g_call_flag = CALL_FROM_UI_GADGET;
1445 group_name = GRP_ADD2;
1446 title_name = _("IDS_WCL_BODY_TIME_ZONE");
1453 retv_if(EINA_FALSE == worldclock_ug_data_open_database(), FAILED);
1456 ad->add_ly = __ugview_layout_add(parent);;
1457 retv_if(ad->add_ly == NULL, FAILED);
1459 /* init search data */
1460 memset(ad->search_text, 0x0, BUF_SIZE * sizeof(char));
1463 ad->add_search_bar = __ugview_searchbar_add(ad->add_ly, data);
1464 retv_if(ad->add_search_bar == NULL, FAILED);
1468 worldclock_load_edj(ad->add_ly, WCL_EDJ_NAME, group_name);
1469 retv_if(ad->add_layout == NULL, FAILED);
1470 elm_object_part_content_set(ad->add_ly, "elm.swallow.content",
1473 //ad->add_search_bar = __ugview_searchbar_add(ad->add_layout, data);
1474 //retv_if(ad->add_search_bar == NULL, FAILED);
1476 // index to quick search
1477 //ad->add_index = __ugview_index_add(ad->add_layout, data);
1480 ad->sort = WCL_SORT_BY_NAME; // sory by name
1481 ad->add_genlist = __ugview_genlist_add(ad->add_layout, data);
1482 retv_if(ad->add_genlist == NULL, FAILED);
1484 Evas_Object *add_sortbar = __ugview_sortbar_add(ad->navi_bar, data);
1485 retv_if(add_sortbar == NULL, FAILED);
1487 // create left button
1488 Evas_Object *back_btn = elm_button_add(ad->navi_bar);
1489 elm_object_style_set(back_btn, "naviframe/end_btn/default");
1490 evas_object_smart_callback_add(back_btn, "clicked", __ugview_quit_cb,
1493 // set segment control as title about layout
1494 Elm_Object_Item *elm_item =
1495 elm_naviframe_item_push(ad->navi_bar, title_name, back_btn, NULL,
1497 elm_object_item_part_content_set(elm_item, "controlbar", add_sortbar);
1498 //elm_naviframe_item_title_visible_set(elm_item, EINA_FALSE);
1501 if (g_ad->add_view_update_timer) {
1502 ecore_timer_del(g_ad->add_view_update_timer);
1503 g_ad->add_view_update_timer = NULL;
1505 ad->add_view_update_timer =
1506 ecore_timer_add(0.01, __ugview_genlist_update, ad);
1513 * Release all resources which used in add view when exit from add view
1515 * @param[in] data data which used in this function
1519 void worldclock_ugview_free(void *data)
1524 struct appdata *ad = (struct appdata *)data;
1525 uninit_alphabetic_index();
1527 __ugview_quit_cb(NULL, NULL, NULL);
1532 #undef MAX_LEN_CITY_NAME
1533 #undef MAX_LEN_COUNTRY_NAME
1535 #undef MAX_LEN_INPUT