1 #include <Elementary.h>
5 * @defgroup Editfield Editfield
8 * This is a editfield. It can contain a simple label and icon objects.
10 * Smart callbacks that you can add are:
12 * clicked - This signal is emitted when an editfield is clicked.
14 * unfocused - This signal is emitted when an editfield is unfocused.
18 //#define ERASER_PADDING (10)
20 typedef struct _Widget_Data Widget_Data;
29 const char *guide_text;
30 Eina_Bool needs_size_calc:1;
31 Eina_Bool show_guide_text:1;
33 Eina_Bool single_line:1;
34 Eina_Bool eraser_show:1;
37 static const char *widtype = NULL;
38 static void _del_hook(Evas_Object *obj);
39 static void _theme_hook(Evas_Object *obj);
40 static void _sizing_eval(Evas_Object *obj);
41 static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
42 static void _on_focus_hook(void *data, Evas_Object *obj);
43 static Eina_Bool _empty_entry(Evas_Object *entry);
46 _del_hook(Evas_Object *obj)
48 Widget_Data *wd = elm_widget_data_get(obj);
50 if (wd->label) eina_stringshare_del(wd->label);
55 _on_focus_hook(void *data, Evas_Object *obj)
57 Widget_Data *wd = elm_widget_data_get(obj);
60 if (!elm_widget_focus_get(obj) && !(elm_widget_disabled_get(obj)) )
62 evas_object_smart_callback_call(obj, "unfocused", NULL);
63 wd->editing = EINA_FALSE;
64 edje_object_signal_emit(wd->base, "elm,state,over,show", "elm");
65 edje_object_signal_emit(wd->base, "elm,state,eraser,hidden", "elm");
66 if(_empty_entry(wd->entry))
70 edje_object_part_text_set(wd->base, "elm.guidetext", wd->guide_text);
71 edje_object_signal_emit(wd->base, "elm,state,guidetext,visible", "elm");
72 wd->show_guide_text = EINA_TRUE;
79 _theme_hook(Evas_Object *obj)
81 Widget_Data *wd = elm_widget_data_get(obj);
84 _elm_theme_object_set(obj, wd->base, "editfield", "base", elm_widget_style_get(obj));
85 edje_object_part_swallow(wd->base, "elm.swallow.content", wd->entry);
87 edje_object_signal_emit(wd->base, "elm,state,over,show", "elm");
88 if(wd->show_guide_text)
90 if(_empty_entry(wd->entry))
94 edje_object_part_text_set(wd->base, "elm.guidetext", wd->guide_text);
95 edje_object_signal_emit(wd->base, "elm,state,guidetext,visible", "elm");
100 edje_object_part_swallow(wd->base, "right_icon", wd->ricon);
102 edje_object_part_swallow(wd->base, "left_icon", wd->licon);
107 _changed_hook(Evas_Object *obj)
109 Widget_Data *wd = elm_widget_data_get(obj);
110 if (wd->needs_size_calc)
113 wd->needs_size_calc = EINA_FALSE;
118 _sizing_eval(Evas_Object *obj)
120 Widget_Data *wd = elm_widget_data_get(obj);
121 Evas_Coord minw = -1, minh = -1;
122 edje_object_size_min_calc(wd->base, &minw, &minh);
123 evas_object_size_hint_min_set(obj, minw, minh);
124 evas_object_size_hint_max_set(obj, -1, -1);
128 _request_sizing_eval(Evas_Object *obj)
130 Widget_Data *wd = elm_widget_data_get(obj);
133 if (wd->needs_size_calc)
135 wd->needs_size_calc = EINA_TRUE;
136 evas_object_smart_changed(obj);
140 _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info)
143 evas_object_size_hint_weight_get(data, &weight_x, NULL);
144 if (weight_x == EVAS_HINT_EXPAND)
145 _request_sizing_eval(data);
149 _empty_entry(Evas_Object *entry)
155 text = elm_entry_entry_get(entry);
156 if(!text) return EINA_FALSE;
157 strip_text = elm_entry_markup_to_utf8(text);
159 len = strlen(strip_text);
169 _entry_changed_cb(void *data, Evas_Object *obj, void* event_info)
171 Evas_Object *ef_obj = (Evas_Object *)data;
172 Widget_Data *wd = elm_widget_data_get(ef_obj);
174 if(!wd || !wd->base) return;
177 if(elm_entry_password_get(wd->entry))
179 edje_object_signal_emit(wd->base, "elm,state,password,set", "elm");
180 edje_object_part_text_set(wd->base, "elm.content.password", elm_entry_entry_get(wd->entry));
184 edje_object_signal_emit(wd->base, "elm,state,password,unset", "elm");
185 edje_object_part_text_set(wd->base, "elm.content.text", elm_entry_entry_get(wd->entry));
188 if(!_empty_entry(wd->entry))
190 if(wd->eraser_show && elm_object_focus_get(obj))
191 edje_object_signal_emit(wd->base, "elm,state,eraser,show", "elm");
194 edje_object_signal_emit(wd->base, "elm,state,guidetext,hidden", "elm");
195 wd->show_guide_text = EINA_FALSE;
201 edje_object_signal_emit(wd->base, "elm,state,eraser,hidden", "elm");
206 _signal_mouse_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
208 Widget_Data *wd = elm_widget_data_get(data);
209 if(!wd || !wd->base) return;
211 if(!strcmp(source, "eraser"))
213 elm_entry_entry_set(wd->entry, "");
214 edje_object_signal_emit(wd->base, "elm,state,eraser,hidden", "elm");
216 else if(strcmp(source, "left_icon") && strcmp(source, "right_icon") && strcmp(source, "eraser"))
218 edje_object_signal_emit(wd->base, "elm,state,over,hide", "elm");
220 elm_object_focus(wd->entry);
222 if(wd->editing == EINA_FALSE)
223 elm_entry_cursor_end_set(wd->entry);
225 if(!(_empty_entry(wd->entry)) && (wd->eraser_show))
226 edje_object_signal_emit(wd->base, "elm,state,eraser,show", "elm");
230 edje_object_signal_emit(wd->base, "elm,state,guidetext,hidden", "elm");
231 wd->show_guide_text = EINA_FALSE;
233 evas_object_smart_callback_call(data, "clicked", NULL);
234 wd->editing = EINA_TRUE;
239 _resize_cb(void *data, Evas *evas, Evas_Object *obj, void *event)
241 Widget_Data *wd = elm_widget_data_get(data);
243 if (!wd || !wd->base) return;
244 evas_object_geometry_get(obj, NULL, NULL, NULL, &h);
248 _signal_emit_hook(Evas_Object *obj, const char *emission, const char *source)
250 Widget_Data *wd = elm_widget_data_get(obj);
252 edje_object_signal_emit(wd->base, emission, source);
257 * Add a new editfield object
259 * @param parent The parent object
260 * @return The new object or NULL if it cannot be created
265 elm_editfield_add(Evas_Object *parent)
271 e = evas_object_evas_get(parent);
274 wd = ELM_NEW(Widget_Data);
275 obj = elm_widget_add(e);
276 ELM_SET_WIDTYPE(widtype, "editfield");
277 elm_widget_type_set(obj, "editfield");
278 elm_widget_sub_object_add(parent, obj);
279 elm_widget_data_set(obj, wd);
280 elm_widget_del_hook_set(obj, _del_hook);
281 elm_widget_theme_hook_set(obj, _theme_hook);
282 elm_widget_changed_hook_set(obj, _changed_hook);
283 elm_widget_on_focus_hook_set( obj, _on_focus_hook, NULL );
284 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
285 elm_widget_can_focus_set(obj, EINA_TRUE);
287 wd->base = edje_object_add(e);
288 _elm_theme_object_set(obj, wd->base, "editfield", "base", "default");
289 elm_widget_resize_object_set(obj, wd->base);
290 edje_object_signal_callback_add(wd->base, "mouse,clicked,1", "*",
291 _signal_mouse_clicked, obj);
292 edje_object_signal_callback_add(wd->base, "clicked", "*",
293 _signal_mouse_clicked, obj);
295 evas_object_event_callback_add(wd->base, EVAS_CALLBACK_RESIZE, _resize_cb, obj);
297 wd->editing = EINA_FALSE;
298 wd->single_line = EINA_FALSE;
299 wd->eraser_show = EINA_TRUE;
301 wd->entry = elm_entry_add(obj);
302 elm_object_style_set(wd->entry, "editfield");
303 evas_object_size_hint_weight_set(wd->entry, 0, EVAS_HINT_EXPAND);
304 evas_object_size_hint_align_set(wd->entry, 0, EVAS_HINT_FILL);
305 evas_object_event_callback_add(wd->entry,
306 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
307 _changed_size_hints, obj);
308 edje_object_part_swallow(wd->base, "elm.swallow.content", wd->entry);
309 evas_object_smart_callback_add(wd->entry, "changed", _entry_changed_cb, obj);
310 elm_widget_sub_object_add(obj, wd->entry);
311 evas_object_show(wd->entry);
318 * Set the label of editfield
320 * @param obj The editfield object
321 * @param label The label text
326 elm_editfield_label_set(Evas_Object *obj, const char *label)
328 Widget_Data *wd = elm_widget_data_get(obj);
329 ELM_CHECK_WIDTYPE(obj, widtype);
330 if (!wd || !wd->base)
333 eina_stringshare_del(wd->label);
336 wd->label = eina_stringshare_add(label);
337 edje_object_signal_emit(wd->base, "elm,state,text,visible", "elm");
338 edje_object_signal_emit(wd->base, "elm,state,left,icon,hide", "elm");
343 edje_object_signal_emit(wd->base, "elm,state,text,hidden", "elm");
344 edje_object_signal_emit(wd->base, "elm,state,left,icon,show", "elm");
346 edje_object_message_signal_process(wd->base);
347 edje_object_part_text_set(wd->base, "elm.text", label);
352 * Get the label used on the editfield object
354 * @param obj The editfield object
360 elm_editfield_label_get(Evas_Object *obj)
362 Widget_Data *wd = elm_widget_data_get(obj);
363 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
364 if (!wd || !wd->base)
370 * Set the guidance text used on the editfield object
372 * @param obj The editfield object
378 elm_editfield_guide_text_set(Evas_Object *obj, const char *text)
380 Widget_Data *wd = elm_widget_data_get(obj);
381 ELM_CHECK_WIDTYPE(obj, widtype);
382 if (!wd || !wd->base)
385 eina_stringshare_del(wd->guide_text);
388 wd->guide_text = eina_stringshare_add(text);
389 edje_object_part_text_set(wd->base, "elm.guidetext", wd->guide_text);
390 wd->show_guide_text = EINA_TRUE;
393 wd->guide_text = NULL;
397 * Get the guidance text used on the editfield object
399 * @param obj The editfield object
405 elm_editfield_guide_text_get(Evas_Object *obj)
407 Widget_Data *wd = elm_widget_data_get(obj);
408 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
409 if (!wd || !wd->base)
411 return wd->guide_text;
415 * Get the entry of the editfield object
417 * @param obj The editfield object
418 * @return entry object
424 elm_editfield_entry_get(Evas_Object *obj)
426 Widget_Data *wd = elm_widget_data_get(obj);
427 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
434 * Set the left side icon.
436 * @param obj The editfield object
437 * @param icon The icon object
442 elm_editfield_left_icon_set(Evas_Object *obj, Evas_Object *icon)
444 Widget_Data *wd = elm_widget_data_get(obj);
445 ELM_CHECK_WIDTYPE(obj, widtype) ;
446 if (!wd || !wd->base || !icon)
448 if ((wd->licon != icon) && (wd->licon))
449 elm_widget_sub_object_del(obj, wd->licon);
452 if (!(edje_object_part_swallow(wd->base, "left_icon", icon)))
455 elm_widget_sub_object_add(obj, icon);
456 evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
457 _changed_size_hints, obj);
458 edje_object_signal_emit(wd->base, "elm,state,left,icon,show", "elm");
459 edje_object_signal_emit(wd->base, "elm,state,text,hidden", "elm");
466 * Get the left side icon
468 * @param obj The editfield object
469 * @return icon object
474 elm_editfield_left_icon_get(Evas_Object *obj)
476 Widget_Data *wd = elm_widget_data_get(obj);
477 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
478 if (!wd || !wd->base || !wd->licon)
484 * Set the right side icon.
486 * @param obj The editfield object
487 * @param icon The icon object
492 elm_editfield_right_icon_set(Evas_Object *obj, Evas_Object *icon)
494 Widget_Data *wd = elm_widget_data_get(obj);
495 ELM_CHECK_WIDTYPE(obj, widtype) ;
496 if (!wd || !wd->base || !icon)
498 if ((wd->ricon != icon) && (wd->ricon))
499 elm_widget_sub_object_del(obj, wd->ricon);
502 if ( !(edje_object_part_swallow(wd->base, "right_icon", icon)) )
505 elm_widget_sub_object_add(obj, icon);
506 evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
507 _changed_size_hints, obj);
508 edje_object_signal_emit(wd->base, "elm,state,right,icon,show", "elm");
515 * Get the right side icon
517 * @param obj The editfield object
518 * @return icon object
523 elm_editfield_right_icon_get(Evas_Object *obj)
525 Widget_Data *wd = elm_widget_data_get(obj);
526 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
527 if (!wd || !wd->base || !wd->ricon)
533 * Set entry object style as single-line or multi-line.
535 * @param obj The editfield object
536 * @param single_line 1 if single-line , 0 if multi-line
541 elm_editfield_entry_single_line_set(Evas_Object *obj, Eina_Bool single_line)
543 Widget_Data *wd = elm_widget_data_get(obj);
545 ELM_CHECK_WIDTYPE(obj, widtype);
546 if (!wd || !wd->base || wd->single_line == single_line)
548 wd->single_line = !!single_line;
549 elm_entry_single_line_set(wd->entry, single_line);
552 elm_entry_scrollable_set(wd->entry, EINA_TRUE);
553 elm_entry_single_line_set(wd->entry,EINA_TRUE);
554 edje_object_signal_emit(wd->base, "elm,state,text,singleline", "elm");
558 elm_entry_scrollable_set(wd->entry, EINA_FALSE);
559 elm_entry_single_line_set(wd->entry,EINA_FALSE);
560 edje_object_signal_emit(wd->base, "elm,state,text,multiline", "elm");
565 * Get the current entry object style(single-line or multi-line)
567 * @param obj The editfield object
568 * @return 1 if single-line , 0 if multi-line
573 elm_editfield_entry_single_line_get(Evas_Object *obj)
575 Widget_Data *wd = elm_widget_data_get(obj);
576 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
577 if (!wd || !wd->base)
579 return wd->single_line;
583 * Set enable user to clean all of text.
585 * @param obj The editfield object
586 * @param visible If true, the eraser is visible and user can clean all of text by using eraser.
587 * If false, the eraser is invisible.
592 elm_editfield_eraser_set(Evas_Object *obj, Eina_Bool visible)
594 Widget_Data *wd = elm_widget_data_get(obj);
595 ELM_CHECK_WIDTYPE(obj, widtype);
596 if (!wd || !wd->base)
599 wd->eraser_show = visible;
602 edje_object_signal_emit(wd->base, "elm,state,eraser,hidden", "elm");
608 * Get the current state of erase (visible/invisible)
610 * @param obj The editfield object
611 * @return 1 if visible, 0 if invisible
616 elm_editfield_eraser_get(Evas_Object *obj)
618 Widget_Data *wd = elm_widget_data_get(obj);
619 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
620 if (!wd || !wd->base)
622 return wd->eraser_show;
625 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/