Merge "gengrid TC modified"
[framework/uifw/elementary.git] / tests / src / lib / elm_searchbar.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4 #include <Elementary.h>
5 #include "elm_priv.h"
6
7 typedef struct _Widget_Data Widget_Data;
8
9 struct _Widget_Data
10 {
11    Evas_Object *base, *ef, *cancel_btn;
12    Eina_Bool cancel_btn_ani_flag;
13    Eina_Bool cancel_btn_show_mode;
14    Eina_Bool boundary_mode;
15    Ecore_Idler *idler;
16 };
17
18 static const char *widtype = NULL;
19 static void _del_hook(Evas_Object *obj);
20 static void _theme_hook(Evas_Object *obj);
21 static void _on_focus_hook(void *data, Evas_Object *obj);
22 static void _sizing_eval(Evas_Object *obj);
23 static void _clicked(void *data, Evas_Object *obj,
24                      const char *emission, const char *source);
25 static void _changed(void *data, Evas_Object *obj, void *event_info);
26 static void _cancel_clicked(void *data, Evas_Object *obj, void *event_info);
27
28 static void _del_hook(Evas_Object *obj)
29 {
30    Widget_Data *wd = elm_widget_data_get(obj);
31
32    if (!wd) return;
33    if (wd->idler) ecore_idler_del(wd->idler);
34
35    free(wd);
36 }
37
38 static void _theme_hook(Evas_Object *obj)
39 {
40    Widget_Data *wd = elm_widget_data_get(obj);
41    char buf[4096];
42
43    if (!wd) return;
44
45    _elm_theme_object_set(obj, wd->base, "searchbar", "base", elm_widget_style_get(obj));
46
47    if (wd->ef)
48      edje_object_part_swallow(wd->base, "search_textfield", wd->ef);
49    if (wd->cancel_btn)
50      edje_object_part_swallow(wd->base, "button_cancel", wd->cancel_btn);
51
52    snprintf(buf, sizeof(buf), "searchbar/%s", elm_widget_style_get(obj));
53    elm_object_style_set(wd->ef, buf);
54
55    snprintf(buf, sizeof(buf), "searchbar/%s", elm_widget_style_get(obj));
56    elm_object_style_set(wd->cancel_btn, buf);
57
58    edje_object_scale_set(wd->cancel_btn, elm_widget_scale_get(obj) * _elm_config->scale);
59    _sizing_eval(obj);
60 }
61
62 static void
63 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
64 {
65    Widget_Data *wd = elm_widget_data_get(obj);
66    if (!wd || !wd->base)
67       return;
68    if (elm_widget_focus_get(obj))
69      {
70         elm_object_focus(wd->ef);
71         if (wd->cancel_btn_show_mode)
72           {
73              if (wd->cancel_btn_ani_flag) edje_object_signal_emit(wd->base, "CANCELIN", "PROG");
74              else edje_object_signal_emit(wd->base, "CANCELSHOW", "PROG");
75           }
76      }
77    else
78      {
79         if (wd->cancel_btn_ani_flag) edje_object_signal_emit(wd->base, "CANCELOUT", "PROG");
80         else edje_object_signal_emit(wd->base, "CANCELHIDE", "PROG");
81      }
82 }
83
84 static void _sizing_eval(Evas_Object *obj)
85 {
86    Widget_Data *wd = elm_widget_data_get(obj);
87    Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
88
89    if (!wd) return;
90    elm_coords_finger_size_adjust(1, &minw, 1, &minh);
91    edje_object_size_min_restricted_calc(wd->base, &minw, &minh, minw, minh);
92    elm_coords_finger_size_adjust(1, &minw, 1, &minh);
93    evas_object_size_hint_min_set(obj, minw, minh);
94    evas_object_size_hint_max_set(obj, maxw, maxh);
95 }
96
97 static void _clicked(void *data, Evas_Object *obj __UNUSED__,
98                      const char *emission __UNUSED__, const char *source __UNUSED__)
99 {
100    evas_object_smart_callback_call(data, "clicked", NULL);
101 }
102
103 static Eina_Bool _delay_changed(void *data)
104 {
105    Widget_Data *wd = elm_widget_data_get(data);
106
107    if (!wd) return ECORE_CALLBACK_CANCEL;
108
109    evas_object_smart_callback_call(data, "delay-changed", NULL);
110    wd->idler = NULL;
111    return ECORE_CALLBACK_CANCEL;
112 }
113
114 static void _changed(void *data, Evas_Object *obj __UNUSED__,
115                      void *event_info __UNUSED__)
116 {
117    Widget_Data *wd = elm_widget_data_get(data);
118
119    if (!wd) return;
120    if (!wd->idler)
121       wd->idler = ecore_idler_add(_delay_changed, data);
122 }
123
124 static void _cancel_clicked(void *data, Evas_Object *obj __UNUSED__,
125                             void *event_info __UNUSED__)
126 {
127    Widget_Data *wd = elm_widget_data_get(data);
128    if (!wd) return;
129
130    const char* text;
131    text = elm_entry_entry_get(elm_editfield_entry_get(wd->ef));
132    if (text != NULL && strlen(text) > 0)
133      elm_entry_entry_set(elm_editfield_entry_get(wd->ef), NULL);
134    elm_object_unfocus(data);
135    evas_object_smart_callback_call(data, "cancel,clicked", NULL);
136 }
137
138 static void
139 _searchsymbol_clicked(void *data, Evas_Object *obj __UNUSED__,
140                       const char *emission __UNUSED__,
141                       const char *source __UNUSED__)
142 {
143    Widget_Data *wd = elm_widget_data_get(data);
144
145    if (!wd) return;
146    evas_object_smart_callback_call(data, "searchsymbol,clicked", NULL);
147 }
148
149 static void
150 _elm_searchbar_text_set(Evas_Object *obj, const char *item, const char *text)
151 {
152    ELM_CHECK_WIDTYPE(obj, widtype);
153    Widget_Data *wd = elm_widget_data_get(obj);
154    if (item && strcmp(item, "default")) return;
155    if (!wd) return;
156    elm_entry_entry_set(elm_editfield_entry_get(wd->ef), text);
157 }
158
159 static const char *
160 _elm_searchbar_text_get(const Evas_Object *obj, const char *item)
161 {
162    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
163    Widget_Data *wd = elm_widget_data_get(obj);
164    if (item && strcmp(item, "default")) return NULL;
165    if (!wd) return NULL;
166    return elm_entry_entry_get(elm_editfield_entry_get(wd->ef));
167 }
168
169
170 EAPI Evas_Object *elm_searchbar_add(Evas_Object *parent)
171 {
172    Evas_Object *obj;
173    Evas *e;
174    Widget_Data *wd;
175    char buf[4096];
176
177    ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
178
179    ELM_SET_WIDTYPE(widtype, "searchbar");
180    elm_widget_type_set(obj, "searchbar");
181    elm_widget_sub_object_add(parent, obj);
182    elm_widget_data_set(obj, wd);
183    elm_widget_del_hook_set(obj, _del_hook);
184    elm_widget_theme_hook_set(obj, _theme_hook);
185    elm_widget_on_focus_hook_set( obj, _on_focus_hook, NULL);
186    elm_widget_can_focus_set(obj, EINA_TRUE);
187    elm_widget_text_set_hook_set(obj, _elm_searchbar_text_set);
188    elm_widget_text_get_hook_set(obj, _elm_searchbar_text_get);
189
190    wd->base = edje_object_add(e);
191    _elm_theme_object_set(obj, wd->base, "searchbar", "base", "default");
192    elm_widget_resize_object_set(obj, wd->base);
193
194    // Add Entry
195    wd->ef = elm_editfield_add(obj);
196    elm_object_style_set(wd->ef, "searchbar/default");
197
198    edje_object_part_swallow(wd->base, "search_textfield", wd->ef);
199    elm_editfield_guide_text_set(wd->ef, E_("Search"));
200    elm_editfield_entry_single_line_set(wd->ef, EINA_TRUE);
201    elm_editfield_eraser_set(wd->ef, EINA_TRUE);
202    evas_object_smart_callback_add(elm_editfield_entry_get(wd->ef), "changed", _changed, obj);
203    edje_object_signal_callback_add(wd->base, "mouse,clicked,1", "*", _clicked, obj);
204    edje_object_signal_callback_add(wd->base, "elm,action,click", "", _searchsymbol_clicked, obj);
205
206    // Add Button
207    wd->cancel_btn = elm_button_add(obj);
208    edje_object_part_swallow(wd->base, "button_cancel", wd->cancel_btn);
209    snprintf(buf, sizeof(buf), "searchbar/%s", elm_widget_style_get(obj));
210    elm_object_style_set(wd->cancel_btn, buf);
211    elm_object_text_set(wd->cancel_btn, E_("Cancel"));
212    evas_object_smart_callback_add(wd->cancel_btn, "clicked", _cancel_clicked, obj);
213
214    wd->cancel_btn_ani_flag = EINA_FALSE;
215    wd->cancel_btn_show_mode = EINA_TRUE;
216    wd->boundary_mode = EINA_TRUE;
217
218    _sizing_eval(obj);
219
220    return obj;
221 }
222
223 EAPI void elm_searchbar_text_set(Evas_Object *obj, const char *entry)
224 {
225    _elm_searchbar_text_set(obj, NULL, entry);
226 }
227
228 EAPI const char* elm_searchbar_text_get(Evas_Object *obj)
229 {
230    return _elm_searchbar_text_get(obj, NULL);
231 }
232
233 EAPI Evas_Object *elm_searchbar_entry_get(Evas_Object *obj)
234 {
235    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
236    Widget_Data *wd = elm_widget_data_get(obj);
237    if (!wd) return NULL;
238
239    return elm_editfield_entry_get(wd->ef);
240 }
241
242 EAPI Evas_Object *elm_searchbar_editfield_get(Evas_Object *obj)
243 {
244    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
245    Widget_Data *wd = elm_widget_data_get(obj);
246    if (!wd || !wd->ef) return NULL;
247
248    return wd->ef;
249 }
250
251 EAPI void elm_searchbar_cancel_button_animation_set(Evas_Object *obj, Eina_Bool cancel_btn_ani_flag)
252 {
253    ELM_CHECK_WIDTYPE(obj, widtype);
254    Widget_Data *wd = elm_widget_data_get(obj);
255    if (!wd) return;
256
257    if (wd->cancel_btn_ani_flag == cancel_btn_ani_flag) return;
258    else wd->cancel_btn_ani_flag = cancel_btn_ani_flag;
259 }
260
261 EAPI void elm_searchbar_cancel_button_set(Evas_Object *obj, Eina_Bool visible)
262 {
263    ELM_CHECK_WIDTYPE(obj, widtype);
264    Widget_Data *wd = elm_widget_data_get(obj);
265    if (!wd) return;
266
267    if (wd->cancel_btn_show_mode == visible) return;
268    else wd->cancel_btn_show_mode = visible;
269
270    if (!visible)
271      {
272         if (wd->cancel_btn_ani_flag)
273            edje_object_signal_emit(wd->base, "CANCELOUT", "PROG");
274         else
275            edje_object_signal_emit(wd->base, "CANCELHIDE", "PROG");
276      }
277    _sizing_eval(obj);
278 }
279
280 EAPI void elm_searchbar_clear(Evas_Object *obj)
281 {
282    ELM_CHECK_WIDTYPE(obj, widtype);
283    Widget_Data *wd = elm_widget_data_get(obj);
284    if (!wd) return;
285
286    if (wd->cancel_btn_show_mode)
287      {
288         if (wd->cancel_btn_ani_flag)
289            edje_object_signal_emit(wd->base, "CANCELOUT", "PROG");
290         else
291            edje_object_signal_emit(wd->base, "CANCELHIDE", "PROG");
292      }
293 //   elm_entry_entry_set(elm_editfield_entry_get(wd->ef), NULL);
294 }
295
296 EAPI void elm_searchbar_boundary_rect_set(Evas_Object *obj, Eina_Bool boundary)
297 {
298    ELM_CHECK_WIDTYPE(obj, widtype);
299    Widget_Data *wd = elm_widget_data_get(obj);
300    if (!wd) return;
301
302    if (wd->boundary_mode == boundary) return;
303    else wd->boundary_mode = boundary;
304
305    if (wd->boundary_mode)
306      {
307         edje_object_signal_emit(wd->base, "BDSHOW", "PROG");
308      }
309    else
310      {
311         edje_object_signal_emit(wd->base, "BDHIDE", "PROG");
312      }
313    _sizing_eval(obj);
314 }