f958bbe01c78ce3f165fcff8d68df1fe3d3208be
[platform/core/uifw/efl-assist.git] / src / lib / efl_assist_editfield.c
1 #include "efl_assist.h"
2 #include "efl_assist_private.h"
3
4 const char *EA_EF_KEY_DATA = "_ea_ef_key_data";
5
6 typedef struct _Ea_Editfield_Data
7 {
8    Eina_Bool clear_btn_disabled;
9 } Ea_Editfield_Data;
10
11 static void _editfield_changed_cb(void *data, Evas_Object *obj, void *event_info)
12 {
13    Ea_Editfield_Data *eed;
14
15    eed = (Ea_Editfield_Data *)evas_object_data_get(obj, EA_EF_KEY_DATA);
16    if (eed && !(eed->clear_btn_disabled)
17        && elm_object_part_content_get(obj, "elm.swallow.clear"))
18      {
19         if (elm_object_focus_get(obj))
20           {
21              if (elm_entry_is_empty(obj))
22                elm_object_signal_emit(obj, "elm,state,clear,hidden", "");
23              else
24                elm_object_signal_emit(obj, "elm,state,clear,visible", "");
25           }
26      }
27 }
28
29 static void _editfield_focused_cb(void *data, Evas_Object *obj, void *event_info)
30 {
31    Ea_Editfield_Data *eed;
32
33    eed = (Ea_Editfield_Data *)evas_object_data_get(obj, EA_EF_KEY_DATA);
34    if (eed && !(eed->clear_btn_disabled)
35        && elm_object_part_content_get(obj, "elm.swallow.clear"))
36      {
37         if (!elm_entry_is_empty(obj))
38           elm_object_signal_emit(obj, "elm,state,clear,visible", "");
39         else
40           elm_object_signal_emit(obj, "elm,state,clear,hidden", "");
41      }
42    elm_object_signal_emit(obj, "elm,state,focus,on", "");
43 }
44
45 static void _editfield_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
46 {
47    Ea_Editfield_Data *eed;
48
49    eed = (Ea_Editfield_Data *)evas_object_data_get(obj, EA_EF_KEY_DATA);
50    if (eed && !(eed->clear_btn_disabled)
51        && elm_object_part_content_get(obj, "elm.swallow.clear"))
52      elm_object_signal_emit(obj, "elm,state,clear,hidden", "");
53    elm_object_signal_emit(obj, "elm,state,focus,off", "");
54 }
55
56 static void _eraser_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
57 {
58    elm_entry_entry_set(data, "");
59 }
60
61 static void _editfield_searchbar_changed_cb(void *data, Evas_Object *obj, void *event_info)
62 {
63    Ea_Editfield_Data *eed;
64
65    eed = (Ea_Editfield_Data *)evas_object_data_get(obj, EA_EF_KEY_DATA);
66    if (eed && !(eed->clear_btn_disabled)
67        && elm_object_part_content_get(obj, "elm.swallow.clear"))
68      {
69         if (elm_entry_is_empty(obj))
70           elm_object_signal_emit(obj, "elm,state,clear,hidden", "");
71         else
72           elm_object_signal_emit(obj, "elm,state,clear,visible", "");
73      }
74 }
75
76 static void _editfield_searchbar_focused_cb(void *data, Evas_Object *obj, void *event_info)
77 {
78    elm_object_signal_emit(obj, "elm,state,focus,on", "");
79 }
80
81 static void _editfield_searchbar_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
82 {
83    elm_object_signal_emit(obj, "elm,state,focus,off", "");
84 }
85
86 EXPORT_API Evas_Object *
87 ea_editfield_add(Evas_Object *parent, Ea_Editfield_Type type)
88 {
89    Evas_Object *entry, *button;
90    Ea_Editfield_Data *eed;
91
92    entry = elm_entry_add(parent);
93
94    if (type == EA_EDITFIELD_SINGLELINE)
95      {
96         elm_object_style_set(entry, "editfield");
97         elm_entry_single_line_set(entry, EINA_TRUE);
98      }
99    else if (type == EA_EDITFIELD_SCROLL_SINGLELINE)
100      {
101         elm_object_style_set(entry, "editfield");
102         elm_entry_single_line_set(entry, EINA_TRUE);
103         elm_entry_scrollable_set(entry, EINA_TRUE);
104         elm_object_signal_emit(entry, "elm,state,scroll,enabled", "");
105      }
106    else if (type == EA_EDITFIELD_SCROLL_SINGLELINE_PASSWORD)
107      {
108         elm_object_style_set(entry, "editfield");
109         elm_entry_single_line_set(entry, EINA_TRUE);
110         elm_entry_password_set(entry, EINA_TRUE);
111         elm_entry_scrollable_set(entry, EINA_TRUE);
112         elm_object_signal_emit(entry, "elm,state,scroll,enabled", "");
113      }
114    else if (type == EA_EDITFIELD_SCROLL_MULTILINE)
115      {
116         elm_object_style_set(entry, "editfield");
117         elm_entry_scrollable_set(entry, EINA_TRUE);
118         elm_object_signal_emit(entry, "elm,state,scroll,enabled", "");
119      }
120    else if (type == EA_EDITFIELD_SEARCHBAR)
121      {
122         elm_object_style_set(entry, "editfield/searchbar/default");
123         elm_entry_single_line_set(entry, EINA_TRUE);
124         elm_entry_scrollable_set(entry, EINA_TRUE);
125         elm_object_signal_emit(entry, "elm,state,scroll,enabled", "");
126      }
127    else
128      {
129         elm_object_style_set(entry, "editfield");
130      }
131
132    if (type == EA_EDITFIELD_SEARCHBAR)
133      {
134         button = elm_button_add(parent);
135         elm_object_style_set(button, "search_clear");
136         elm_object_focus_allow_set(button, EINA_FALSE);
137         elm_object_part_content_set(entry, "elm.swallow.clear", button);
138         evas_object_smart_callback_add(button, "clicked", _eraser_btn_clicked_cb, entry);
139
140         evas_object_smart_callback_add(entry, "changed", _editfield_searchbar_changed_cb, NULL);
141         evas_object_smart_callback_add(entry, "preedit,changed", _editfield_searchbar_changed_cb, NULL);
142         evas_object_smart_callback_add(entry, "focused", _editfield_searchbar_focused_cb, NULL);
143         evas_object_smart_callback_add(entry, "unfocused", _editfield_searchbar_unfocused_cb, NULL);
144      }
145    else
146      {
147         button = elm_button_add(parent);
148         elm_object_style_set(button, "editfield_clear");
149         elm_object_focus_allow_set(button, EINA_FALSE);
150         elm_object_part_content_set(entry, "elm.swallow.clear", button);
151         evas_object_smart_callback_add(button, "clicked", _eraser_btn_clicked_cb, entry);
152
153         evas_object_smart_callback_add(entry, "changed", _editfield_changed_cb, NULL);
154         evas_object_smart_callback_add(entry, "preedit,changed", _editfield_changed_cb, NULL);
155         evas_object_smart_callback_add(entry, "focused", _editfield_focused_cb, NULL);
156         evas_object_smart_callback_add(entry, "unfocused", _editfield_unfocused_cb, NULL);
157      }
158
159    eed = calloc(1, sizeof(Ea_Editfield_Data));
160    eed->clear_btn_disabled = EINA_FALSE;
161    evas_object_data_set(entry, EA_EF_KEY_DATA, eed);
162    return entry;
163 }
164
165 EXPORT_API void
166 ea_editfield_clear_button_disabled_set(Evas_Object *obj, Eina_Bool disable)
167 {
168    Ea_Editfield_Data *eed;
169
170    eed = evas_object_data_get(obj, EA_EF_KEY_DATA);
171    if (eed)
172      {
173         eed->clear_btn_disabled = !!disable;
174         if (eed->clear_btn_disabled)
175           elm_object_signal_emit(obj, "elm,state,clear,hidden", "");
176      }
177 }
178
179 EXPORT_API Eina_Bool
180 ea_editfield_clear_button_disabled_get(Evas_Object *obj)
181 {
182    Ea_Editfield_Data *eed;
183
184    if (!obj)
185      return EINA_FALSE;
186    eed = evas_object_data_get(obj, EA_EF_KEY_DATA);
187    if (!eed)
188      return EINA_FALSE;
189
190    return eed->clear_btn_disabled;
191 }