X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Flib%2Felc_fileselector_entry.c;h=7c78e2aea8053f3251ef3e626ccaddc5e5fdcb93;hb=207aaa411ece9ffa2aef12e807a4c74fa3b8bc22;hp=e75937706d97d25e4aaebaba1d6d2a96ae3ef901;hpb=1c9e3ebcecfb2ca477bd316707368340d0dce0f0;p=framework%2Fuifw%2Felementary.git diff --git a/src/lib/elc_fileselector_entry.c b/src/lib/elc_fileselector_entry.c index e759377..7c78e2a 100644 --- a/src/lib/elc_fileselector_entry.c +++ b/src/lib/elc_fileselector_entry.c @@ -1,18 +1,6 @@ #include #include "elm_priv.h" - /** - * @defgroup File_Selector_Entry File Selector Entry - * - * An entry that shows to enter/display path and have an associated - * button to allow selecting the file from a dialog. - * - * The button, when clicked, creates an Elementary window (or inner - * window) with an Elementary File Selector within. When a file is - * chosen, the (inner) window is closed and the selected file is - * exposed as an evas_object_smart_callback_call() of the button. - */ - typedef struct _Widget_Data Widget_Data; struct _Widget_Data @@ -20,6 +8,7 @@ struct _Widget_Data Evas_Object *edje; Evas_Object *button; Evas_Object *entry; + char *path; }; static const char *widtype = NULL; @@ -74,6 +63,8 @@ SIG_FWD(SELECTION_CUT) SIG_FWD(UNPRESSED) #undef SIG_FWD +static void _del_pre_hook(Evas_Object *obj); +static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl); static void @@ -81,7 +72,12 @@ _FILE_CHOSEN_fwd(void *data, Evas_Object *obj __UNUSED__, void *event_info) { Widget_Data *wd = elm_widget_data_get(data); const char *file = event_info; - elm_scrolled_entry_entry_set(wd->entry, file); + char *s; + + s = elm_entry_utf8_to_markup(file); + if (!s) return; + elm_object_text_set(wd->entry, s); + free(s); evas_object_smart_callback_call(data, SIG_FILE_CHOSEN, event_info); } @@ -89,15 +85,27 @@ static void _ACTIVATED_fwd(void *data, Evas_Object *obj __UNUSED__, void *event_info) { Widget_Data *wd = elm_widget_data_get(data); - const char *file = elm_scrolled_entry_entry_get(wd->entry); + const char *file = elm_object_text_get(wd->entry); elm_fileselector_button_path_set(wd->button, file); evas_object_smart_callback_call(data, SIG_ACTIVATED, event_info); } static void +_del_pre_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + evas_object_event_callback_del_full + (wd->button, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); + evas_object_event_callback_del_full + (wd->entry, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); +} + +static void _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); + if (wd->path) free(wd->path); free(wd); } @@ -170,7 +178,9 @@ _theme_hook(Evas_Object *obj) char buf[1024]; if (!wd) return; + _elm_widget_mirrored_reload(obj); _mirrored_set(obj, elm_widget_mirrored_get(obj)); + _elm_theme_object_set(obj, wd->edje, "fileselector_entry", "base", style); if (elm_object_disabled_get(obj)) edje_object_signal_emit(wd->edje, "elm,state,disabled", "elm"); @@ -210,47 +220,93 @@ _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, _sizing_eval(data); } -/** - * Add a new file selector entry into the parent object. - * - * @param parent The parent object - * @return The new object or NULL if it cannot be created - * - * @ingroup File_Selector_Entry - */ +static void +_elm_fileselector_entry_button_label_set(Evas_Object *obj, const char *item, const char *label) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (item && strcmp(item, "default")) return; + if (!wd) return; + elm_object_text_set(wd->button, label); +} + +static const char * +_elm_fileselector_entry_button_label_get(const Evas_Object *obj, const char *item) +{ + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + if (item && strcmp(item, "default")) return NULL; + if (!wd) return NULL; + return elm_object_text_get(wd->button); +} + +static void +_content_set_hook(Evas_Object *obj, const char *part, Evas_Object *content) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (part && strcmp(part, "button icon")) return; + elm_object_part_content_set(wd->button, NULL, content); +} + +static Evas_Object * +_content_get_hook(const Evas_Object *obj, const char *part) +{ + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return NULL; + if (part && strcmp(part, "button icon")) return NULL; + return elm_object_part_content_get(wd->button, NULL); +} + +static Evas_Object * +_content_unset_hook(Evas_Object *obj, const char *part) +{ + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return NULL; + if (part && strcmp(part, "button icon")) return NULL; + return elm_object_part_content_unset(wd->button, NULL); +} + EAPI Evas_Object * elm_fileselector_entry_add(Evas_Object *parent) { Evas_Object *obj; - Evas *e = evas_object_evas_get(parent); - if (!e) return NULL; + Evas *e; Widget_Data *wd; - EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL); - - wd = ELM_NEW(Widget_Data); + ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL); - obj = elm_widget_add(e); ELM_SET_WIDTYPE(widtype, "fileselector_entry"); elm_widget_type_set(obj, "fileselector_entry"); elm_widget_sub_object_add(parent, obj); elm_widget_data_set(obj, wd); + elm_widget_del_pre_hook_set(obj, _del_pre_hook); elm_widget_del_hook_set(obj, _del_hook); elm_widget_disable_hook_set(obj, _disable_hook); elm_widget_focus_next_hook_set(obj, _elm_fileselector_entry_focus_next_hook); elm_widget_can_focus_set(obj, EINA_FALSE); elm_widget_theme_hook_set(obj, _theme_hook); + elm_widget_text_set_hook_set(obj, _elm_fileselector_entry_button_label_set); + elm_widget_text_get_hook_set(obj, _elm_fileselector_entry_button_label_get); + elm_widget_content_set_hook_set(obj, _content_set_hook); + elm_widget_content_get_hook_set(obj, _content_get_hook); + elm_widget_content_unset_hook_set(obj, _content_unset_hook); wd->edje = edje_object_add(e); _elm_theme_object_set(obj, wd->edje, "fileselector_entry", "base", "default"); elm_widget_resize_object_set(obj, wd->edje); wd->button = elm_fileselector_button_add(obj); + elm_widget_mirrored_automatic_set(wd->button, EINA_FALSE); + ELM_SET_WIDTYPE(widtype, "fileselector_entry"); elm_widget_style_set(wd->button, "fileselector_entry/default"); edje_object_part_swallow(wd->edje, "elm.swallow.button", wd->button); elm_widget_sub_object_add(obj, wd->button); evas_object_event_callback_add - (wd->button, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); + (wd->button, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); elm_fileselector_button_expandable_set(wd->button, _elm_config->fileselector_expand_enable); @@ -261,14 +317,16 @@ elm_fileselector_entry_add(Evas_Object *parent) SIG_FWD(FILE_CHOSEN); #undef SIG_FWD - wd->entry = elm_scrolled_entry_add(obj); + wd->entry = elm_entry_add(obj); + elm_entry_scrollable_set(wd->entry, EINA_TRUE); + elm_widget_mirrored_automatic_set(wd->entry, EINA_FALSE); elm_widget_style_set(wd->entry, "fileselector_entry/default"); - elm_scrolled_entry_single_line_set(wd->entry, EINA_TRUE); - elm_scrolled_entry_editable_set(wd->entry, EINA_TRUE); + elm_entry_single_line_set(wd->entry, EINA_TRUE); + elm_entry_editable_set(wd->entry, EINA_TRUE); edje_object_part_swallow(wd->edje, "elm.swallow.entry", wd->entry); elm_widget_sub_object_add(obj, wd->entry); evas_object_event_callback_add - (wd->entry, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); + (wd->entry, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); #define SIG_FWD(name) \ evas_object_smart_callback_add(wd->entry, SIG_##name, _##name##_fwd, obj) @@ -294,42 +352,6 @@ elm_fileselector_entry_add(Evas_Object *parent) return obj; } -/** - * Set the label used in the file selector entry. - * - * @param obj The entry object - * @param label The text label text to be displayed on the entry - * - * @ingroup File_Selector_Entry - */ -EAPI void -elm_fileselector_entry_button_label_set(Evas_Object *obj, const char *label) -{ - ELM_CHECK_WIDTYPE(obj, widtype); - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - elm_fileselector_button_label_set(wd->button, label); -} - -EAPI const char * -elm_fileselector_entry_button_label_get(const Evas_Object *obj) -{ - ELM_CHECK_WIDTYPE(obj, widtype) NULL; - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; - return elm_fileselector_button_label_get(wd->button); -} - -/** - * Set the path to start the entry's file selector with, when clicked. - * - * @param obj The entry object - * @param path Path to a file/directory - * - * Default path is "HOME" environment variable's value. - * - * @ingroup File_Selector_Entry - */ EAPI void elm_fileselector_entry_selected_set(Evas_Object *obj, const char *path) { @@ -339,16 +361,6 @@ elm_fileselector_entry_selected_set(Evas_Object *obj, const char *path) elm_fileselector_button_path_set(wd->button, path); } -/** - * Get the last path which the entry's file selector was set to. - * - * @param obj The entry object - * @param path Path to a file/directory - * - * Default path is "HOME" environment variable's value. - * - * @ingroup File_Selector_Entry - */ EAPI const char * elm_fileselector_entry_selected_get(const Evas_Object *obj) { @@ -358,17 +370,6 @@ elm_fileselector_entry_selected_get(const Evas_Object *obj) return elm_fileselector_button_path_get(wd->button); } -/** - * Set the title of the file selector entry's window. - * - * @param obj The entry object - * @param title The title string - * - * Note that it will only take any effect if the fileselector entry - * not at "inwin mode". - * - * @ingroup File_Selector_Entry - */ EAPI void elm_fileselector_entry_window_title_set(Evas_Object *obj, const char *title) { @@ -378,13 +379,6 @@ elm_fileselector_entry_window_title_set(Evas_Object *obj, const char *title) elm_fileselector_button_window_title_set(wd->button, title); } -/** - * Get the title of the file selector entry's window. - * - * @param obj The entry object - * - * @ingroup File_Selector_Entry - */ EAPI const char * elm_fileselector_entry_window_title_get(const Evas_Object *obj) { @@ -394,18 +388,6 @@ elm_fileselector_entry_window_title_get(const Evas_Object *obj) return elm_fileselector_button_window_title_get(wd->button); } -/** - * Set the size of the file selector entry's window. - * - * @param obj The entry object - * @param width The width - * @param height The height - * - * Note that it will only take any effect if the fileselector entry not at - * "inwin mode". Default size for the window (when applicable) is 400x400. - * - * @ingroup File_Selector_Entry - */ EAPI void elm_fileselector_entry_window_size_set(Evas_Object *obj, Evas_Coord width, Evas_Coord height) { @@ -415,15 +397,6 @@ elm_fileselector_entry_window_size_set(Evas_Object *obj, Evas_Coord width, Evas_ elm_fileselector_button_window_size_set(wd->button, width, height); } -/** - * Get the size of the file selector entry's window. - * - * @param obj The entry object - * @param width Pointer into which to store the width value - * @param height Pointer into which to store the height value - * - * @ingroup File_Selector_Entry - */ EAPI void elm_fileselector_entry_window_size_get(const Evas_Object *obj, Evas_Coord *width, Evas_Coord *height) { @@ -433,53 +406,35 @@ elm_fileselector_entry_window_size_get(const Evas_Object *obj, Evas_Coord *width elm_fileselector_button_window_size_get(wd->button, width, height); } -/** - * Set the starting path of the file selector entry's window. - * - * @param obj The entry object - * @param path The path string - * - * It must be a directory path. - * - * @ingroup File_Selector_Entry - */ EAPI void elm_fileselector_entry_path_set(Evas_Object *obj, const char *path) { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); + char *s; + if (!wd) return; elm_fileselector_button_path_set(wd->button, path); - elm_scrolled_entry_entry_set(wd->entry, path); + s = elm_entry_utf8_to_markup(path); + if (s) + { + elm_object_text_set(wd->entry, s); + free(s); + } } -/** - * Get the last path of the file selector entry's window. - * - * @param obj The entry object - * - * @ingroup File_Selector_Entry - */ EAPI const char * elm_fileselector_entry_path_get(const Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return NULL; - return elm_scrolled_entry_entry_get(wd->entry); -} - -/** - * Set whether the entry's file selector is to present itself as an - * Elementary Generic List (which will expand its entries for nested - * directories) or as canonical list, which will be rendered again - * with the contents of each selected directory. - * - * @param obj The entry object - * @param value The expandable flag - * - * @ingroup File_Selector_Entry - */ + if (wd->path) free(wd->path); + wd->path = elm_entry_markup_to_utf8(elm_object_text_get(wd->entry)); + return wd->path; +} + EAPI void elm_fileselector_entry_expandable_set(Evas_Object *obj, Eina_Bool value) { @@ -489,14 +444,6 @@ elm_fileselector_entry_expandable_set(Evas_Object *obj, Eina_Bool value) elm_fileselector_button_expandable_set(wd->button, value); } -/** - * Get the entry's file selector expandable flag. - * - * @param obj The entry object - * @return value The expandable flag - * - * @ingroup File_Selector_Entry - */ EAPI Eina_Bool elm_fileselector_entry_expandable_get(const Evas_Object *obj) { @@ -506,15 +453,6 @@ elm_fileselector_entry_expandable_get(const Evas_Object *obj) return elm_fileselector_button_expandable_get(wd->button); } -/** - * Set whether the entry's file selector list is to display folders - * only or the directory contents, as well. - * - * @param obj The entry object - * @param value The "folder only" flag - * - * @ingroup File_Selector_Entry - */ EAPI void elm_fileselector_entry_folder_only_set(Evas_Object *obj, Eina_Bool value) { @@ -524,14 +462,6 @@ elm_fileselector_entry_folder_only_set(Evas_Object *obj, Eina_Bool value) elm_fileselector_button_folder_only_set(wd->button, value); } -/** - * Get the entry's file selector "folder only" flag. - * - * @param obj The entry object - * @return value The "folder only" flag - * - * @ingroup File_Selector_Entry - */ EAPI Eina_Bool elm_fileselector_entry_folder_only_get(const Evas_Object *obj) { @@ -541,15 +471,6 @@ elm_fileselector_entry_folder_only_get(const Evas_Object *obj) return elm_fileselector_button_folder_only_get(wd->button); } -/** - * Set whether the entry's file selector has an editable text entry - * which will hold its current selection. - * - * @param obj The entry object - * @param value The "is save" flag - * - * @ingroup File_Selector_Entry - */ EAPI void elm_fileselector_entry_is_save_set(Evas_Object *obj, Eina_Bool value) { @@ -559,14 +480,6 @@ elm_fileselector_entry_is_save_set(Evas_Object *obj, Eina_Bool value) elm_fileselector_button_is_save_set(wd->button, value); } -/** - * Get the entry's file selector "is save" flag. - * - * @param obj The entry object - * @return value The "is save" flag - * - * @ingroup File_Selector_Entry - */ EAPI Eina_Bool elm_fileselector_entry_is_save_get(const Evas_Object *obj) { @@ -576,16 +489,6 @@ elm_fileselector_entry_is_save_get(const Evas_Object *obj) return elm_fileselector_button_is_save_get(wd->button); } -/** - * Set whether the entry's file selector will raise an Elementary - * Inner Window, instead of a dedicated Elementary Window. By default, - * it won't. - * - * @param obj The entry object - * @param value The "inwin mode" flag - * - * @ingroup File_Selector_Entry - */ EAPI void elm_fileselector_entry_inwin_mode_set(Evas_Object *obj, Eina_Bool value) { @@ -595,14 +498,6 @@ elm_fileselector_entry_inwin_mode_set(Evas_Object *obj, Eina_Bool value) elm_fileselector_button_inwin_mode_set(wd->button, value); } -/** - * Get the entry's file selector "inwin mode" flag. - * - * @param obj The entry object - * @return value The "inwin mode" flag - * - * @ingroup File_Selector_Entry - */ EAPI Eina_Bool elm_fileselector_entry_inwin_mode_get(const Evas_Object *obj) { @@ -611,58 +506,3 @@ elm_fileselector_entry_inwin_mode_get(const Evas_Object *obj) if (!wd) return EINA_FALSE; return elm_fileselector_button_inwin_mode_get(wd->button); } - -/** - * Set the icon used for the entry button - * - * Once the icon object is set, a previously set one will be deleted. - * - * @param obj The entry object - * @param icon The image for the entry - * - * @ingroup File_Selector_Entry - */ -EAPI void -elm_fileselector_entry_button_icon_set(Evas_Object *obj, Evas_Object *icon) -{ - ELM_CHECK_WIDTYPE(obj, widtype); - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - elm_fileselector_button_icon_set(wd->button, icon); -} - -/** - * Get the icon used for the entry button - * - * @param obj The entry object - * @return The image for the entry - * - * @ingroup File_Selector_Entry - */ -EAPI Evas_Object * -elm_fileselector_entry_button_icon_get(const Evas_Object *obj) -{ - ELM_CHECK_WIDTYPE(obj, widtype) NULL; - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; - return elm_fileselector_button_icon_get(wd->button); -} - -/** - * Unset the icon used for the entry button - * - * Unparent and return the icon object which was set for this widget. - * - * @param obj The entry object - * @return The icon object that was being used - * - * @ingroup File_Selector_Entry - */ -EAPI Evas_Object * -elm_fileselector_entry_button_icon_unset(Evas_Object *obj) -{ - ELM_CHECK_WIDTYPE(obj, widtype) NULL; - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; - return elm_fileselector_button_icon_unset(wd->button); -}