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;
34 Eina_Bool single_line:1;
35 Eina_Bool eraser_show:1;
38 static const char *widtype = NULL;
39 static void _del_hook(Evas_Object *obj);
40 static void _theme_hook(Evas_Object *obj);
41 static void _sizing_eval(Evas_Object *obj);
42 static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
43 static void _show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
44 static void _on_focus_hook(void *data, Evas_Object *obj);
45 static Eina_Bool _empty_entry(Evas_Object *entry);
47 static const char SIG_FOCUSED[] = "focused";
49 static const Evas_Smart_Cb_Description _signals[] = {
55 _del_hook(Evas_Object *obj)
57 Widget_Data *wd = elm_widget_data_get(obj);
59 if (wd->label) eina_stringshare_del(wd->label);
64 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
66 Widget_Data *wd = elm_widget_data_get(obj);
69 if (!elm_widget_focus_get(obj))
71 evas_object_smart_callback_call(obj, "unfocused", NULL);
72 wd->editing = EINA_FALSE;
73 wd->clicked = EINA_FALSE;
74 edje_object_signal_emit(wd->base, "elm,state,over,show", "elm");
76 if (!wd->single_line) // FIXME : if textblock works well, delete
77 edje_object_signal_emit(wd->base, "elm,state,entry,show", "elm"); // FIXME : if textblock works well, delete
79 edje_object_signal_emit(wd->base, "elm,state,eraser,hidden", "elm");
80 if(_empty_entry(wd->entry))
84 edje_object_part_text_set(wd->base, "elm.guidetext", wd->guide_text);
85 edje_object_signal_emit(wd->base, "elm,state,guidetext,visible", "elm");
86 wd->show_guide_text = EINA_TRUE;
92 evas_object_smart_callback_call(obj, SIG_FOCUSED, NULL);
97 _theme_hook(Evas_Object *obj)
99 Widget_Data *wd = elm_widget_data_get(obj);
101 if (!wd || !wd->base)
104 _elm_theme_object_set(obj, wd->base, "editfield", "base", elm_widget_style_get(obj));
105 snprintf(buf, sizeof(buf), "editfield/%s", elm_widget_style_get(obj));
106 elm_object_style_set(wd->entry, buf);
107 edje_object_part_swallow(wd->base, "elm.swallow.content", wd->entry);
109 edje_object_signal_emit(wd->base, "elm,state,over,show", "elm");
111 edje_object_signal_emit(wd->base, "elm,state,text,singleline", "elm");
113 edje_object_signal_emit(wd->base, "elm,state,text,multiline", "elm");
114 if(wd->show_guide_text)
116 if(_empty_entry(wd->entry))
120 edje_object_part_text_set(wd->base, "elm.guidetext", wd->guide_text);
121 edje_object_signal_emit(wd->base, "elm,state,guidetext,visible", "elm");
126 edje_object_part_swallow(wd->base, "right_icon", wd->ricon);
128 edje_object_part_swallow(wd->base, "left_icon", wd->licon);
133 _changed_hook(Evas_Object *obj)
135 Widget_Data *wd = elm_widget_data_get(obj);
136 if (wd->needs_size_calc)
139 wd->needs_size_calc = EINA_FALSE;
144 _sizing_eval(Evas_Object *obj)
146 Widget_Data *wd = elm_widget_data_get(obj);
147 Evas_Coord minw = -1, minh = -1;
148 edje_object_size_min_calc(wd->base, &minw, &minh);
149 evas_object_size_hint_min_set(obj, minw, minh);
150 evas_object_size_hint_max_set(obj, -1, -1);
154 _request_sizing_eval(Evas_Object *obj)
156 Widget_Data *wd = elm_widget_data_get(obj);
159 if (wd->needs_size_calc)
161 wd->needs_size_calc = EINA_TRUE;
162 evas_object_smart_changed(obj);
166 _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
169 evas_object_size_hint_weight_get(data, &weight_x, NULL);
170 if (weight_x == EVAS_HINT_EXPAND)
171 _request_sizing_eval(data);
175 _show_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
177 Widget_Data *wd = elm_widget_data_get(data);
179 if ((wd->single_line) && (wd->clicked) && (!wd->editing)) // FIXME : single_line is not needed for this conditional state after TEXTBLOCK fixing
181 elm_object_focus(wd->entry);
182 elm_entry_cursor_end_set(wd->entry);
183 wd->editing = EINA_TRUE;
184 wd->clicked = EINA_FALSE;
189 _empty_entry(Evas_Object *entry)
195 text = elm_entry_entry_get(entry);
196 if(!text) return EINA_TRUE;
197 strip_text = elm_entry_markup_to_utf8(text);
199 len = strlen(strip_text);
209 _entry_changed_cb(void *data, Evas_Object *obj, void* event_info __UNUSED__)
211 Evas_Object *ef_obj = (Evas_Object *)data;
212 Widget_Data *wd = elm_widget_data_get(ef_obj);
214 if(!wd || !wd->base) return;
218 if(elm_entry_password_get(wd->entry))
220 edje_object_signal_emit(wd->base, "elm,state,password,set", "elm");
221 edje_object_part_text_set(wd->base, "elm.content.password", elm_entry_entry_get(wd->entry));
225 edje_object_signal_emit(wd->base, "elm,state,password,unset", "elm");
226 edje_object_part_text_set(wd->base, "elm.content.single", elm_entry_entry_get(wd->entry));
229 // else // Add after TEXTBLOCK fix
230 // edje_object_part_text_set(wd->base, "elm.content.multi", elm_entry_entry_get(wd->entry));
232 if(!_empty_entry(wd->entry))
234 if(wd->eraser_show && elm_object_focus_get(obj))
235 edje_object_signal_emit(wd->base, "elm,state,eraser,show", "elm");
238 edje_object_signal_emit(wd->base, "elm,state,guidetext,hidden", "elm");
239 wd->show_guide_text = EINA_FALSE;
245 edje_object_signal_emit(wd->base, "elm,state,eraser,hidden", "elm");
248 if (!wd->editing && wd->single_line)
249 edje_object_signal_emit(wd->base, "elm,state,over,show", "elm");
253 _signal_mouse_clicked(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source)
255 Widget_Data *wd = elm_widget_data_get(data);
256 if(!wd || !wd->base) return;
258 if(!strcmp(source, "eraser"))
260 elm_entry_entry_set(wd->entry, "");
261 edje_object_signal_emit(wd->base, "elm,state,eraser,hidden", "elm");
263 else if(strcmp(source, "left_icon") && strcmp(source, "right_icon") && strcmp(source, "eraser"))
265 edje_object_signal_emit(wd->base, "elm,state,over,hide", "elm");
266 wd->clicked = EINA_TRUE;
268 if ((!wd->single_line) && (!wd->editing)) //FIXME : after fixing TEXTBLOCK, this should be deleted
270 elm_object_focus(wd->entry);
271 elm_entry_cursor_end_set(wd->entry);
272 wd->editing = EINA_TRUE;
275 if(!(_empty_entry(wd->entry)) && (wd->eraser_show))
276 edje_object_signal_emit(wd->base, "elm,state,eraser,show", "elm");
280 edje_object_signal_emit(wd->base, "elm,state,guidetext,hidden", "elm");
281 wd->show_guide_text = EINA_FALSE;
283 evas_object_smart_callback_call(data, "clicked", NULL);
288 _resize_cb(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event __UNUSED__)
290 Widget_Data *wd = elm_widget_data_get(data);
292 if (!wd || !wd->base) return;
293 evas_object_geometry_get(obj, NULL, NULL, NULL, &h);
297 _signal_emit_hook(Evas_Object *obj, const char *emission, const char *source)
299 Widget_Data *wd = elm_widget_data_get(obj);
301 edje_object_signal_emit(wd->base, emission, source);
306 * Add a new editfield object
308 * @param parent The parent object
309 * @return The new object or NULL if it cannot be created
314 elm_editfield_add(Evas_Object *parent)
320 e = evas_object_evas_get(parent);
323 wd = ELM_NEW(Widget_Data);
324 obj = elm_widget_add(e);
325 ELM_SET_WIDTYPE(widtype, "editfield");
326 elm_widget_type_set(obj, "editfield");
327 elm_widget_sub_object_add(parent, obj);
328 elm_widget_data_set(obj, wd);
329 elm_widget_del_hook_set(obj, _del_hook);
330 elm_widget_theme_hook_set(obj, _theme_hook);
331 elm_widget_changed_hook_set(obj, _changed_hook);
332 elm_widget_on_focus_hook_set( obj, _on_focus_hook, NULL );
333 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
334 elm_widget_can_focus_set(obj, EINA_TRUE);
336 wd->base = edje_object_add(e);
337 _elm_theme_object_set(obj, wd->base, "editfield", "base", "default");
338 elm_widget_resize_object_set(obj, wd->base);
339 edje_object_signal_callback_add(wd->base, "mouse,clicked,1", "*",
340 _signal_mouse_clicked, obj);
341 edje_object_signal_callback_add(wd->base, "clicked", "*",
342 _signal_mouse_clicked, obj);
344 evas_object_event_callback_add(wd->base, EVAS_CALLBACK_RESIZE, _resize_cb, obj);
346 wd->editing = EINA_FALSE;
347 wd->clicked = EINA_FALSE;
348 wd->single_line = EINA_FALSE;
349 wd->eraser_show = EINA_TRUE;
351 wd->entry = elm_entry_add(obj);
352 elm_object_style_set(wd->entry, "editfield");
353 evas_object_size_hint_weight_set(wd->entry, 0, EVAS_HINT_EXPAND);
354 evas_object_size_hint_align_set(wd->entry, 0, EVAS_HINT_FILL);
355 evas_object_event_callback_add(wd->entry, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj);
356 evas_object_event_callback_add(wd->entry, EVAS_CALLBACK_SHOW, _show_cb, obj);
357 edje_object_part_swallow(wd->base, "elm.swallow.content", wd->entry);
358 evas_object_smart_callback_add(wd->entry, "changed", _entry_changed_cb, obj);
359 elm_widget_sub_object_add(obj, wd->entry);
360 evas_object_show(wd->entry);
361 evas_object_smart_callbacks_descriptions_set(obj, _signals);
368 * Set the label of editfield
370 * @param obj The editfield object
371 * @param label The label text
376 elm_editfield_label_set(Evas_Object *obj, const char *label)
378 Widget_Data *wd = elm_widget_data_get(obj);
379 ELM_CHECK_WIDTYPE(obj, widtype);
380 if (!wd || !wd->base)
383 eina_stringshare_del(wd->label);
386 wd->label = eina_stringshare_add(label);
387 edje_object_signal_emit(wd->base, "elm,state,text,visible", "elm");
388 edje_object_signal_emit(wd->base, "elm,state,left,icon,hide", "elm");
393 edje_object_signal_emit(wd->base, "elm,state,text,hidden", "elm");
394 edje_object_signal_emit(wd->base, "elm,state,left,icon,show", "elm");
396 edje_object_message_signal_process(wd->base);
397 edje_object_part_text_set(wd->base, "elm.text", label);
402 * Get the label used on the editfield object
404 * @param obj The editfield object
410 elm_editfield_label_get(Evas_Object *obj)
412 Widget_Data *wd = elm_widget_data_get(obj);
413 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
414 if (!wd || !wd->base)
420 * Set the guidance text used on the editfield object
422 * @param obj The editfield object
428 elm_editfield_guide_text_set(Evas_Object *obj, const char *text)
430 Widget_Data *wd = elm_widget_data_get(obj);
431 ELM_CHECK_WIDTYPE(obj, widtype);
432 if (!wd || !wd->base)
435 eina_stringshare_del(wd->guide_text);
438 wd->guide_text = eina_stringshare_add(text);
439 edje_object_part_text_set(wd->base, "elm.guidetext", wd->guide_text);
440 wd->show_guide_text = EINA_TRUE;
443 wd->guide_text = NULL;
447 * Get the guidance text used on the editfield object
449 * @param obj The editfield object
455 elm_editfield_guide_text_get(Evas_Object *obj)
457 Widget_Data *wd = elm_widget_data_get(obj);
458 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
459 if (!wd || !wd->base)
461 return wd->guide_text;
465 * Get the entry of the editfield object
467 * @param obj The editfield object
468 * @return entry object
474 elm_editfield_entry_get(Evas_Object *obj)
476 Widget_Data *wd = elm_widget_data_get(obj);
477 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
484 * Set the left side icon.
486 * @param obj The editfield object
487 * @param icon The icon object
492 elm_editfield_left_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->licon != icon) && (wd->licon))
499 elm_widget_sub_object_del(obj, wd->licon);
502 if (!(edje_object_part_swallow(wd->base, "left_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,left,icon,show", "elm");
509 edje_object_signal_emit(wd->base, "elm,state,text,hidden", "elm");
516 * Get the left side icon
518 * @param obj The editfield object
519 * @return icon object
524 elm_editfield_left_icon_get(Evas_Object *obj)
526 Widget_Data *wd = elm_widget_data_get(obj);
527 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
528 if (!wd || !wd->base || !wd->licon)
534 * Set the right side icon.
536 * @param obj The editfield object
537 * @param icon The icon object
542 elm_editfield_right_icon_set(Evas_Object *obj, Evas_Object *icon)
544 Widget_Data *wd = elm_widget_data_get(obj);
545 ELM_CHECK_WIDTYPE(obj, widtype) ;
546 if (!wd || !wd->base || !icon)
548 if ((wd->ricon != icon) && (wd->ricon))
549 elm_widget_sub_object_del(obj, wd->ricon);
552 if ( !(edje_object_part_swallow(wd->base, "right_icon", icon)) )
555 elm_widget_sub_object_add(obj, icon);
556 evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
557 _changed_size_hints, obj);
558 edje_object_signal_emit(wd->base, "elm,state,right,icon,show", "elm");
565 * Get the right side icon
567 * @param obj The editfield object
568 * @return icon object
573 elm_editfield_right_icon_get(Evas_Object *obj)
575 Widget_Data *wd = elm_widget_data_get(obj);
576 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
577 if (!wd || !wd->base || !wd->ricon)
583 * Set entry object style as single-line or multi-line.
585 * @param obj The editfield object
586 * @param single_line 1 if single-line , 0 if multi-line
591 elm_editfield_entry_single_line_set(Evas_Object *obj, Eina_Bool single_line)
593 Widget_Data *wd = elm_widget_data_get(obj);
594 ELM_CHECK_WIDTYPE(obj, widtype);
595 if (!wd || !wd->base || wd->single_line == single_line)
597 wd->single_line = !!single_line;
598 elm_entry_single_line_set(wd->entry, single_line);
601 elm_entry_scrollable_set(wd->entry, EINA_TRUE);
602 elm_entry_single_line_set(wd->entry,EINA_TRUE);
603 edje_object_signal_emit(wd->base, "elm,state,text,singleline", "elm");
607 elm_entry_scrollable_set(wd->entry, EINA_FALSE);
608 elm_entry_single_line_set(wd->entry,EINA_FALSE);
609 edje_object_signal_emit(wd->base, "elm,state,text,multiline", "elm");
612 edje_object_signal_emit(wd->base, "elm,state,over,show", "elm");
616 * Get the current entry object style(single-line or multi-line)
618 * @param obj The editfield object
619 * @return 1 if single-line , 0 if multi-line
624 elm_editfield_entry_single_line_get(Evas_Object *obj)
626 Widget_Data *wd = elm_widget_data_get(obj);
627 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
628 if (!wd || !wd->base)
630 return wd->single_line;
634 * Set enable user to clean all of text.
636 * @param obj The editfield object
637 * @param visible If true, the eraser is visible and user can clean all of text by using eraser.
638 * If false, the eraser is invisible.
643 elm_editfield_eraser_set(Evas_Object *obj, Eina_Bool visible)
645 Widget_Data *wd = elm_widget_data_get(obj);
646 ELM_CHECK_WIDTYPE(obj, widtype);
647 if (!wd || !wd->base)
650 wd->eraser_show = !!visible;
653 edje_object_signal_emit(wd->base, "elm,state,eraser,hidden", "elm");
659 * Get the current state of erase (visible/invisible)
661 * @param obj The editfield object
662 * @return 1 if visible, 0 if invisible
667 elm_editfield_eraser_get(Evas_Object *obj)
669 Widget_Data *wd = elm_widget_data_get(obj);
670 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
671 if (!wd || !wd->base)
673 return wd->eraser_show;
676 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/