[Dnd] Fix double text insert issue in elm_entry, drop at disable, non-editable entry

Summary:
Issue 1: If you drop text to elm_entry, text is inserted twice.
Reason: Drop callbacks are registered multiple times in elm_entry.
Resolve: Register only one drop callback at entry side.

Issue 2: Even thought entry is disabled, non-editable, you still can drop text, image file. (Example, run Entry Scrolled and drop text, image file to disabled or non-editable entries).
Reason: Drop callback are registered but not remove when entry is set to disabled, non-editable mode.
Resolve: Correct registering and removing drop callbacks in entry.

Reviewers: JackDanielZ, raster

Reviewed By: raster

CC: woohyun

Differential Revision: https://phab.enlightenment.org/D565
This commit is contained in:
Thiep Ha 2014-02-19 12:25:08 +09:00 committed by Carsten Haitzler (Rasterman)
parent 8a312631e6
commit 771887df2b
2 changed files with 79 additions and 45 deletions

View File

@ -508,6 +508,39 @@ _elm_entry_theme_group_get(Evas_Object *obj)
}
}
static Eina_Bool
_drag_drop_cb(void *data EINA_UNUSED,
Evas_Object *obj,
Elm_Selection_Data *drop)
{
Eina_Bool rv;
ELM_ENTRY_DATA_GET(obj, sd);
edje_object_part_text_cursor_copy
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN, /*->*/ EDJE_CURSOR_USER);
rv = edje_object_part_text_cursor_coord_set
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN, drop->x, drop->y);
if (!rv) WRN("Warning: Failed to position cursor: paste anyway");
elm_entry_entry_insert(obj, drop->data);
edje_object_part_text_cursor_copy
(sd->entry_edje, "elm.text", EDJE_CURSOR_USER, /*->*/ EDJE_CURSOR_MAIN);
return EINA_TRUE;
}
static Elm_Sel_Format
_get_drop_format(Evas_Object *obj)
{
ELM_ENTRY_DATA_GET(obj, sd);
if ((sd->editable) && (!sd->single_line) && (!sd->password) && (!sd->disabled))
return ELM_SEL_FORMAT_MARKUP | ELM_SEL_FORMAT_IMAGE;
return ELM_SEL_FORMAT_MARKUP;
}
/* we can't reuse layout's here, because it's on entry_edje only */
static void
_elm_entry_smart_disable(Eo *obj, void *_pd, va_list *list)
@ -516,6 +549,11 @@ _elm_entry_smart_disable(Eo *obj, void *_pd, va_list *list)
if (ret) *ret = EINA_FALSE;
Elm_Entry_Smart_Data *sd = _pd;
elm_drop_target_del(obj, sd->drop_format,
NULL, NULL,
NULL, NULL,
NULL, NULL,
_drag_drop_cb, NULL);
if (elm_object_disabled_get(obj))
{
edje_object_signal_emit(sd->entry_edje, "elm,state,disabled", "elm");
@ -535,6 +573,12 @@ _elm_entry_smart_disable(Eo *obj, void *_pd, va_list *list)
eo_do(obj, elm_scrollable_interface_freeze_set(EINA_FALSE));
}
sd->disabled = EINA_FALSE;
sd->drop_format = _get_drop_format(obj);
elm_drop_target_add(obj, sd->drop_format,
NULL, NULL,
NULL, NULL,
NULL, NULL,
_drag_drop_cb, NULL);
}
if (ret) *ret = EINA_TRUE;
@ -2333,29 +2377,6 @@ _event_selection_clear(void *data EINA_UNUSED,
}
#endif
static Eina_Bool
_drag_drop_cb(void *data EINA_UNUSED,
Evas_Object *obj,
Elm_Selection_Data *drop)
{
Eina_Bool rv;
ELM_ENTRY_DATA_GET(obj, sd);
edje_object_part_text_cursor_copy
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN, /*->*/ EDJE_CURSOR_USER);
rv = edje_object_part_text_cursor_coord_set
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN, drop->x, drop->y);
if (!rv) WRN("Warning: Failed to position cursor: paste anyway");
elm_entry_entry_insert(obj, drop->data);
edje_object_part_text_cursor_copy
(sd->entry_edje, "elm.text", EDJE_CURSOR_USER, /*->*/ EDJE_CURSOR_MAIN);
return EINA_TRUE;
}
static Evas_Object *
_item_get(void *data,
Evas_Object *edje EINA_UNUSED,
@ -3185,6 +3206,13 @@ _elm_entry_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
priv->auto_save = EINA_TRUE;
priv->editable = EINA_TRUE;
priv->drop_format = ELM_SEL_FORMAT_MARKUP | ELM_SEL_FORMAT_IMAGE;
elm_drop_target_add(obj, priv->drop_format,
NULL, NULL,
NULL, NULL,
NULL, NULL,
_drag_drop_cb, NULL);
if (!elm_layout_theme_set(obj, "entry", "base", elm_widget_style_get(obj)))
CRI("Failed to set layout!");
@ -3309,10 +3337,6 @@ _elm_entry_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
}
#endif
elm_drop_target_add
(obj, ELM_SEL_FORMAT_MARKUP | ELM_SEL_FORMAT_IMAGE,
NULL, NULL, NULL, NULL, NULL, NULL, _drag_drop_cb, NULL);
entries = eina_list_prepend(entries, obj);
// module - find module for entry
@ -3629,20 +3653,21 @@ _password_set(Eo *obj, void *_pd, va_list *list)
if (sd->password == password) return;
sd->password = password;
elm_drop_target_del(obj, sd->drop_format,
NULL, NULL,
NULL, NULL,
NULL, NULL,
_drag_drop_cb, NULL);
if (password)
{
sd->single_line = EINA_TRUE;
sd->line_wrap = ELM_WRAP_NONE;
elm_drop_target_del(obj, ELM_SEL_FORMAT_MARKUP,
NULL, NULL,
NULL, NULL,
NULL, NULL,
_drag_drop_cb, NULL);
_entry_selection_callbacks_unregister(obj);
}
else
{
elm_drop_target_add(obj, ELM_SEL_FORMAT_MARKUP,
sd->drop_format = _get_drop_format(obj);
elm_drop_target_add(obj, sd->drop_format,
NULL, NULL,
NULL, NULL,
NULL, NULL,
@ -3935,18 +3960,20 @@ _editable_set(Eo *obj, void *_pd, va_list *list)
sd->editable = editable;
eo_do(obj, elm_wdg_theme_apply(NULL));
elm_drop_target_del(obj, sd->drop_format,
NULL, NULL,
NULL, NULL,
NULL, NULL,
_drag_drop_cb, NULL);
if (editable)
elm_drop_target_add(obj, ELM_SEL_FORMAT_MARKUP,
NULL, NULL,
NULL, NULL,
NULL, NULL,
_drag_drop_cb, NULL);
else
elm_drop_target_del(obj, ELM_SEL_FORMAT_MARKUP,
NULL, NULL,
NULL, NULL,
NULL, NULL,
_drag_drop_cb, NULL);
{
sd->drop_format = _get_drop_format(obj);
elm_drop_target_add(obj, sd->drop_format,
NULL, NULL,
NULL, NULL,
NULL, NULL,
_drag_drop_cb, NULL);
}
}
EAPI Eina_Bool
@ -5017,7 +5044,13 @@ _cnp_mode_set(Eo *obj, void *_pd, va_list *list)
else if (cnp_mode == ELM_CNP_MODE_MARKUP)
format |= ELM_SEL_FORMAT_IMAGE;
elm_drop_target_add(obj, format,
elm_drop_target_del(obj, sd->drop_format,
NULL, NULL,
NULL, NULL,
NULL, NULL,
_drag_drop_cb, NULL);
sd->drop_format = format;
elm_drop_target_add(obj, sd->drop_format,
NULL, NULL,
NULL, NULL,
NULL, NULL,

View File

@ -72,6 +72,7 @@ struct _Elm_Entry_Smart_Data
} anchor_hover;
Elm_Cnp_Mode cnp_mode;
Elm_Sel_Format drop_format;
Eina_Bool input_panel_return_key_disabled : 1;
Eina_Bool drag_selection_asked : 1;