1cb646ab06c5085f245927c6772a33141754b36a
[apps/core/preloaded/settings.git] / setting-common / src / setting-common-draw-searchbar.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 <Ecore_X.h>
24 /**
25 * Get searchbar text and register redraw_cb by idler.
26 *
27 * @param[in] data
28 * @param[in] search_bar
29 * @param[in] search_text
30 * @param[in] search_idler
31 * @param[in] redraw_cb
32 */
33 int setting_searchbar_redraw(void *data,
34                            Evas_Object *search_bar,
35                            char *search_text,
36                            Ecore_Idler **search_idler,
37                            Ecore_Task_Cb redraw_cb)
38 {
39         SETTING_TRACE_BEGIN;
40         setting_retvm_if(search_bar == NULL, -1, "search_bar parameter is NULL");
41         //const char *str = elm_object_text_get(search_bar);
42         Evas_Object *entry = elm_object_part_content_get(search_bar, "elm.swallow.content");
43         const char *str = elm_entry_entry_get(entry);
44         int str_len = safeStrLen(str);
45         setting_retvm_if(str_len > MAX_SEARCH_STR_LEN, -1, "str_len > MAX_SEARCH_STR_LEN");
46
47         memset(search_text, '\0', MAX_SEARCH_STR_LEN + 1);
48         safeCopyStr(search_text, str, MAX_SEARCH_STR_LEN);
49
50         SETTING_TRACE("Update the search view text, search_text=%s",
51                         search_text);
52
53         if (*search_idler) {
54                 ecore_idler_del(*search_idler);
55                 *search_idler = NULL;
56         }
57         *search_idler = ecore_idler_add(redraw_cb, data);
58         return 0;
59 }
60 static void __searchbar_chg_cb(void *data, Evas_Object *obj, void *event_info)
61 {
62         Evas_Object *searchbar_layout = data;
63         if (elm_object_focus_get(searchbar_layout)) {
64                 if (elm_entry_is_empty(obj)) {
65                         elm_object_signal_emit(searchbar_layout, "elm,state,eraser,hide", "elm");
66                 }
67                 else
68                         elm_object_signal_emit(searchbar_layout, "elm,state,eraser,show", "elm");
69         }
70         if(safeStrLen(elm_entry_entry_get(obj)) > 0) {
71                 elm_object_signal_emit(searchbar_layout, "elm,state,guidetext,hide", "elm");
72         } else {
73                 elm_object_signal_emit(searchbar_layout, "elm,state,guidetext,show", "elm");
74         }
75 }
76
77 static void __searchbar_focused_cb(void *data, Evas_Object *obj, void *event_info)
78 {
79         ret_if(!data || !obj);
80         Evas_Object *searchbar_layout = data;
81         if (!elm_entry_is_empty(obj))
82                 elm_object_signal_emit(searchbar_layout, "elm,state,eraser,show", "elm");
83         elm_object_signal_emit(searchbar_layout, "elm,state,guidetext,hide", "elm");
84         elm_object_signal_emit(searchbar_layout, "cancel,in", "");
85 }
86
87 static void __searchbar_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
88 {
89         ret_if(!data || !obj);
90         Evas_Object *searchbar_layout = data;
91         if (elm_entry_is_empty(obj))
92                 elm_object_signal_emit(searchbar_layout, "elm,state,guidetext,show", "elm");
93         elm_object_signal_emit(searchbar_layout, "elm,state,eraser,hide", "elm");
94 }
95
96 static void __searchbar_activated_cb(void *data, Evas_Object *obj, void *event_info)
97 {
98         ret_if(!obj);
99         Evas_Object *searchbar_layout = data;
100         Evas_Object *entry = elm_object_part_content_get(searchbar_layout, "elm.swallow.content");
101         ret_if(!entry);
102         elm_object_focus_set(entry, EINA_FALSE);
103 }
104
105 static void __searchbar_eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
106 {
107         ret_if(!data);
108         Evas_Object *entry = data;
109         elm_entry_entry_set(entry, "");
110 }
111
112 static void __searchbar_bg_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
113 {
114         ret_if(!data);
115         Evas_Object *entry = data;
116         elm_object_focus_set(entry, EINA_TRUE);
117 }
118
119 static void __searchbar_cancel_clicked_cb(void *data, Evas_Object *obj, void *event_info)
120 {
121         ret_if(!data || !obj);
122         evas_object_hide(obj);
123         Evas_Object *searchbar_layout = data;
124         elm_object_signal_emit(searchbar_layout, "cancel,out", "");
125         Evas_Object *entry = elm_object_part_content_get(searchbar_layout, "elm.swallow.content");
126         ret_if(!entry);
127         const char* text = elm_entry_entry_get(entry);
128         if (text != NULL && strlen(text) > 0)
129                 elm_entry_entry_set(entry, NULL);
130         elm_object_focus_set(entry, EINA_FALSE);
131 }
132
133 static void __searchbar_searchsymbol_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
134 {
135         ret_if(!data);
136         Evas_Object *entry = data;
137         elm_object_focus_set(entry, EINA_TRUE);
138 }
139 /**
140 * Create searchar, register change cb and cancel cb.
141 *
142 * @param[in] data
143 * @param[in] parent
144 * @param[in] change_cb
145 * @param[in] cancel_cb
146 */
147 Evas_Object *setting_create_searchbar(void *data, Evas_Object *parent,
148                                          Evas_Smart_Cb change_cb,
149                                          Evas_Smart_Cb cancel_cb)
150 {
151         SETTING_TRACE_BEGIN;
152         setting_retvm_if(parent == NULL, NULL, "parent parameter is NULL");
153         Evas_Object *searchbar_layout = elm_layout_add(parent);
154         elm_layout_theme_set(searchbar_layout, "layout", "searchbar", "cancel_button");
155         elm_object_part_content_set(parent, "searchbar", searchbar_layout);
156         Evas_Object *entry = elm_entry_add(searchbar_layout);
157         elm_entry_scrollable_set(entry, EINA_TRUE);
158         elm_entry_single_line_set(entry, EINA_TRUE);
159         elm_entry_prediction_allow_set(entry, EINA_FALSE);
160         if (change_cb) evas_object_smart_callback_add(entry, "changed", change_cb, data);
161         evas_object_smart_callback_add(entry, "changed", __searchbar_chg_cb, searchbar_layout);
162         evas_object_smart_callback_add(entry, "focused", __searchbar_focused_cb, searchbar_layout);
163         evas_object_smart_callback_add(entry, "unfocused", __searchbar_unfocused_cb, searchbar_layout);
164         evas_object_smart_callback_add(entry, "activated", __searchbar_activated_cb, searchbar_layout);
165         elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
166         elm_object_part_content_set(searchbar_layout, "elm.swallow.content", entry);
167         elm_object_part_text_set(searchbar_layout, "elm.guidetext", _("IDS_COM_SK_SEARCH"));
168         elm_object_signal_callback_add(searchbar_layout, "elm,eraser,clicked", "elm", __searchbar_eraser_clicked_cb, entry);
169         elm_object_signal_callback_add(searchbar_layout, "elm,bg,clicked", "elm", __searchbar_bg_clicked_cb, entry);
170         evas_object_size_hint_weight_set(searchbar_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
171         evas_object_size_hint_align_set(searchbar_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
172
173
174         Evas_Object *cancel_btn = elm_button_add(searchbar_layout);
175         elm_object_part_content_set(searchbar_layout, "button_cancel", cancel_btn);
176         elm_object_style_set(cancel_btn, "searchbar/default");
177         elm_object_text_set(cancel_btn, _("Cancel"));
178
179         if (!cancel_cb){
180                 cancel_cb = __searchbar_cancel_clicked_cb;
181         }
182         evas_object_smart_callback_add(cancel_btn, "clicked", cancel_cb, searchbar_layout);
183         elm_object_signal_callback_add(searchbar_layout, "elm,action,click", "", __searchbar_searchsymbol_clicked_cb, entry);
184         return searchbar_layout;
185 }
186