2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
4 #include <Elementary.h>
8 * @defgroup Searchbar Searchbar
12 * It can contain a simple entry and button object.
15 typedef struct _Widget_Data Widget_Data;
19 Evas_Object *base, *ef, *cancel_btn;
20 Eina_Bool cancel_btn_ani_flag;
21 Eina_Bool cancel_btn_show_mode;
22 Eina_Bool boundary_mode;
26 static const char *widtype = NULL;
27 static void _del_hook(Evas_Object *obj);
28 static void _theme_hook(Evas_Object *obj);
29 static void _on_focus_hook(void *data, Evas_Object *obj);
30 static void _sizing_eval(Evas_Object *obj);
31 static void _clicked(void *data, Evas_Object *obj, void *event_info);
32 static void _changed(void *data, Evas_Object *obj, void *event_info);
33 static void _cancel_clicked(void *data, Evas_Object *obj, void *event_info);
35 static void _del_hook(Evas_Object *obj)
37 Widget_Data *wd = elm_widget_data_get(obj);
40 if (wd->idler) ecore_idler_del(wd->idler);
45 static void _theme_hook(Evas_Object *obj)
47 Widget_Data *wd = elm_widget_data_get(obj);
52 _elm_theme_object_set(obj, wd->base, "searchbar", "base", elm_widget_style_get(obj));
55 edje_object_part_swallow(wd->base, "search_textfield", wd->ef);
57 edje_object_part_swallow(wd->base, "button_cancel", wd->cancel_btn);
59 snprintf(buf, sizeof(buf), "searchbar/%s", elm_widget_style_get(obj));
60 elm_object_style_set(wd->ef, buf);
62 snprintf(buf, sizeof(buf), "searchbar/%s", elm_widget_style_get(obj));
63 elm_object_style_set(wd->cancel_btn, buf);
65 edje_object_scale_set(wd->cancel_btn, elm_widget_scale_get(obj) * _elm_config->scale);
70 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
72 Widget_Data *wd = elm_widget_data_get(obj);
75 if (elm_widget_focus_get(obj))
77 /*FIXME: Sending clicked signal to focus editfield once open source is merged
78 * remove the below call
80 elm_object_signal_emit(wd->ef, "clicked", "elm");
81 if (wd->cancel_btn_show_mode)
83 if (wd->cancel_btn_ani_flag) edje_object_signal_emit(wd->base, "CANCELIN", "PROG");
84 else edje_object_signal_emit(wd->base, "CANCELSHOW", "PROG");
89 if (wd->cancel_btn_ani_flag) edje_object_signal_emit(wd->base, "CANCELOUT", "PROG");
90 else edje_object_signal_emit(wd->base, "CANCELHIDE", "PROG");
94 static void _sizing_eval(Evas_Object *obj)
96 Widget_Data *wd = elm_widget_data_get(obj);
97 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
100 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
101 edje_object_size_min_restricted_calc(wd->base, &minw, &minh, minw, minh);
102 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
103 evas_object_size_hint_min_set(obj, minw, minh);
104 evas_object_size_hint_max_set(obj, maxw, maxh);
107 static void _clicked(void *data, Evas_Object *obj __UNUSED__,
108 void *event_info __UNUSED__)
110 Widget_Data *wd = elm_widget_data_get(data);
113 evas_object_smart_callback_call(data, "clicked", NULL);
116 static Eina_Bool _delay_changed(void *data)
118 Widget_Data *wd = elm_widget_data_get(data);
120 if (!wd) return ECORE_CALLBACK_CANCEL;
122 evas_object_smart_callback_call(data, "delay-changed", NULL);
124 return ECORE_CALLBACK_CANCEL;
127 static void _changed(void *data, Evas_Object *obj __UNUSED__,
128 void *event_info __UNUSED__)
130 Widget_Data *wd = elm_widget_data_get(data);
134 wd->idler = ecore_idler_add(_delay_changed, data);
137 static void _cancel_clicked(void *data, Evas_Object *obj __UNUSED__,
138 void *event_info __UNUSED__)
140 Widget_Data *wd = elm_widget_data_get(data);
144 text = elm_entry_entry_get(elm_editfield_entry_get(wd->ef));
145 if (text != NULL && strlen(text) > 0)
146 elm_entry_entry_set(elm_editfield_entry_get(wd->ef), NULL);
147 elm_object_unfocus(data);
148 evas_object_smart_callback_call(data, "cancel,clicked", NULL);
152 _basebg_clicked(void *data, Evas_Object *obj, const char *emission __UNUSED__,
155 Widget_Data *wd = elm_widget_data_get(data);
159 if (!strcmp(source, "base_bg"))
160 _clicked(data, obj, NULL);
164 _searchsymbol_clicked(void *data, Evas_Object *obj __UNUSED__,
165 const char *emission __UNUSED__,
166 const char *source __UNUSED__)
168 Widget_Data *wd = elm_widget_data_get(data);
171 evas_object_smart_callback_call(data, "searchsymbol,clicked", NULL);
175 * Add a new searchbar to the parent
176 * @param parent The parent object
177 * @return The new object or NULL if it cannot be created
181 EAPI Evas_Object *elm_searchbar_add(Evas_Object *parent)
188 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
190 ELM_SET_WIDTYPE(widtype, "searchbar");
191 elm_widget_type_set(obj, "searchbar");
192 elm_widget_sub_object_add(parent, obj);
193 elm_widget_data_set(obj, wd);
194 elm_widget_del_hook_set(obj, _del_hook);
195 elm_widget_theme_hook_set(obj, _theme_hook);
196 elm_widget_on_focus_hook_set( obj, _on_focus_hook, NULL );
197 elm_widget_can_focus_set(obj, 1 );
199 wd->base = edje_object_add(e);
200 if (wd->base == NULL) return NULL;
202 _elm_theme_object_set(obj, wd->base, "searchbar", "base", "default");
205 wd->ef = elm_editfield_add(parent);
206 elm_object_style_set(wd->ef, "searchbar/default");
208 edje_object_part_swallow(wd->base, "search_textfield", wd->ef);
209 elm_editfield_guide_text_set(wd->ef, E_("Search"));
210 elm_editfield_entry_single_line_set(wd->ef, EINA_TRUE);
211 elm_editfield_eraser_set(wd->ef, EINA_TRUE);
212 evas_object_smart_callback_add(wd->ef, "clicked", _clicked, obj);
213 evas_object_smart_callback_add(elm_editfield_entry_get(wd->ef), "changed", _changed, obj);
214 edje_object_signal_callback_add(wd->base, "mouse,up,1", "*", _basebg_clicked, obj);
215 edje_object_signal_callback_add(wd->base, "elm,action,click", "", _searchsymbol_clicked, obj);
217 elm_widget_sub_object_add(obj, wd->ef);
220 wd->cancel_btn = elm_button_add(parent);
221 edje_object_part_swallow(wd->base, "button_cancel", wd->cancel_btn);
223 snprintf(buf, sizeof(buf), "searchbar/%s", elm_widget_style_get(obj));
224 elm_object_style_set(wd->cancel_btn, buf);
226 elm_object_text_set(wd->cancel_btn, E_("Cancel"));
227 evas_object_smart_callback_add(wd->cancel_btn, "clicked", _cancel_clicked, obj);
228 elm_widget_sub_object_add(obj, wd->cancel_btn);
230 wd->cancel_btn_ani_flag = EINA_FALSE;
231 wd->cancel_btn_show_mode = EINA_TRUE;
232 wd->boundary_mode = EINA_TRUE;
234 elm_widget_resize_object_set(obj, wd->base);
242 * set the text of entry
244 * @param obj The searchbar object
249 EAPI void elm_searchbar_text_set(Evas_Object *obj, const char *entry)
251 ELM_CHECK_WIDTYPE(obj, widtype);
252 Widget_Data *wd = elm_widget_data_get(obj);
255 elm_entry_entry_set(elm_editfield_entry_get(wd->ef), entry);
259 * get the text of entry
261 * @param obj The searchbar object
262 * @return string pointer of entry
266 EAPI const char* elm_searchbar_text_get(Evas_Object *obj)
268 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
269 Widget_Data *wd = elm_widget_data_get(obj);
270 if (!wd) return NULL;
272 return elm_entry_entry_get(elm_editfield_entry_get(wd->ef));
276 * get the pointer of entry
278 * @param obj The searchbar object
279 * @return the entry object
283 EAPI Evas_Object *elm_searchbar_entry_get(Evas_Object *obj)
285 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
286 Widget_Data *wd = elm_widget_data_get(obj);
287 if (!wd) return NULL;
289 return elm_editfield_entry_get(wd->ef);
293 * get the pointer of editfield
295 * @param obj The searchbar object
296 * @return the editfield object
300 EAPI Evas_Object *elm_searchbar_editfield_get(Evas_Object *obj)
302 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
303 Widget_Data *wd = elm_widget_data_get(obj);
304 if (!wd || !wd->ef) return NULL;
310 * set the cancel button animation flag
312 * @param obj The searchbar object
313 * @param cancel_btn_ani_flag The flag of animating cancen button or not
318 EAPI void elm_searchbar_cancel_button_animation_set(Evas_Object *obj, Eina_Bool cancel_btn_ani_flag)
320 ELM_CHECK_WIDTYPE(obj, widtype);
321 Widget_Data *wd = elm_widget_data_get(obj);
324 if (wd->cancel_btn_ani_flag == cancel_btn_ani_flag) return;
325 else wd->cancel_btn_ani_flag = cancel_btn_ani_flag;
329 * set the cancel button show mode
331 * @param obj The searchbar object
332 * @param visible The flag of cancen button show or not
337 EAPI void elm_searchbar_cancel_button_set(Evas_Object *obj, Eina_Bool visible)
339 ELM_CHECK_WIDTYPE(obj, widtype);
340 Widget_Data *wd = elm_widget_data_get(obj);
343 if (wd->cancel_btn_show_mode == visible) return;
344 else wd->cancel_btn_show_mode = visible;
348 if (wd->cancel_btn_ani_flag)
349 edje_object_signal_emit(wd->base, "CANCELOUT", "PROG");
351 edje_object_signal_emit(wd->base, "CANCELHIDE", "PROG");
357 * clear searchbar status
359 * @param obj The searchbar object
364 EAPI void elm_searchbar_clear(Evas_Object *obj)
366 ELM_CHECK_WIDTYPE(obj, widtype);
367 Widget_Data *wd = elm_widget_data_get(obj);
370 if (wd->cancel_btn_show_mode)
372 if (wd->cancel_btn_ani_flag)
373 edje_object_signal_emit(wd->base, "CANCELOUT", "PROG");
375 edje_object_signal_emit(wd->base, "CANCELHIDE", "PROG");
377 // elm_entry_entry_set(elm_editfield_entry_get(wd->ef), NULL);
381 * set the searchbar boundary rect mode(with bg rect) set
383 * @param obj The searchbar object
384 * @param boundary The present flag of boundary rect or not
389 EAPI void elm_searchbar_boundary_rect_set(Evas_Object *obj, Eina_Bool boundary)
391 ELM_CHECK_WIDTYPE(obj, widtype);
392 Widget_Data *wd = elm_widget_data_get(obj);
395 if (wd->boundary_mode == boundary) return;
396 else wd->boundary_mode = boundary;
398 if (wd->boundary_mode)
400 edje_object_signal_emit(wd->base, "BDSHOW", "PROG");
404 edje_object_signal_emit(wd->base, "BDHIDE", "PROG");