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