1 #include "e.h"
2
3 typedef struct _E_Widget_Data E_Widget_Data;
4 struct _E_Widget_Data
5 {
6 Evas_Object *o_entry, *o_inout;
7 char **text_location;
8 void (*func)(void *data, void *data2);
9 char *text;
10 void *data;
11 void *data2;
12 };
13
14 /* local subsystem functions */
15 static void _e_wid_del_hook(Evas_Object *obj);
16 static void _e_wid_focus_hook(Evas_Object *obj);
17 static void _e_wid_disable_hook(Evas_Object *obj);
18 static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info);
19 static void _e_wid_changed_cb(void *data, Evas_Object *obj, void *event_info);
20 static void _e_wid_keydown(void *data, Evas *e, Evas_Object *obj, void *event_info);
21 static void _e_wid_movresz(void *data, Evas *e, Evas_Object *obj, void *event_info);
22
23 /* externally accessible functions */
24
25 /**
26 * Creates a new entry widget
27 *
28 * @param evas the evas where to add the new entry widget
29 * @param text_location the location where to store the text of the entry.
30 * @param func DOCUMENT ME!
31 * @param data DOCUMENT ME!
32 * @param data2 DOCUMENT ME!
33 * The current value will be used to initialize the entry
34 * @return Returns the new entry widget
35 */
36 E_API Evas_Object *
e_widget_entry_add(Evas_Object * parent,char ** text_location,void (* func)(void * data,void * data2),void * data,void * data2)37 e_widget_entry_add(Evas_Object *parent, char **text_location, void (*func)(void *data, void *data2), void *data, void *data2)
38 {
39 Evas_Object *obj, *o;
40 E_Widget_Data *wd;
41 Evas_Coord minw, minh;
42 Evas *evas;
43
44 evas = evas_object_evas_get(parent);
45 obj = e_widget_add(evas);
46
47 e_widget_del_hook_set(obj, _e_wid_del_hook);
48 e_widget_focus_hook_set(obj, _e_wid_focus_hook);
49 e_widget_disable_hook_set(obj, _e_wid_disable_hook);
50
51 wd = calloc(1, sizeof(E_Widget_Data));
52 e_widget_data_set(obj, wd);
53 wd->text_location = text_location;
54
55 o = elm_entry_add(parent);
56 elm_object_text_set(o, "test");
57 elm_entry_scrollable_set(o, 1);
58 elm_entry_single_line_set(o, 1);
59 elm_scroller_policy_set(o, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_OFF);
60 wd->o_entry = o;
61 evas_object_size_hint_min_get(wd->o_entry, &minw, &minh);
62 e_widget_size_min_set(obj, minw, minh);
63 elm_object_text_set(o, NULL);
64
65 e_widget_sub_object_add(obj, o);
66 e_widget_resize_object_set(obj, o);
67 evas_object_show(o);
68
69 evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN, _e_wid_keydown, obj);
70 evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _e_wid_movresz, obj);
71 evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _e_wid_movresz, obj);
72
73 o = evas_object_rectangle_add(evas);
74 wd->o_inout = o;
75 evas_object_repeat_events_set(o, EINA_TRUE);
76 evas_object_color_set(o, 0, 0, 0, 0);
77 e_widget_sub_object_add(obj, o);
78 evas_object_smart_member_add(o, obj);
79 evas_object_show(o);
80
81 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj);
82
83 o = wd->o_entry;
84 if ((text_location) && (*text_location))
85 {
86 char *tmp = elm_entry_utf8_to_markup(*text_location);
87
88 if (tmp)
89 {
90 elm_object_text_set(o, tmp);
91 free(tmp);
92 }
93 else elm_object_text_set(wd->o_entry, NULL);
94 }
95
96 wd->func = func;
97 wd->data = data;
98 wd->data2 = data2;
99 evas_object_smart_callback_add(o, "changed", _e_wid_changed_cb, obj);
100
101 return obj;
102 }
103
104 /**
105 * Sets the text of the entry widget
106 *
107 * @param entry an entry widget
108 * @param text the text to set
109 */
110 E_API void
e_widget_entry_text_set(Evas_Object * entry,const char * text)111 e_widget_entry_text_set(Evas_Object *entry, const char *text)
112 {
113 E_Widget_Data *wd;
114 char *tmp;
115
116 if (!(entry) || (!(wd = e_widget_data_get(entry))))
117 return;
118 tmp = elm_entry_utf8_to_markup(text);
119 if (tmp)
120 {
121 elm_object_text_set(wd->o_entry, tmp);
122 free(tmp);
123 }
124 else elm_object_text_set(wd->o_entry, NULL);
125 }
126
127 /**
128 * Gets the text of the entry widget
129 *
130 * @param entry an entry widget
131 * @return Returns the text of the entry widget
132 */
133 E_API const char *
e_widget_entry_text_get(Evas_Object * entry)134 e_widget_entry_text_get(Evas_Object *entry)
135 {
136 E_Widget_Data *wd;
137 char *tmp;
138
139 if (!(entry) || (!(wd = e_widget_data_get(entry))))
140 return NULL;
141 tmp = elm_entry_markup_to_utf8(elm_object_text_get(wd->o_entry));
142 if (tmp)
143 {
144 if (wd->text) free(wd->text);
145 wd->text = tmp;
146 return wd->text;
147 }
148 if (wd->text) free(wd->text);
149 wd->text = NULL;
150 return NULL;
151 }
152
153 /**
154 * Clears the entry widget
155 *
156 * @param entry an entry widget
157 */
158 E_API void
e_widget_entry_clear(Evas_Object * entry)159 e_widget_entry_clear(Evas_Object *entry)
160 {
161 E_Widget_Data *wd;
162
163 if (!(entry) || (!(wd = e_widget_data_get(entry))))
164 return;
165 elm_object_text_set(wd->o_entry, NULL);
166 }
167
168 /**
169 * Sets whether or not the entry widget is in password mode. In password mode,
170 * the entry displays '*' instead of the characters
171 *
172 * @param entry an entry widget
173 * @param password_mode 1 to turn on password mode, 0 to turn it off
174 */
175 E_API void
e_widget_entry_password_set(Evas_Object * entry,int password_mode)176 e_widget_entry_password_set(Evas_Object *entry, int password_mode)
177 {
178 E_Widget_Data *wd;
179
180 if (!(entry) || (!(wd = e_widget_data_get(entry))))
181 return;
182 elm_entry_password_set(wd->o_entry, !!password_mode);
183 }
184
185 /**
186 * Sets whether or not the entry widget is user-editable. This still
187 * allows copying and selecting, just no inserting or deleting of text.
188 *
189 * @param entry an entry widget
190 * @param readonly_mode 1 to enable read-only mode, 0 to turn it off
191 */
192 E_API void
e_widget_entry_readonly_set(Evas_Object * entry,int readonly_mode)193 e_widget_entry_readonly_set(Evas_Object *entry, int readonly_mode)
194 {
195 E_Widget_Data *wd;
196
197 if (!(entry) || (!(wd = e_widget_data_get(entry))))
198 return;
199
200 elm_entry_editable_set(wd->o_entry, !readonly_mode);
201 }
202
203 /**
204 * Selects the content of the entry.
205 *
206 * @param entry an entry widget
207 */
208 E_API void
e_widget_entry_select_all(Evas_Object * entry)209 e_widget_entry_select_all(Evas_Object *entry)
210 {
211 E_Widget_Data *wd;
212
213 if (!(entry) || (!(wd = e_widget_data_get(entry))))
214 return;
215 elm_entry_select_all(wd->o_entry);
216 }
217
218 /* Private functions */
219
220 static void
_e_wid_del_hook(Evas_Object * obj)221 _e_wid_del_hook(Evas_Object *obj)
222 {
223 E_Widget_Data *wd;
224
225 if (!(obj) || (!(wd = e_widget_data_get(obj))))
226 return;
227 if (wd->text) free(wd->text);
228 evas_object_del(wd->o_entry);
229 evas_object_del(wd->o_inout);
230 wd->o_entry = NULL;
231 wd->o_inout = NULL;
232 wd->text = NULL;
233 free(wd);
234 }
235
236 static void
_e_wid_focus_hook(Evas_Object * obj)237 _e_wid_focus_hook(Evas_Object *obj)
238 {
239 E_Widget_Data *wd;
240
241 if (!(obj) || (!(wd = e_widget_data_get(obj))))
242 return;
243
244 elm_object_focus_set(wd->o_entry, !!e_widget_focus_get(obj));
245 }
246
247 static void
_e_wid_disable_hook(Evas_Object * obj)248 _e_wid_disable_hook(Evas_Object *obj)
249 {
250 E_Widget_Data *wd;
251
252 if (!(obj) || (!(wd = e_widget_data_get(obj))))
253 return;
254
255 elm_object_disabled_set(wd->o_entry, !!e_widget_disabled_get(obj));
256 }
257
258 static void
_e_wid_focus_steal(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)259 _e_wid_focus_steal(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
260 {
261 e_widget_focus_steal(data);
262 }
263
264 static void
_e_wid_changed_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)265 _e_wid_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
266 {
267 Evas_Object *entry;
268 E_Widget_Data *wd;
269 char *tmp;
270
271 if (!(entry = data) || (!(wd = e_widget_data_get(entry))))
272 return;
273
274 tmp = elm_entry_markup_to_utf8(elm_object_text_get(wd->o_entry));
275 if (tmp)
276 {
277 if (wd->text) free(wd->text);
278 wd->text = tmp;
279 }
280 else
281 {
282 if (wd->text) free(wd->text);
283 wd->text = NULL;
284 }
285 if (wd->text_location)
286 {
287 free(*wd->text_location);
288 *wd->text_location = wd->text ? strdup(wd->text) : NULL;
289 }
290 e_widget_change(data);
291
292 if (wd->func) wd->func(wd->data, wd->data2);
293 }
294
295 static void
_e_wid_keydown(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)296 _e_wid_keydown(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
297 {
298 evas_object_smart_callback_call(data, "key_down", event_info);
299 }
300
301 static void
_e_wid_movresz(void * data,Evas * e EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)302 _e_wid_movresz(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
303 {
304 E_Widget_Data *wd;
305 Evas_Coord x, y, w, h;
306
307 if (!(data) || (!(wd = e_widget_data_get(data))))
308 return;
309 evas_object_geometry_get(obj, &x, &y, &w, &h);
310 if (wd->o_inout)
311 {
312 evas_object_move(wd->o_inout, x, y);
313 evas_object_resize(wd->o_inout, w, h);
314 }
315 }
316
317