From a9bdc983b40aa09b81b4673cd9446965ef0f0608 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Tue, 30 Oct 2012 14:06:13 +0000 Subject: [PATCH] E entry: Move to edje_entry and remove e_editable. This should reduce the number of issues in the long run and reduced the amount of code we have to maintain." SVN revision: 78663 --- data/themes/default.edc | 84 ++- src/bin/Makefile.am | 2 - src/bin/e_editable.c | 1392 -------------------------------------- src/bin/e_editable.h | 47 -- src/bin/e_entry.c | 1205 +++++++-------------------------- src/bin/e_entry.h | 2 +- src/bin/e_entry_dialog.c | 2 +- src/bin/e_fm.c | 5 +- src/bin/e_includes.h | 1 - src/bin/e_widget_entry.c | 13 +- src/bin/e_widget_entry.h | 2 +- 11 files changed, 335 insertions(+), 2420 deletions(-) delete mode 100644 src/bin/e_editable.c delete mode 100644 src/bin/e_editable.h diff --git a/data/themes/default.edc b/data/themes/default.edc index ac5ad86bc..a2413b51b 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -26135,9 +26135,10 @@ target: "region"; } /* e/widgets/entry is used in the Wallpaper Picture file selector */ group { - name: "e/widgets/entry"; + name: "e/widgets/entry/scrollframe"; // min: 12 12; images.image: "inset_sunk.png" COMP; + parts { part { name: "base"; @@ -26155,8 +26156,21 @@ target: "region"; } } part { - name: "e.swallow.text"; + name: "clipper"; + type: RECT; + description { + state: "default" 0.0; + rel1.to: "base"; + rel2.to: "base"; + } + } + part { + name: "e.swallow.content"; type: SWALLOW; + mouse_events: 1; + scale: 1; + clip_to: "clipper"; + description { state: "default" 0.0; rel1 { @@ -26171,6 +26185,7 @@ target: "region"; } part { name: "overlay"; + repeat_events: 1; description { state: "default" 0.0; image { @@ -26207,34 +26222,54 @@ target: "region"; } } } - group { - name: "e/widgets/entry/text"; + + group { name: "e/widgets/entry/text"; + styles { + style { name: "entry_textblock_style"; + base: "font=Sans font_size=10 color=#000 text_class=entry color_classs=entry_text"; + } + style { name: "entry_textblock_disabled_style"; + base: "font=Sans font_size=10 color=#000 text_class=entry color_class=entry_text_disabled"; + } + } parts { part { name: "e.text.text"; - type: TEXT; - mouse_events: 0; + type: TEXTBLOCK; + mouse_events: 1; scale: 1; + entry_mode: EDITABLE; + select_mode: DEFAULT; + cursor_mode: BEFORE; + multiline: 0; + source: "e/widgets/entry/selection"; // selection under + source4: "e/widgets/entry/cursor"; // cursorover + description { state: "default" 0.0; color_class: "entry_text"; text { text: ""; - font: "Sans"; - size: 10; + style: "entry_textblock_style"; min: 1 1; - align: 0.0 0.0; - text_class: "entry"; + align: 0.0 0.5; } } description { state: "disabled" 0.0; inherit: "default" 0.0; + text.style: "entry_textblock_disabled_style"; color_class: "entry_text_disabled"; } } } programs { + program { name: "focus"; + signal: "load"; + source: ""; + action: FOCUS_SET; + target: "e.text.text"; + } program { name: "disable"; signal: "e,state,disabled"; @@ -26251,6 +26286,19 @@ target: "region"; } } } + + group { name: "e/widgets/entry/password"; + inherit: "e/widgets/entry/text"; + parts { + part { name: "e.text.text"; + entry_mode: PASSWORD; + description { state: "default" 0.0; + text.repch: "*"; + } + } + } + } + group { name: "e/widgets/entry/cursor"; min: 1 0; @@ -26283,6 +26331,22 @@ target: "region"; target: "cursor_hide_timer"; after: "cursor_show"; } + program { + name: "on_cursor_hide"; + signal: "e,action,hide,cursor"; + source: "e"; + action: ACTION_STOP; + target: "cursor_show"; + target: "cursor_hide"; + target: "cursor_show_timer"; + target: "cursor_hide_timer"; + after: "cursor_hide_stop"; + } + program { + name: "cursor_hide_stop"; + action: STATE_SET "default" 0.0; + target: "cursor"; + } program { name: "cursor_show"; action: STATE_SET "visible" 0.0; diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index 91dfc9b74..34a48c249 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -69,7 +69,6 @@ e_dialog.h \ e_dnd.h \ e_dpms.h \ e_eap_editor.h \ -e_editable.h \ e_entry.h \ e_entry_dialog.h \ e_env.h \ @@ -227,7 +226,6 @@ e_dialog.c \ e_dnd.c \ e_dpms.c \ e_eap_editor.c \ -e_editable.c \ e_entry.c \ e_entry_dialog.c \ e_env.c \ diff --git a/src/bin/e_editable.c b/src/bin/e_editable.c deleted file mode 100644 index 0bc45b348..000000000 --- a/src/bin/e_editable.c +++ /dev/null @@ -1,1392 +0,0 @@ -#include "e.h" - -#define E_EDITABLE_CURSOR_MARGIN 5 - -#define E_EDITABLE_BLOCK_SIZE 128 -#define E_EDITABLE_SIZE_TO_ALLOC(length) \ - (((length) + (E_EDITABLE_BLOCK_SIZE - 1)) / E_EDITABLE_BLOCK_SIZE) * E_EDITABLE_BLOCK_SIZE - -typedef struct _E_Editable_Smart_Data E_Editable_Smart_Data; - -struct _E_Editable_Smart_Data -{ - Evas_Object *clip_object; - Evas_Object *event_object; - Evas_Object *text_object; - Evas_Object *cursor_object; - Evas_Object *selection_object; - - int cursor_pos; - int cursor_visible; - int selection_pos; - int selection_visible; - int password_mode; - - char *text; - int char_length; - int unicode_length; - int allocated_length; - - int cursor_width; - int selection_on_fg; - int average_char_w; - int average_char_h; -}; - -/* local subsystem functions */ -static int _e_editable_text_insert(Evas_Object *editable, int pos, const char *text); -static int _e_editable_text_delete(Evas_Object *editable, int start, int end); -static void _e_editable_cursor_update(Evas_Object *editable); -static void _e_editable_selection_update(Evas_Object *editable); -static void _e_editable_text_update(Evas_Object *editable); -static void _e_editable_text_position_update(Evas_Object *editable, Evas_Coord real_w); -static int _e_editable_char_geometry_get_from_pos(Evas_Object *editable, int utf_pos, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch); - -static void _e_editable_smart_add(Evas_Object *object); -static void _e_editable_smart_del(Evas_Object *object); -static void _e_editable_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y); -static void _e_editable_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h); -static void _e_editable_smart_show(Evas_Object *object); -static void _e_editable_smart_hide(Evas_Object *object); -static void _e_editable_color_set(Evas_Object *object, int r, int g, int b, int a); -static void _e_editable_clip_set(Evas_Object *object, Evas_Object *clip); -static void _e_editable_clip_unset(Evas_Object *object); - -/* local subsystem globals */ -static Evas_Smart *_e_editable_smart = NULL; -static int _e_editable_smart_use = 0; - -/* externally accessible functions */ - -/** - * Creates a new editable object. An editable object is an evas smart object in - * which the user can type some single-line text, select it and delete it. - * - * @param evas The evas where to add the editable object - * @return Returns the new editable object - */ -EAPI Evas_Object * -e_editable_add(Evas *evas) -{ - if (!_e_editable_smart) - { - static const Evas_Smart_Class sc = - { - "e_editable", - EVAS_SMART_CLASS_VERSION, - _e_editable_smart_add, - _e_editable_smart_del, - _e_editable_smart_move, - _e_editable_smart_resize, - _e_editable_smart_show, - _e_editable_smart_hide, - _e_editable_color_set, - _e_editable_clip_set, - _e_editable_clip_unset, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - }; - _e_editable_smart = evas_smart_class_new(&sc); - _e_editable_smart_use = 0; - } - - return evas_object_smart_add(evas, _e_editable_smart); -} - -/** - * Sets the theme group to be used by the editable object. - * This function has to be called, or the cursor and the selection won't be - * visible. - * - * @param editable an editable object - * @param category the theme category to use for the editable object - * @param group the theme group to use for the editable object - */ -EAPI void -e_editable_theme_set(Evas_Object *editable, const char *category, const char *group) -{ - E_Editable_Smart_Data *sd; - char *obj_group; - const char *data; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - if ((!category) || (!group)) return; - obj_group = alloca(strlen(group) + strlen("/selection") + 1); - - /* Gets the theme for the text object */ - sprintf(obj_group, "%s/text", group); - e_theme_edje_object_set(sd->text_object, category, obj_group); - sd->average_char_w = -1; - sd->average_char_h = -1; - - /* Gets the theme for the cursor */ - sprintf(obj_group, "%s/cursor", group); - e_theme_edje_object_set(sd->cursor_object, category, obj_group); - - edje_object_size_min_get(sd->cursor_object, &sd->cursor_width, NULL); - if (sd->cursor_width < 1) sd->cursor_width = 1; - - /* Gets the theme for the selection */ - sprintf(obj_group, "%s/selection", group); - e_theme_edje_object_set(sd->selection_object, category, obj_group); - - data = edje_object_data_get(sd->selection_object, "on_foreground"); - if ((data) && (strcmp(data, "1") == 0)) - { - sd->selection_on_fg = 1; - evas_object_stack_above(sd->selection_object, sd->text_object); - } - else - { - sd->selection_on_fg = 0; - evas_object_stack_below(sd->selection_object, sd->text_object); - } - - _e_editable_text_update(editable); - _e_editable_cursor_update(editable); -} - -/** - * Sets whether or not the editable object is in password mode. In password - * mode, the editable object displays '*' instead of the characters - * - * @param editable an editable object - * @param password_mode 1 to turn on the password mode of the editable object, - * 0 to turn it off - */ -EAPI void -e_editable_password_set(Evas_Object *editable, int password_mode) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - if (sd->password_mode == password_mode) return; - - sd->password_mode = password_mode; - _e_editable_text_update(editable); - _e_editable_cursor_update(editable); -} - -/** - * Gets whether or not the editable is in password mode - * - * @param editable an editable object - * @return Returns 1 if the editable object is in the password mode, 0 otherwise - */ -EAPI int -e_editable_password_get(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERR(0); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return 0; - return sd->password_mode; -} - -/** - * Sets the text of the editable object - * - * @param editable an editable object - * @param text the text to set - */ -EAPI void -e_editable_text_set(Evas_Object *editable, const char *text) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - - if (sd->password_mode) memset(sd->text, 0, sd->char_length); - E_FREE(sd->text); - sd->char_length = 0; - sd->unicode_length = 0; - sd->allocated_length = -1; - - if (_e_editable_text_insert(editable, 0, text) <= 0) - { - sd->text = malloc((E_EDITABLE_BLOCK_SIZE + 1) * sizeof(char)); - sd->text[0] = '\0'; - sd->char_length = 0; - sd->unicode_length = 0; - sd->allocated_length = E_EDITABLE_BLOCK_SIZE; - _e_editable_text_update(editable); - } - - sd->cursor_pos = sd->unicode_length; - sd->selection_pos = sd->unicode_length; - _e_editable_cursor_update(editable); -} - -/** - * Gets the entire text of the editable object - * - * @param editable an editable object - * @return Returns the entire text of the editable object - */ -EAPI const char * -e_editable_text_get(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERR(NULL); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return NULL; - return sd->text; -} - -/** - * Gets a range of the text of the editable object, from position @a start to - * position @a end - * - * @param editable an editable object - * @param start the start position of the text range to get - * @param end the end position of the text range to get - * @return Returns the range of text. The returned string will have to be freed - */ -EAPI char * -e_editable_text_range_get(Evas_Object *editable, int start, int end) -{ - E_Editable_Smart_Data *sd; - char *range; - int start_id = 0, end_id = 0, i; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERR(NULL); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return NULL; - - start = E_CLAMP(start, 0, sd->unicode_length); - end = E_CLAMP(end, 0, sd->unicode_length); - if (end <= start) return NULL; - - for (i = 0; i < end; i++) - { - end_id = evas_string_char_next_get(sd->text, end_id, NULL); - if (i < start) start_id = end_id; - } - - if (end_id <= start_id) return NULL; - - range = malloc((end_id - start_id + 1) * sizeof(char)); - if (!range) return NULL; - - strncpy(range, &sd->text[start_id], end_id - start_id); - range[end_id - start_id] = '\0'; - - return range; -} - -/** - * Gets the unicode length of the text of the editable object. The unicode - * length is not always the length returned by strlen() since a UTF-8 char can - * take several bytes - * - * @param editable an editable object - * @return Returns the unicode length of the text of the editable object - */ -EAPI int -e_editable_text_length_get(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERR(0); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return 0; - return sd->unicode_length; -} - -/** - * Inserts some text at the given position in the editable object - * - * @param editable the editable object in which the text should be inserted - * @param pos the position where to insert the text - * @param text the text to insert - * @return Returns 1 if the text has been modified, 0 otherwise - */ -EAPI int -e_editable_insert(Evas_Object *editable, int pos, const char *text) -{ - E_Editable_Smart_Data *sd; - int unicode_length; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERR(0); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return 0; - - unicode_length = _e_editable_text_insert(editable, pos, text); - if (unicode_length <= 0) return 0; - - if (sd->cursor_pos >= pos) - e_editable_cursor_pos_set(editable, sd->cursor_pos + unicode_length); - if (sd->selection_pos >= pos) - e_editable_selection_pos_set(editable, sd->selection_pos + unicode_length); - - _e_editable_text_position_update(editable, -1); - return 1; -} - -/** - * Deletes the text of the editable object, between position "start" and - * position "end" - * - * @param editable the editable object in which the text should be deleted - * @param start the position of the first char to delete - * @param end the position of the last char to delete - * @return Returns 1 if the text has been modified, 0 otherwise - */ -EAPI int -e_editable_delete(Evas_Object *editable, int start, int end) -{ - E_Editable_Smart_Data *sd; - int unicode_length; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERR(0); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return 0; - - unicode_length = _e_editable_text_delete(editable, start, end); - if (unicode_length <= 0) return 0; - - if (sd->cursor_pos > end) - e_editable_cursor_pos_set(editable, sd->cursor_pos - unicode_length); - else if (sd->cursor_pos > start) - e_editable_cursor_pos_set(editable, start); - - if (sd->selection_pos > end) - e_editable_selection_pos_set(editable, sd->selection_pos - unicode_length); - else if (sd->selection_pos > start) - e_editable_selection_pos_set(editable, start); - - _e_editable_text_position_update(editable, -1); - return 1; -} - -/** - * Moves the cursor of the editable object to the given position - * - * @param editable an editable object - * @param pos the position where to move the cursor - */ -EAPI void -e_editable_cursor_pos_set(Evas_Object *editable, int pos) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - - pos = E_CLAMP(pos, 0, sd->unicode_length); - if (sd->cursor_pos == pos) return; - - sd->cursor_pos = pos; - _e_editable_cursor_update(editable); -} - -/** - * Gets the position of the cursor of the editable object - * - * @param editable an editable object - * @return Returns the position of the cursor of the editable object - */ -EAPI int -e_editable_cursor_pos_get(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERR(0); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return 0; - return sd->cursor_pos; -} - -/** - * Gets the geometry of the cursor of the editable object - * - * @param editable an editable object - * @param cx the x of the cursor - * @param cy the y of the cursor - * @param cw the width of the cursor - * @param ch the height of the cursor - */ -EAPI void -e_editable_cursor_geometry_get(Evas_Object *editable, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - - evas_object_geometry_get(sd->cursor_object, cx, cy, cw, ch); -} - -/** - * Moves the cursor to the start of the editable object - * - * @param editable an editable object - */ -EAPI void -e_editable_cursor_move_to_start(Evas_Object *editable) -{ - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if (!editable) - return; - e_editable_cursor_pos_set(editable, 0); -} - -/** - * Moves the cursor to the end of the editable object - * - * @param editable an editable object - */ -EAPI void -e_editable_cursor_move_to_end(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - e_editable_cursor_pos_set(editable, sd->unicode_length); -} - -/** - * Moves the cursor backward by one character offset - * - * @param editable an editable object - */ -EAPI void -e_editable_cursor_move_left(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - e_editable_cursor_pos_set(editable, sd->cursor_pos - 1); -} - -/** - * Moves the cursor forward by one character offset - * - * @param editable an editable object - */ -EAPI void -e_editable_cursor_move_right(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - e_editable_cursor_pos_set(editable, sd->cursor_pos + 1); -} - -/** - * Shows the cursor of the editable object - * - * @param editable the editable object whose cursor should be shown - */ -EAPI void -e_editable_cursor_show(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - if (sd->cursor_visible) return; - - sd->cursor_visible = 1; - if (evas_object_visible_get(editable)) - { - evas_object_show(sd->cursor_object); - edje_object_signal_emit(sd->cursor_object, "e,action,show,cursor", "e"); - } -} - -/** - * Hides the cursor of the editable object - * - * @param editable the editable object whose cursor should be hidden - */ -EAPI void -e_editable_cursor_hide(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - if (!sd->cursor_visible) return; - - sd->cursor_visible = 0; - evas_object_hide(sd->cursor_object); -} - -/** - * Moves the selection bound of the editable object to the given position - * - * @param editable an editable object - * @param pos the position where to move the selection bound - */ -EAPI void -e_editable_selection_pos_set(Evas_Object *editable, int pos) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - - pos = E_CLAMP(pos, 0, sd->unicode_length); - if (sd->selection_pos == pos) return; - - sd->selection_pos = pos; - _e_editable_selection_update(editable); -} - -/** - * Gets the position of the selection bound of the editable object - * - * @param editable an editable object - * @return Returns the position of the selection bound of the editable object - */ -EAPI int -e_editable_selection_pos_get(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERR(0); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return 0; - return sd->selection_pos; -} - -/** - * Moves the selection bound to the start of the editable object - * - * @param editable an editable object - */ -EAPI void -e_editable_selection_move_to_start(Evas_Object *editable) -{ - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if (!editable) - return; - e_editable_selection_pos_set(editable, 0); -} - -/** - * Moves the selection bound to the end of the editable object - * - * @param editable an editable object - */ -EAPI void -e_editable_selection_move_to_end(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - e_editable_selection_pos_set(editable, sd->unicode_length); -} - -/** - * Moves the selection bound backward by one character offset - * - * @param editable an editable object - */ -EAPI void -e_editable_selection_move_left(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - e_editable_selection_pos_set(editable, sd->selection_pos - 1); -} - -/** - * Moves the selection bound forward by one character offset - * - * @param editable an editable object - */ -EAPI void -e_editable_selection_move_right(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - e_editable_selection_pos_set(editable, sd->selection_pos + 1); -} - -/** - * Selects all the text of the editable object. The selection bound will be - * moved to the start of the editable object and the cursor will be moved to - * the end - * - * @param editable an editable object - */ -EAPI void -e_editable_select_all(Evas_Object *editable) -{ - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - e_editable_selection_move_to_start(editable); - e_editable_cursor_move_to_end(editable); -} - -/** - * Unselects all the text of the editable object. The selection bound will be - * moved to the cursor position - * - * @param editable an editable object - */ -EAPI void -e_editable_unselect_all(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - e_editable_selection_pos_set(editable, sd->cursor_pos); -} - -/** - * Selects the word at the provided character index - */ -EAPI void -e_editable_select_word(Evas_Object *editable, int idx) -{ - E_Editable_Smart_Data *sd; - int spos = 0, epos = -1, i = 0, pos = 0; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - if ((idx < 0) || (idx >= sd->unicode_length)) return; - - while (i < sd->char_length) - { - if (sd->text[i] == ' ') - { - if (pos < idx) spos = pos + 1; - else if (pos > idx) - { - epos = pos; - break; - } - } - i = evas_string_char_next_get(sd->text, i, NULL); - pos++; - } - if (epos == -1) epos = pos; - e_editable_selection_pos_set(editable, spos); - e_editable_cursor_pos_set(editable, epos); -} - -/** - * Shows the selection of the editable object - * - * @param editable an editable object - */ -EAPI void -e_editable_selection_show(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - if (sd->selection_visible) return; - sd->selection_visible = 1; - if ((evas_object_visible_get(editable)) && - (sd->cursor_pos != sd->selection_pos)) - evas_object_show(sd->selection_object); -} - -/** - * Hides the selection of the editable object - * - * @param editable an editable object - */ -EAPI void -e_editable_selection_hide(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - if (!sd->selection_visible) return; - sd->selection_visible = 0; - evas_object_hide(sd->selection_object); -} - -/** - * Gets the cursor position at the coords ( @a x, @a y ). It's used to know - * where to place the cursor or the selection bound on mouse evevents. - * - * @param editable an editable object - * @param x the x coord, relative to the editable object - * @param y the y coord, relative to the editable object - * @return Returns the position where to place the cursor according to the - * given coords - */ -EAPI int -e_editable_pos_get_from_coords(Evas_Object *editable, Evas_Coord x, Evas_Coord y) -{ - E_Editable_Smart_Data *sd; - const Evas_Object *text_obj; - Evas_Coord ox, oy; - Evas_Coord tx, ty, tw, th; - Evas_Coord cx, cw; - Evas_Coord canvas_x, canvas_y; - int idx, pos, i, j; - const char *text; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERR(0); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return 0; - if (!(text_obj = edje_object_part_object_get(sd->text_object, "e.text.text"))) - return 0; - - evas_object_geometry_get(editable, &ox, &oy, NULL, NULL); - evas_object_geometry_get(text_obj, &tx, &ty, &tw, &th); - canvas_x = ox + x; - canvas_y = oy + y; - - if ((canvas_y < ty) || (canvas_x < tx)) - pos = 0; - else if ((canvas_y > (ty + th)) || (canvas_x > (tx + tw))) - pos = sd->unicode_length; - else - { - idx = evas_object_text_char_coords_get(text_obj, - canvas_x - tx, canvas_y - ty, - &cx, NULL, &cw, NULL); - text = evas_object_text_text_get(text_obj); - if ((idx >= 0) && (text)) - { - if ((canvas_x - tx) > (cx + (cw / 2))) idx++; - - i = 0; - j = -1; - pos = 0; - while ((i < idx) && (j != i)) - { - pos++; - j = i; - i = evas_string_char_next_get(text, i, NULL); - } - if (pos > sd->unicode_length) pos = sd->unicode_length; - } - else pos = 0; - } - return pos; -} - -/** - * A utility function to get the average size of a character written inside - * the editable object - * - * @param editable an editable object - * @param w the location where to store the average width of a character - * @param h the location where to store the average height of a character - */ -EAPI void -e_editable_char_size_get(Evas_Object *editable, int *w, int *h) -{ - int tw = 0, th = 0; - Evas *evas; - const Evas_Object *text_obj; - Evas_Object *obj; - E_Editable_Smart_Data *sd; - char *text = "Tout est bon dans l'abricot sauf le noyau!" - "Wakey wakey! Eggs and Bakey!"; - const char *font, *font_source; - Evas_Text_Style_Type style; - int font_size; - - if (w) *w = 0; - if (h) *h = 0; - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(evas = evas_object_evas_get(editable)))) - return; - if (!(sd = evas_object_smart_data_get(editable))) return; - if (!(text_obj = edje_object_part_object_get(sd->text_object, "e.text.text"))) - return; - - if ((sd->average_char_w <= 0) || (sd->average_char_h <= 0)) - { - font_source = evas_object_text_font_source_get(text_obj); - evas_object_text_font_get(text_obj, &font, &font_size); - style = evas_object_text_style_get(text_obj); - - obj = evas_object_text_add(evas); - evas_object_scale_set(obj, edje_scale_get()); - evas_object_text_font_source_set(obj, font_source); - evas_object_text_font_set(obj, font, font_size); - evas_object_text_style_set(obj, style); - evas_object_text_text_set(obj, text); - evas_object_geometry_get(obj, NULL, NULL, &tw, &th); - evas_object_del(obj); - sd->average_char_w = (tw / strlen(text)); - sd->average_char_h = th; - } - if (w) *w = sd->average_char_w; - if (h) *h = sd->average_char_h; -} - -EAPI void -e_editable_enable(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - - edje_object_signal_emit(sd->text_object, "e,state,enabled", "e"); -} - -EAPI void -e_editable_disable(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - - if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - - edje_object_signal_emit(sd->text_object, "e,state,disabled", "e"); -} - -/* Private functions */ - -/* A utility function to insert some text inside the editable object. - * It doesn't update the position of the cursor, nor the selection... */ -static int -_e_editable_text_insert(Evas_Object *editable, int pos, const char *text) -{ - E_Editable_Smart_Data *sd; - int char_length = -1, unicode_length = -1; - int prev_char_length, new_char_length, new_unicode_length; - int idx = 0, i = 0; - - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return 0; - if ((!text) || (*text == '\0')) return 0; - - if (pos < 0) pos = 0; - else if (pos > sd->unicode_length) - pos = sd->unicode_length; - - for (i = 0; i != char_length; i = evas_string_char_next_get(text, i, NULL)) - { - char_length = i; - unicode_length++; - } - - for (i = 0; i < pos; i++) - idx = evas_string_char_next_get(sd->text, idx, NULL); - - if ((unicode_length <= 0) || (char_length <= 0)) return 0; - - prev_char_length = sd->char_length; - new_char_length = sd->char_length + char_length; - new_unicode_length = sd->unicode_length + unicode_length; - - if (new_char_length > sd->allocated_length) - { - int new_allocated_length = E_EDITABLE_SIZE_TO_ALLOC(new_char_length); - char *old = sd->text; - - if (sd->password_mode) - { - /* security -- copy contents into new buffer, and overwrite old contents */ - sd->text = malloc(new_allocated_length + 1); - if (!sd->text) - { - sd->text = old; - return 0; - } - if (old) - { - memcpy(sd->text, old, prev_char_length + 1); - memset(old, 0, prev_char_length); - free(old); - } - } - else - { - char *p = realloc(sd->text, new_allocated_length + 1); - if (!p) - { - sd->text = old; - return 0; - } - sd->text = p; - } - sd->allocated_length = new_allocated_length; - } - sd->unicode_length = new_unicode_length; - sd->char_length = new_char_length; - - if (prev_char_length > idx) - memmove(&sd->text[idx + char_length], &sd->text[idx], prev_char_length - idx); - strncpy(&sd->text[idx], text, char_length); - sd->text[sd->char_length] = '\0'; - - _e_editable_text_update(editable); - return unicode_length; -} - -/* A utility function to delete a range of text from the editable object. - * It doesn't update the position of the cursor, nor the selection... */ -static int -_e_editable_text_delete(Evas_Object *editable, int start, int end) -{ - E_Editable_Smart_Data *sd; - int start_id = 0, end_id = 0, i = 0; - - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return 0; - - start = E_CLAMP(start, 0, sd->unicode_length); - end = E_CLAMP(end, 0, sd->unicode_length); - if (end <= start) return 0; - - for (i = 0; i < end; i++) - { - end_id = evas_string_char_next_get(sd->text, end_id, NULL); - if (i < start) start_id = end_id; - } - - if (end_id <= start_id) return 0; - - memmove(&sd->text[start_id], &sd->text[end_id], sd->char_length - end_id); - sd->char_length -= (end_id - start_id); - sd->unicode_length -= (end - start); - sd->text[sd->char_length] = '\0'; - - _e_editable_text_update(editable); - - return end - start; -} - -/* Updates the position of the cursor - * It also updates automatically the text position and the selection */ -static void -_e_editable_cursor_update(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - const Evas_Object *text_obj; - Evas_Coord tx, ty; - Evas_Coord cx, cy, ch; - - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - if (!(text_obj = edje_object_part_object_get(sd->text_object, "e.text.text"))) - return; - - evas_object_geometry_get(text_obj, &tx, &ty, NULL, NULL); - _e_editable_char_geometry_get_from_pos(editable, sd->cursor_pos, - &cx, &cy, NULL, &ch); - - evas_object_move(sd->cursor_object, tx + cx, ty + cy); - evas_object_resize(sd->cursor_object, sd->cursor_width, ch); - - if (sd->cursor_visible && evas_object_visible_get(editable)) - { - evas_object_show(sd->cursor_object); - edje_object_signal_emit(sd->cursor_object, "e,action,show,cursor", "e"); - } - - _e_editable_selection_update(editable); - _e_editable_text_position_update(editable, -1); -} - -/* Updates the selection of the editable object */ -static void -_e_editable_selection_update(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - const Evas_Object *text_obj; - Evas_Coord tx, ty; - Evas_Coord cx, cy; - Evas_Coord sx, sy, sw, sh; - int start_pos, end_pos; - - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - if (!(text_obj = edje_object_part_object_get(sd->text_object, "e.text.text"))) - return; - - if ((sd->cursor_pos == sd->selection_pos) || (!sd->selection_visible)) - evas_object_hide(sd->selection_object); - else - { - evas_object_geometry_get(text_obj, &tx, &ty, NULL, NULL); - start_pos = (sd->cursor_pos <= sd->selection_pos) ? - sd->cursor_pos : sd->selection_pos; - end_pos = (sd->cursor_pos >= sd->selection_pos) ? - sd->cursor_pos : sd->selection_pos; - - _e_editable_char_geometry_get_from_pos(editable, start_pos, - &cx, &cy, NULL, NULL); - sx = tx + cx; - sy = ty + cy; - - _e_editable_char_geometry_get_from_pos(editable, end_pos, - &cx, NULL, NULL, &sh); - sw = tx + cx - sx; - - evas_object_move(sd->selection_object, sx, sy); - evas_object_resize(sd->selection_object, sw, sh); - evas_object_show(sd->selection_object); - } -} - -/* Updates the text of the text object of the editable object - * (it fills it with '*' if the editable is in password mode) - * It does not update the position of the text */ -static void -_e_editable_text_update(Evas_Object *editable) -{ - E_Editable_Smart_Data *sd; - Evas_Coord minw, minh; - - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - - if (sd->password_mode) - { - char *text; - - text = malloc((sd->unicode_length + 1) * sizeof(char)); - if (!text) return; - - memset(text, '*', sd->unicode_length * sizeof(char)); - text[sd->unicode_length] = '\0'; - edje_object_part_text_set(sd->text_object, "e.text.text", text); - free(text); - } - else - edje_object_part_text_set(sd->text_object, "e.text.text", sd->text); - - edje_object_size_min_calc(sd->text_object, &minw, &minh); - evas_object_resize(sd->text_object, minw, minh); -} - -/* Updates the position of the text object according to the position of the - * cursor (we make sure the cursor is visible) */ -static void -_e_editable_text_position_update(Evas_Object *editable, Evas_Coord real_w) -{ - E_Editable_Smart_Data *sd; - Evas_Coord ox, oy, ow; - Evas_Coord tx, ty, tw; - Evas_Coord cx, cy, cw; - Evas_Coord sx, sy; - Evas_Coord offset_x = 0; - - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return; - - evas_object_geometry_get(editable, &ox, &oy, &ow, NULL); - if (real_w >= 0) ow = real_w; - evas_object_geometry_get(sd->text_object, &tx, &ty, &tw, NULL); - evas_object_geometry_get(sd->cursor_object, &cx, &cy, &cw, NULL); - evas_object_geometry_get(sd->selection_object, &sx, &sy, NULL, NULL); - - if (tw <= ow) - offset_x = ox - tx; - else if (cx < (ox + E_EDITABLE_CURSOR_MARGIN)) - offset_x = ox + E_EDITABLE_CURSOR_MARGIN - cx; - else if ((cx + cw + E_EDITABLE_CURSOR_MARGIN) > (ox + ow)) - offset_x = (ox + ow) - (cx + cw + E_EDITABLE_CURSOR_MARGIN); - - if (tw > ow) - { - if ((tx + offset_x) > ox) - offset_x = ox - tx; - else if ((tx + tw + offset_x) < (ox + ow)) - offset_x = (ox + ow) - (tx + tw); - } - - if (offset_x != 0) - { - evas_object_move(sd->text_object, tx + offset_x, ty); - evas_object_move(sd->cursor_object, cx + offset_x, cy); - evas_object_move(sd->selection_object, sx + offset_x, sy); - } -} - -/* Gets the geometry of the char according to its utf-8 pos */ -static int -_e_editable_char_geometry_get_from_pos(Evas_Object *editable, int utf_pos, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) -{ - E_Editable_Smart_Data *sd; - const Evas_Object *text_obj; - const char *text; - Evas_Coord x, w; - int idx = 0, i, last_pos, ret; - - if (cx) *cx = 0; - if (cy) *cy = 0; - if (cw) *cw = 0; - if (ch) *ch = 0; - - if ((!editable) || (!(sd = evas_object_smart_data_get(editable)))) - return 0; - if (!(text_obj = edje_object_part_object_get(sd->text_object, "e.text.text"))) - return 0; - - text = evas_object_text_text_get(text_obj); - if ((!text) || (sd->unicode_length <= 0) || (utf_pos <= 0)) - { - e_editable_char_size_get(editable, cw, ch); - return 1; - } - else - { - if (utf_pos >= sd->unicode_length) - { - utf_pos = sd->unicode_length - 1; - last_pos = 1; - } - else - last_pos = 0; - - for (i = 0; i < utf_pos; i++) - idx = evas_string_char_next_get(text, idx, NULL); - - ret = evas_object_text_char_pos_get(text_obj, idx, &x, cy, &w, ch); - if (cx) *cx = x - 1 + (last_pos ? w : 0); - if (cw) *cw = last_pos ? 1 : w; - return ret; - } -} - -/* Editable object's smart methods */ - -static void -_e_editable_smart_add(Evas_Object *object) -{ - Evas *evas; - E_Editable_Smart_Data *sd; - Evas_Coord ox, oy; - - if ((!object) || !(evas = evas_object_evas_get(object))) - return; - - sd = malloc(sizeof(E_Editable_Smart_Data)); - if (!sd) return; - - _e_editable_smart_use++; - evas_object_smart_data_set(object, sd); - evas_object_geometry_get(object, &ox, &oy, NULL, NULL); - - sd->text = malloc((E_EDITABLE_BLOCK_SIZE + 1) * sizeof(char)); - if (!sd->text) return; - - sd->text[0] = '\0'; - sd->char_length = 0; - sd->unicode_length = 0; - sd->allocated_length = E_EDITABLE_BLOCK_SIZE; - - sd->cursor_width = 1; - sd->selection_on_fg = 0; - sd->average_char_w = -1; - sd->average_char_h = -1; - - sd->cursor_pos = 0; - sd->cursor_visible = 1; - sd->selection_pos = 0; - sd->selection_visible = 1; - sd->password_mode = 0; - - sd->clip_object = evas_object_rectangle_add(evas); - evas_object_move(sd->clip_object, ox, oy); - evas_object_smart_member_add(sd->clip_object, object); - - sd->event_object = evas_object_rectangle_add(evas); - evas_object_color_set(sd->event_object, 0, 0, 0, 0); - evas_object_clip_set(sd->event_object, sd->clip_object); - evas_object_move(sd->event_object, ox, oy); - evas_object_smart_member_add(sd->event_object, object); - - sd->text_object = edje_object_add(evas); - evas_object_pass_events_set(sd->text_object, 1); - evas_object_clip_set(sd->text_object, sd->clip_object); - evas_object_move(sd->text_object, ox, oy); - evas_object_smart_member_add(sd->text_object, object); - - sd->selection_object = edje_object_add(evas); - evas_object_pass_events_set(sd->selection_object, 1); - evas_object_clip_set(sd->selection_object, sd->clip_object); - evas_object_move(sd->selection_object, ox, oy); - evas_object_smart_member_add(sd->selection_object, object); - - sd->cursor_object = edje_object_add(evas); - evas_object_pass_events_set(sd->cursor_object, 1); - evas_object_clip_set(sd->cursor_object, sd->clip_object); - evas_object_move(sd->cursor_object, ox, oy); - evas_object_smart_member_add(sd->cursor_object, object); - - _e_editable_cursor_update(object); -} - -/* Deletes the editable */ -static void -_e_editable_smart_del(Evas_Object *object) -{ - E_Editable_Smart_Data *sd; - - if ((!object) || (!(sd = evas_object_smart_data_get(object)))) - return; - - evas_object_del(sd->clip_object); - evas_object_del(sd->event_object); - evas_object_del(sd->text_object); - evas_object_del(sd->cursor_object); - evas_object_del(sd->selection_object); - /* Security - clear out memory that contained a password */ - if (sd->password_mode) memset(sd->text, 0, sd->char_length); - free(sd->text); - free(sd); - - _e_editable_smart_use--; - if (_e_editable_smart_use <= 0) - { - evas_smart_free(_e_editable_smart); - _e_editable_smart = NULL; - } -} - -/* Moves the editable object */ -static void -_e_editable_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y) -{ - E_Editable_Smart_Data *sd; - Evas_Coord prev_x, prev_y; - Evas_Coord ox, oy; - - if ((!object) || (!(sd = evas_object_smart_data_get(object)))) - return; - - evas_object_geometry_get(object, &prev_x, &prev_y, NULL, NULL); - evas_object_move(sd->clip_object, x, y); - evas_object_move(sd->event_object, x, y); - evas_object_geometry_get(sd->text_object, &ox, &oy, NULL, NULL); - evas_object_move(sd->text_object, ox + (x - prev_x), oy + (y - prev_y)); - evas_object_geometry_get(sd->cursor_object, &ox, &oy, NULL, NULL); - evas_object_move(sd->cursor_object, ox + (x - prev_x), oy + (y - prev_y)); - evas_object_geometry_get(sd->selection_object, &ox, &oy, NULL, NULL); - evas_object_move(sd->selection_object, ox + (x - prev_x), oy + (y - prev_y)); -} - -/* Resizes the editable object */ -static void -_e_editable_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h) -{ - E_Editable_Smart_Data *sd; - - if ((!object) || (!(sd = evas_object_smart_data_get(object)))) - return; - - evas_object_resize(sd->clip_object, w, h); - evas_object_resize(sd->event_object, w, h); - _e_editable_text_position_update(object, w); -} - -/* Shows the editable object */ -static void -_e_editable_smart_show(Evas_Object *object) -{ - E_Editable_Smart_Data *sd; - - if ((!object) || (!(sd = evas_object_smart_data_get(object)))) - return; - - evas_object_show(sd->clip_object); - evas_object_show(sd->event_object); - evas_object_show(sd->text_object); - - if (sd->cursor_visible) - { - evas_object_show(sd->cursor_object); - edje_object_signal_emit(sd->cursor_object, "e,action,show,cursor", "e"); - } - - if ((sd->selection_visible) && (sd->cursor_pos != sd->selection_pos)) - evas_object_show(sd->selection_object); -} - -/* Hides the editable object */ -static void -_e_editable_smart_hide(Evas_Object *object) -{ - E_Editable_Smart_Data *sd; - - if ((!object) || (!(sd = evas_object_smart_data_get(object)))) - return; - - evas_object_hide(sd->clip_object); - evas_object_hide(sd->event_object); - evas_object_hide(sd->text_object); - evas_object_hide(sd->cursor_object); - evas_object_hide(sd->selection_object); -} - -/* Changes the color of the editable object */ -static void -_e_editable_color_set(Evas_Object *object, int r, int g, int b, int a) -{ - E_Editable_Smart_Data *sd; - - if ((!object) || (!(sd = evas_object_smart_data_get(object)))) - return; - evas_object_color_set(sd->clip_object, r, g, b, a); -} - -/* Clips the editable object against "clip" */ -static void -_e_editable_clip_set(Evas_Object *object, Evas_Object *clip) -{ - E_Editable_Smart_Data *sd; - - if ((!object) || (!(sd = evas_object_smart_data_get(object)))) - return; - evas_object_clip_set(sd->clip_object, clip); -} - -/* Unclips the editable object */ -static void -_e_editable_clip_unset(Evas_Object *object) -{ - E_Editable_Smart_Data *sd; - - if ((!object) || (!(sd = evas_object_smart_data_get(object)))) - return; - evas_object_clip_unset(sd->clip_object); -} - diff --git a/src/bin/e_editable.h b/src/bin/e_editable.h deleted file mode 100644 index 11543edce..000000000 --- a/src/bin/e_editable.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifdef E_TYPEDEFS -#else -#ifndef E_EDITABLE_H -#define E_EDITABLE_H - -EAPI Evas_Object *e_editable_add (Evas *evas); -EAPI void e_editable_theme_set (Evas_Object *editable, const char *category, const char *group); -EAPI void e_editable_password_set (Evas_Object *editable, int password_mode); -EAPI int e_editable_password_get (Evas_Object *editable); - -EAPI void e_editable_text_set (Evas_Object *editable, const char *text); -EAPI const char *e_editable_text_get (Evas_Object *editable); -EAPI char *e_editable_text_range_get (Evas_Object *editable, int start, int end); -EAPI int e_editable_text_length_get (Evas_Object *editable); -EAPI int e_editable_insert (Evas_Object *editable, int pos, const char *text); -EAPI int e_editable_delete (Evas_Object *editable, int start, int end); - -EAPI void e_editable_cursor_pos_set (Evas_Object *editable, int pos); -EAPI int e_editable_cursor_pos_get (Evas_Object *editable); -EAPI void e_editable_cursor_geometry_get (Evas_Object *editable, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch); -EAPI void e_editable_cursor_move_to_start (Evas_Object *editable); -EAPI void e_editable_cursor_move_to_end (Evas_Object *editable); -EAPI void e_editable_cursor_move_left (Evas_Object *editable); -EAPI void e_editable_cursor_move_right (Evas_Object *editable); -EAPI void e_editable_cursor_show (Evas_Object *editable); -EAPI void e_editable_cursor_hide (Evas_Object *editable); - -EAPI void e_editable_selection_pos_set (Evas_Object *editable, int pos); -EAPI int e_editable_selection_pos_get (Evas_Object *editable); -EAPI void e_editable_selection_move_to_start (Evas_Object *editable); -EAPI void e_editable_selection_move_to_end (Evas_Object *editable); -EAPI void e_editable_selection_move_left (Evas_Object *editable); -EAPI void e_editable_selection_move_right (Evas_Object *editable); -EAPI void e_editable_select_all (Evas_Object *editable); -EAPI void e_editable_unselect_all (Evas_Object *editable); -EAPI void e_editable_select_word (Evas_Object *editable, int index); -EAPI void e_editable_selection_show (Evas_Object *editable); -EAPI void e_editable_selection_hide (Evas_Object *editable); - -EAPI int e_editable_pos_get_from_coords (Evas_Object *editable, Evas_Coord x, Evas_Coord y); -EAPI void e_editable_char_size_get (Evas_Object *editable, int *w, int *h); - -EAPI void e_editable_enable (Evas_Object *entry); -EAPI void e_editable_disable (Evas_Object *entry); - -#endif -#endif diff --git a/src/bin/e_entry.c b/src/bin/e_entry.c index a16126ea3..39ce3f85d 100644 --- a/src/bin/e_entry.c +++ b/src/bin/e_entry.c @@ -1,45 +1,32 @@ #include "e.h" -#ifdef HAVE_ECORE_IMF -#include -#include -#endif +#define ENTRY_PART_NAME "e.text.text" typedef struct _E_Entry_Smart_Data E_Entry_Smart_Data; struct _E_Entry_Smart_Data { Evas_Object *entry_object; - Evas_Object *editable_object; + Evas_Object *scroll_object; E_Menu *popup; Ecore_Event_Handler *selection_handler; -#ifdef HAVE_ECORE_IMF - Ecore_IMF_Context *imf_context; -#endif int enabled; int focused; - int selection_dragging; - int selection_mode; - float valign; int min_width; int height; + Evas_Coord theme_width; + Evas_Coord theme_height; int preedit_start_pos; int preedit_end_pos; + Eina_Bool password_mode : 1; Eina_Bool have_preedit : 1; }; /* local subsystem functions */ -static void _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _e_entry_key_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _e_entry_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _e_entry_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _e_entry_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static Eina_Bool _e_entry_x_selection_notify_handler(void *data, int type, void *event); static void _e_entry_x_selection_update(Evas_Object *entry); -static void _e_entry_key_down_windows(Evas_Object *entry, Evas_Event_Key_Down *event); -static void _e_entry_key_down_emacs(Evas_Object *entry, Evas_Event_Key_Down *event); static void _e_entry_smart_add(Evas_Object *object); static void _e_entry_smart_del(Evas_Object *object); @@ -55,20 +42,11 @@ static void _e_entry_cb_cut(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_entry_cb_copy(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_entry_cb_paste(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_entry_cb_select_all(void *data, E_Menu *m, E_Menu_Item *mi); -static void _e_entry_cb_delete(void *data, E_Menu *m, E_Menu_Item *mi); -static void _e_entry_imf_cursor_info_set(Evas_Object *object); -static void _e_entry_imf_context_reset(Evas_Object *object); -#ifdef HAVE_ECORE_IMF -static Eina_Bool _e_entry_cb_imf_retrieve_surrounding(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos); -static void _e_entry_cb_imf_event_commit(void *data, Ecore_IMF_Context *ctx __UNUSED__, void *event_info); -static void _e_entry_cb_imf_event_preedit_changed(void *data, Ecore_IMF_Context *ctx __UNUSED__, void *event_info); -static void _e_entry_cb_imf_event_delete_surrounding(void *data, Ecore_IMF_Context *ctx __UNUSED__, void *event_info); -#endif +static void _e_entry_cb_delete(void *data, E_Menu *m , E_Menu_Item *mi ); /* local subsystem globals */ static Evas_Smart *_e_entry_smart = NULL; static int _e_entry_smart_use = 0; -static int _e_entry_emacs_keybindings = 0; /* externally accessible functions */ @@ -131,7 +109,7 @@ e_entry_text_set(Evas_Object *entry, const char *text) if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) return; - e_editable_text_set(sd->editable_object, text); + edje_object_part_text_set(sd->entry_object, ENTRY_PART_NAME, text); evas_object_smart_callback_call(entry, "changed", NULL); } @@ -149,7 +127,7 @@ e_entry_text_get(Evas_Object *entry) if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERR(NULL); if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) return NULL; - return e_editable_text_get(sd->editable_object); + return edje_object_part_text_get(sd->entry_object, ENTRY_PART_NAME); } /** @@ -165,22 +143,20 @@ e_entry_clear(Evas_Object *entry) } /** - * Gets the editable object used by the entry object. It will allow you to have - * better control on the text, the cursor or the selection of the entry with - * the e_editable_*() functions. + * Selects all the text of the entry. * * @param entry an entry object - * @return Returns the editable object used by the entry object */ -EAPI Evas_Object * -e_entry_editable_object_get(Evas_Object *entry) +EAPI void +e_entry_select_all(Evas_Object *entry) { E_Entry_Smart_Data *sd; - if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERR(NULL); + if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERRNR(); if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) - return NULL; - return sd->editable_object; + return; + + _e_entry_cb_select_all(sd, NULL, NULL); } /** @@ -198,13 +174,14 @@ e_entry_password_set(Evas_Object *entry, int password_mode) if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERRNR(); if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) return; - e_editable_password_set(sd->editable_object, password_mode); -#ifdef HAVE_ECORE_IMF - if (sd->imf_context) - ecore_imf_context_input_mode_set(sd->imf_context, - password_mode ? ECORE_IMF_INPUT_MODE_FULL & ECORE_IMF_INPUT_MODE_INVISIBLE : - ECORE_IMF_INPUT_MODE_FULL); -#endif + if (sd->password_mode == password_mode) + return; + + sd->password_mode = !!password_mode; + if (!sd->password_mode) + e_theme_edje_object_set(sd->entry_object, "base/theme/widgets", "e/widgets/entry/text"); + else + e_theme_edje_object_set(sd->entry_object, "base/theme/widgets", "e/widgets/entry/password"); } /** @@ -223,8 +200,8 @@ e_entry_size_min_get(Evas_Object *entry, Evas_Coord *minw, Evas_Coord *minh) if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) return; - if (minw) *minw = sd->min_width; - if (minh) *minh = sd->height; + if (minw) *minw = sd->theme_width + sd->min_width; + if (minh) *minh = sd->theme_height + sd->height; } /** @@ -245,23 +222,12 @@ e_entry_focus(Evas_Object *entry) if (sd->focused) return; - evas_object_focus_set(entry, 1); + evas_object_focus_set(sd->entry_object, EINA_TRUE); edje_object_signal_emit(sd->entry_object, "e,state,focused", "e"); - if (!sd->selection_dragging) - { - _e_entry_imf_context_reset(entry); - e_editable_cursor_move_to_end(sd->editable_object); - _e_entry_imf_cursor_info_set(entry); - e_editable_selection_move_to_end(sd->editable_object); - } + edje_object_part_text_cursor_end_set(sd->entry_object, ENTRY_PART_NAME, EDJE_CURSOR_MAIN); if (sd->enabled) - e_editable_cursor_show(sd->editable_object); - e_editable_selection_show(sd->editable_object); -#ifdef HAVE_ECORE_IMF - if (sd->imf_context) - ecore_imf_context_focus_in(sd->imf_context); -#endif + edje_object_signal_emit(sd->entry_object, "e,action,show,cursor", "e"); sd->focused = 1; } @@ -283,17 +249,9 @@ e_entry_unfocus(Evas_Object *entry) if (!sd->focused) return; - evas_object_focus_set(entry, 0); edje_object_signal_emit(sd->entry_object, "e,state,unfocused", "e"); - e_editable_cursor_hide(sd->editable_object); - e_editable_selection_hide(sd->editable_object); -#ifdef HAVE_ECORE_IMF - if (sd->imf_context) - { - ecore_imf_context_reset(sd->imf_context); - ecore_imf_context_focus_out(sd->imf_context); - } -#endif + evas_object_focus_set(sd->entry_object, EINA_FALSE); + edje_object_signal_emit(sd->entry_object, "e,action,hide,cursor", "e"); sd->focused = 0; } @@ -313,10 +271,11 @@ e_entry_enable(Evas_Object *entry) if (sd->enabled) return; + edje_object_signal_emit(e_scrollframe_edje_object_get(sd->scroll_object), + "e,state,enabled", "e"); edje_object_signal_emit(sd->entry_object, "e,state,enabled", "e"); - e_editable_enable(sd->editable_object); if (sd->focused) - e_editable_cursor_show(sd->editable_object); + edje_object_signal_emit(sd->entry_object, "e,action,show,cursor", "e"); sd->enabled = 1; } @@ -337,69 +296,36 @@ e_entry_disable(Evas_Object *entry) if (!sd->enabled) return; + edje_object_signal_emit(e_scrollframe_edje_object_get(sd->scroll_object), + "e,state,disabled", "e"); edje_object_signal_emit(sd->entry_object, "e,state,disabled", "e"); - e_editable_disable(sd->editable_object); - e_editable_cursor_hide(sd->editable_object); + edje_object_signal_emit(sd->entry_object, "e,action,hide,cursor", "e"); sd->enabled = 0; } /* Private functions */ -/* Called when a key has been pressed by the user */ -static void -_e_entry_key_down_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) +static Eina_Bool +_e_entry_is_empty(const Evas_Object *entry_edje) { - E_Entry_Smart_Data *sd; + const Evas_Object *tb; + Evas_Textblock_Cursor *cur; + Eina_Bool ret; - if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) - return; + /* It's a hack until we get the support suggested above. We just + * create a cursor, point it to the begining, and then try to + * advance it, if it can advance, the tb is not empty, otherwise it + * is. */ + tb = edje_object_part_object_get(entry_edje, ENTRY_PART_NAME); -#ifdef HAVE_ECORE_IMF - if (sd->imf_context) - { - Ecore_IMF_Event_Key_Down ev; + cur = evas_object_textblock_cursor_new((Evas_Object *)tb); + evas_textblock_cursor_pos_set(cur, 0); + ret = evas_textblock_cursor_char_next(cur); + evas_textblock_cursor_free(cur); - ecore_imf_evas_event_key_down_wrap(event_info, &ev); - if (ecore_imf_context_filter_event(sd->imf_context, - ECORE_IMF_EVENT_KEY_DOWN, - (Ecore_IMF_Event *) &ev)) - return; - } -#endif + return !ret; - if (_e_entry_emacs_keybindings) - _e_entry_key_down_emacs(obj, event_info); - else - _e_entry_key_down_windows(obj, event_info); -} - -/* Called when a key has been released by the user */ -#ifdef HAVE_ECORE_IMF -static void -_e_entry_key_up_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) -#else -static void -_e_entry_key_up_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) -#endif -{ - E_Entry_Smart_Data *sd; - - if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) - return; - -#ifdef HAVE_ECORE_IMF - if (sd->imf_context) - { - Ecore_IMF_Event_Key_Up ev; - - ecore_imf_evas_event_key_up_wrap(event_info, &ev); - if (ecore_imf_context_filter_event(sd->imf_context, - ECORE_IMF_EVENT_KEY_UP, - (Ecore_IMF_Event *) &ev)) - return; - } -#endif } /* Called when the entry object is pressed by the mouse */ @@ -408,85 +334,24 @@ _e_entry_mouse_down_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *o { E_Entry_Smart_Data *sd; Evas_Event_Mouse_Down *event; - Evas_Coord ox, oy; - int pos; if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) return; if (!(event = event_info)) return; -#ifdef HAVE_ECORE_IMF - if (sd->imf_context) - { - Ecore_IMF_Event_Mouse_Down ev; - - ecore_imf_evas_event_mouse_down_wrap(event_info, &ev); - if (ecore_imf_context_filter_event(sd->imf_context, - ECORE_IMF_EVENT_MOUSE_DOWN, - (Ecore_IMF_Event *) &ev)) - return; - } -#endif - - _e_entry_imf_context_reset(obj); - - evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL); - pos = e_editable_pos_get_from_coords(sd->editable_object, - event->canvas.x - ox, - event->canvas.y - oy); - - if (event->button == 1) - { - if (event->flags & EVAS_BUTTON_TRIPLE_CLICK) - { - e_editable_select_all(sd->editable_object); - _e_entry_x_selection_update(obj); - } - else if (event->flags & EVAS_BUTTON_DOUBLE_CLICK) - { - e_editable_select_word(sd->editable_object, pos); - _e_entry_x_selection_update(obj); - } - else - { - e_editable_cursor_pos_set(sd->editable_object, pos); - if (!evas_key_modifier_is_set(event->modifiers, "Shift")) - e_editable_selection_pos_set(sd->editable_object, pos); - - sd->selection_dragging = 1; - } - } - else if (event->button == 2) - { - E_Win *win; - - e_editable_cursor_pos_set(sd->editable_object, pos); - e_editable_selection_pos_set(sd->editable_object, pos); - - if ((win = e_win_evas_object_win_get(obj))) - ecore_x_selection_primary_request(win->evas_win, - ECORE_X_SELECTION_TARGET_UTF8_STRING); - } - else if (event->button == 3) + if (event->button == 3) { E_Menu_Item *mi; E_Manager *man; E_Container *con; - int x, y; - int cursor_pos, selection_pos; - int start_pos, end_pos; - int s_enabled, s_selecting, s_empty, s_passwd; + Evas_Coord x, y; + int s_enabled, s_selecting, s_passwd, s_empty; - cursor_pos = e_editable_cursor_pos_get(sd->editable_object); - selection_pos = e_editable_selection_pos_get(sd->editable_object); - start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; - end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; - - s_selecting = (start_pos != end_pos); + s_selecting = !!edje_object_part_text_selection_get(sd->entry_object, ENTRY_PART_NAME); s_enabled = sd->enabled; - s_empty = !e_editable_text_length_get(sd->editable_object); - s_passwd = e_editable_password_get(sd->editable_object); + s_passwd = sd->password_mode; + s_empty = _e_entry_is_empty(sd->entry_object); if (!s_selecting && !s_enabled && s_empty) return; @@ -548,81 +413,6 @@ _e_entry_mouse_down_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *o x, y, 1, 1, E_MENU_POP_DIRECTION_DOWN, event->timestamp); } - - _e_entry_imf_cursor_info_set(obj); -} - -/* Called when the entry object is released by the mouse */ -#ifdef HAVE_ECORE_IMF -static void -_e_entry_mouse_up_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) -#else -static void -_e_entry_mouse_up_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) -#endif -{ - E_Entry_Smart_Data *sd; - - if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) - return; - -#ifdef HAVE_ECORE_IMF - if (sd->imf_context) - { - Ecore_IMF_Event_Mouse_Up ev; - - ecore_imf_evas_event_mouse_up_wrap(event_info, &ev); - if (ecore_imf_context_filter_event(sd->imf_context, - ECORE_IMF_EVENT_MOUSE_UP, - (Ecore_IMF_Event *) &ev)) - return; - } -#endif - - if (sd->selection_dragging) - { - sd->selection_dragging = 0; - _e_entry_x_selection_update(obj); - } -} - -/* Called when the mouse moves over the entry object */ -static void -_e_entry_mouse_move_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) -{ - E_Entry_Smart_Data *sd; - Evas_Event_Mouse_Move *event; - Evas_Coord ox, oy; - int pos; - - if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) - return; - if (!(event = event_info)) - return; - -#ifdef HAVE_ECORE_IMF - if (sd->imf_context) - { - Ecore_IMF_Event_Mouse_Move ev; - - ecore_imf_evas_event_mouse_move_wrap(event_info, &ev); - if (ecore_imf_context_filter_event(sd->imf_context, - ECORE_IMF_EVENT_MOUSE_MOVE, - (Ecore_IMF_Event *) &ev)) - return; - } -#endif - - if (sd->selection_dragging) - { - evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL); - pos = e_editable_pos_get_from_coords(sd->editable_object, - event->cur.canvas.x - ox, - event->cur.canvas.y - oy); - _e_entry_imf_context_reset(obj); - e_editable_cursor_pos_set(sd->editable_object, pos); - _e_entry_imf_cursor_info_set(obj); - } } /* Called when the the "selection_notify" event is emitted */ @@ -632,42 +422,33 @@ _e_entry_x_selection_notify_handler(void *data, int type __UNUSED__, void *event Evas_Object *entry; E_Entry_Smart_Data *sd; Ecore_X_Event_Selection_Notify *ev; - Evas_Object *editable; - int cursor_pos, selection_pos; - int start_pos, end_pos; - int selecting; - int changed = 0; if ((!(entry = data)) || (!(sd = evas_object_smart_data_get(entry)))) return 1; if (!sd->focused) return 1; - editable = sd->editable_object; - cursor_pos = e_editable_cursor_pos_get(editable); - selection_pos = e_editable_selection_pos_get(editable); - start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; - end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; - selecting = (start_pos != end_pos); - ev = event; - if ((ev->selection == ECORE_X_SELECTION_CLIPBOARD) || - (ev->selection == ECORE_X_SELECTION_PRIMARY)) + if (((ev->selection == ECORE_X_SELECTION_CLIPBOARD) || + (ev->selection == ECORE_X_SELECTION_PRIMARY)) && + (strcmp(ev->target, ECORE_X_SELECTION_TARGET_UTF8_STRING) == 0)) { - if (strcmp(ev->target, ECORE_X_SELECTION_TARGET_UTF8_STRING) == 0) - { - Ecore_X_Selection_Data_Text *text_data; + Ecore_X_Selection_Data_Text *text_data; - text_data = ev->data; - if (selecting && !_e_entry_emacs_keybindings) - changed |= e_editable_delete(editable, start_pos, end_pos); - changed |= e_editable_insert(editable, start_pos, text_data->text); + text_data = ev->data; + if ((text_data->data.content == ECORE_X_SELECTION_CONTENT_TEXT) && + (text_data->text)) + { + char *txt = evas_textblock_text_utf8_to_markup(NULL, text_data->text); + if (txt) + { + edje_object_part_text_user_insert(sd->entry_object, + ENTRY_PART_NAME, txt); + free(txt); + } } } - if (changed) - evas_object_smart_callback_call(entry, "changed", NULL); - return ECORE_CALLBACK_PASS_ON; } @@ -676,348 +457,137 @@ static void _e_entry_x_selection_update(Evas_Object *entry) { E_Entry_Smart_Data *sd; - Evas_Object *editable; E_Win *win; - int cursor_pos, selection_pos; - int start_pos, end_pos; - int selecting; - char *text; - + const char *text; if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) return; if (!(win = e_win_evas_object_win_get(entry))) return; - editable = sd->editable_object; - if (e_editable_password_get(editable)) return; - - cursor_pos = e_editable_cursor_pos_get(editable); - selection_pos = e_editable_selection_pos_get(editable); - start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; - end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; - selecting = (start_pos != end_pos); - - if ((!selecting) || - (!(text = e_editable_text_range_get(editable, start_pos, end_pos)))) - return; + if (sd->password_mode) + return; + text = edje_object_part_text_selection_get(sd->entry_object, ENTRY_PART_NAME); ecore_x_selection_primary_set(win->evas_win, text, strlen(text) + 1); - free(text); } -/* Treats the "key down" event to mimick the behavior of Windows/Gtk2/Qt */ static void -_e_entry_key_down_windows(Evas_Object *entry, Evas_Event_Key_Down *event) +_entry_paste_request_signal_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission, + const char *source EINA_UNUSED) { - E_Entry_Smart_Data *sd; - Evas_Object *editable; - int cursor_pos, selection_pos; - int start_pos, end_pos; - int selecting; - int changed = 0; - int selection_changed = 0; - char *range; E_Win *win; + if (!(win = e_win_evas_object_win_get(data))) + return; - if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) - return; - if ((!event) || (!event->keyname)) - return; - - editable = sd->editable_object; - cursor_pos = e_editable_cursor_pos_get(editable); - selection_pos = e_editable_selection_pos_get(editable); - start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; - end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; - selecting = (start_pos != end_pos); - - if ((!strcmp(event->key, "Escape")) || - (!strcmp(event->key, "Return")) || (!strcmp(event->key, "KP_Enter"))) - _e_entry_imf_context_reset(entry); - - /* Move the cursor/selection to the left */ - if (strcmp(event->key, "Left") == 0 || - ((strcmp(event->key, "KP_Left") == 0) && (!event->string))) + if (emission[sizeof("ntry,paste,request,")] == '1') { - if (evas_key_modifier_is_set(event->modifiers, "Shift")) - { - e_editable_cursor_move_left(editable); - selection_changed = 1; - } - else if (selecting) - { - if (cursor_pos < selection_pos) - e_editable_selection_pos_set(editable, cursor_pos); - else - e_editable_cursor_pos_set(editable, selection_pos); - } - else - { - e_editable_cursor_move_left(editable); - e_editable_selection_pos_set(editable, - e_editable_cursor_pos_get(editable)); - } + ecore_x_selection_primary_request(win->evas_win, + ECORE_X_SELECTION_TARGET_UTF8_STRING); } - /* Move the cursor/selection to the right */ - else if (strcmp(event->key, "Right") == 0 || - ((strcmp(event->key, "KP_Right") == 0) && (!event->string))) + else { - if (evas_key_modifier_is_set(event->modifiers, "Shift")) - { - e_editable_cursor_move_right(editable); - selection_changed = 1; - } - else if (selecting) - { - if (cursor_pos > selection_pos) - e_editable_selection_pos_set(editable, cursor_pos); - else - e_editable_cursor_pos_set(editable, selection_pos); - } - else - { - e_editable_cursor_move_right(editable); - e_editable_selection_pos_set(editable, - e_editable_cursor_pos_get(editable)); - } + ecore_x_selection_clipboard_request(win->evas_win, + ECORE_X_SELECTION_TARGET_UTF8_STRING); } - /* Move the cursor/selection to the start of the entry */ - else if (strcmp(event->keyname, "Home") == 0 || - ((strcmp(event->key, "KP_Home") == 0) && (!event->string))) - { - e_editable_cursor_move_to_start(editable); - if (!evas_key_modifier_is_set(event->modifiers, "Shift")) - e_editable_selection_pos_set(editable, - e_editable_cursor_pos_get(editable)); - else - selection_changed = 1; - } - /* Move the cursor/selection to the end of the entry */ - else if (strcmp(event->keyname, "End") == 0 || - ((strcmp(event->key, "KP_End") == 0) && (!event->string))) - { - e_editable_cursor_move_to_end(editable); - if (!evas_key_modifier_is_set(event->modifiers, "Shift")) - e_editable_selection_pos_set(editable, - e_editable_cursor_pos_get(editable)); - else - selection_changed = 1; - } - /* Delete the previous character */ - else if ((sd->enabled) && (strcmp(event->keyname, "BackSpace") == 0)) - { - if (selecting) - changed = e_editable_delete(editable, start_pos, end_pos); - else - changed = e_editable_delete(editable, cursor_pos - 1, cursor_pos); - } - /* Delete the next character */ - else if ((sd->enabled) && ((strcmp(event->keyname, "Delete") == 0) || - ((strcmp(event->key, "KP_Delete") == 0) && (!event->string)))) - { - if (selecting) - changed = e_editable_delete(editable, start_pos, end_pos); - else - changed = e_editable_delete(editable, cursor_pos, cursor_pos + 1); - } - /* Ctrl + A,C,X,V */ - else if (evas_key_modifier_is_set(event->modifiers, "Control")) - { - if (strcmp(event->keyname, "a") == 0) - { - e_editable_select_all(editable); - selection_changed = 1; - } - else if ((strcmp(event->keyname, "x") == 0) || - (strcmp(event->keyname, "c") == 0)) - { - if (!e_editable_password_get(editable) && selecting) - { - range = e_editable_text_range_get(editable, start_pos, end_pos); - if (range) - { - if ((win = e_win_evas_object_win_get(entry))) - ecore_x_selection_clipboard_set(win->evas_win, - range, - strlen(range) + 1); - free(range); - } - if ((sd->enabled) && (strcmp(event->keyname, "x") == 0)) - changed = e_editable_delete(editable, start_pos, end_pos); - } - } - else if ((sd->enabled) && (strcmp(event->keyname, "v") == 0)) - { - if ((win = e_win_evas_object_win_get(entry))) - ecore_x_selection_clipboard_request(win->evas_win, - ECORE_X_SELECTION_TARGET_UTF8_STRING); - } - } - /* Otherwise, we insert the corresponding character */ - else if ((event->string) && ((sd->enabled)) && - ((strlen(event->string) != 1) || (event->string[0] >= 0x20))) - { - if (selecting) - changed |= e_editable_delete(editable, start_pos, end_pos); - changed |= e_editable_insert(editable, start_pos, event->string); - } - - _e_entry_imf_cursor_info_set(entry); - - if (changed) - evas_object_smart_callback_call(entry, "changed", NULL); - if (selection_changed) - _e_entry_x_selection_update(entry); } -/* Treats the "key down" event to mimick the behavior of Emacs */ static void -_e_entry_key_down_emacs(Evas_Object *entry, Evas_Event_Key_Down *event) +_entry_selection_changed_signal_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + _e_entry_x_selection_update(data); +} + +static void +_entry_selection_all_signal_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + e_entry_select_all(data); +} + +static void +_entry_copy_notify_signal_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) { E_Entry_Smart_Data *sd; - Evas_Object *editable; - int cursor_pos, selection_pos; - int start_pos, end_pos; - int selecting; - int changed = 0; - int selection_changed = 0; - char *range; - E_Win *win; - if ((!entry) || (!(sd = evas_object_smart_data_get(entry)))) - return; - if ((!event) || (!event->keyname)) + if ((!data) || !(sd = evas_object_smart_data_get(data))) return; - editable = sd->editable_object; - cursor_pos = e_editable_cursor_pos_get(editable); - selection_pos = e_editable_selection_pos_get(editable); - start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; - end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; - selecting = (start_pos != end_pos); + _e_entry_cb_copy(sd, NULL, NULL); +} - if ((!strcmp(event->key, "Escape")) || - (!strcmp(event->key, "Return")) || (!strcmp(event->key, "KP_Enter"))) - _e_entry_imf_context_reset(entry); +static void +_entry_cut_notify_signal_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + E_Entry_Smart_Data *sd; - /* Move the cursor/selection to the left */ - if ((strcmp(event->key, "Left") == 0) || - ((evas_key_modifier_is_set(event->modifiers, "Control")) && - (strcmp(event->key, "b") == 0))) - { - e_editable_cursor_move_left(editable); - if (sd->selection_mode) - selection_changed = 1; - else - e_editable_selection_pos_set(editable, - e_editable_cursor_pos_get(editable)); - } - /* Move the cursor/selection to the right */ - else if ((strcmp(event->key, "Right") == 0) || - ((evas_key_modifier_is_set(event->modifiers, "Control")) && - (strcmp(event->key, "f") == 0))) - { - e_editable_cursor_move_right(editable); - if (sd->selection_mode) - selection_changed = 1; - else - e_editable_selection_pos_set(editable, - e_editable_cursor_pos_get(editable)); - } - /* Move the cursor/selection to the start of the entry */ - else if ((strcmp(event->keyname, "Home") == 0) || - ((evas_key_modifier_is_set(event->modifiers, "Control")) && - (strcmp(event->key, "a") == 0))) - { - e_editable_cursor_move_to_start(editable); - if (sd->selection_mode) - selection_changed = 1; - else - e_editable_selection_pos_set(editable, - e_editable_cursor_pos_get(editable)); - } - /* Move the cursor/selection to the end of the entry */ - else if ((strcmp(event->keyname, "End") == 0) || - ((evas_key_modifier_is_set(event->modifiers, "Control")) && - (strcmp(event->key, "e") == 0))) - { - e_editable_cursor_move_to_end(editable); - if (sd->selection_mode) - selection_changed = 1; - else - e_editable_selection_pos_set(editable, - e_editable_cursor_pos_get(editable)); - } - /* Delete the previous character */ - else if ((sd->enabled) && (strcmp(event->keyname, "BackSpace") == 0)) - changed = e_editable_delete(editable, cursor_pos - 1, cursor_pos); - /* Delete the next character */ - else if ((sd->enabled) && - ((evas_key_modifier_is_set(event->modifiers, "Control")) && - (strcmp(event->key, "d") == 0))) - changed = e_editable_delete(editable, cursor_pos, cursor_pos + 1); - /* Delete until end of line */ - else if ((sd->enabled) && - ((evas_key_modifier_is_set(event->modifiers, "Control")) && - (strcmp(event->key, "k") == 0))) - changed = e_editable_delete(editable, cursor_pos, - e_editable_text_length_get(editable)); - /* Toggle the selection mode */ - else if ((evas_key_modifier_is_set(event->modifiers, "Control")) && - (strcmp(event->key, "space") == 0)) - { - if (sd->selection_mode) - { - e_editable_selection_pos_set(editable, cursor_pos); - sd->selection_mode = 0; - } - else - sd->selection_mode = 1; - } - /* Cut/Copy */ - else if ((evas_key_modifier_is_set(event->modifiers, "Control") || - evas_key_modifier_is_set(event->modifiers, "Shift")) && - (strcmp(event->key, "w") == 0)) - { - if (!e_editable_password_get(editable) && selecting) - { - range = e_editable_text_range_get(editable, start_pos, end_pos); - if (range) - { - if ((win = e_win_evas_object_win_get(entry))) - ecore_x_selection_clipboard_set(win->evas_win, - range, - strlen(range) + 1); - free(range); - } - if ((sd->enabled) && (evas_key_modifier_is_set(event->modifiers, "Control"))) - { - changed = e_editable_delete(editable, start_pos, end_pos); - sd->selection_mode = 0; - } - } - } - /* Paste */ - else if ((sd->enabled) && - ((evas_key_modifier_is_set(event->modifiers, "Control")) && - (strcmp(event->key, "y") == 0))) - { - if ((win = e_win_evas_object_win_get(entry))) - ecore_x_selection_clipboard_request(win->evas_win, - ECORE_X_SELECTION_TARGET_UTF8_STRING); - } - /* Otherwise, we insert the corresponding character */ - else if ((event->string) && - ((strlen(event->string) != 1) || - (event->string[0] >= 0x20 && event->string[0] != 0x7f))) - changed = e_editable_insert(editable, cursor_pos, event->string); + if ((!data) || !(sd = evas_object_smart_data_get(data))) + return; - _e_entry_imf_cursor_info_set(entry); + _e_entry_cb_cut(sd, NULL, NULL); +} - if (changed) - evas_object_smart_callback_call(entry, "changed", NULL); - if (selection_changed) - _e_entry_x_selection_update(entry); +static void +_entry_recalc_size(Evas_Object *object) +{ + E_Entry_Smart_Data *sd; + Evas_Coord vw, vh, w, h; + + if ((!object) || !(sd = evas_object_smart_data_get(object))) + return; + + e_scrollframe_child_viewport_size_get(sd->scroll_object, &vw, &vh); + w = (sd->min_width < vw) ? vw : sd->min_width; + h = (sd->height < vh) ? vh : sd->height; + + evas_object_resize(sd->entry_object, w, h); +} + +static void +_entry_changed_signal_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + Evas_Object *object = data; + E_Entry_Smart_Data *sd; + + if ((!object) || !(sd = evas_object_smart_data_get(object))) + return; + + evas_object_smart_callback_call(object, "changed", NULL); + edje_object_size_min_calc(sd->entry_object, &sd->min_width, &sd->height); + _entry_recalc_size(object); +} + +static void +_entry_cursor_changed_signal_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + Evas_Object *object = data; + E_Entry_Smart_Data *sd; + Evas_Coord cx, cy, cw, ch; + + if ((!object) || !(sd = evas_object_smart_data_get(object))) + return; + + edje_object_part_text_cursor_geometry_get(sd->entry_object, ENTRY_PART_NAME, + &cx, &cy, &cw, &ch); + e_scrollframe_child_region_show(sd->scroll_object, cx, cy, cw, ch); } /* Editable object's smart methods */ @@ -1028,11 +598,6 @@ _e_entry_smart_add(Evas_Object *object) Evas *evas; E_Entry_Smart_Data *sd; Evas_Object *o; - int cw, ch; -#ifdef HAVE_ECORE_IMF - const char *ctx_id; - const Ecore_IMF_Context_Info *ctx_info; -#endif if ((!object) || !(evas = evas_object_evas_get(object))) return; @@ -1042,71 +607,55 @@ _e_entry_smart_add(Evas_Object *object) evas_object_smart_data_set(object, sd); -#ifdef HAVE_ECORE_IMF - ctx_id = ecore_imf_context_default_id_get(); - if (ctx_id) - { - ctx_info = ecore_imf_context_info_by_id_get(ctx_id); - if (!ctx_info->canvas_type || - strcmp(ctx_info->canvas_type, "evas") == 0) - sd->imf_context = ecore_imf_context_add(ctx_id); - else - { - ctx_id = ecore_imf_context_default_id_by_canvas_type_get("evas"); - if (ctx_id) - sd->imf_context = ecore_imf_context_add(ctx_id); - else - sd->imf_context = NULL; - } - } - else - sd->imf_context = NULL; - - if (sd->imf_context) - { - ecore_imf_context_client_window_set(sd->imf_context, - (long *)ecore_evas_window_get(ecore_evas_ecore_evas_get(evas))); - ecore_imf_context_client_canvas_set(sd->imf_context, evas); - ecore_imf_context_retrieve_surrounding_callback_set(sd->imf_context, - _e_entry_cb_imf_retrieve_surrounding, - sd); - ecore_imf_context_event_callback_add(sd->imf_context, ECORE_IMF_CALLBACK_COMMIT, _e_entry_cb_imf_event_commit, object); - ecore_imf_context_event_callback_add(sd->imf_context, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, _e_entry_cb_imf_event_preedit_changed, object); - ecore_imf_context_event_callback_add(sd->imf_context, ECORE_IMF_CALLBACK_DELETE_SURROUNDING, _e_entry_cb_imf_event_delete_surrounding, sd); - } -#endif - sd->enabled = 1; sd->focused = 0; - sd->selection_dragging = 0; - sd->selection_mode = 0; - sd->valign = 0.5; + + sd->scroll_object = e_scrollframe_add(evas); + e_scrollframe_key_navigation_set(sd->scroll_object, EINA_FALSE); + evas_object_propagate_events_set(sd->scroll_object, EINA_TRUE); + e_scrollframe_custom_theme_set(sd->scroll_object, "base/theme/widgets", "e/widgets/entry/scrollframe"); + edje_object_size_min_calc(e_scrollframe_edje_object_get(sd->scroll_object), + &sd->theme_width, &sd->theme_height); + + e_scrollframe_thumbscroll_force(sd->scroll_object, EINA_TRUE); + evas_object_smart_member_add(sd->scroll_object, object); + evas_object_show(sd->scroll_object); o = edje_object_add(evas); sd->entry_object = o; - e_theme_edje_object_set(o, "base/theme/widgets", "e/widgets/entry"); - evas_object_smart_member_add(o, object); - - o = e_editable_add(evas); - sd->editable_object = o; - e_editable_theme_set(o, "base/theme/widgets", "e/widgets/entry"); - e_editable_cursor_hide(o); - e_editable_char_size_get(o, &cw, &ch); - edje_extern_object_min_size_set(o, cw, ch); - edje_object_part_swallow(sd->entry_object, "e.swallow.text", o); + e_theme_edje_object_set(o, "base/theme/widgets", "e/widgets/entry/text"); edje_object_size_min_calc(sd->entry_object, &sd->min_width, &sd->height); + evas_object_propagate_events_set(sd->entry_object, EINA_TRUE); + + e_scrollframe_child_set(sd->scroll_object, sd->entry_object); evas_object_show(o); - evas_object_event_callback_add(object, EVAS_CALLBACK_KEY_DOWN, - _e_entry_key_down_cb, NULL); - evas_object_event_callback_add(object, EVAS_CALLBACK_KEY_UP, - _e_entry_key_up_cb, NULL); evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_DOWN, - _e_entry_mouse_down_cb, NULL); - evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_UP, - _e_entry_mouse_up_cb, NULL); - evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_MOVE, - _e_entry_mouse_move_cb, NULL); + _e_entry_mouse_down_cb, object); + edje_object_signal_callback_add(sd->entry_object, + "selection,changed", ENTRY_PART_NAME, + _entry_selection_changed_signal_cb, object); + edje_object_signal_callback_add(sd->entry_object, + "entry,selection,all,request", ENTRY_PART_NAME, + _entry_selection_all_signal_cb, object); + edje_object_signal_callback_add(sd->entry_object, + "entry,changed", ENTRY_PART_NAME, + _entry_changed_signal_cb, object); + edje_object_signal_callback_add(sd->entry_object, + "entry,paste,request,*", ENTRY_PART_NAME, + _entry_paste_request_signal_cb, object); + edje_object_signal_callback_add(sd->entry_object, + "entry,copy,notify", ENTRY_PART_NAME, + _entry_copy_notify_signal_cb, object); + edje_object_signal_callback_add(sd->entry_object, + "entry,cut,notify", ENTRY_PART_NAME, + _entry_cut_notify_signal_cb, object); + edje_object_signal_callback_add(sd->entry_object, + "cursor,changed", ENTRY_PART_NAME, + _entry_cursor_changed_signal_cb, object); + + _entry_recalc_size(object); + sd->selection_handler = ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY, _e_entry_x_selection_notify_handler, object); @@ -1120,31 +669,32 @@ _e_entry_smart_del(Evas_Object *object) if ((!object) || !(sd = evas_object_smart_data_get(object))) return; -#ifdef HAVE_ECORE_IMF - if (sd->imf_context) - { - ecore_imf_context_event_callback_del(sd->imf_context, ECORE_IMF_CALLBACK_COMMIT, _e_entry_cb_imf_event_commit); - ecore_imf_context_event_callback_del(sd->imf_context, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, _e_entry_cb_imf_event_preedit_changed); - ecore_imf_context_event_callback_del(sd->imf_context, ECORE_IMF_CALLBACK_DELETE_SURROUNDING, _e_entry_cb_imf_event_delete_surrounding); - - ecore_imf_context_del(sd->imf_context); - } -#endif - - evas_object_event_callback_del(object, EVAS_CALLBACK_KEY_DOWN, - _e_entry_key_down_cb); - evas_object_event_callback_del(object, EVAS_CALLBACK_KEY_UP, - _e_entry_key_up_cb); - evas_object_event_callback_del(object, EVAS_CALLBACK_MOUSE_DOWN, - _e_entry_mouse_down_cb); - evas_object_event_callback_del(object, EVAS_CALLBACK_MOUSE_UP, - _e_entry_mouse_up_cb); - evas_object_event_callback_del(object, EVAS_CALLBACK_MOUSE_MOVE, - _e_entry_mouse_move_cb); + evas_object_event_callback_del_full(object, EVAS_CALLBACK_MOUSE_DOWN, + _e_entry_mouse_down_cb, object); + edje_object_signal_callback_del_full(sd->entry_object, + "selection,changed", ENTRY_PART_NAME, + _entry_selection_changed_signal_cb, object); + edje_object_signal_callback_del_full(sd->entry_object, + "entry,selection,all,request", ENTRY_PART_NAME, + _entry_selection_all_signal_cb, object); + edje_object_signal_callback_del_full(sd->entry_object, + "entry,changed", ENTRY_PART_NAME, + _entry_changed_signal_cb, object); + edje_object_signal_callback_del_full(sd->entry_object, + "entry,paste,request,*", ENTRY_PART_NAME, + _entry_paste_request_signal_cb, object); + edje_object_signal_callback_del_full(sd->entry_object, + "entry,copy,notify", ENTRY_PART_NAME, + _entry_copy_notify_signal_cb, object); + edje_object_signal_callback_del_full(sd->entry_object, + "entry,cut,notify", ENTRY_PART_NAME, + _entry_cut_notify_signal_cb, object); + edje_object_signal_callback_del_full(sd->entry_object, + "cursor,changed", ENTRY_PART_NAME, + _entry_cursor_changed_signal_cb, object); if (sd->selection_handler) ecore_event_handler_del(sd->selection_handler); - evas_object_del(sd->editable_object); evas_object_del(sd->entry_object); free(sd); } @@ -1153,29 +703,24 @@ static void _e_entry_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y) { E_Entry_Smart_Data *sd; - Evas_Coord prev_x, prev_y; - Evas_Coord ox, oy; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - evas_object_geometry_get(object, &prev_x, &prev_y, NULL, NULL); - evas_object_geometry_get(sd->entry_object, &ox, &oy, NULL, NULL); - evas_object_move(sd->entry_object, ox + (x - prev_x), oy + (y - prev_y)); + evas_object_move(sd->scroll_object, x, y); } static void _e_entry_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h) { E_Entry_Smart_Data *sd; - Evas_Coord x, y; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - evas_object_geometry_get(object, &x, &y, NULL, NULL); - evas_object_move(sd->entry_object, x, y + ((h - sd->height) * sd->valign)); - evas_object_resize(sd->entry_object, w, sd->height); + evas_object_resize(sd->scroll_object, w, h); + + _entry_recalc_size(object); } static void @@ -1185,7 +730,7 @@ _e_entry_smart_show(Evas_Object *object) if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - evas_object_show(sd->entry_object); + evas_object_show(sd->scroll_object); } static void @@ -1195,7 +740,7 @@ _e_entry_smart_hide(Evas_Object *object) if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - evas_object_hide(sd->entry_object); + evas_object_hide(sd->scroll_object); } static void @@ -1205,7 +750,7 @@ _e_entry_color_set(Evas_Object *object, int r, int g, int b, int a) if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - evas_object_color_set(sd->entry_object, r, g, b, a); + evas_object_color_set(sd->scroll_object, r, g, b, a); } static void @@ -1215,7 +760,7 @@ _e_entry_clip_set(Evas_Object *object, Evas_Object *clip) if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - evas_object_clip_set(sd->entry_object, clip); + evas_object_clip_set(sd->scroll_object, clip); } static void @@ -1225,7 +770,7 @@ _e_entry_clip_unset(Evas_Object *object) if ((!object) || !(sd = evas_object_smart_data_get(object))) return; - evas_object_clip_unset(sd->entry_object); + evas_object_clip_unset(sd->scroll_object); } static void @@ -1242,66 +787,26 @@ _e_entry_cb_menu_post(void *data, E_Menu *m __UNUSED__) static void _e_entry_cb_cut(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) { - E_Entry_Smart_Data *sd; - Evas_Object *editable; - int cursor_pos, selection_pos; - int start_pos, end_pos; - int selecting, changed; - char *range; - E_Win *win; - - sd = data; - if (!sd->enabled) return; - - editable = sd->editable_object; - cursor_pos = e_editable_cursor_pos_get(editable); - selection_pos = e_editable_selection_pos_get(editable); - start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; - end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; - selecting = (start_pos != end_pos); - if (!selecting) return; - - range = e_editable_text_range_get(editable, start_pos, end_pos); - if (range) - { - if ((win = e_win_evas_object_win_get(sd->entry_object))) - ecore_x_selection_clipboard_set(win->evas_win, - range, strlen(range) + 1); - free(range); - } - changed = e_editable_delete(editable, start_pos, end_pos); - if (changed) - evas_object_smart_callback_call(sd->entry_object, "changed", NULL); + E_Entry_Smart_Data *sd = data; + _e_entry_cb_copy(sd, NULL, NULL); + edje_object_part_text_user_insert(sd->entry_object, ENTRY_PART_NAME, ""); } static void _e_entry_cb_copy(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) { E_Entry_Smart_Data *sd; - Evas_Object *editable; - int cursor_pos, selection_pos; - int start_pos, end_pos; - int selecting; - char *range; + const char *range; E_Win *win; sd = data; - editable = sd->editable_object; - cursor_pos = e_editable_cursor_pos_get(editable); - selection_pos = e_editable_selection_pos_get(editable); - start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; - end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; - selecting = (start_pos != end_pos); - if (!selecting) return; - - range = e_editable_text_range_get(editable, start_pos, end_pos); + range = edje_object_part_text_selection_get(sd->entry_object, ENTRY_PART_NAME); if (range) { if ((win = e_win_evas_object_win_get(sd->entry_object))) ecore_x_selection_clipboard_set(win->evas_win, range, strlen(range) + 1); - free(range); } } @@ -1325,7 +830,7 @@ _e_entry_cb_select_all(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSE E_Entry_Smart_Data *sd; sd = data; - e_editable_select_all(sd->editable_object); + edje_object_part_text_select_all(sd->entry_object, ENTRY_PART_NAME); _e_entry_x_selection_update(sd->entry_object); } @@ -1333,215 +838,9 @@ static void _e_entry_cb_delete(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) { E_Entry_Smart_Data *sd; - Evas_Object *editable; - int cursor_pos, selection_pos; - int start_pos, end_pos; - int selecting; - char *range; sd = data; - if (!sd->enabled) return; + edje_object_part_text_user_insert(sd->entry_object, ENTRY_PART_NAME, ""); - editable = sd->editable_object; - cursor_pos = e_editable_cursor_pos_get(editable); - selection_pos = e_editable_selection_pos_get(editable); - start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; - end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; - selecting = (start_pos != end_pos); - if (!selecting) return; - - range = e_editable_text_range_get(editable, start_pos, end_pos); - if (range) - { - e_editable_delete(editable, start_pos, end_pos); - evas_object_smart_callback_call(sd->entry_object, "changed", NULL); - free(range); - } } -static void -_e_entry_imf_context_reset(Evas_Object *object) -{ - E_Entry_Smart_Data *sd; - - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return; - -#ifdef HAVE_ECORE_IMF - if (sd->imf_context) - ecore_imf_context_reset(sd->imf_context); -#endif -} - -static void -_e_entry_imf_cursor_info_set(Evas_Object *object) -{ - E_Entry_Smart_Data *sd; -#ifdef HAVE_ECORE_IMF - Evas_Coord cx, cy, cw, ch; - Evas_Object *editable; -#endif - - if ((!object) || !(sd = evas_object_smart_data_get(object))) - return; - -#ifdef HAVE_ECORE_IMF - if (!sd || !sd->imf_context) return; - - editable = sd->editable_object; - - e_editable_cursor_geometry_get(editable, &cx, &cy, &cw, &ch); - - ecore_imf_context_cursor_position_set(sd->imf_context, - e_editable_cursor_pos_get(editable)); - ecore_imf_context_cursor_location_set(sd->imf_context, cx, cy, cw, ch); -#endif -} - -#ifdef HAVE_ECORE_IMF -static Eina_Bool -_e_entry_cb_imf_retrieve_surrounding(void *data, Ecore_IMF_Context *ctx __UNUSED__, char **text, int *cursor_pos) -{ - E_Entry_Smart_Data *sd; - - sd = data; - - if (text) - { - const char *str; - - str = e_editable_text_get(sd->editable_object); - *text = str ? strdup(str) : strdup(""); - } - - if (cursor_pos) - *cursor_pos = e_editable_cursor_pos_get(sd->editable_object); - - return EINA_TRUE; -} - -static void -_e_entry_cb_imf_event_commit(void *data, Ecore_IMF_Context *ctx __UNUSED__, void *event_info) -{ - Evas_Object *entry; - E_Entry_Smart_Data *sd; - Evas_Object *editable; - char *commit_str = event_info; - int cursor_pos, selection_pos; - int start_pos, end_pos; - int selecting; - int changed = 0; - - if ((!(entry = data)) || (!(sd = evas_object_smart_data_get(entry)))) - return; - - if (!sd->imf_context) - return; - - editable = sd->editable_object; - cursor_pos = e_editable_cursor_pos_get(editable); - selection_pos = e_editable_selection_pos_get(editable); - start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; - end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; - selecting = (start_pos != end_pos); - - if (selecting) - changed |= e_editable_delete(editable, start_pos, end_pos); - - /* delete preedit characters */ - if (sd->have_preedit) - { - if (sd->preedit_start_pos != sd->preedit_end_pos) - e_editable_delete(editable, sd->preedit_start_pos, sd->preedit_end_pos); - sd->have_preedit = EINA_FALSE; - start_pos = sd->preedit_start_pos; - } - - changed |= e_editable_insert(editable, start_pos, commit_str); - - _e_entry_imf_cursor_info_set(entry); - - if (changed) - evas_object_smart_callback_call(entry, "changed", NULL); -} - -static void -_e_entry_cb_imf_event_preedit_changed(void *data, Ecore_IMF_Context *ctx __UNUSED__, void *event_info __UNUSED__) -{ - Evas_Object *entry; - E_Entry_Smart_Data *sd; - Evas_Object *editable; - int cursor_pos, selection_pos; - char *preedit_string = NULL; - int start_pos, end_pos; - int selecting; - int changed = 0; - - if ((!(entry = data)) || (!(sd = evas_object_smart_data_get(entry)))) - return; - - if (!sd->imf_context) - return; - - /* Get the preedit string from IMF */ - ecore_imf_context_preedit_string_get(sd->imf_context, &preedit_string, &cursor_pos); - if (!preedit_string) return; - - editable = sd->editable_object; - cursor_pos = e_editable_cursor_pos_get(editable); - selection_pos = e_editable_selection_pos_get(editable); - start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; - end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; - selecting = (start_pos != end_pos); - - if (selecting) - changed |= e_editable_delete(editable, start_pos, end_pos); - - /* delete preedit characters */ - if (sd->have_preedit) - { - if (sd->preedit_start_pos != sd->preedit_end_pos) - e_editable_delete(editable, sd->preedit_start_pos, sd->preedit_end_pos); - } - - cursor_pos = e_editable_cursor_pos_get(editable); - sd->preedit_start_pos = cursor_pos; - - /* insert preedit character(s) */ - changed |= e_editable_insert(editable, cursor_pos, preedit_string); - - sd->preedit_end_pos = e_editable_cursor_pos_get(editable); - - if (!strcmp(preedit_string, "")) - sd->have_preedit = EINA_FALSE; - else - sd->have_preedit = EINA_TRUE; - - _e_entry_imf_cursor_info_set(entry); - - if (changed) - evas_object_smart_callback_call(entry, "preedit,changed", NULL); - - free(preedit_string); -} - -static void -_e_entry_cb_imf_event_delete_surrounding(void *data, Ecore_IMF_Context *ctx __UNUSED__, void *event_info) -{ - E_Entry_Smart_Data *sd; - Ecore_IMF_Event_Delete_Surrounding *ev = event_info; - Evas_Object *editable; - int cursor_pos; - - sd = data; - - if ((!sd) || (!sd->imf_context)) - return; - - editable = sd->editable_object; - cursor_pos = e_editable_cursor_pos_get(editable); - e_editable_delete(editable, - cursor_pos + ev->offset, - cursor_pos + ev->offset + ev->n_chars); -} -#endif diff --git a/src/bin/e_entry.h b/src/bin/e_entry.h index 563242c76..b737ed58e 100644 --- a/src/bin/e_entry.h +++ b/src/bin/e_entry.h @@ -7,7 +7,7 @@ EAPI Evas_Object *e_entry_add (Evas *evas); EAPI void e_entry_text_set (Evas_Object *entry, const char *text); EAPI const char *e_entry_text_get (Evas_Object *entry); EAPI void e_entry_clear (Evas_Object *entry); -EAPI Evas_Object *e_entry_editable_object_get (Evas_Object *entry); +EAPI void e_entry_select_all (Evas_Object *entry); EAPI void e_entry_password_set (Evas_Object *entry, int password_mode); EAPI void e_entry_size_min_get (Evas_Object *entry, Evas_Coord *minw, Evas_Coord *minh); diff --git a/src/bin/e_entry_dialog.c b/src/bin/e_entry_dialog.c index cc8769f5c..d0236ce13 100644 --- a/src/bin/e_entry_dialog.c +++ b/src/bin/e_entry_dialog.c @@ -66,7 +66,7 @@ e_entry_dialog_show(const char *title, const char *icon, const char *text, e_win_centered_set(dia->win, 1); e_dialog_show(dia); e_widget_focus_set(ed->entry, 1); - e_editable_select_all(e_widget_entry_editable_object_get(ed->entry)); + e_widget_entry_select_all(ed->entry); return ed; } diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c index 3ec60bc86..b7fb63a32 100644 --- a/src/bin/e_fm.c +++ b/src/bin/e_fm.c @@ -9760,7 +9760,6 @@ _e_fm2_file_rename(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) static Evas_Object * _e_fm2_icon_entry_widget_add(E_Fm2_Icon *ic) { - Evas_Object *eo; Evas *e; E_Container *con; E_Manager *man; @@ -9789,9 +9788,7 @@ _e_fm2_icon_entry_widget_add(E_Fm2_Icon *ic) evas_object_show(ic->entry_widget); e_widget_entry_text_set(ic->entry_widget, ic->info.file); e_widget_focus_set(ic->entry_widget, 0); - eo = e_widget_entry_editable_object_get(ic->entry_widget); - e_editable_cursor_move_to_start(eo); - e_editable_selection_move_to_end(eo); + e_widget_entry_select_all(ic->entry_widget); ic->sd->iop_icon = ic; ic->sd->typebuf.disabled = EINA_TRUE; diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h index 3af48de85..eb4367d18 100644 --- a/src/bin/e_includes.h +++ b/src/bin/e_includes.h @@ -16,7 +16,6 @@ #include "e_icon.h" #include "e_box.h" #include "e_flowlayout.h" -#include "e_editable.h" #include "e_entry.h" #include "e_init.h" #include "e_int_menus.h" diff --git a/src/bin/e_widget_entry.c b/src/bin/e_widget_entry.c index 68549d47f..e1effa5ce 100644 --- a/src/bin/e_widget_entry.c +++ b/src/bin/e_widget_entry.c @@ -161,21 +161,18 @@ e_widget_entry_readonly_set(Evas_Object *entry, int readonly_mode) } /** - * Gets the editable object of the entry widget. It will allow you to have - * better control on the text, the cursor or the selection of the entry with - * the e_editable_*() functions. + * Selects the content of the entry. * * @param entry an entry widget - * @return Returns the editable object of the entry widget */ -EAPI Evas_Object * -e_widget_entry_editable_object_get(Evas_Object *entry) +EAPI void +e_widget_entry_select_all(Evas_Object *entry) { E_Widget_Data *wd; if (!(entry) || (!(wd = e_widget_data_get(entry)))) - return NULL; - return e_entry_editable_object_get(wd->o_entry); + return; + e_entry_select_all(wd->o_entry); } diff --git a/src/bin/e_widget_entry.h b/src/bin/e_widget_entry.h index 863debb4d..613f074db 100644 --- a/src/bin/e_widget_entry.h +++ b/src/bin/e_widget_entry.h @@ -9,7 +9,7 @@ EAPI const char *e_widget_entry_text_get (Evas_Object *entry); EAPI void e_widget_entry_clear (Evas_Object *entry); EAPI void e_widget_entry_password_set (Evas_Object *entry, int password_mode); EAPI void e_widget_entry_readonly_set (Evas_Object *entry, int readonly_mode); -EAPI Evas_Object *e_widget_entry_editable_object_get (Evas_Object *entry); +EAPI void e_widget_entry_select_all (Evas_Object *entry); #endif #endif