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);
48 _del_hook(Evas_Object *obj)
50 Widget_Data *wd = elm_widget_data_get(obj);
52 if (wd->label) eina_stringshare_del(wd->label);
57 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
59 Widget_Data *wd = elm_widget_data_get(obj);
62 if (!elm_widget_focus_get(obj) && !(elm_widget_disabled_get(obj)) )
64 evas_object_smart_callback_call(obj, "unfocused", NULL);
65 wd->editing = EINA_FALSE;
66 wd->clicked = EINA_FALSE;
67 edje_object_signal_emit(wd->base, "elm,state,over,show", "elm");
69 if (!wd->single_line) // FIXME : if textblock works well, delete
70 edje_object_signal_emit(wd->base, "elm,state,entry,show", "elm"); // FIXME : if textblock works well, delete
72 edje_object_signal_emit(wd->base, "elm,state,eraser,hidden", "elm");
73 if(_empty_entry(wd->entry))
77 edje_object_part_text_set(wd->base, "elm.guidetext", wd->guide_text);
78 edje_object_signal_emit(wd->base, "elm,state,guidetext,visible", "elm");
79 wd->show_guide_text = EINA_TRUE;
86 _theme_hook(Evas_Object *obj)
88 Widget_Data *wd = elm_widget_data_get(obj);
93 _elm_theme_object_set(obj, wd->base, "editfield", "base", elm_widget_style_get(obj));
94 snprintf(buf, sizeof(buf), "editfield/%s", elm_widget_style_get(obj));
95 elm_object_style_set(wd->entry, buf);
96 edje_object_part_swallow(wd->base, "elm.swallow.content", wd->entry);
98 edje_object_signal_emit(wd->base, "elm,state,over,show", "elm");
99 if(wd->show_guide_text)
101 if(_empty_entry(wd->entry))
105 edje_object_part_text_set(wd->base, "elm.guidetext", wd->guide_text);
106 edje_object_signal_emit(wd->base, "elm,state,guidetext,visible", "elm");
111 edje_object_part_swallow(wd->base, "right_icon", wd->ricon);
113 edje_object_part_swallow(wd->base, "left_icon", wd->licon);
118 _changed_hook(Evas_Object *obj)
120 Widget_Data *wd = elm_widget_data_get(obj);
121 if (wd->needs_size_calc)
124 wd->needs_size_calc = EINA_FALSE;
129 _sizing_eval(Evas_Object *obj)
131 Widget_Data *wd = elm_widget_data_get(obj);
132 Evas_Coord minw = -1, minh = -1;
133 edje_object_size_min_calc(wd->base, &minw, &minh);
134 evas_object_size_hint_min_set(obj, minw, minh);
135 evas_object_size_hint_max_set(obj, -1, -1);
139 _request_sizing_eval(Evas_Object *obj)
141 Widget_Data *wd = elm_widget_data_get(obj);
144 if (wd->needs_size_calc)
146 wd->needs_size_calc = EINA_TRUE;
147 evas_object_smart_changed(obj);
151 _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
154 evas_object_size_hint_weight_get(data, &weight_x, NULL);
155 if (weight_x == EVAS_HINT_EXPAND)
156 _request_sizing_eval(data);
160 _show_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
162 Widget_Data *wd = elm_widget_data_get(data);
164 if ((wd->single_line) && (wd->clicked) && (!wd->editing)) // FIXME : single_line is not needed for this conditional state after TEXTBLOCK fixing
166 elm_object_focus(wd->entry);
167 elm_entry_cursor_end_set(wd->entry);
168 wd->editing = EINA_TRUE;
169 wd->clicked = EINA_FALSE;
174 _empty_entry(Evas_Object *entry)
180 text = elm_entry_entry_get(entry);
181 if(!text) return EINA_FALSE;
182 strip_text = elm_entry_markup_to_utf8(text);
184 len = strlen(strip_text);
194 _entry_changed_cb(void *data, Evas_Object *obj, void* event_info __UNUSED__)
196 Evas_Object *ef_obj = (Evas_Object *)data;
197 Widget_Data *wd = elm_widget_data_get(ef_obj);
199 if(!wd || !wd->base) return;
203 if(elm_entry_password_get(wd->entry))
205 edje_object_signal_emit(wd->base, "elm,state,password,set", "elm");
206 edje_object_part_text_set(wd->base, "elm.content.password", elm_entry_entry_get(wd->entry));
210 edje_object_signal_emit(wd->base, "elm,state,password,unset", "elm");
211 edje_object_part_text_set(wd->base, "elm.content.single", elm_entry_entry_get(wd->entry));
214 // else // Add after TEXTBLOCK fix
215 // edje_object_part_text_set(wd->base, "elm.content.multi", elm_entry_entry_get(wd->entry));
217 if(!_empty_entry(wd->entry))
219 if(wd->eraser_show && elm_object_focus_get(obj))
220 edje_object_signal_emit(wd->base, "elm,state,eraser,show", "elm");
223 edje_object_signal_emit(wd->base, "elm,state,guidetext,hidden", "elm");
224 wd->show_guide_text = EINA_FALSE;
230 edje_object_signal_emit(wd->base, "elm,state,eraser,hidden", "elm");
233 if (!wd->editing && wd->single_line)
234 edje_object_signal_emit(wd->base, "elm,state,over,show", "elm");
238 _signal_mouse_clicked(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source)
240 Widget_Data *wd = elm_widget_data_get(data);
241 if(!wd || !wd->base) return;
243 if(!strcmp(source, "eraser"))
245 elm_entry_entry_set(wd->entry, "");
246 edje_object_signal_emit(wd->base, "elm,state,eraser,hidden", "elm");
248 else if(strcmp(source, "left_icon") && strcmp(source, "right_icon") && strcmp(source, "eraser"))
250 edje_object_signal_emit(wd->base, "elm,state,over,hide", "elm");
251 wd->clicked = EINA_TRUE;
253 if ((!wd->single_line) && (!wd->editing)) //FIXME : after fixing TEXTBLOCK, this should be deleted
255 elm_object_focus(wd->entry);
256 elm_entry_cursor_end_set(wd->entry);
257 wd->editing = EINA_TRUE;
260 if(!(_empty_entry(wd->entry)) && (wd->eraser_show))
261 edje_object_signal_emit(wd->base, "elm,state,eraser,show", "elm");
265 edje_object_signal_emit(wd->base, "elm,state,guidetext,hidden", "elm");
266 wd->show_guide_text = EINA_FALSE;
268 evas_object_smart_callback_call(data, "clicked", NULL);
273 _resize_cb(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event __UNUSED__)
275 Widget_Data *wd = elm_widget_data_get(data);
277 if (!wd || !wd->base) return;
278 evas_object_geometry_get(obj, NULL, NULL, NULL, &h);
282 _signal_emit_hook(Evas_Object *obj, const char *emission, const char *source)
284 Widget_Data *wd = elm_widget_data_get(obj);
286 edje_object_signal_emit(wd->base, emission, source);
291 * Add a new editfield object
293 * @param parent The parent object
294 * @return The new object or NULL if it cannot be created
299 elm_editfield_add(Evas_Object *parent)
305 e = evas_object_evas_get(parent);
308 wd = ELM_NEW(Widget_Data);
309 obj = elm_widget_add(e);
310 ELM_SET_WIDTYPE(widtype, "editfield");
311 elm_widget_type_set(obj, "editfield");
312 elm_widget_sub_object_add(parent, obj);
313 elm_widget_data_set(obj, wd);
314 elm_widget_del_hook_set(obj, _del_hook);
315 elm_widget_theme_hook_set(obj, _theme_hook);
316 elm_widget_changed_hook_set(obj, _changed_hook);
317 elm_widget_on_focus_hook_set( obj, _on_focus_hook, NULL );
318 elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
319 elm_widget_can_focus_set(obj, EINA_TRUE);
321 wd->base = edje_object_add(e);
322 _elm_theme_object_set(obj, wd->base, "editfield", "base", "default");
323 elm_widget_resize_object_set(obj, wd->base);
324 edje_object_signal_callback_add(wd->base, "mouse,clicked,1", "*",
325 _signal_mouse_clicked, obj);
326 edje_object_signal_callback_add(wd->base, "clicked", "*",
327 _signal_mouse_clicked, obj);
329 evas_object_event_callback_add(wd->base, EVAS_CALLBACK_RESIZE, _resize_cb, obj);
331 wd->editing = EINA_FALSE;
332 wd->clicked = EINA_FALSE;
333 wd->single_line = EINA_FALSE;
334 wd->eraser_show = EINA_TRUE;
336 wd->entry = elm_entry_add(obj);
337 elm_object_style_set(wd->entry, "editfield");
338 evas_object_size_hint_weight_set(wd->entry, 0, EVAS_HINT_EXPAND);
339 evas_object_size_hint_align_set(wd->entry, 0, EVAS_HINT_FILL);
340 evas_object_event_callback_add(wd->entry, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj);
341 evas_object_event_callback_add(wd->entry, EVAS_CALLBACK_SHOW, _show_cb, obj);
342 edje_object_part_swallow(wd->base, "elm.swallow.content", wd->entry);
343 evas_object_smart_callback_add(wd->entry, "changed", _entry_changed_cb, obj);
344 elm_widget_sub_object_add(obj, wd->entry);
345 evas_object_show(wd->entry);
352 * Set the label of editfield
354 * @param obj The editfield object
355 * @param label The label text
360 elm_editfield_label_set(Evas_Object *obj, const char *label)
362 Widget_Data *wd = elm_widget_data_get(obj);
363 ELM_CHECK_WIDTYPE(obj, widtype);
364 if (!wd || !wd->base)
367 eina_stringshare_del(wd->label);
370 wd->label = eina_stringshare_add(label);
371 edje_object_signal_emit(wd->base, "elm,state,text,visible", "elm");
372 edje_object_signal_emit(wd->base, "elm,state,left,icon,hide", "elm");
377 edje_object_signal_emit(wd->base, "elm,state,text,hidden", "elm");
378 edje_object_signal_emit(wd->base, "elm,state,left,icon,show", "elm");
380 edje_object_message_signal_process(wd->base);
381 edje_object_part_text_set(wd->base, "elm.text", label);
386 * Get the label used on the editfield object
388 * @param obj The editfield object
394 elm_editfield_label_get(Evas_Object *obj)
396 Widget_Data *wd = elm_widget_data_get(obj);
397 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
398 if (!wd || !wd->base)
404 * Set the guidance text used on the editfield object
406 * @param obj The editfield object
412 elm_editfield_guide_text_set(Evas_Object *obj, const char *text)
414 Widget_Data *wd = elm_widget_data_get(obj);
415 ELM_CHECK_WIDTYPE(obj, widtype);
416 if (!wd || !wd->base)
419 eina_stringshare_del(wd->guide_text);
422 wd->guide_text = eina_stringshare_add(text);
423 edje_object_part_text_set(wd->base, "elm.guidetext", wd->guide_text);
424 wd->show_guide_text = EINA_TRUE;
427 wd->guide_text = NULL;
431 * Get the guidance text used on the editfield object
433 * @param obj The editfield object
439 elm_editfield_guide_text_get(Evas_Object *obj)
441 Widget_Data *wd = elm_widget_data_get(obj);
442 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
443 if (!wd || !wd->base)
445 return wd->guide_text;
449 * Get the entry of the editfield object
451 * @param obj The editfield object
452 * @return entry object
458 elm_editfield_entry_get(Evas_Object *obj)
460 Widget_Data *wd = elm_widget_data_get(obj);
461 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
468 * Set the left side icon.
470 * @param obj The editfield object
471 * @param icon The icon object
476 elm_editfield_left_icon_set(Evas_Object *obj, Evas_Object *icon)
478 Widget_Data *wd = elm_widget_data_get(obj);
479 ELM_CHECK_WIDTYPE(obj, widtype) ;
480 if (!wd || !wd->base || !icon)
482 if ((wd->licon != icon) && (wd->licon))
483 elm_widget_sub_object_del(obj, wd->licon);
486 if (!(edje_object_part_swallow(wd->base, "left_icon", icon)))
489 elm_widget_sub_object_add(obj, icon);
490 evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
491 _changed_size_hints, obj);
492 edje_object_signal_emit(wd->base, "elm,state,left,icon,show", "elm");
493 edje_object_signal_emit(wd->base, "elm,state,text,hidden", "elm");
500 * Get the left side icon
502 * @param obj The editfield object
503 * @return icon object
508 elm_editfield_left_icon_get(Evas_Object *obj)
510 Widget_Data *wd = elm_widget_data_get(obj);
511 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
512 if (!wd || !wd->base || !wd->licon)
518 * Set the right side icon.
520 * @param obj The editfield object
521 * @param icon The icon object
526 elm_editfield_right_icon_set(Evas_Object *obj, Evas_Object *icon)
528 Widget_Data *wd = elm_widget_data_get(obj);
529 ELM_CHECK_WIDTYPE(obj, widtype) ;
530 if (!wd || !wd->base || !icon)
532 if ((wd->ricon != icon) && (wd->ricon))
533 elm_widget_sub_object_del(obj, wd->ricon);
536 if ( !(edje_object_part_swallow(wd->base, "right_icon", icon)) )
539 elm_widget_sub_object_add(obj, icon);
540 evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
541 _changed_size_hints, obj);
542 edje_object_signal_emit(wd->base, "elm,state,right,icon,show", "elm");
549 * Get the right side icon
551 * @param obj The editfield object
552 * @return icon object
557 elm_editfield_right_icon_get(Evas_Object *obj)
559 Widget_Data *wd = elm_widget_data_get(obj);
560 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
561 if (!wd || !wd->base || !wd->ricon)
567 * Set entry object style as single-line or multi-line.
569 * @param obj The editfield object
570 * @param single_line 1 if single-line , 0 if multi-line
575 elm_editfield_entry_single_line_set(Evas_Object *obj, Eina_Bool single_line)
577 Widget_Data *wd = elm_widget_data_get(obj);
578 ELM_CHECK_WIDTYPE(obj, widtype);
579 if (!wd || !wd->base || wd->single_line == single_line)
581 wd->single_line = !!single_line;
582 elm_entry_single_line_set(wd->entry, single_line);
585 elm_entry_scrollable_set(wd->entry, EINA_TRUE);
586 elm_entry_single_line_set(wd->entry,EINA_TRUE);
587 edje_object_signal_emit(wd->base, "elm,state,text,singleline", "elm");
591 elm_entry_scrollable_set(wd->entry, EINA_FALSE);
592 elm_entry_single_line_set(wd->entry,EINA_FALSE);
593 edje_object_signal_emit(wd->base, "elm,state,text,multiline", "elm");
596 edje_object_signal_emit(wd->base, "elm,state,over,show", "elm");
600 * Get the current entry object style(single-line or multi-line)
602 * @param obj The editfield object
603 * @return 1 if single-line , 0 if multi-line
608 elm_editfield_entry_single_line_get(Evas_Object *obj)
610 Widget_Data *wd = elm_widget_data_get(obj);
611 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
612 if (!wd || !wd->base)
614 return wd->single_line;
618 * Set enable user to clean all of text.
620 * @param obj The editfield object
621 * @param visible If true, the eraser is visible and user can clean all of text by using eraser.
622 * If false, the eraser is invisible.
627 elm_editfield_eraser_set(Evas_Object *obj, Eina_Bool visible)
629 Widget_Data *wd = elm_widget_data_get(obj);
630 ELM_CHECK_WIDTYPE(obj, widtype);
631 if (!wd || !wd->base)
634 wd->eraser_show = !!visible;
637 edje_object_signal_emit(wd->base, "elm,state,eraser,hidden", "elm");
643 * Get the current state of erase (visible/invisible)
645 * @param obj The editfield object
646 * @return 1 if visible, 0 if invisible
651 elm_editfield_eraser_get(Evas_Object *obj)
653 Widget_Data *wd = elm_widget_data_get(obj);
654 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
655 if (!wd || !wd->base)
657 return wd->eraser_show;
660 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/