elm entry: add the elm_object_text_set/get hooks.
[framework/uifw/elementary.git] / src / lib / elm_entry.c
index 2deed04..e0432f3 100644 (file)
@@ -595,7 +595,7 @@ _theme_hook(Evas_Object *obj)
      {
         const char *str;
         Evas_Object *edj;
-        
+
         edj = elm_smart_scroller_edje_object_get(wd->scroller);
         str = edje_object_data_get(edj, "focus_highlight");
         if ((str) && (!strcmp(str, "on")))
@@ -712,7 +712,7 @@ _sizing_eval(Evas_Object *obj)
              wd->entmw = minw;
              wd->entmh = minh;
              elm_coords_finger_size_adjust(1, &minw, 1, &minh);
-             
+
              if ((minw > 0) && (vw < minw)) vw = minw;
              if (minh > vh) vh = minh;
 
@@ -739,12 +739,12 @@ _sizing_eval(Evas_Object *obj)
         if (wd->scroll)
           {
              Evas_Coord vw = 0, vh = 0, vmw = 0, vmh = 0, w = -1, h = -1;
-             
+
              edje_object_size_min_calc(wd->ent, &minw, &minh);
              wd->entmw = minw;
              wd->entmh = minh;
              elm_coords_finger_size_adjust(1, &minw, 1, &minh);
-             
+
              elm_smart_scroller_child_viewport_size_get(wd->scroller, &vw, &vh);
 
              if ((minw > 0) && (vw < minw)) vw = minw;
@@ -909,7 +909,7 @@ _resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event
 {
    Widget_Data *wd = elm_widget_data_get(data);
    if (!wd) return;
-   
+
    if (wd->linewrap)
      {
         _sizing_eval(data);
@@ -917,7 +917,7 @@ _resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event
    else if (wd->scroll)
      {
         Evas_Coord vw = 0, vh = 0;
-        
+
         elm_smart_scroller_child_viewport_size_get(wd->scroller, &vw, &vh);
         if (vw < wd->entmw) vw = wd->entmw;
         if (vh < wd->entmh) vh = wd->entmh;
@@ -1090,7 +1090,7 @@ _menu_press(Evas_Object *obj)
           elm_hoversel_horizontal_set(wd->hoversel, EINA_TRUE);
         elm_object_style_set(wd->hoversel, "entry");
         elm_widget_sub_object_add(obj, wd->hoversel);
-        elm_hoversel_label_set(wd->hoversel, "Text");
+        elm_object_text_set(wd->hoversel, "Text");
         top = elm_widget_top_get(obj);
         if (top) elm_hoversel_hover_parent_set(wd->hoversel, top);
         evas_object_smart_callback_add(wd->hoversel, "dismissed", _dismissed, obj);
@@ -1318,7 +1318,7 @@ _entry_changed_common_handling(void *data, const char *event)
    _sizing_eval(data);
    if (wd->text) eina_stringshare_del(wd->text);
    wd->text = NULL;
-   evas_object_smart_callback_call(data, SIG_CHANGED, NULL);
+   evas_object_smart_callback_call(data, event, NULL);
    if (wd->delay_write)
      {
         ecore_timer_del(wd->delay_write);
@@ -1856,6 +1856,70 @@ _add_chars_till_limit(Evas_Object *obj, char **text, int can_add, Length_Unit un
    evas_object_smart_callback_call(obj, "maxlength,reached", NULL);
 }
 
+static void
+_elm_entry_text_set(Evas_Object *obj, const char *item, const char *entry)
+{
+   int len = 0;
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   if (item) return;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   if (!entry) entry = "";
+   if (wd->text) eina_stringshare_del(wd->text);
+   wd->text = NULL;
+   wd->changed = EINA_TRUE;
+
+   /* Clear currently pending job if there is one */
+   if (wd->append_text_idler)
+     {
+        ecore_idler_del(wd->append_text_idler);
+        free(wd->append_text_left);
+        wd->append_text_left = NULL;
+        wd->append_text_idler = NULL;
+     }
+
+   len = strlen(entry);
+   /* Split to ~_CHUNK_SIZE chunks */
+   if (len > _CHUNK_SIZE)
+     {
+        wd->append_text_left = (char *) malloc(len + 1);
+     }
+
+   /* If we decided to use the idler */
+   if (wd->append_text_left)
+     {
+        /* Need to clear the entry first */
+        edje_object_part_text_set(wd->ent, "elm.text", "");
+        memcpy(wd->append_text_left, entry, len + 1);
+        wd->append_text_position = 0;
+        wd->append_text_len = len;
+        wd->append_text_idler = ecore_idler_add(_text_append_idler, obj);
+     }
+   else
+     {
+        edje_object_part_text_set(wd->ent, "elm.text", entry);
+     }
+}
+
+static const char *
+_elm_entry_text_get(const Evas_Object *obj, const char *item)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (item) return NULL;
+   const char *text;
+   if (!wd) return NULL;
+   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;
+     }
+   eina_stringshare_replace(&wd->text, text);
+   return wd->text;
+}
+
 /**
  * This adds an entry to @p parent object.
  *
@@ -1890,7 +1954,9 @@ elm_entry_add(Evas_Object *parent)
    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);
+
    wd->scroller = elm_smart_scroller_add(e);
    elm_widget_sub_object_add(obj, wd->scroller);
    elm_smart_scroller_widget_set(wd->scroller, obj);
@@ -1900,7 +1966,7 @@ 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);
-   
+
    wd->linewrap     = ELM_WRAP_WORD;
    wd->editable     = EINA_TRUE;
    wd->disabled     = EINA_FALSE;
@@ -1920,7 +1986,7 @@ elm_entry_add(Evas_Object *parent)
    evas_object_event_callback_add(wd->ent, EVAS_CALLBACK_MOUSE_MOVE,
                                   _mouse_move, obj);
    evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, obj);
-   
+
    _elm_theme_object_set(obj, wd->ent, "entry", "base", "default");
    edje_object_signal_callback_add(wd->ent, "entry,changed", "elm.text",
                                    _signal_entry_changed, obj);
@@ -2020,8 +2086,8 @@ elm_entry_single_line_set(Evas_Object *obj, Eina_Bool single_line)
    if (wd->scroller)
      {
         if (wd->single_line)
-           elm_smart_scroller_policy_set(wd->scroller, 
-                                         ELM_SMART_SCROLLER_POLICY_OFF, 
+           elm_smart_scroller_policy_set(wd->scroller,
+                                         ELM_SMART_SCROLLER_POLICY_OFF,
                                          ELM_SMART_SCROLLER_POLICY_OFF);
         else
           {
@@ -2031,8 +2097,8 @@ elm_entry_single_line_set(Evas_Object *obj, Eina_Bool single_line)
                   ELM_SMART_SCROLLER_POLICY_ON,
                   ELM_SMART_SCROLLER_POLICY_OFF
                };
-             elm_smart_scroller_policy_set(wd->scroller, 
-                                           map[wd->policy_h], 
+             elm_smart_scroller_policy_set(wd->scroller,
+                                           map[wd->policy_h],
                                            map[wd->policy_v]);
           }
         _sizing_eval(obj);
@@ -2110,45 +2176,7 @@ elm_entry_password_get(const Evas_Object *obj)
 EAPI void
 elm_entry_entry_set(Evas_Object *obj, const char *entry)
 {
-   int len = 0;
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   if (!entry) entry = "";
-   if (wd->text) eina_stringshare_del(wd->text);
-   wd->text = NULL;
-   wd->changed = EINA_TRUE;
-
-   /* Clear currently pending job if there is one */
-   if (wd->append_text_idler)
-     {
-        ecore_idler_del(wd->append_text_idler);
-        free(wd->append_text_left);
-        wd->append_text_left = NULL;
-        wd->append_text_idler = NULL;
-     }
-
-   len = strlen(entry);
-   /* Split to ~_CHUNK_SIZE chunks */
-   if (len > _CHUNK_SIZE)
-     {
-        wd->append_text_left = (char *) malloc(len + 1);
-     }
-
-   /* If we decided to use the idler */
-   if (wd->append_text_left)
-     {
-        /* Need to clear the entry first */
-        edje_object_part_text_set(wd->ent, "elm.text", "");
-        memcpy(wd->append_text_left, entry, len + 1);
-        wd->append_text_position = 0;
-        wd->append_text_len = len;
-        wd->append_text_idler = ecore_idler_add(_text_append_idler, obj);
-     }
-   else
-     {
-        edje_object_part_text_set(wd->ent, "elm.text", entry);
-     }
+   _elm_entry_text_set(obj, NULL, entry);
 }
 
 /**
@@ -2202,19 +2230,7 @@ elm_entry_entry_append(Evas_Object *obj, const char *entry)
 EAPI const char *
 elm_entry_entry_get(const Evas_Object *obj)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   const char *text;
-   if (!wd) return NULL;
-   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;
-     }
-   eina_stringshare_replace(&wd->text, text);
-   return wd->text;
+   return _elm_entry_text_get(obj, NULL);
 }
 
 /**
@@ -3353,7 +3369,7 @@ elm_entry_cnp_textonly_get(const Evas_Object *obj)
  * Enable or disable scrolling in entry
  *
  * Normally the entry is not scrollable unless you enable it with this call.
- * 
+ *
  * @param obj The entry object
  * @param scroll EINA_TRUE if it is to be scrollable, EINA_FALSE otherwise
  *
@@ -3396,7 +3412,7 @@ elm_entry_scrollable_set(Evas_Object *obj, Eina_Bool scroll)
  *
  * Normally the entry is not scrollable. This gets the scrollable state
  * of the entry. See elm_entry_scrollable_set() for more information.
- * 
+ *
  * @param obj The entry object
  * @return The scrollable state
  *
@@ -3644,8 +3660,8 @@ elm_entry_scrollbar_policy_set(Evas_Object *obj, Elm_Scroller_Policy h, Elm_Scro
    if (!wd) return;
    wd->policy_h = h;
    wd->policy_v = v;
-   elm_smart_scroller_policy_set(wd->scroller, 
-                                 map[wd->policy_h], 
+   elm_smart_scroller_policy_set(wd->scroller,
+                                 map[wd->policy_h],
                                  map[wd->policy_v]);
 }