raster pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=009bb2cef32251db3d15aa879e37ad8b3e938a25

commit 009bb2cef32251db3d15aa879e37ad8b3e938a25
Author: Thiep Ha <thie...@gmail.com>
Date:   Wed Feb 19 12:25:08 2014 +0900

    [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
---
 src/lib/elm_entry.c        | 123 ++++++++++++++++++++++++++++-----------------
 src/lib/elm_widget_entry.h |   1 +
 2 files changed, 79 insertions(+), 45 deletions(-)

diff --git a/src/lib/elm_entry.c b/src/lib/elm_entry.c
index 27b4c81..d3a3131 100644
--- a/src/lib/elm_entry.c
+++ b/src/lib/elm_entry.c
@@ -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,
diff --git a/src/lib/elm_widget_entry.h b/src/lib/elm_widget_entry.h
index 3e6f78e..dabfde3 100644
--- a/src/lib/elm_widget_entry.h
+++ b/src/lib/elm_widget_entry.h
@@ -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;

-- 


Reply via email to