1 //FIXME this widget should inherit from file selector button
3 #include <Elementary.h>
5 #include "elm_widget_fileselector_entry.h"
7 EAPI const char ELM_FILESELECTOR_ENTRY_SMART_NAME[] = "elm_fileselector_entry";
9 static const char SIG_CHANGED[] = "changed";
10 static const char SIG_ACTIVATED[] = "activated";
11 static const char SIG_PRESS[] = "press";
12 static const char SIG_LONGPRESSED[] = "longpressed";
13 static const char SIG_CLICKED[] = "clicked";
14 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
15 static const char SIG_FOCUSED[] = "focused";
16 static const char SIG_UNFOCUSED[] = "unfocused";
17 static const char SIG_SELECTION_PASTE[] = "selection,paste";
18 static const char SIG_SELECTION_COPY[] = "selection,copy";
19 static const char SIG_SELECTION_CUT[] = "selection,cut";
20 static const char SIG_UNPRESSED[] = "unpressed";
21 static const char SIG_FILE_CHOSEN[] = "file,chosen";
22 static const Evas_Smart_Cb_Description _smart_callbacks[] =
27 {SIG_LONGPRESSED, ""},
29 {SIG_CLICKED_DOUBLE, ""},
32 {SIG_SELECTION_PASTE, ""},
33 {SIG_SELECTION_COPY, ""},
34 {SIG_SELECTION_CUT, ""},
36 {SIG_FILE_CHOSEN, "s"},
40 #define SIG_FWD(name) \
42 _##name##_fwd(void *data, Evas_Object * obj __UNUSED__, void *event_info) \
44 evas_object_smart_callback_call(data, SIG_##name, event_info); \
50 SIG_FWD(CLICKED_DOUBLE)
53 SIG_FWD(SELECTION_PASTE)
54 SIG_FWD(SELECTION_COPY)
55 SIG_FWD(SELECTION_CUT)
59 EVAS_SMART_SUBCLASS_NEW
60 (ELM_FILESELECTOR_ENTRY_SMART_NAME, _elm_fileselector_entry,
61 Elm_Fileselector_Entry_Smart_Class, Elm_Layout_Smart_Class,
62 elm_layout_smart_class_get, _smart_callbacks);
65 _FILE_CHOSEN_fwd(void *data,
66 Evas_Object *obj __UNUSED__,
69 const char *file = event_info;
72 ELM_FILESELECTOR_ENTRY_DATA_GET(data, sd);
74 s = elm_entry_utf8_to_markup(file);
76 elm_object_text_set(sd->entry, s);
78 evas_object_smart_callback_call(data, SIG_FILE_CHOSEN, event_info);
82 _ACTIVATED_fwd(void *data,
83 Evas_Object *obj __UNUSED__,
88 ELM_FILESELECTOR_ENTRY_DATA_GET(data, sd);
90 file = elm_object_text_get(sd->entry);
91 elm_fileselector_button_path_set(sd->button, file);
92 evas_object_smart_callback_call(data, SIG_ACTIVATED, event_info);
96 _elm_fileselector_entry_smart_sizing_eval(Evas_Object *obj)
98 Evas_Coord minw = -1, minh = -1;
100 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
102 edje_object_size_min_calc(ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh);
103 evas_object_size_hint_min_set(obj, minw, minh);
104 evas_object_size_hint_max_set(obj, -1, -1);
108 _elm_fileselector_entry_smart_focus_next(const Evas_Object *obj,
109 Elm_Focus_Direction dir,
112 Evas_Object *chain[2];
113 Evas_Object *to_focus;
116 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
119 if (dir == ELM_FOCUS_PREVIOUS)
121 chain[0] = sd->button;
122 chain[1] = sd->entry;
124 else if (dir == ELM_FOCUS_NEXT)
126 chain[0] = sd->entry;
127 chain[1] = sd->button;
132 i = elm_widget_focus_get(chain[1]);
134 if (elm_widget_focus_next_get(chain[i], dir, next))
139 if (elm_widget_focus_next_get(chain[i], dir, &to_focus))
149 _mirrored_set(Evas_Object *obj,
152 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
154 elm_widget_mirrored_set(sd->button, rtl);
158 _elm_fileselector_entry_smart_theme(Evas_Object *obj)
163 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
165 if (!ELM_WIDGET_CLASS(_elm_fileselector_entry_parent_sc)->theme(obj))
168 style = elm_widget_style_get(obj);
170 _mirrored_set(obj, elm_widget_mirrored_get(obj));
172 if (elm_object_disabled_get(obj))
173 elm_layout_signal_emit(obj, "elm,state,disabled", "elm");
175 if (!style) style = "default";
176 snprintf(buf, sizeof(buf), "fileselector_entry/%s", style);
177 elm_widget_style_set(sd->button, buf);
178 elm_widget_style_set(sd->entry, buf);
180 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
182 elm_layout_sizing_eval(obj);
188 _elm_fileselector_entry_smart_disable(Evas_Object *obj)
192 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
194 if (!ELM_WIDGET_CLASS(_elm_fileselector_entry_parent_sc)->disable(obj))
197 val = elm_widget_disabled_get(obj);
199 elm_widget_disabled_set(sd->button, val);
200 elm_widget_disabled_set(sd->entry, val);
206 _elm_fileselector_entry_smart_text_set(Evas_Object *obj,
210 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
212 if (item && strcmp(item, "default"))
213 return _elm_fileselector_entry_parent_sc->text_set(obj, item, label);
215 elm_object_text_set(sd->button, label);
221 _elm_fileselector_entry_smart_text_get(const Evas_Object *obj,
224 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
226 if (item && strcmp(item, "default"))
227 return _elm_fileselector_entry_parent_sc->text_get(obj, item);
229 return elm_object_text_get(sd->button);
233 _elm_fileselector_entry_smart_content_set(Evas_Object *obj,
235 Evas_Object *content)
237 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
239 if (part && strcmp(part, "button icon"))
240 return ELM_CONTAINER_CLASS(_elm_fileselector_entry_parent_sc)->content_set
241 (obj, part, content);
243 elm_layout_content_set(sd->button, NULL, content);
249 _elm_fileselector_entry_smart_content_get(const Evas_Object *obj,
252 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
254 if (part && strcmp(part, "button icon"))
255 return ELM_CONTAINER_CLASS(_elm_fileselector_entry_parent_sc)->
256 content_get(obj, part);
258 return elm_layout_content_get(sd->button, NULL);
262 _elm_fileselector_entry_smart_content_unset(Evas_Object *obj,
265 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
266 if (part && strcmp(part, "button icon"))
267 return ELM_CONTAINER_CLASS(_elm_fileselector_entry_parent_sc)->
268 content_unset(obj, part);
270 return elm_layout_content_unset(sd->button, NULL);
274 _elm_fileselector_entry_smart_add(Evas_Object *obj)
276 EVAS_SMART_DATA_ALLOC(obj, Elm_Fileselector_Entry_Smart_Data);
278 ELM_WIDGET_CLASS(_elm_fileselector_entry_parent_sc)->base.add(obj);
281 (obj, "fileselector_entry", "base", elm_widget_style_get(obj));
283 priv->button = elm_fileselector_button_add(obj);
284 elm_widget_mirrored_automatic_set(priv->button, EINA_FALSE);
285 elm_widget_style_set(priv->button, "fileselector_entry/default");
287 elm_layout_content_set(obj, "elm.swallow.button", priv->button);
288 elm_fileselector_button_expandable_set
289 (priv->button, _elm_config->fileselector_expand_enable);
291 #define SIG_FWD(name) \
292 evas_object_smart_callback_add(priv->button, SIG_##name, _##name##_fwd, obj)
295 SIG_FWD(FILE_CHOSEN);
298 priv->entry = elm_entry_add(obj);
299 elm_entry_scrollable_set(priv->entry, EINA_TRUE);
300 elm_widget_mirrored_automatic_set(priv->entry, EINA_FALSE);
301 elm_widget_style_set(priv->entry, "fileselector_entry/default");
302 elm_entry_single_line_set(priv->entry, EINA_TRUE);
303 elm_entry_editable_set(priv->entry, EINA_TRUE);
304 elm_layout_content_set(obj, "elm.swallow.entry", priv->entry);
306 #define SIG_FWD(name) \
307 evas_object_smart_callback_add(priv->entry, SIG_##name, _##name##_fwd, obj)
311 SIG_FWD(LONGPRESSED);
313 SIG_FWD(CLICKED_DOUBLE);
316 SIG_FWD(SELECTION_PASTE);
317 SIG_FWD(SELECTION_COPY);
318 SIG_FWD(SELECTION_CUT);
321 elm_widget_can_focus_set(obj, EINA_FALSE);
323 _mirrored_set(obj, elm_widget_mirrored_get(obj));
324 elm_layout_sizing_eval(obj);
328 _elm_fileselector_entry_smart_del(Evas_Object *obj)
330 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
332 if (sd->path) free(sd->path);
334 ELM_WIDGET_CLASS(_elm_fileselector_entry_parent_sc)->base.del(obj);
338 _elm_fileselector_entry_smart_set_user(Elm_Fileselector_Entry_Smart_Class *sc)
340 ELM_WIDGET_CLASS(sc)->base.add = _elm_fileselector_entry_smart_add;
341 ELM_WIDGET_CLASS(sc)->base.del = _elm_fileselector_entry_smart_del;
343 ELM_WIDGET_CLASS(sc)->disable = _elm_fileselector_entry_smart_disable;
344 ELM_WIDGET_CLASS(sc)->theme = _elm_fileselector_entry_smart_theme;
346 ELM_WIDGET_CLASS(sc)->focus_next = _elm_fileselector_entry_smart_focus_next;
347 ELM_WIDGET_CLASS(sc)->focus_direction = NULL;
349 ELM_CONTAINER_CLASS(sc)->content_set =
350 _elm_fileselector_entry_smart_content_set;
351 ELM_CONTAINER_CLASS(sc)->content_get =
352 _elm_fileselector_entry_smart_content_get;
353 ELM_CONTAINER_CLASS(sc)->content_unset =
354 _elm_fileselector_entry_smart_content_unset;
356 ELM_LAYOUT_CLASS(sc)->text_set = _elm_fileselector_entry_smart_text_set;
357 ELM_LAYOUT_CLASS(sc)->text_get = _elm_fileselector_entry_smart_text_get;
358 ELM_LAYOUT_CLASS(sc)->sizing_eval =
359 _elm_fileselector_entry_smart_sizing_eval;
362 EAPI const Elm_Fileselector_Entry_Smart_Class *
363 elm_fileselector_entry_smart_class_get(void)
365 static Elm_Fileselector_Entry_Smart_Class _sc =
366 ELM_FILESELECTOR_ENTRY_SMART_CLASS_INIT_NAME_VERSION
367 (ELM_FILESELECTOR_ENTRY_SMART_NAME);
368 static const Elm_Fileselector_Entry_Smart_Class *class = NULL;
369 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
374 _elm_fileselector_entry_smart_set(&_sc);
375 esc->callbacks = _smart_callbacks;
382 elm_fileselector_entry_add(Evas_Object *parent)
386 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
388 obj = elm_widget_add(_elm_fileselector_entry_smart_class_new(), parent);
389 if (!obj) return NULL;
391 if (!elm_widget_sub_object_add(parent, obj))
392 ERR("could not add %p as sub object of %p", obj, parent);
398 elm_fileselector_entry_selected_set(Evas_Object *obj,
401 ELM_FILESELECTOR_ENTRY_CHECK(obj);
402 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
404 elm_fileselector_button_path_set(sd->button, path);
408 elm_fileselector_entry_selected_get(const Evas_Object *obj)
410 ELM_FILESELECTOR_ENTRY_CHECK(obj) NULL;
411 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
413 return elm_fileselector_button_path_get(sd->button);
417 elm_fileselector_entry_window_title_set(Evas_Object *obj,
420 ELM_FILESELECTOR_ENTRY_CHECK(obj);
421 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
423 elm_fileselector_button_window_title_set(sd->button, title);
427 elm_fileselector_entry_window_title_get(const Evas_Object *obj)
429 ELM_FILESELECTOR_ENTRY_CHECK(obj) NULL;
430 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
432 return elm_fileselector_button_window_title_get(sd->button);
436 elm_fileselector_entry_window_size_set(Evas_Object *obj,
440 ELM_FILESELECTOR_ENTRY_CHECK(obj);
441 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
443 elm_fileselector_button_window_size_set(sd->button, width, height);
447 elm_fileselector_entry_window_size_get(const Evas_Object *obj,
451 ELM_FILESELECTOR_ENTRY_CHECK(obj);
452 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
454 elm_fileselector_button_window_size_get(sd->button, width, height);
458 elm_fileselector_entry_path_set(Evas_Object *obj,
463 ELM_FILESELECTOR_ENTRY_CHECK(obj);
464 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
466 elm_fileselector_button_path_set(sd->button, path);
467 s = elm_entry_utf8_to_markup(path);
470 elm_object_text_set(sd->entry, s);
476 elm_fileselector_entry_path_get(const Evas_Object *obj)
478 ELM_FILESELECTOR_ENTRY_CHECK(obj) NULL;
479 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
481 if (sd->path) free(sd->path);
482 sd->path = elm_entry_markup_to_utf8(elm_object_text_get(sd->entry));
487 elm_fileselector_entry_expandable_set(Evas_Object *obj,
490 ELM_FILESELECTOR_ENTRY_CHECK(obj);
491 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
493 elm_fileselector_button_expandable_set(sd->button, value);
497 elm_fileselector_entry_expandable_get(const Evas_Object *obj)
499 ELM_FILESELECTOR_ENTRY_CHECK(obj) EINA_FALSE;
500 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
502 return elm_fileselector_button_expandable_get(sd->button);
506 elm_fileselector_entry_folder_only_set(Evas_Object *obj,
509 ELM_FILESELECTOR_ENTRY_CHECK(obj);
510 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
512 elm_fileselector_button_folder_only_set(sd->button, value);
516 elm_fileselector_entry_folder_only_get(const Evas_Object *obj)
518 ELM_FILESELECTOR_ENTRY_CHECK(obj) EINA_FALSE;
519 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
521 return elm_fileselector_button_folder_only_get(sd->button);
525 elm_fileselector_entry_is_save_set(Evas_Object *obj,
528 ELM_FILESELECTOR_ENTRY_CHECK(obj);
529 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
531 elm_fileselector_button_is_save_set(sd->button, value);
535 elm_fileselector_entry_is_save_get(const Evas_Object *obj)
537 ELM_FILESELECTOR_ENTRY_CHECK(obj) EINA_FALSE;
538 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
540 return elm_fileselector_button_is_save_get(sd->button);
544 elm_fileselector_entry_inwin_mode_set(Evas_Object *obj,
547 ELM_FILESELECTOR_ENTRY_CHECK(obj);
548 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
550 elm_fileselector_button_inwin_mode_set(sd->button, value);
554 elm_fileselector_entry_inwin_mode_get(const Evas_Object *obj)
556 ELM_FILESELECTOR_ENTRY_CHECK(obj) EINA_FALSE;
557 ELM_FILESELECTOR_ENTRY_DATA_GET(obj, sd);
559 return elm_fileselector_button_inwin_mode_get(sd->button);