[TC-editifield, entry] fix fails
[framework/uifw/elementary.git] / src / lib / elm_editfield.c
index bc9887c..b773f10 100644 (file)
@@ -30,6 +30,7 @@ struct _Widget_Data
    Eina_Bool needs_size_calc:1;
    Eina_Bool show_guide_text:1;
    Eina_Bool editing:1;
+   Eina_Bool clicked:1;
    Eina_Bool single_line:1;
    Eina_Bool eraser_show:1;
 };
@@ -43,6 +44,13 @@ static void _show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
 static void _on_focus_hook(void *data, Evas_Object *obj);
 static Eina_Bool _empty_entry(Evas_Object *entry);
 
+static const char SIG_FOCUSED[] = "focused";
+
+static const Evas_Smart_Cb_Description _signals[] = {
+   {SIG_FOCUSED, ""},
+   {NULL, NULL}
+};
+
 static void
 _del_hook(Evas_Object *obj)
 {
@@ -58,10 +66,11 @@ _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd || !wd->base)
       return;
-   if (!elm_widget_focus_get(obj) && !(elm_widget_disabled_get(obj)) )
+   if (!elm_widget_focus_get(obj))
      {
         evas_object_smart_callback_call(obj, "unfocused", NULL);
         wd->editing = EINA_FALSE;
+        wd->clicked = EINA_FALSE;
         edje_object_signal_emit(wd->base, "elm,state,over,show", "elm");
 
         if (!wd->single_line) // FIXME : if textblock works well, delete
@@ -78,18 +87,30 @@ _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
                }
           }
      }
+   else
+     {
+        evas_object_smart_callback_call(obj, SIG_FOCUSED, NULL);
+     }
 }
 
 static void
 _theme_hook(Evas_Object *obj)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
+   char buf[4096];
    if (!wd || !wd->base)
       return;
+
    _elm_theme_object_set(obj, wd->base, "editfield", "base", elm_widget_style_get(obj));
+   snprintf(buf, sizeof(buf), "editfield/%s", elm_widget_style_get(obj));
+   elm_object_style_set(wd->entry, buf);
    edje_object_part_swallow(wd->base, "elm.swallow.content", wd->entry);
    if(!wd->editing)
       edje_object_signal_emit(wd->base, "elm,state,over,show", "elm");
+   if(wd->single_line)
+     edje_object_signal_emit(wd->base, "elm,state,text,singleline", "elm");
+   else
+     edje_object_signal_emit(wd->base, "elm,state,text,multiline", "elm");
    if(wd->show_guide_text)
      {
         if(_empty_entry(wd->entry))
@@ -154,9 +175,14 @@ static void
 _show_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 {
    Widget_Data *wd = elm_widget_data_get(data);
-   if ((!wd) && (!wd->entry)) return;
-   if (wd->editing && wd->single_line)  // FIXME : single_line is not needed for this conditional state after TEXTBLOCK fixing
-     elm_object_focus(wd->entry);
+   if (!wd) return;
+   if ((wd->single_line) && (wd->clicked) && (!wd->editing))  // FIXME : single_line is not needed for this conditional state after TEXTBLOCK fixing
+     {
+        elm_object_focus(wd->entry);
+        elm_entry_cursor_end_set(wd->entry);
+        wd->editing = EINA_TRUE;
+        wd->clicked = EINA_FALSE;
+     }
 }
 
 static Eina_Bool
@@ -167,7 +193,7 @@ _empty_entry(Evas_Object *entry)
    int len = 0;
 
    text = elm_entry_entry_get(entry);
-   if(!text) return EINA_FALSE;
+   if(!text) return EINA_TRUE;
    strip_text = elm_entry_markup_to_utf8(text);
    if (strip_text) {
         len = strlen(strip_text);
@@ -217,6 +243,15 @@ _entry_changed_cb(void *data, Evas_Object *obj, void* event_info __UNUSED__)
      {
         if(wd->eraser_show)
            edje_object_signal_emit(wd->base, "elm,state,eraser,hidden", "elm");
+        if(!elm_object_focus_get(wd->entry))
+          {
+             if(wd->guide_text)
+               {
+                  edje_object_part_text_set(wd->base, "elm.guidetext", wd->guide_text);
+                  edje_object_signal_emit(wd->base, "elm,state,guidetext,visible", "elm");
+                  wd->show_guide_text = EINA_TRUE;
+               }
+          }
      }
 
    if (!wd->editing && wd->single_line)
@@ -236,15 +271,15 @@ _signal_mouse_clicked(void *data, Evas_Object *obj __UNUSED__, const char *emiss
      }
    else if(strcmp(source, "left_icon") && strcmp(source, "right_icon") && strcmp(source, "eraser"))
      {
-        if(wd->editing == EINA_FALSE)
-           elm_entry_cursor_end_set(wd->entry);
-
-        wd->editing = EINA_TRUE;
-
         edje_object_signal_emit(wd->base, "elm,state,over,hide", "elm");
+        wd->clicked = EINA_TRUE;
 
-        if (!wd->single_line)        //FIXME : after fixing TEXTBLOCK, this should be deleted
-          elm_object_focus(wd->entry);
+        if ((!wd->single_line) && (!wd->editing)) //FIXME : after fixing TEXTBLOCK, this should be deleted
+          {
+             elm_object_focus(wd->entry);
+             elm_entry_cursor_end_set(wd->entry);
+             wd->editing = EINA_TRUE;
+          }
 
         if(!(_empty_entry(wd->entry)) && (wd->eraser_show))
            edje_object_signal_emit(wd->base, "elm,state,eraser,show", "elm");
@@ -318,6 +353,7 @@ elm_editfield_add(Evas_Object *parent)
    evas_object_event_callback_add(wd->base, EVAS_CALLBACK_RESIZE, _resize_cb, obj);
 
    wd->editing = EINA_FALSE;
+   wd->clicked = EINA_FALSE;
    wd->single_line = EINA_FALSE;
    wd->eraser_show = EINA_TRUE;
 
@@ -331,6 +367,7 @@ elm_editfield_add(Evas_Object *parent)
    evas_object_smart_callback_add(wd->entry, "changed", _entry_changed_cb, obj);
    elm_widget_sub_object_add(obj, wd->entry);
    evas_object_show(wd->entry);
+   evas_object_smart_callbacks_descriptions_set(obj, _signals);
    _sizing_eval(obj);
 
    return obj;
@@ -471,8 +508,7 @@ elm_editfield_left_icon_set(Evas_Object *obj, Evas_Object *icon)
       elm_widget_sub_object_del(obj, wd->licon);
    if (icon)
      {
-        if (!(edje_object_part_swallow(wd->base, "left_icon", icon)))
-           return;
+        edje_object_part_swallow(wd->base, "left_icon", icon);
         wd->licon = icon;
         elm_widget_sub_object_add(obj, icon);
         evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
@@ -521,8 +557,7 @@ elm_editfield_right_icon_set(Evas_Object *obj, Evas_Object *icon)
       elm_widget_sub_object_del(obj, wd->ricon);
    if (icon)
      {
-        if ( !(edje_object_part_swallow(wd->base, "right_icon", icon)) )
-           return;
+        edje_object_part_swallow(wd->base, "right_icon", icon);
         wd->ricon = icon;
         elm_widget_sub_object_add(obj, icon);
         evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,