Elementary: When an elm_entry is setted to be scrolled its stops of propagate events.
[framework/uifw/elementary.git] / src / lib / elm_entry.c
index 6d862a7..a83bd10 100644 (file)
@@ -123,6 +123,7 @@ static const char SIG_PRESS[] = "press";
 static const char SIG_LONGPRESSED[] = "longpressed";
 static const char SIG_CLICKED[] = "clicked";
 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
+static const char SIG_CLICKED_TRIPLE[] = "clicked,triple";
 static const char SIG_FOCUSED[] = "focused";
 static const char SIG_UNFOCUSED[] = "unfocused";
 static const char SIG_SELECTION_PASTE[] = "selection,paste";
@@ -145,6 +146,7 @@ static const Evas_Smart_Cb_Description _signals[] = {
        {SIG_LONGPRESSED, ""},
        {SIG_CLICKED, ""},
        {SIG_CLICKED_DOUBLE, ""},
+       {SIG_CLICKED_TRIPLE, ""},
        {SIG_FOCUSED, ""},
        {SIG_UNFOCUSED, ""},
        {SIG_SELECTION_PASTE, ""},
@@ -546,6 +548,7 @@ _recalc_cursor_geometry(Evas_Object *obj)
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
    evas_object_smart_callback_call(obj, SIG_CURSOR_CHANGED, NULL);
+   if (!elm_object_focus_get(obj)) return;
    if (!wd->deferred_recalc_job)
      {
         Evas_Coord cx, cy, cw, ch;
@@ -617,7 +620,7 @@ _elm_win_recalc_job(void *data)
           }
      }
 
-   if (wd->deferred_cur)
+   if ((wd->deferred_cur) && (elm_object_focus_get(data)))
      {
         Evas_Coord cx, cy, cw, ch;
         edje_object_part_text_cursor_geometry_get(wd->ent, "elm.text",
@@ -949,6 +952,7 @@ _store_selection(Elm_Sel_Type seltype, Evas_Object *obj)
 
    if (!wd) return;
    sel = edje_object_part_text_selection_get(wd->ent, "elm.text");
+   if ((!sel) || (!sel[0])) return; /* avoid deleting our own selection */
    elm_selection_set(seltype, obj, ELM_SEL_FORMAT_MARKUP, sel);
    if (seltype == ELM_SEL_CLIPBOARD)
      eina_stringshare_replace(&wd->cut_sel, sel);
@@ -969,6 +973,7 @@ _cut(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
    _store_selection(ELM_SEL_CLIPBOARD, data);
    edje_object_part_text_insert(wd->ent, "elm.text", "");
    edje_object_part_text_select_none(wd->ent, "elm.text");
+   _sizing_eval(data);
 }
 
 static void
@@ -1312,14 +1317,29 @@ _signal_selection_start(void *data, Evas_Object *obj __UNUSED__, const char *emi
 }
 
 static void
+_signal_selection_all(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return;
+   elm_entry_select_all(data);
+}
+
+static void
+_signal_selection_none(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return;
+   elm_entry_select_none(data);
+}
+
+static void
 _signal_selection_changed(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
 {
    Widget_Data *wd = elm_widget_data_get(data);
    if (!wd) return;
    wd->have_selection = EINA_TRUE;
    evas_object_smart_callback_call(data, SIG_SELECTION_CHANGED, NULL);
-   elm_selection_set(ELM_SEL_PRIMARY, obj, ELM_SEL_FORMAT_MARKUP,
-                     elm_entry_selection_get(data));
+   _store_selection(ELM_SEL_PRIMARY, data);
 }
 
 static void
@@ -1384,24 +1404,13 @@ _signal_entry_paste_request(void *data, Evas_Object *obj __UNUSED__, const char
 static void
 _signal_entry_copy_notify(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
 {
-   Widget_Data *wd = elm_widget_data_get(data);
-   if (!wd) return;
-   evas_object_smart_callback_call(data, SIG_SELECTION_COPY, NULL);
-   elm_selection_set(ELM_SEL_CLIPBOARD, obj, ELM_SEL_FORMAT_MARKUP,
-                     elm_entry_selection_get(data));
+   _copy(data, NULL, NULL);
 }
 
 static void
 _signal_entry_cut_notify(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
 {
-   Widget_Data *wd = elm_widget_data_get(data);
-   if (!wd) return;
-   evas_object_smart_callback_call(data, SIG_SELECTION_CUT, NULL);
-   elm_selection_set(ELM_SEL_CLIPBOARD, obj, ELM_SEL_FORMAT_MARKUP,
-                     elm_entry_selection_get(data));
-   edje_object_part_text_insert(wd->ent, "elm.text", "");
-   wd->changed = EINA_TRUE;
-   _sizing_eval(data);
+   _cut(data, NULL, NULL);
 }
 
 static void
@@ -1569,6 +1578,14 @@ _signal_mouse_double(void *data, Evas_Object *obj __UNUSED__, const char *emissi
    evas_object_smart_callback_call(data, SIG_CLICKED_DOUBLE, NULL);
 }
 
+static void
+_signal_mouse_triple(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return;
+   evas_object_smart_callback_call(data, SIG_CLICKED_TRIPLE, NULL);
+}
+
 #ifdef HAVE_ELEMENTARY_X
 static Eina_Bool
 _event_selection_notify(void *data, int type __UNUSED__, void *event)
@@ -1896,7 +1913,28 @@ _elm_entry_text_get(const Evas_Object *obj, const char *item)
         ERR("text=NULL for edje %p, part 'elm.text'", wd->ent);
         return NULL;
      }
-   eina_stringshare_replace(&wd->text, text);
+
+   if (wd->append_text_len > 0)
+     {
+        char *tmpbuf;
+        size_t tlen;
+        tlen = strlen(text);
+        tmpbuf = malloc(tlen + wd->append_text_len + 1);
+        if (!tmpbuf)
+          {
+             ERR("Failed to allocate memory for entry's text %p", obj);
+             return NULL;
+          }
+        memcpy(tmpbuf, text, tlen);
+        memcpy(tmpbuf + tlen, wd->append_text_left, wd->append_text_len);
+        tmpbuf[tlen + wd->append_text_len] = '\0';
+        eina_stringshare_replace(&wd->text, tmpbuf);
+        free(tmpbuf);
+     }
+   else
+     {
+        eina_stringshare_replace(&wd->text, text);
+     }
    return wd->text;
 }
 
@@ -1938,6 +1976,8 @@ elm_entry_add(Evas_Object *parent)
    evas_object_size_hint_align_set(wd->scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_smart_scroller_bounce_allow_set(wd->scroller, EINA_FALSE, EINA_FALSE);
    evas_object_propagate_events_set(wd->scroller, EINA_TRUE);
+   evas_object_propagate_events_set(elm_smart_scroller_edje_object_get(
+                                    wd->scroller), EINA_TRUE);
 
    wd->linewrap     = ELM_WRAP_WORD;
    wd->editable     = EINA_TRUE;
@@ -1968,11 +2008,13 @@ elm_entry_add(Evas_Object *parent)
                                    _signal_selection_start, obj);
    edje_object_signal_callback_add(wd->ent, "selection,changed", "elm.text",
                                    _signal_selection_changed, obj);
+   edje_object_signal_callback_add(wd->ent, "entry,selection,all,request", "elm.text",
+                                   _signal_selection_all, obj);
+   edje_object_signal_callback_add(wd->ent, "entry,selection,none,request", "elm.text",
+                                   _signal_selection_none, obj);
    edje_object_signal_callback_add(wd->ent, "selection,cleared", "elm.text",
                                    _signal_selection_cleared, obj);
-   edje_object_signal_callback_add(wd->ent, "entry,paste,request,1", "elm.text",
-                                   _signal_entry_paste_request, obj);
-   edje_object_signal_callback_add(wd->ent, "entry,paste,request,3", "elm.text",
+   edje_object_signal_callback_add(wd->ent, "entry,paste,request,*", "elm.text",
                                    _signal_entry_paste_request, obj);
    edje_object_signal_callback_add(wd->ent, "entry,copy,notify", "elm.text",
                                    _signal_entry_copy_notify, obj);
@@ -2000,6 +2042,8 @@ elm_entry_add(Evas_Object *parent)
                                    _signal_mouse_clicked, obj);
    edje_object_signal_callback_add(wd->ent, "mouse,down,1,double", "elm.text",
                                    _signal_mouse_double, obj);
+   edje_object_signal_callback_add(wd->ent, "mouse,down,1,triple", "elm.text",
+                                   _signal_mouse_triple, obj);
    edje_object_part_text_set(wd->ent, "elm.text", "");
    if (_elm_config->desktop_entry)
      edje_object_part_text_select_allow_set(wd->ent, "elm.text", EINA_TRUE);