addd object dump features
[framework/uifw/elementary.git] / src / lib / elm_entry.c
index eb35a2b..1974a67 100644 (file)
@@ -16,11 +16,12 @@ typedef struct _Mod_Api Mod_Api;
 typedef struct _Widget_Data Widget_Data;
 typedef struct _Elm_Entry_Context_Menu_Item Elm_Entry_Context_Menu_Item;
 typedef struct _Elm_Entry_Item_Provider Elm_Entry_Item_Provider;
-typedef struct _Elm_Entry_Text_Filter Elm_Entry_Text_Filter;
+typedef struct _Elm_Entry_Markup_Filter Elm_Entry_Markup_Filter;
 
 struct _Widget_Data
 {
    Evas_Object *ent, *scroller;
+   Evas_Object *hoversel;
    Ecore_Job *deferred_recalc_job;
    Ecore_Event_Handler *sel_notify_handler;
    Ecore_Event_Handler *sel_clear_handler;
@@ -41,6 +42,7 @@ struct _Widget_Data
    Eina_List *items;
    Eina_List *item_providers;
    Eina_List *text_filters;
+   Eina_List *markup_filters;
    Ecore_Job *hovdeljob;
    Mod_Api *api; // module api if supplied
    int cursor_pos;
@@ -52,6 +54,12 @@ struct _Widget_Data
    Elm_Input_Panel_Return_Key_Type input_panel_return_key_type;
    void *input_panel_imdata;
    int input_panel_imdata_len;
+   struct
+     {
+        Evas_Object *hover_parent;
+        Evas_Object *pop, *hover;
+        const char *hover_style;
+     } anchor_hover;
    Eina_Bool changed : 1;
    Eina_Bool single_line : 1;
    Eina_Bool password : 1;
@@ -66,7 +74,6 @@ struct _Widget_Data
    Eina_Bool drag_selection_asked : 1;
    Eina_Bool can_write : 1;
    Eina_Bool autosave : 1;
-   Eina_Bool textonly : 1;
    Eina_Bool usedown : 1;
    Eina_Bool scroll : 1;
    Eina_Bool h_bounce : 1;
@@ -75,8 +82,8 @@ struct _Widget_Data
    Eina_Bool prediction_allow : 1;
    Eina_Bool input_panel_return_key_disabled : 1;
    Eina_Bool autoreturnkey : 1;
+   Elm_Cnp_Mode cnp_mode : 2;
 //// TIZEN ONLY
-   Evas_Object *hoversel;
    Evas_Object *mgf_proxy;
    Evas_Object *mgf_clip;
    Evas_Object *mgf_bg;
@@ -90,7 +97,6 @@ struct _Widget_Data
    Eina_Bool double_clicked : 1;
    Eina_Bool long_pressed : 1;
    Eina_Bool magnifier_enabled : 1;
-   Elm_CNP_Mode cnp_mode : 2;
 //
 };
 
@@ -111,7 +117,7 @@ struct _Elm_Entry_Item_Provider
    void *data;
 };
 
-struct _Elm_Entry_Text_Filter
+struct _Elm_Entry_Markup_Filter
 {
    Elm_Entry_Filter_Cb func;
    void *data;
@@ -141,6 +147,7 @@ static void _on_focus_hook(void *data, Evas_Object *obj);
 static void _content_set_hook(Evas_Object *obj, const char *part, Evas_Object *content);
 static Evas_Object *_content_unset_hook(Evas_Object *obj, const char *part);
 static Evas_Object *_content_get_hook(const Evas_Object *obj, const char *part);
+static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src, Evas_Callback_Type type, void *event_info);
 static void _resize(void *data, Evas *e, Evas_Object *obj, void *event_info);
 static const char *_getbase(Evas_Object *obj);
 static void _signal_entry_changed(void *data, Evas_Object *obj, const char *emission, const char *source);
@@ -152,6 +159,7 @@ static void _signal_entry_copy_notify(void *data, Evas_Object *obj, const char *
 static void _signal_entry_cut_notify(void *data, Evas_Object *obj, const char *emission, const char *source);
 static void _signal_cursor_changed(void *data, Evas_Object *obj, const char *emission, const char *source);
 static void _add_chars_till_limit(Evas_Object *obj, char **text, int can_add, Length_Unit unit);
+static void _entry_hover_anchor_clicked(void *data, Evas_Object *obj, void *event_info);
 //// TIZEN ONLY
 static void _signal_selection_end(void *data, Evas_Object *obj, const char *emission, const char *source);
 static void _signal_handler_move_start(void *data, Evas_Object *obj, const char *emission, const char *source);
@@ -166,6 +174,7 @@ static Evas_Coord_Rectangle _viewport_region_get(Evas_Object *data);
 static void _region_get_job(void *data);
 static void _region_recalc_job(void *data);
 //
+
 static const char SIG_CHANGED[] = "changed";
 static const char SIG_CHANGED_USER[] = "changed,user";
 static const char SIG_ACTIVATED[] = "activated";
@@ -185,6 +194,7 @@ static const char SIG_SELECTION_CLEARED[] = "selection,cleared";
 static const char SIG_CURSOR_CHANGED[] = "cursor,changed";
 static const char SIG_CURSOR_CHANGED_MANUAL[] = "cursor,changed,manual";
 static const char SIG_ANCHOR_CLICKED[] = "anchor,clicked";
+static const char SIG_ANCHOR_HOVER_OPENED[] = "anchor,hover,opened";
 static const char SIG_ANCHOR_DOWN[] = "anchor,down";
 static const char SIG_ANCHOR_UP[] = "anchor,up";
 static const char SIG_ANCHOR_IN[] = "anchor,in";
@@ -211,6 +221,7 @@ static const Evas_Smart_Cb_Description _signals[] = {
        {SIG_CURSOR_CHANGED, ""},
        {SIG_CURSOR_CHANGED_MANUAL, ""},
        {SIG_ANCHOR_CLICKED, ""},
+       {SIG_ANCHOR_HOVER_OPENED, ""},
        {SIG_ANCHOR_DOWN, ""},
        {SIG_ANCHOR_UP, ""},
        {SIG_ANCHOR_IN, ""},
@@ -318,16 +329,16 @@ _load_plain(const char *file)
    return NULL;
 }
 
-static void
+static Eina_Bool
 _load(Evas_Object *obj)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
    char *text;
-   if (!wd) return;
+   if (!wd) return EINA_FALSE;
    if (!wd->file)
      {
         elm_object_text_set(obj, "");
-        return;
+        return EINA_TRUE;
      }
    switch (wd->format)
      {
@@ -345,9 +356,13 @@ _load(Evas_Object *obj)
      {
         elm_object_text_set(obj, text);
         free(text);
+        return EINA_TRUE;
      }
    else
-     elm_object_text_set(obj, "");
+     {
+        elm_object_text_set(obj, "");
+        return EINA_FALSE;
+     }
 }
 
 static void
@@ -411,10 +426,10 @@ _delay_write(void *data)
    return ECORE_CALLBACK_CANCEL;
 }
 
-static Elm_Entry_Text_Filter *
+static Elm_Entry_Markup_Filter *
 _filter_new(Elm_Entry_Filter_Cb func, void *data)
 {
-   Elm_Entry_Text_Filter *tf = ELM_NEW(Elm_Entry_Text_Filter);
+   Elm_Entry_Markup_Filter *tf = ELM_NEW(Elm_Entry_Markup_Filter);
    if (!tf) return NULL;
 
    tf->func = func;
@@ -467,7 +482,7 @@ _filter_new(Elm_Entry_Filter_Cb func, void *data)
 }
 
 static void
-_filter_free(Elm_Entry_Text_Filter *tf)
+_filter_free(Elm_Entry_Markup_Filter *tf)
 {
    if (tf->func == elm_entry_filter_limit_size)
      {
@@ -498,6 +513,8 @@ _del_pre_hook(Evas_Object *obj)
         wd->delay_write = NULL;
         if (wd->autosave) _save(obj);
      }
+   elm_entry_anchor_hover_end(obj);
+   elm_entry_anchor_hover_parent_set(obj, NULL);
 }
 
 static void
@@ -506,7 +523,7 @@ _del_hook(Evas_Object *obj)
    Widget_Data *wd = elm_widget_data_get(obj);
    Elm_Entry_Context_Menu_Item *it;
    Elm_Entry_Item_Provider *ip;
-   Elm_Entry_Text_Filter *tf;
+   Elm_Entry_Markup_Filter *tf;
 
    evas_event_freeze(evas_object_evas_get(obj));
 
@@ -554,12 +571,17 @@ _del_hook(Evas_Object *obj)
      {
         _filter_free(tf);
      }
+   EINA_LIST_FREE(wd->markup_filters, tf)
+     {
+        _filter_free(tf);
+     }
    if (wd->delay_write) ecore_timer_del(wd->delay_write);
    if (wd->input_panel_imdata) free(wd->input_panel_imdata);
-   free(wd);
 
+   if (wd->anchor_hover.hover_style) eina_stringshare_del(wd->anchor_hover.hover_style);
    evas_event_thaw(evas_object_evas_get(obj));
    evas_event_thaw_eval(evas_object_evas_get(obj));
+   free(wd);
 }
 
 static void
@@ -567,6 +589,8 @@ _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
    edje_object_mirrored_set(wd->ent, rtl);
+   if (wd->anchor_hover.hover)
+      elm_widget_mirrored_set(wd->anchor_hover.hover, rtl);
 }
 
 static void
@@ -589,6 +613,7 @@ _theme_hook(Evas_Object *obj)
      edje_object_signal_emit(wd->ent, "elm,state,disabled", "elm");
    edje_object_part_text_input_panel_layout_set(wd->ent, "elm.text", wd->input_panel_layout);
    edje_object_part_text_autocapital_type_set(wd->ent, "elm.text", wd->autocapital_type);
+   edje_object_part_text_prediction_allow_set(wd->ent, "elm.text", wd->prediction_allow);
    edje_object_part_text_input_panel_enabled_set(wd->ent, "elm.text", wd->input_panel_enable);
    edje_object_part_text_input_panel_imdata_set(wd->ent, "elm.text", wd->input_panel_imdata, wd->input_panel_imdata_len);
    edje_object_part_text_input_panel_return_key_type_set(wd->ent, "elm.text", wd->input_panel_return_key_type);
@@ -616,7 +641,6 @@ _theme_hook(Evas_Object *obj)
           elm_widget_highlight_in_theme_set(obj, EINA_FALSE);
      }
    _sizing_eval(obj);
-
    evas_event_thaw(evas_object_evas_get(obj));
    evas_event_thaw_eval(evas_object_evas_get(obj));
 }
@@ -672,7 +696,7 @@ _elm_deferred_recalc_job(void *data)
    elm_coords_finger_size_adjust(1, &minw, 1, &minh);
    /* This is a hack to workaround the way min size hints are treated.
     * If the minimum width is smaller than the restricted width, it means
-    * the mininmum doesn't matter. */
+    * the minimum doesn't matter. */
    if (minw <= resw)
      {
         Evas_Coord ominw = -1;
@@ -757,7 +781,7 @@ _sizing_eval(Evas_Object *obj)
              elm_coords_finger_size_adjust(1, &minw, 1, &minh);
              /* This is a hack to workaround the way min size hints are treated.
               * If the minimum width is smaller than the restricted width, it means
-              * the mininmum doesn't matter. */
+              * the minimum doesn't matter. */
              if (minw <= vw)
                {
                   Evas_Coord ominw = -1;
@@ -804,8 +828,8 @@ _sizing_eval(Evas_Object *obj)
 
              elm_smart_scroller_child_viewport_size_get(wd->scroller, &vw, &vh);
 
-             if ((minw > 0) && (vw < minw)) vw = minw;
-             if (minh > 0) vh = minh;
+             if (minw > vw) vw = minw;
+             if (minh > vh) vh = minh;
 
              evas_object_resize(wd->ent, vw, vh);
              edje_object_size_min_calc
@@ -859,30 +883,34 @@ _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
    Widget_Data *wd = elm_widget_data_get(obj);
    Evas_Object *top = elm_widget_top_get(obj);
    if (!wd) return;
-   if (!wd->editable) return;
+
    if (elm_widget_focus_get(obj))
      {
         printf("[Elm_entry::Focused] obj : %p\n", obj);
         evas_object_focus_set(wd->ent, EINA_TRUE);
         edje_object_signal_emit(wd->ent, "elm,action,focus", "elm");
-        if (top && wd->input_panel_enable)
-          elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_ON);
-        evas_object_smart_callback_call(obj, SIG_FOCUSED, NULL);
-        _check_enable_return_key(obj);
         wd->mgf_type = _ENTRY_MAGNIFIER_FIXEDSIZE;
+        if (wd->editable)
+          {
+             if (top && wd->input_panel_enable)
+               elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_ON);
+             evas_object_smart_callback_call(obj, SIG_FOCUSED, NULL);
+             _check_enable_return_key(obj);
+          }
      }
    else
      {
         printf("[Elm_entry::Unfocused] obj : %p\n", obj);
         edje_object_signal_emit(wd->ent, "elm,action,unfocus", "elm");
         evas_object_focus_set(wd->ent, EINA_FALSE);
-        if (top && wd->input_panel_enable)
-          elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_OFF);
-        evas_object_smart_callback_call(obj, SIG_UNFOCUSED, NULL);
-
         if ((wd->api) && (wd->api->obj_hidemenu))
+          wd->api->obj_hidemenu(obj);
+
+        if (wd->editable)
           {
-             wd->api->obj_hidemenu(obj);
+             if (top && wd->input_panel_enable)
+               elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_OFF);
+             evas_object_smart_callback_call(obj, SIG_UNFOCUSED, NULL);
           }
      }
 }
@@ -892,6 +920,7 @@ _content_set_hook(Evas_Object *obj, const char *part, Evas_Object *content)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
    Evas_Object *edje;
+   Evas_Object *prev_content;
    if ((!wd) || (!content)) return;
 
    if (wd->scroll)
@@ -899,23 +928,20 @@ _content_set_hook(Evas_Object *obj, const char *part, Evas_Object *content)
    else
       edje = wd->ent;
 
-   /* Delete the currently swallowed object */
-   Evas_Object *cswallow;
-
    if (!part || !strcmp(part, "icon"))
      {
-        cswallow = edje_object_part_swallow_get(edje, "elm.swallow.icon");
+        prev_content = edje_object_part_swallow_get(edje, "elm.swallow.icon");
         edje_object_signal_emit(edje, "elm,action,show,icon", "elm");
      }
    else if (!strcmp(part, "end"))
      {
-        cswallow = edje_object_part_swallow_get(edje, "elm.swallow.end");
+        prev_content = edje_object_part_swallow_get(edje, "elm.swallow.end");
         edje_object_signal_emit(edje, "elm,action,show,end", "elm");
      }
    else
-     cswallow = edje_object_part_swallow_get(edje, part);
+     prev_content = edje_object_part_swallow_get(edje, part);
 
-   if (cswallow) evas_object_del(cswallow);
+   if (prev_content) evas_object_del(prev_content);
 
    evas_event_freeze(evas_object_evas_get(obj));
    elm_widget_sub_object_add(obj, content);
@@ -999,6 +1025,18 @@ _translate_hook(Evas_Object *obj)
    evas_object_smart_callback_call(obj, "language,changed", NULL);
 }
 
+static Eina_Bool
+_event_hook(Evas_Object *obj, Evas_Object *src, Evas_Callback_Type type, void *event_info)
+{
+   if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
+   Evas_Event_Key_Down *ev = event_info;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return EINA_FALSE;
+   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
+   if (elm_widget_disabled_get(obj)) return EINA_FALSE;
+   return EINA_TRUE;
+}
+
 static void
 _signal_emit_hook(Evas_Object *obj, const char *emission, const char *source)
 {
@@ -1226,25 +1264,71 @@ _select(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
       //elm_widget_scroll_hold_push(data);
 }
 
+static char *
+_remove_item_tags(const char *str)
+{
+   char *ret;
+   if (!str)
+     return NULL;
+
+   Eina_Strbuf *buf = eina_strbuf_new();
+   if (!buf)
+     return NULL;
+
+   if (!eina_strbuf_append(buf, str))
+     return NULL;
+
+   while (EINA_TRUE)
+     {
+        const char *temp = eina_strbuf_string_get(buf);
+
+        char *startTag = NULL;
+        char *endTag = NULL;
+
+        startTag = strstr(temp, "<item");
+        if (!startTag)
+          startTag = strstr(temp, "</item");
+        if (startTag)
+          endTag = strstr(startTag, ">");
+        else
+          break;
+        if (!endTag || startTag > endTag)
+          break;
+
+        size_t sindex = startTag - temp;
+        size_t eindex = endTag - temp + 1;
+        if (!eina_strbuf_remove(buf, sindex, eindex))
+          break;
+     }
+   ret = eina_strbuf_string_steal(buf);
+   eina_strbuf_free(buf);
+   return ret;
+}
+
 void
 _elm_entry_entry_paste(Evas_Object *obj, const char *entry)
 {
-   Elm_Entry_Change_Info info;
-   info.insert = EINA_TRUE;
-   info.change.insert.pos = elm_entry_cursor_pos_get(obj);
-   info.change.insert.content = eina_stringshare_add(entry);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   char *str = NULL;
+
+   if (wd->cnp_mode == ELM_CNP_MODE_NO_IMAGE)
      {
-        char *tmp;
-        tmp = evas_textblock_text_markup_to_utf8(elm_entry_textblock_get(obj),
-              info.change.insert.content);
-        info.change.insert.plain_length = eina_unicode_utf8_get_len(tmp);
-        free(tmp);
+        str = _remove_item_tags(entry);
+        if (!str) str = strdup(entry);
      }
+   else
+     str = strdup(entry);
+   if (!str) str = (char *)entry;
 
-   elm_entry_entry_insert(obj, entry);
-   evas_object_smart_callback_call(obj, SIG_CHANGED_USER, &info);
+   edje_object_part_text_user_insert(wd->ent, "elm.text", str);
+   if (str != entry) free(str);
 
-   eina_stringshare_del(info.change.insert.content);
+   // start for cbhm
+#ifdef HAVE_ELEMENTARY_X
+   if (cnpwidgetdata == obj)
+      ecore_x_selection_secondary_set(elm_win_xwindow_get(obj), "",1);
+#endif
+   // end for cbhm
 }
 
 static void
@@ -1262,7 +1346,7 @@ _paste(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
           formats = ELM_SEL_FORMAT_TEXT;
         else if (wd->cnp_mode != ELM_CNP_MODE_NO_IMAGE)
           formats |= ELM_SEL_FORMAT_IMAGE;
-        elm_cnp_selection_get(ELM_SEL_TYPE_CLIPBOARD, formats, data, NULL, NULL);
+        elm_cnp_selection_get(data, ELM_SEL_TYPE_CLIPBOARD, formats, NULL, NULL);
 #endif
      }
 }
@@ -1272,59 +1356,13 @@ _store_selection(Elm_Sel_Type seltype, Evas_Object *obj)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
    const char *sel;
-   char *sel_str = NULL;
-   Elm_Sel_Format formats = ELM_SEL_FORMAT_MARKUP;
 
    if (!wd) return;
    sel = edje_object_part_text_selection_get(wd->ent, "elm.text");
    if ((!sel) || (!sel[0])) return; /* avoid deleting our own selection */
-   if (wd->cnp_mode == ELM_CNP_MODE_PLAINTEXT)
-     {
-        sel_str = elm_entry_markup_to_utf8(sel);
-        if (!sel_str)
-          return;
-        formats = ELM_SEL_FORMAT_TEXT;
-     }
-   else
-     {
-        sel_str = strdup(sel);
-        if (!sel_str)
-          return;
-        if (wd->cnp_mode == ELM_CNP_MODE_NO_IMAGE)
-          {
-             while (EINA_TRUE)
-               {
-                  char *startTag = NULL;
-                  char *endTag = NULL;
-
-                  startTag = strstr(sel_str, "<item");
-                  if (!startTag)
-                    startTag = strstr(sel_str, "</item");
-                  if (startTag)
-                    endTag = strstr(startTag, ">");
-                  else
-                    break;
-                  if (!endTag || startTag > endTag)
-                    break;
-
-                  size_t sindex = startTag - sel_str;
-                  size_t eindex = endTag - sel_str + 1;
-
-                  Eina_Strbuf *buf = eina_strbuf_new();
-                  if (buf)
-                    {
-                       eina_strbuf_append(buf, sel_str);
-                       eina_strbuf_remove(buf, sindex, eindex);
-                       sel_str = eina_strbuf_string_steal(buf);
-                       eina_strbuf_free(buf);
-                    }
-               }
-          }
-     }
-   elm_cnp_selection_set(seltype, obj, formats, sel_str, strlen(sel_str));
+   elm_cnp_selection_set(obj, seltype, ELM_SEL_FORMAT_MARKUP, sel, strlen(sel));
    if (seltype == ELM_SEL_TYPE_CLIPBOARD)
      eina_stringshare_replace(&wd->cut_sel, sel);
-   free(sel_str);
 }
 
 static void
@@ -1340,8 +1378,7 @@ _cut(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
    if (!_elm_config->desktop_entry)
      elm_widget_scroll_hold_pop(data);
    _store_selection(ELM_SEL_TYPE_CLIPBOARD, data);
-   edje_object_part_text_insert(wd->ent, "elm.text", "");
-   edje_object_part_text_select_none(wd->ent, "elm.text");
+   edje_object_part_text_user_insert(wd->ent, "elm.text", "");
    _sizing_eval(data);
 }
 
@@ -1350,10 +1387,10 @@ _copy(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 {
    Widget_Data *wd = elm_widget_data_get(data);
    if (!wd) return;
-   wd->selmode = EINA_FALSE;
+   wd->selmode = EINA_TRUE;   // TIZEN ONLY
    if (!_elm_config->desktop_entry)
      {
-        edje_object_part_text_select_allow_set(wd->ent, "elm.text", EINA_FALSE);
+        //edje_object_part_text_select_allow_set(wd->ent, "elm.text", EINA_FALSE);   // TIZEN ONLY
         edje_object_signal_emit(wd->ent, "elm,state,select,off", "elm");
         elm_widget_scroll_hold_pop(data);
      }
@@ -1583,7 +1620,7 @@ _magnifier_create(void *data)
    key_data = edje_object_data_get(wd->mgf_bg, "scale");
    if (key_data) wd->mgf_scale = atof(key_data);
 
-   elm_scale = elm_scale_get();
+   elm_scale = elm_config_scale_get();
    wd->mgf_height = (int)((float)wd->mgf_height * elm_scale);
 
    if (wd->mgf_type == _ENTRY_MAGNIFIER_FILLWIDTH)
@@ -1639,7 +1676,8 @@ _long_press(void *data)
 {
    Widget_Data *wd = elm_widget_data_get(data);
    if (!wd) return ECORE_CALLBACK_CANCEL;
-   //_menu_press(data);  /////// TIZEN ONLY
+   if ((!_elm_config->desktop_entry) && (!wd->magnifier_enabled))
+     _menu_press(data); /////// TIZEN ONLY
    wd->longpress_timer = NULL;
    evas_object_smart_callback_call(data, SIG_LONGPRESSED, NULL);
    return ECORE_CALLBACK_CANCEL;
@@ -1681,16 +1719,15 @@ _mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *
           {
              _magnifier_hide(data);
              elm_object_scroll_freeze_pop(data);
+             if (wd->long_pressed) _menu_press(data);
           }
-        if (wd->long_pressed)
-          _menu_press(data);
         if (wd->longpress_timer)
           {
              ecore_timer_del(wd->longpress_timer);
              wd->longpress_timer = NULL;
           }
      }
-   else if (ev->button == 3)
+   else if ((ev->button == 3) && (!_elm_config->desktop_entry))
      {
         wd->usedown = 1;
         _menu_press(data);
@@ -1809,29 +1846,7 @@ _getbase(Evas_Object *obj)
                }
           }
      }
-   return "base";
-}
-
-#ifndef HAVE_STRCASESTR
-char* _strcasestr(const char *s, const char *find)
-{
-   char c, sc;
-   size_t len;
-
-   if ((c = *find++) != 0) {
-      c = tolower((unsigned char) c);
-      len = strlen(find);
-      do {
-         do {
-            if( (sc = *s++) == 0)
-               return NULL;
-         } while ((char)tolower((unsigned char)sc) != c);
-      } while (strncasecmp(s, find, len) != 0);
-      s--;
-   }
-   return ((char*) s);
 }
-#endif
 
 static void
 _entry_changed_common_handling(void *data, const char *event)
@@ -2015,7 +2030,6 @@ static void
 _region_get_job(void *data)
 {
    Widget_Data *wd = elm_widget_data_get(data);
-   Evas_Coord_Rectangle ret_rect;
    if (!wd) return;
    wd->region_get_job = NULL;
 
@@ -2113,7 +2127,7 @@ _signal_selection_start(void *data, Evas_Object *obj __UNUSED__, const char *emi
 
         top = elm_widget_top_get(data);
         if (txt && top && (elm_win_xwindow_get(top)))
-          elm_cnp_selection_set(ELM_SEL_TYPE_PRIMARY, data,
+          elm_cnp_selection_set(data, ELM_SEL_TYPE_PRIMARY,
                                 ELM_SEL_FORMAT_MARKUP, txt, strlen(txt));
      }
 #endif
@@ -2199,7 +2213,7 @@ _signal_selection_cleared(void *data, Evas_Object *obj __UNUSED__, const char *e
 
              top = elm_widget_top_get(data);
              if ((top) && (elm_win_xwindow_get(top)))
-               elm_cnp_selection_set(ELM_SEL_TYPE_PRIMARY, data,
+               elm_cnp_selection_set(data, ELM_SEL_TYPE_PRIMARY,
                                      ELM_SEL_FORMAT_MARKUP, wd->cut_sel,
                                      strlen(wd->cut_sel));
 #endif
@@ -2213,7 +2227,7 @@ _signal_selection_cleared(void *data, Evas_Object *obj __UNUSED__, const char *e
 
              top = elm_widget_top_get(data);
              if ((top) && (elm_win_xwindow_get(top)))
-               elm_cnp_selection_clear(ELM_SEL_TYPE_PRIMARY, data);
+               elm_object_cnp_selection_clear(data, ELM_SEL_TYPE_PRIMARY);
 #endif
           }
      }
@@ -2228,9 +2242,13 @@ static void
 _signal_entry_paste_request(void *data, Evas_Object *obj __UNUSED__, const char *emission, const char *source __UNUSED__)
 {
    Widget_Data *wd = elm_widget_data_get(data);
+#ifdef HAVE_ELEMENTARY_X
    Elm_Sel_Type type = (emission[sizeof("ntry,paste,request,")] == '1') ?
      ELM_SEL_TYPE_PRIMARY : ELM_SEL_TYPE_CLIPBOARD;
+#endif
+
    if (!wd) return;
+   if (!wd->editable) return;
    evas_object_smart_callback_call(data, SIG_SELECTION_PASTE, NULL);
    if (wd->sel_notify_handler)
      {
@@ -2246,8 +2264,8 @@ _signal_entry_paste_request(void *data, Evas_Object *obj __UNUSED__, const char
                formats = ELM_SEL_FORMAT_TEXT;
              else if (wd->cnp_mode != ELM_CNP_MODE_NO_IMAGE)
                formats |= ELM_SEL_FORMAT_IMAGE;
-             elm_cnp_selection_get(ELM_SEL_TYPE_CLIPBOARD, formats, data,
-                               NULL, NULL);
+             elm_cnp_selection_get(data, type, formats,
+                                   NULL, NULL);
           }
 #endif
      }
@@ -2256,12 +2274,14 @@ _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__)
 {
+   evas_object_smart_callback_call(data, SIG_SELECTION_COPY, NULL);
    _copy(data, NULL, NULL);
 }
 
 static void
 _signal_entry_cut_notify(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
 {
+   evas_object_smart_callback_call(data, SIG_SELECTION_CUT, NULL);
    _cut(data, NULL, NULL);
 }
 
@@ -2363,7 +2383,12 @@ _signal_anchor_clicked(void *data, Evas_Object *obj __UNUSED__, const char *emis
    _signal_anchor_geoms_do_things_with(wd, &ei);
 
    if (!wd->disabled)
-     evas_object_smart_callback_call(data, SIG_ANCHOR_CLICKED, &ei);
+     {
+        evas_object_smart_callback_call(data, SIG_ANCHOR_CLICKED, &ei);
+
+        if (!_elm_config->desktop_entry)
+          _entry_hover_anchor_clicked(data, data, &ei);
+     }
 }
 
 static void
@@ -2547,7 +2572,7 @@ _event_selection_clear(void *data __UNUSED__, int type __UNUSED__, void *event _
           formats = ELM_SEL_FORMAT_TEXT;
         else if (wd->cnp_mode != ELM_CNP_MODE_NO_IMAGE)
           formats |= ELM_SEL_FORMAT_IMAGE;
-        elm_cnp_selection_get(ELM_SEL_TYPE_SECONDARY, formats, data, NULL, NULL);
+        elm_cnp_selection_get(data, ELM_SEL_TYPE_SECONDARY, formats, NULL, NULL);
      }
 
    // end for cbhm
@@ -2620,7 +2645,7 @@ _text_filter(void *data, Evas_Object *edje __UNUSED__, const char *part __UNUSED
 {
    Widget_Data *wd = elm_widget_data_get(data);
    Eina_List *l;
-   Elm_Entry_Text_Filter *tf;
+   Elm_Entry_Markup_Filter *tf;
 
    if (type == EDJE_TEXT_FILTER_FORMAT)
      return;
@@ -2633,6 +2658,21 @@ _text_filter(void *data, Evas_Object *edje __UNUSED__, const char *part __UNUSED
      }
 }
 
+static void
+_markup_filter(void *data, Evas_Object *edje __UNUSED__, const char *part __UNUSED__, char **text)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   Eina_List *l;
+   Elm_Entry_Markup_Filter *tf;
+
+   EINA_LIST_FOREACH(wd->markup_filters, l, tf)
+     {
+        tf->func(tf->data, data, text);
+        if (!*text)
+          break;
+     }
+}
+
 /* This function is used to insert text by chunks in jobs */
 static Eina_Bool
 _text_append_idler(void *data)
@@ -2800,7 +2840,6 @@ _elm_entry_text_set(Evas_Object *obj, const char *item, const char *entry)
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   evas_event_freeze(evas_object_evas_get(obj));
    if (!entry) entry = "";
    if (item && strcmp(item, "default"))
      {
@@ -2808,6 +2847,7 @@ _elm_entry_text_set(Evas_Object *obj, const char *item, const char *entry)
         return;
      }
 
+   evas_event_freeze(evas_object_evas_get(obj));
    if (wd->text) eina_stringshare_del(wd->text);
    wd->text = NULL;
    if (wd->password_text) eina_stringshare_del(wd->password_text);
@@ -2856,20 +2896,14 @@ _elm_entry_text_get(const Evas_Object *obj, const char *item)
    if (item && strcmp(item, "default")) return NULL;
    const char *text;
    if (!wd) return NULL;
-   if (wd->password)
-     {
-        if(wd->password_text) return wd->password_text;
-     }
-   else if (wd->text)
-     {
-        return wd->text;
-     }
+
    text = edje_object_part_text_get(wd->ent, "elm.text");
    if (!text)
      {
         ERR("text=NULL for edje %p, part 'elm.text'", wd->ent);
         return NULL;
      }
+
    if (wd->append_text_len > 0)
      {
         char *tmpbuf;
@@ -2882,7 +2916,8 @@ _elm_entry_text_get(const Evas_Object *obj, const char *item)
              return NULL;
           }
         memcpy(tmpbuf, text, tlen);
-        memcpy(tmpbuf + tlen, wd->append_text_left, wd->append_text_len);
+        if (wd->append_text_left)
+          memcpy(tmpbuf + tlen, wd->append_text_left, strlen(wd->append_text_left));
         tmpbuf[tlen + wd->append_text_len] = '\0';
         eina_stringshare_replace(&wd->text, tmpbuf);
         free(tmpbuf);
@@ -2908,7 +2943,10 @@ _elm_entry_text_get(const Evas_Object *obj, const char *item)
 EAPI Evas_Object *
 elm_entry_add(Evas_Object *parent)
 {
-   Evas_Object *obj, *top;
+#ifdef HAVE_ELEMENTARY_X
+   Evas_Object *top;
+#endif
+   Evas_Object *obj;
    Evas *e;
    Widget_Data *wd;
 
@@ -2930,13 +2968,13 @@ elm_entry_add(Evas_Object *parent)
    elm_widget_signal_callback_del_hook_set(obj, _signal_callback_del_hook);
    elm_object_cursor_set(obj, ELM_CURSOR_XTERM);
    elm_widget_can_focus_set(obj, EINA_TRUE);
-   elm_widget_highlight_ignore_set(obj, EINA_TRUE);
    elm_widget_text_set_hook_set(obj, _elm_entry_text_set);
    elm_widget_text_get_hook_set(obj, _elm_entry_text_get);
    elm_widget_content_set_hook_set(obj, _content_set_hook);
    elm_widget_content_unset_hook_set(obj, _content_unset_hook);
    elm_widget_content_get_hook_set(obj, _content_get_hook);
    elm_widget_translate_hook_set(obj, _translate_hook);
+   elm_widget_event_hook_set(obj, _event_hook);
 
    evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, wd);
 
@@ -2945,17 +2983,17 @@ elm_entry_add(Evas_Object *parent)
    wd->disabled     = EINA_FALSE;
    wd->context_menu = EINA_TRUE;
    wd->autosave     = EINA_TRUE;
-   wd->textonly     = EINA_FALSE;
+   wd->cnp_mode     = ELM_CNP_MODE_MARKUP;
    wd->scroll       = EINA_FALSE;
    wd->input_panel_imdata = NULL;
 //TIZEN ONLY
-   wd->cnp_mode     = ELM_CNP_MODE_MARKUP;
    wd->magnifier_enabled = EINA_TRUE;
 //
 
    wd->ent = edje_object_add(e);
    edje_object_item_provider_set(wd->ent, _get_item, obj);
    edje_object_text_insert_filter_callback_add(wd->ent,"elm.text", _text_filter, obj);
+   edje_object_text_markup_filter_callback_add(wd->ent,"elm.text", _markup_filter, obj);
    evas_object_event_callback_add(wd->ent, EVAS_CALLBACK_MOVE, _move, obj);
    evas_object_event_callback_add(wd->ent, EVAS_CALLBACK_MOUSE_DOWN,
                                   _mouse_down, obj);
@@ -3046,7 +3084,9 @@ elm_entry_add(Evas_Object *parent)
 
    elm_entry_input_panel_layout_set(obj, ELM_INPUT_PANEL_LAYOUT_NORMAL);
 
-   wd->input_panel_enable = edje_object_part_text_input_panel_enabled_get(wd->ent, "elm.text");
+   elm_entry_input_panel_enabled_set(obj, EINA_TRUE);
+   elm_entry_prediction_allow_set(obj, EINA_TRUE);
+
    wd->autocapital_type = edje_object_part_text_autocapital_type_get(wd->ent, "elm.text");
 
 #ifdef HAVE_ELEMENTARY_X
@@ -3079,7 +3119,7 @@ elm_entry_add(Evas_Object *parent)
    return obj;
 }
 
-EAPI void elm_entry_extension_module_data_get(Evas_Object *obj,Elm_Entry_Extension_data *ext_mod)
+void elm_entry_extension_module_data_get(Evas_Object *obj,Elm_Entry_Extension_data *ext_mod)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
@@ -3103,6 +3143,35 @@ EAPI void elm_entry_extension_module_data_get(Evas_Object *obj,Elm_Entry_Extensi
 }
 
 EAPI void
+elm_entry_text_style_user_push(Evas_Object *obj, const char *style)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   edje_object_part_text_style_user_push(wd->ent, "elm.text", style);
+   _theme_hook(obj);
+}
+
+EAPI void
+elm_entry_text_style_user_pop(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   edje_object_part_text_style_user_pop(wd->ent, "elm.text");
+   _theme_hook(obj);
+}
+
+EAPI const char*
+elm_entry_text_style_user_peek(const Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+   return edje_object_part_text_style_user_peek(wd->ent, "elm.text");
+}
+
+EAPI void
 elm_entry_single_line_set(Evas_Object *obj, Eina_Bool single_line)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
@@ -3276,7 +3345,7 @@ elm_entry_is_empty(const Evas_Object *obj)
     * otherwise it is. */
    tb = edje_object_part_object_get(wd->ent, "elm.text");
    cur = evas_object_textblock_cursor_new((Evas_Object *) tb); /* This is
-                                                                  actually, ok for the time being, thsese hackish stuff will be removed
+                                                                  actually, ok for the time being, these hackish stuff will be removed
                                                                   once evas 1.0 is out*/
    evas_textblock_cursor_pos_set(cur, 0);
    ret = evas_textblock_cursor_char_next(cur);
@@ -3301,7 +3370,7 @@ elm_entry_textblock_get(Evas_Object *obj)
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return NULL;
 
-   return edje_object_part_object_get(wd->ent, "elm.text");
+   return (Evas_Object *) edje_object_part_object_get(wd->ent, "elm.text");
 }
 
 EAPI void
@@ -3487,7 +3556,6 @@ elm_entry_cursor_end_set(Evas_Object *obj)
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
    edje_object_part_text_cursor_end_set(wd->ent, "elm.text", EDJE_CURSOR_MAIN);
-   edje_object_message_signal_process(wd->ent);
 }
 
 EAPI void
@@ -3642,7 +3710,7 @@ elm_entry_context_menu_disabled_set(Evas_Object *obj, Eina_Bool disabled)
    if (wd->context_menu == !disabled) return;
    wd->context_menu = !disabled;
 
-   if (!_elm_config->desktop_entry)
+   if (!_elm_config->desktop_entry) // TIZEN ONLY : commit ? 
      edje_object_part_text_copy_paste_disabled_set(wd->ent, "elm.text", disabled);
 }
 
@@ -3656,26 +3724,7 @@ elm_entry_context_menu_disabled_get(const Evas_Object *obj)
 }
 
 EAPI void
-elm_entry_magnifier_disabled_set(Evas_Object *obj, Eina_Bool disabled)
-{
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   if (wd->magnifier_enabled == !disabled) return;
-   wd->magnifier_enabled = !disabled;
-}
-
-EAPI Eina_Bool
-elm_entry_magnifier_disabled_get(const Evas_Object *obj)
-{
-   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return EINA_FALSE;
-   return !wd->magnifier_enabled;
-}
-
-EAPI void
-elm_entry_item_provider_append(Evas_Object *obj, Evas_Object *(*func) (void *data, Evas_Object *entry, const char *item), void *data)
+elm_entry_item_provider_append(Evas_Object *obj, Elm_Entry_Item_Provider_Cb func, void *data)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
@@ -3689,7 +3738,7 @@ elm_entry_item_provider_append(Evas_Object *obj, Evas_Object *(*func) (void *dat
 }
 
 EAPI void
-elm_entry_item_provider_prepend(Evas_Object *obj, Evas_Object *(*func) (void *data, Evas_Object *entry, const char *item), void *data)
+elm_entry_item_provider_prepend(Evas_Object *obj, Elm_Entry_Item_Provider_Cb func, void *data)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
@@ -3703,7 +3752,7 @@ elm_entry_item_provider_prepend(Evas_Object *obj, Evas_Object *(*func) (void *da
 }
 
 EAPI void
-elm_entry_item_provider_remove(Evas_Object *obj, Evas_Object *(*func) (void *data, Evas_Object *entry, const char *item), void *data)
+elm_entry_item_provider_remove(Evas_Object *obj, Elm_Entry_Item_Provider_Cb func, void *data)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
@@ -3723,10 +3772,10 @@ elm_entry_item_provider_remove(Evas_Object *obj, Evas_Object *(*func) (void *dat
 }
 
 EAPI void
-elm_entry_text_filter_append(Evas_Object *obj, Elm_Entry_Filter_Cb func, void *data)
+elm_entry_markup_filter_append(Evas_Object *obj, Elm_Entry_Filter_Cb func, void *data)
 {
    Widget_Data *wd;
-   Elm_Entry_Text_Filter *tf;
+   Elm_Entry_Markup_Filter *tf;
    ELM_CHECK_WIDTYPE(obj, widtype);
 
    wd = elm_widget_data_get(obj);
@@ -3736,14 +3785,14 @@ elm_entry_text_filter_append(Evas_Object *obj, Elm_Entry_Filter_Cb func, void *d
    tf = _filter_new(func, data);
    if (!tf) return;
 
-   wd->text_filters = eina_list_append(wd->text_filters, tf);
+   wd->markup_filters = eina_list_append(wd->markup_filters, tf);
 }
 
 EAPI void
-elm_entry_text_filter_prepend(Evas_Object *obj, Elm_Entry_Filter_Cb func, void *data)
+elm_entry_markup_filter_prepend(Evas_Object *obj, Elm_Entry_Filter_Cb func, void *data)
 {
    Widget_Data *wd;
-   Elm_Entry_Text_Filter *tf;
+   Elm_Entry_Markup_Filter *tf;
    ELM_CHECK_WIDTYPE(obj, widtype);
 
    wd = elm_widget_data_get(obj);
@@ -3753,26 +3802,26 @@ elm_entry_text_filter_prepend(Evas_Object *obj, Elm_Entry_Filter_Cb func, void *
    tf = _filter_new(func, data);
    if (!tf) return;
 
-   wd->text_filters = eina_list_prepend(wd->text_filters, tf);
+   wd->markup_filters = eina_list_prepend(wd->markup_filters, tf);
 }
 
 EAPI void
-elm_entry_text_filter_remove(Evas_Object *obj, Elm_Entry_Filter_Cb func, void *data)
+elm_entry_markup_filter_remove(Evas_Object *obj, Elm_Entry_Filter_Cb func, void *data)
 {
    Widget_Data *wd;
    Eina_List *l;
-   Elm_Entry_Text_Filter *tf;
+   Elm_Entry_Markup_Filter *tf;
    ELM_CHECK_WIDTYPE(obj, widtype);
 
    wd = elm_widget_data_get(obj);
 
    EINA_SAFETY_ON_NULL_RETURN(func);
 
-   EINA_LIST_FOREACH(wd->text_filters, l, tf)
+   EINA_LIST_FOREACH(wd->markup_filters, l, tf)
      {
         if ((tf->func == func) && ((!data) || (tf->data == data)))
           {
-             wd->text_filters = eina_list_remove_list(wd->text_filters, l);
+             wd->markup_filters = eina_list_remove_list(wd->markup_filters, l);
              _filter_free(tf);
              return;
           }
@@ -3808,7 +3857,6 @@ elm_entry_filter_limit_size(void *data, Evas_Object *entry, char **text)
    char *current, *utfstr;
    int len, newlen;
    const char *(*text_get)(const Evas_Object *);
-   const char *widget_type;
 
    EINA_SAFETY_ON_NULL_RETURN(data);
    EINA_SAFETY_ON_NULL_RETURN(entry);
@@ -3816,7 +3864,6 @@ elm_entry_filter_limit_size(void *data, Evas_Object *entry, char **text)
 
    /* hack. I don't want to copy the entire function to work with
     * scrolled_entry */
-   widget_type = elm_widget_type_get(entry);
    text_get = _text_get;
 
    current = elm_entry_markup_to_utf8(text_get(entry));
@@ -3825,7 +3872,8 @@ elm_entry_filter_limit_size(void *data, Evas_Object *entry, char **text)
    if (lim->max_char_count > 0)
      {
         len = evas_string_char_len_get(current);
-        if (len >= lim->max_char_count)
+        newlen = evas_string_char_len_get(utfstr);
+        if ((len >= lim->max_char_count) && (newlen > 0))
           {
              evas_object_smart_callback_call(entry, "maxlength,reached", NULL);
              free(*text);
@@ -3834,14 +3882,14 @@ elm_entry_filter_limit_size(void *data, Evas_Object *entry, char **text)
              free(utfstr);
              return;
           }
-        newlen = evas_string_char_len_get(utfstr);
         if ((len + newlen) > lim->max_char_count)
           _add_chars_till_limit(entry, text, (lim->max_char_count - len), LENGTH_UNIT_CHAR);
      }
    else if (lim->max_byte_count > 0)
      {
         len = strlen(current);
-        if (len >= lim->max_byte_count)
+        newlen = strlen(utfstr);
+        if ((len >= lim->max_byte_count) && (newlen > 0))
           {
              evas_object_smart_callback_call(entry, "maxlength,reached", NULL);
              free(*text);
@@ -3850,7 +3898,6 @@ elm_entry_filter_limit_size(void *data, Evas_Object *entry, char **text)
              free(utfstr);
              return;
           }
-        newlen = strlen(utfstr);
         if ((len + newlen) > lim->max_byte_count)
           _add_chars_till_limit(entry, text, (lim->max_byte_count - len), LENGTH_UNIT_BYTE);
      }
@@ -3915,12 +3962,12 @@ elm_entry_filter_accept_set(void *data, Evas_Object *entry __UNUSED__, char **te
    *insert = 0;
 }
 
-EAPI void
+EAPI Eina_Bool
 elm_entry_file_set(Evas_Object *obj, const char *file, Elm_Text_Format format)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype);
+   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
+   if (!wd) return EINA_FALSE;
    if (wd->delay_write)
      {
         ecore_timer_del(wd->delay_write);
@@ -3929,7 +3976,7 @@ elm_entry_file_set(Evas_Object *obj, const char *file, Elm_Text_Format format)
    if (wd->autosave) _save(obj);
    eina_stringshare_replace(&wd->file, file);
    wd->format = format;
-   _load(obj);
+   return _load(obj);
 }
 
 EAPI void
@@ -3975,14 +4022,17 @@ elm_entry_autosave_get(const Evas_Object *obj)
    return wd->autosave;
 }
 
-EAPI void
+EINA_DEPRECATED EAPI void
 elm_entry_cnp_textonly_set(Evas_Object *obj, Eina_Bool textonly)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
-   elm_entry_cnp_mode_set(obj, textonly ? ELM_CNP_MODE_NO_IMAGE : ELM_CNP_MODE_MARKUP);
+   Elm_Cnp_Mode cnp_mode = ELM_CNP_MODE_MARKUP;
+   if (textonly)
+     cnp_mode = ELM_CNP_MODE_NO_IMAGE;
+   elm_entry_cnp_mode_set(obj, cnp_mode);
 }
 
-EAPI Eina_Bool
+EINA_DEPRECATED EAPI Eina_Bool
 elm_entry_cnp_textonly_get(const Evas_Object *obj)
 {
    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
@@ -3990,7 +4040,7 @@ elm_entry_cnp_textonly_get(const Evas_Object *obj)
 }
 
 EAPI void
-elm_entry_cnp_mode_set(Evas_Object *obj, Elm_CNP_Mode cnp_mode)
+elm_entry_cnp_mode_set(Evas_Object *obj, Elm_Cnp_Mode cnp_mode)
 {
    Elm_Sel_Format format = ELM_SEL_FORMAT_MARKUP;
    ELM_CHECK_WIDTYPE(obj, widtype);
@@ -4006,12 +4056,12 @@ elm_entry_cnp_mode_set(Evas_Object *obj, Elm_CNP_Mode cnp_mode)
 #endif
 }
 
-EAPI Elm_CNP_Mode
+EAPI Elm_Cnp_Mode
 elm_entry_cnp_mode_get(const Evas_Object *obj)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+   ELM_CHECK_WIDTYPE(obj, widtype) ELM_CNP_MODE_MARKUP;
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return EINA_FALSE;
+   if (!wd) return ELM_CNP_MODE_MARKUP;
    return wd->cnp_mode;
 }
 
@@ -4083,28 +4133,6 @@ elm_entry_scrollable_get(const Evas_Object *obj)
 }
 
 EAPI void
-elm_entry_icon_set(Evas_Object *obj, Evas_Object *icon)
-{
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   EINA_SAFETY_ON_NULL_RETURN(icon);
-   _content_set_hook(obj, NULL, icon);
-}
-
-EAPI Evas_Object *
-elm_entry_icon_get(const Evas_Object *obj)
-{
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   return _content_get_hook(obj, NULL);
-}
-
-EAPI Evas_Object *
-elm_entry_icon_unset(Evas_Object *obj)
-{
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   return _content_unset_hook(obj, NULL);
-}
-
-EAPI void
 elm_entry_icon_visible_set(Evas_Object *obj, Eina_Bool setting)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
@@ -4125,28 +4153,6 @@ elm_entry_icon_visible_set(Evas_Object *obj, Eina_Bool setting)
 }
 
 EAPI void
-elm_entry_end_set(Evas_Object *obj, Evas_Object *end)
-{
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   EINA_SAFETY_ON_NULL_RETURN(end);
-   _content_set_hook(obj, "end", end);
-}
-
-EAPI Evas_Object *
-elm_entry_end_get(const Evas_Object *obj)
-{
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   return _content_get_hook(obj, "end");
-}
-
-EAPI Evas_Object *
-elm_entry_end_unset(Evas_Object *obj)
-{
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   return _content_unset_hook(obj, "end");
-}
-
-EAPI void
 elm_entry_end_visible_set(Evas_Object *obj, Eina_Bool setting)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
@@ -4300,31 +4306,6 @@ elm_entry_input_panel_enabled_get(const Evas_Object *obj)
    return wd->input_panel_enable;
 }
 
-EINA_DEPRECATED EAPI void
-elm_entry_line_char_wrap_set(Evas_Object *obj, Eina_Bool wrap)
-{
-   if (wrap) elm_entry_line_wrap_set(obj, ELM_WRAP_CHAR);
-}
-
-EAPI void
-elm_entry_autocapitalization_set(Evas_Object *obj, Eina_Bool autocap)
-{
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-
-   if (autocap)
-     wd->autocapital_type = ELM_AUTOCAPITAL_TYPE_SENTENCE;
-   else
-     wd->autocapital_type = ELM_AUTOCAPITAL_TYPE_NONE;
-
-   if (wd->input_panel_layout == ELM_INPUT_PANEL_LAYOUT_URL ||
-       wd->input_panel_layout == ELM_INPUT_PANEL_LAYOUT_EMAIL)
-     wd->autocapital_type = ELM_AUTOCAPITAL_TYPE_NONE;
-
-   edje_object_part_text_autocapital_type_set(wd->ent, "elm.text", wd->autocapital_type);
-}
-
 EAPI void
 elm_entry_input_panel_show(Evas_Object *obj)
 {
@@ -4438,35 +4419,194 @@ elm_entry_input_panel_return_key_disabled_get(const Evas_Object *obj)
 }
 
 EAPI void
-elm_entry_input_panel_return_key_autoenabled_set(Evas_Object *obj, Eina_Bool on)
+elm_entry_input_panel_return_key_autoenabled_set(Evas_Object *obj, Eina_Bool enabled)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
 
-   wd->autoreturnkey = on;
+   wd->autoreturnkey = enabled;
    _check_enable_return_key(obj);
 }
 
-EINA_DEPRECATED EAPI void
-elm_entry_autoperiod_set(Evas_Object *obj __UNUSED__, Eina_Bool autoperiod __UNUSED__)
+EAPI void*
+elm_entry_imf_context_get(Evas_Object *obj)
 {
-   // will be deleted
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+
+   return edje_object_part_text_imf_context_get(wd->ent, "elm.text");
 }
 
-EINA_DEPRECATED EAPI void
-elm_entry_autoenable_returnkey_set(Evas_Object *obj __UNUSED__, Eina_Bool on __UNUSED__)
+/* START - ANCHOR HOVER */
+static void
+_parent_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 {
-   // will be deleted
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return;
+   wd->anchor_hover.hover_parent = NULL;
 }
 
-EAPI Ecore_IMF_Context *elm_entry_imf_context_get(Evas_Object *obj)
+static void
+_anchor_hover_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return;
+   if (wd->anchor_hover.pop) evas_object_del(wd->anchor_hover.pop);
+   wd->anchor_hover.pop = NULL;
+   evas_object_event_callback_del_full(wd->anchor_hover.hover, EVAS_CALLBACK_DEL,
+                                       _anchor_hover_del, obj);
+}
+
+EAPI void
+elm_entry_anchor_hover_parent_set(Evas_Object *obj, Evas_Object *parent)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   if (wd->anchor_hover.hover_parent)
+     evas_object_event_callback_del_full(wd->anchor_hover.hover_parent, EVAS_CALLBACK_DEL, _parent_del, obj);
+   wd->anchor_hover.hover_parent = parent;
+   if (wd->anchor_hover.hover_parent)
+     evas_object_event_callback_add(wd->anchor_hover.hover_parent, EVAS_CALLBACK_DEL, _parent_del, obj);
+}
+
+EAPI Evas_Object *
+elm_entry_anchor_hover_parent_get(const Evas_Object *obj)
 {
    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd || !wd->ent) return NULL;
+   if (!wd) return NULL;
+   return wd->anchor_hover.hover_parent;
+}
 
-   return edje_object_part_text_imf_context_get(wd->ent, "elm.text");
+EAPI void
+elm_entry_anchor_hover_style_set(Evas_Object *obj, const char *style)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   eina_stringshare_replace(&wd->anchor_hover.hover_style, style);
+}
+
+EAPI const char *
+elm_entry_anchor_hover_style_get(const Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+   return wd->anchor_hover.hover_style;
+}
+
+EAPI void
+elm_entry_anchor_hover_end(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   if (wd->anchor_hover.hover) evas_object_del(wd->anchor_hover.hover);
+   if (wd->anchor_hover.pop) evas_object_del(wd->anchor_hover.pop);
+   wd->anchor_hover.hover = NULL;
+   wd->anchor_hover.pop = NULL;
+}
+
+
+static void
+_anchor_hover_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   elm_entry_anchor_hover_end(data);
+}
+
+static void
+_entry_hover_anchor_clicked(void *data, Evas_Object *obj, void *event_info)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Elm_Entry_Anchor_Info *info = event_info;
+   Evas_Object *hover_parent;
+   Elm_Entry_Anchor_Hover_Info ei;
+   Evas_Coord x, w, y, h, px, py;
+   if (!wd) return;
+
+   ei.anchor_info = event_info;
+
+   wd->anchor_hover.pop = elm_icon_add(obj);
+   evas_object_move(wd->anchor_hover.pop, info->x, info->y);
+   evas_object_resize(wd->anchor_hover.pop, info->w, info->h);
+
+   wd->anchor_hover.hover = elm_hover_add(obj);
+   evas_object_event_callback_add(wd->anchor_hover.hover, EVAS_CALLBACK_DEL,
+                                  _anchor_hover_del, obj);
+   elm_widget_mirrored_set(wd->anchor_hover.hover, elm_widget_mirrored_get(obj));
+   if (wd->anchor_hover.hover_style)
+     elm_object_style_set(wd->anchor_hover.hover, wd->anchor_hover.hover_style);
+
+   hover_parent = wd->anchor_hover.hover_parent;
+   if (!hover_parent) hover_parent = obj;
+   elm_hover_parent_set(wd->anchor_hover.hover, hover_parent);
+   elm_hover_target_set(wd->anchor_hover.hover, wd->anchor_hover.pop);
+   ei.hover = wd->anchor_hover.hover;
+
+   evas_object_geometry_get(hover_parent, &x, &y, &w, &h);
+   ei.hover_parent.x = x;
+   ei.hover_parent.y = y;
+   ei.hover_parent.w = w;
+   ei.hover_parent.h = h;
+   px = info->x + (info->w / 2);
+   py = info->y + (info->h / 2);
+   ei.hover_left = 1;
+   if (px < (x + (w / 3))) ei.hover_left = 0;
+   ei.hover_right = 1;
+   if (px > (x + ((w * 2) / 3))) ei.hover_right = 0;
+   ei.hover_top = 1;
+   if (py < (y + (h / 3))) ei.hover_top = 0;
+   ei.hover_bottom = 1;
+   if (py > (y + ((h * 2) / 3))) ei.hover_bottom = 0;
+
+   if (elm_widget_mirrored_get(wd->anchor_hover.hover))
+     {  /* Swap right and left because they switch sides in RTL */
+        Eina_Bool tmp = ei.hover_left;
+        ei.hover_left = ei.hover_right;
+        ei.hover_right = tmp;
+     }
+
+   evas_object_smart_callback_call(data, SIG_ANCHOR_HOVER_OPENED, &ei);
+   evas_object_smart_callback_add(wd->anchor_hover.hover, "clicked", _anchor_hover_clicked, data);
+
+   /* FIXME: Should just check if there's any callback registered to the smart
+    * events instead.
+    * This is used to determine if anyone cares about the hover or not. */
+   if (!elm_object_part_content_get(wd->anchor_hover.hover, "middle") &&
+         !elm_object_part_content_get(wd->anchor_hover.hover, "left") &&
+         !elm_object_part_content_get(wd->anchor_hover.hover, "right") &&
+         !elm_object_part_content_get(wd->anchor_hover.hover, "top") &&
+         !elm_object_part_content_get(wd->anchor_hover.hover, "bottom"))
+     {
+        evas_object_del(wd->anchor_hover.hover);
+        wd->anchor_hover.hover = NULL;
+     }
+   else
+     evas_object_show(wd->anchor_hover.hover);
+}
+/* END - ANCHOR HOVER */
+
+EAPI void
+elm_entry_magnifier_disabled_set(Evas_Object *obj, Eina_Bool disabled)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   if (wd->magnifier_enabled == !disabled) return;
+   wd->magnifier_enabled = !disabled;
+}
+
+EAPI Eina_Bool
+elm_entry_magnifier_disabled_get(const Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return EINA_FALSE;
+   return !wd->magnifier_enabled;
 }
 
 EAPI void
@@ -4479,4 +4619,3 @@ elm_entry_magnifier_type_set(Evas_Object *obj, int type)
    wd->mgf_type = type;
    _magnifier_create(obj);
 }
-