[editfield] Set a access info callback for Search bar editfield
[framework/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 static Elm_Access_Info_Cb _editfield_searchbar_access_info_cb(void *data, Evas_Object *obj)
87 {
88    const char *txt;
89    txt = "Search bar";
90    return strdup(txt);
91 }
92
93 EXPORT_API Evas_Object *
94 ea_editfield_add(Evas_Object *parent, Ea_Editfield_Type type)
95 {
96    Evas_Object *entry, *button;
97    Ea_Editfield_Data *eed;
98
99    entry = elm_entry_add(parent);
100
101    if (type == EA_EDITFIELD_SINGLELINE)
102      {
103         elm_object_style_set(entry, "editfield");
104         elm_entry_single_line_set(entry, EINA_TRUE);
105      }
106    else if (type == EA_EDITFIELD_SCROLL_SINGLELINE)
107      {
108         elm_object_style_set(entry, "editfield");
109         elm_entry_single_line_set(entry, EINA_TRUE);
110         elm_entry_scrollable_set(entry, EINA_TRUE);
111         elm_object_signal_emit(entry, "elm,state,scroll,enabled", "");
112      }
113    else if (type == EA_EDITFIELD_SCROLL_SINGLELINE_PASSWORD)
114      {
115         elm_object_style_set(entry, "editfield");
116         elm_entry_single_line_set(entry, EINA_TRUE);
117         elm_entry_password_set(entry, EINA_TRUE);
118         elm_entry_scrollable_set(entry, EINA_TRUE);
119         elm_object_signal_emit(entry, "elm,state,scroll,enabled", "");
120      }
121    else if (type == EA_EDITFIELD_SCROLL_MULTILINE)
122      {
123         elm_object_style_set(entry, "editfield");
124         elm_entry_scrollable_set(entry, EINA_TRUE);
125         elm_object_signal_emit(entry, "elm,state,scroll,enabled", "");
126      }
127    else if (type == EA_EDITFIELD_SEARCHBAR)
128      {
129         elm_object_style_set(entry, "editfield/searchbar/default");
130         elm_entry_single_line_set(entry, EINA_TRUE);
131         elm_entry_scrollable_set(entry, EINA_TRUE);
132         elm_object_signal_emit(entry, "elm,state,scroll,enabled", "");
133      }
134    else
135      {
136         elm_object_style_set(entry, "editfield");
137      }
138
139    if (type == EA_EDITFIELD_SEARCHBAR)
140      {
141         button = elm_button_add(parent);
142         elm_object_style_set(button, "search_icon");
143         elm_object_focus_allow_set(button, EINA_FALSE);
144         elm_object_part_content_set(entry, "elm.swallow.icon", button);
145
146         button = elm_button_add(parent);
147         elm_object_style_set(button, "search_clear");
148         elm_object_focus_allow_set(button, EINA_FALSE);
149         elm_object_part_content_set(entry, "elm.swallow.clear", button);
150         evas_object_smart_callback_add(button, "clicked", _eraser_btn_clicked_cb, entry);
151
152         evas_object_smart_callback_add(entry, "changed", _editfield_searchbar_changed_cb, NULL);
153         evas_object_smart_callback_add(entry, "preedit,changed", _editfield_searchbar_changed_cb, NULL);
154         evas_object_smart_callback_add(entry, "focused", _editfield_searchbar_focused_cb, NULL);
155         evas_object_smart_callback_add(entry, "unfocused", _editfield_searchbar_unfocused_cb, NULL);
156
157         elm_access_info_cb_set(entry, ELM_ACCESS_TYPE, _editfield_searchbar_access_info_cb, NULL);
158      }
159    else
160      {
161         button = elm_button_add(parent);
162         elm_object_style_set(button, "editfield_clear");
163         elm_object_focus_allow_set(button, EINA_FALSE);
164         elm_object_part_content_set(entry, "elm.swallow.clear", button);
165         evas_object_smart_callback_add(button, "clicked", _eraser_btn_clicked_cb, entry);
166
167         evas_object_smart_callback_add(entry, "changed", _editfield_changed_cb, NULL);
168         evas_object_smart_callback_add(entry, "preedit,changed", _editfield_changed_cb, NULL);
169         evas_object_smart_callback_add(entry, "focused", _editfield_focused_cb, NULL);
170         evas_object_smart_callback_add(entry, "unfocused", _editfield_unfocused_cb, NULL);
171      }
172
173    eed = calloc(1, sizeof(Ea_Editfield_Data));
174    eed->clear_btn_disabled = EINA_FALSE;
175    evas_object_data_set(entry, EA_EF_KEY_DATA, eed);
176    return entry;
177 }
178
179 EXPORT_API void
180 ea_editfield_clear_button_disabled_set(Evas_Object *obj, Eina_Bool disable)
181 {
182    Ea_Editfield_Data *eed;
183
184    eed = evas_object_data_get(obj, EA_EF_KEY_DATA);
185    if (eed)
186      {
187         eed->clear_btn_disabled = !!disable;
188         if (eed->clear_btn_disabled)
189           elm_object_signal_emit(obj, "elm,state,clear,hidden", "");
190      }
191 }
192
193 EXPORT_API Eina_Bool
194 ea_editfield_clear_button_disabled_get(Evas_Object *obj)
195 {
196    Ea_Editfield_Data *eed;
197
198    if (!obj)
199      return EINA_FALSE;
200    eed = evas_object_data_get(obj, EA_EF_KEY_DATA);
201    if (!eed)
202      return EINA_FALSE;
203
204    return eed->clear_btn_disabled;
205 }