Enlightenment CVS committal

Author  : urandom
Project : e17
Module  : libs/etk

Dir     : e17/libs/etk/src/lib


Modified Files:
        etk_entry.c etk_entry.h 


Log Message:
 [Entry] Never again shall entries be denied the simple right to own images!

===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_entry.c,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -3 -r1.24 -r1.25
--- etk_entry.c 12 Jan 2007 03:16:50 -0000      1.24
+++ etk_entry.c 13 Jan 2007 18:39:23 -0000      1.25
@@ -9,6 +9,7 @@
 #include "etk_signal.h"
 #include "etk_signal_callback.h"
 #include "etk_utils.h"
+#include "etk_image.h"
 
 /**
  * @addtogroup Etk_Entry
@@ -33,16 +34,22 @@
 static void _etk_entry_realize_cb(Etk_Object *object, void *data);
 static void _etk_entry_unrealize_cb(Etk_Object *object, void *data);
 static void _etk_entry_key_down_cb(Etk_Object *object, Etk_Event_Key_Down 
*event, void *data);
-static void _etk_entry_mouse_in_cb(Etk_Object *object, Etk_Event_Mouse_In 
*event, void *data);
-static void _etk_entry_mouse_out_cb(Etk_Object *object, Etk_Event_Mouse_Out 
*event, void *data);
-static void _etk_entry_mouse_down_cb(Etk_Object *object, Etk_Event_Mouse_Down 
*event, void *data);
-static void _etk_entry_mouse_up_cb(Etk_Object *object, Etk_Event_Mouse_Up 
*event, void *data);
-static void _etk_entry_mouse_move_cb(Etk_Object *object, Etk_Event_Mouse_Move 
*event, void *data);
+static void _etk_entry_editable_mouse_in_cb(void *data, Evas *evas, 
Evas_Object *object, void *event_info);
+static void _etk_entry_editable_mouse_out_cb(void *data, Evas *evas, 
Evas_Object *object, void *event_info);
+static void _etk_entry_editable_mouse_down_cb(void *data, Evas *evas, 
Evas_Object *object, void *event_info);
+static void _etk_entry_editable_mouse_up_cb(void *data, Evas *evas, 
Evas_Object *object, void *event_info);
+static void _etk_entry_editable_mouse_move_cb(void *data, Evas *evas, 
Evas_Object *object, void *event_info);
+static void _etk_entry_image_mouse_in_cb(Etk_Widget *widget, 
Etk_Event_Mouse_In *event, void *data);
+static void _etk_entry_image_mouse_out_cb(Etk_Widget *widget, 
Etk_Event_Mouse_Out *event, void *data);
+static void _etk_entry_image_mouse_down_cb(Etk_Widget *widget, 
Etk_Event_Mouse_Down *event, void *data);
+static void _etk_entry_image_mouse_up_cb(Etk_Widget *widget, 
Etk_Event_Mouse_Up *event, void *data);
+static void _etk_entry_clear_button_cb(Etk_Widget *widget, Etk_Event_Mouse_Up 
*event, void *data);
 static void _etk_entry_focus_cb(Etk_Object *object, void *data);
 static void _etk_entry_unfocus_cb(Etk_Object *object, void *data);
 static void _etk_entry_selection_received_cb(Etk_Object *object, void *event, 
void *data);
 static void _etk_entry_selection_copy(Etk_Entry *entry, Etk_Selection_Type 
selection, Etk_Bool cut);
-  
+static void _etk_entry_size_allocate(Etk_Widget *widget, Etk_Geometry 
geometry);
+
 static Etk_Signal *_etk_entry_signals[ETK_ENTRY_NUM_SIGNALS];
 
 
@@ -68,10 +75,10 @@
 
       _etk_entry_signals[ETK_ENTRY_TEXT_CHANGED_SIGNAL] = 
etk_signal_new("text_changed",
          entry_type, -1, etk_marshaller_VOID__VOID, NULL, NULL);
-      
+
       etk_type_property_add(entry_type, "password_mode", 
ETK_ENTRY_PASSWORD_MODE_PROPERTY,
          ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE,  
etk_property_value_bool(ETK_FALSE));
-      
+
       entry_type->property_set = _etk_entry_property_set;
       entry_type->property_get = _etk_entry_property_get;
    }
@@ -98,7 +105,7 @@
 {
    if (!entry)
       return;
-   
+
    if (!entry->editable_object)
    {
       if (entry->text != text)
@@ -109,7 +116,7 @@
    }
    else
       etk_editable_text_set(entry->editable_object, text);
-   
+
    etk_signal_emit(_etk_entry_signals[ETK_ENTRY_TEXT_CHANGED_SIGNAL], 
ETK_OBJECT(entry), NULL);
 }
 
@@ -122,7 +129,7 @@
 {
    if (!entry)
       return NULL;
-   
+
    if (!entry->editable_object)
       return entry->text;
    else
@@ -139,6 +146,160 @@
 }
 
 /**
+ * @brief Sets an image inside the entry
+ * @param entry an entry
+ * @param position image position
+ * @param image an image
+ * @note If you want to remove an existing image, pass NULL instead of an 
Etk_Image
+ */
+void etk_entry_image_set(Etk_Entry *entry, Etk_Entry_Image_Position position, 
Etk_Image *image)
+{
+   int ok = 0;
+
+   if (!entry)
+      return;
+
+   if (position == ETK_ENTRY_IMAGE_PRIMARY)
+   {
+      if (entry->primary_image == image)
+        return;
+
+      if (entry->primary_image)
+      {
+        etk_widget_parent_set(ETK_WIDGET(entry->primary_image), NULL);
+        etk_widget_internal_set(ETK_WIDGET(entry->primary_image), ETK_FALSE);
+        entry->primary_image = NULL;
+      }
+      if (!image)
+        return;
+
+      entry->primary_image = image;
+      ok = 1;
+   }
+   else if (position == ETK_ENTRY_IMAGE_SECONDARY)
+   {
+      if (entry->secondary_image == image)
+        return;
+
+      if (entry->secondary_image)
+      {
+        etk_widget_parent_set(ETK_WIDGET(entry->secondary_image), NULL);
+        etk_widget_internal_set(ETK_WIDGET(entry->secondary_image), ETK_FALSE);
+        entry->secondary_image = NULL;
+      }
+      if (!image)
+        return;
+
+      entry->secondary_image = image;
+      ok = 1;
+   }
+
+   if (ok)
+   {
+      etk_widget_parent_set(ETK_WIDGET(image), ETK_WIDGET(entry));
+      etk_widget_internal_set(ETK_WIDGET(image), ETK_TRUE);
+      etk_widget_show(ETK_WIDGET(image));
+      etk_entry_image_highlight_set(entry, position, ETK_TRUE);
+   }
+}
+
+/**
+ * @brief Sets whether the image will be highlighted on mouse-over
+ * @param entry an entry
+ * @param position image position
+ * @param highlight if @a highlight is ETK_TRUE, the image will be highlighted
+ * @note By default, the image has mouse highlight turn on
+ */
+void etk_entry_image_highlight_set(Etk_Entry *entry, Etk_Entry_Image_Position 
position, Etk_Bool highlight)
+{
+   Etk_Image *image;
+
+   if (!entry)
+      return;
+
+   if (position == ETK_ENTRY_IMAGE_PRIMARY)
+   {
+      if (!(image = entry->primary_image))
+        return;
+      if (entry->primary_image_highlight == highlight)
+        return;
+
+      entry->primary_image_highlight = highlight;
+   }
+   else if (position == ETK_ENTRY_IMAGE_SECONDARY)
+   {
+      if (!(image = entry->secondary_image))
+        return;
+      if (entry->secondary_image_highlight == highlight)
+        return;
+
+      entry->secondary_image_highlight = highlight;
+   }
+   else return;
+
+   if (highlight)
+   {
+      etk_signal_connect("mouse_in", ETK_OBJECT(image),
+           ETK_CALLBACK(_etk_entry_image_mouse_in_cb), entry);
+      etk_signal_connect("mouse_out", ETK_OBJECT(image),
+           ETK_CALLBACK(_etk_entry_image_mouse_out_cb), entry);
+      etk_signal_connect("mouse_down", ETK_OBJECT(image),
+           ETK_CALLBACK(_etk_entry_image_mouse_down_cb), entry);
+      etk_signal_connect("mouse_up", ETK_OBJECT(image),
+           ETK_CALLBACK(_etk_entry_image_mouse_up_cb), entry);
+   }
+   else
+   {
+      etk_signal_disconnect("mouse_in", ETK_OBJECT(image),
+           ETK_CALLBACK(_etk_entry_image_mouse_in_cb));
+      etk_signal_disconnect("mouse_out", ETK_OBJECT(image),
+           ETK_CALLBACK(_etk_entry_image_mouse_out_cb));
+      etk_signal_disconnect("mouse_down", ETK_OBJECT(image),
+           ETK_CALLBACK(_etk_entry_image_mouse_down_cb));
+      etk_signal_disconnect("mouse_up", ETK_OBJECT(image),
+           ETK_CALLBACK(_etk_entry_image_mouse_up_cb));
+
+      evas_object_color_set(etk_image_evas_object_get(image), 255, 255, 255, 
255);
+   }
+}
+
+/**
+ * @brief Gets the image of the entry
+ * @param entry an entry
+ * @param position image position
+ * @return Returns the image of the entry
+ */
+void etk_entry_add_clear_button(Etk_Entry *entry)
+{
+   Etk_Widget *image;
+
+   if (!entry)
+      return;
+
+   image = etk_image_new_from_stock(ETK_STOCK_EDIT_CLEAR, ETK_STOCK_SMALL);
+   etk_entry_image_set(entry, ETK_ENTRY_IMAGE_SECONDARY, ETK_IMAGE(image));
+   etk_signal_connect("mouse_click", ETK_OBJECT(image),
+        ETK_CALLBACK(_etk_entry_clear_button_cb), entry);
+}
+
+/**
+ * @brief Adds a clear button to the entry
+ * @param entry an entry
+ */
+Etk_Image *etk_entry_image_get(Etk_Entry *entry, Etk_Entry_Image_Position 
position)
+{
+   if (!entry)
+      return NULL;
+
+   if (position == ETK_ENTRY_IMAGE_PRIMARY)
+       return entry->primary_image;
+   else if (position == ETK_ENTRY_IMAGE_SECONDARY)
+       return entry->secondary_image;
+
+   return NULL;
+}
+
+/**
  * @brief Sets whether or not the entry is in password mode
  * @param entry an entry
  * @param password_mode ETK_TRUE to turn the entry into a password entry, 
ETK_FALSE to turn it into a normal entry
@@ -147,7 +308,7 @@
 {
    if (!entry || entry->password_mode == password_mode)
       return;
-   
+
    if (entry->editable_object)
       etk_editable_password_mode_set(entry->editable_object, password_mode);
    entry->password_mode = password_mode;
@@ -175,23 +336,30 @@
 /* Initializes the default values of the entry */
 static void _etk_entry_constructor(Etk_Entry *entry)
 {
+   Etk_Widget *widget;
+
    if (!entry)
       return;
 
+   if (!(widget = ETK_WIDGET(entry)))
+      return;
+
+   entry->primary_image = NULL;
+   entry->secondary_image = NULL;
    entry->editable_object = NULL;
    entry->password_mode = ETK_FALSE;
    entry->selection_dragging = ETK_FALSE;
+   entry->primary_image_highlight = ETK_FALSE;
+   entry->secondary_image_highlight = ETK_FALSE;
    entry->pointer_set = ETK_FALSE;
-   entry->text = NULL;   
-   
+   entry->text = NULL;
+   entry->inner_part_margin = 2;
+
+   widget->size_allocate = _etk_entry_size_allocate;
+
    etk_signal_connect("realize", ETK_OBJECT(entry), 
ETK_CALLBACK(_etk_entry_realize_cb), NULL);
    etk_signal_connect("unrealize", ETK_OBJECT(entry), 
ETK_CALLBACK(_etk_entry_unrealize_cb), NULL);
    etk_signal_connect("key_down", ETK_OBJECT(entry), 
ETK_CALLBACK(_etk_entry_key_down_cb), NULL);
-   etk_signal_connect("mouse_in", ETK_OBJECT(entry), 
ETK_CALLBACK(_etk_entry_mouse_in_cb), NULL);
-   etk_signal_connect("mouse_out", ETK_OBJECT(entry), 
ETK_CALLBACK(_etk_entry_mouse_out_cb), NULL);
-   etk_signal_connect("mouse_down", ETK_OBJECT(entry), 
ETK_CALLBACK(_etk_entry_mouse_down_cb), NULL);
-   etk_signal_connect("mouse_up", ETK_OBJECT(entry), 
ETK_CALLBACK(_etk_entry_mouse_up_cb), NULL);
-   etk_signal_connect("mouse_move", ETK_OBJECT(entry), 
ETK_CALLBACK(_etk_entry_mouse_move_cb), NULL);
    etk_signal_connect("focus", ETK_OBJECT(entry), 
ETK_CALLBACK(_etk_entry_focus_cb), NULL);
    etk_signal_connect("unfocus", ETK_OBJECT(entry), 
ETK_CALLBACK(_etk_entry_unfocus_cb), NULL);
    etk_signal_connect("selection_received", ETK_OBJECT(entry), 
ETK_CALLBACK(_etk_entry_selection_received_cb), NULL);
@@ -203,16 +371,21 @@
    if (!entry)
       return;
    free(entry->text);
+
+   if (entry->primary_image)
+      etk_object_destroy(ETK_OBJECT(entry->primary_image));
+   if (entry->secondary_image)
+      etk_object_destroy(ETK_OBJECT(entry->secondary_image));
 }
 
 /* Sets the property whose id is "property_id" to the value "value" */
 static void _etk_entry_property_set(Etk_Object *object, int property_id, 
Etk_Property_Value *value)
 {
    Etk_Entry *entry;
-   
+
    if (!(entry = ETK_ENTRY(object)) || !value)
       return;
-   
+
    switch (property_id)
    {
       case ETK_ENTRY_PASSWORD_MODE_PROPERTY:
@@ -227,10 +400,10 @@
 static void _etk_entry_property_get(Etk_Object *object, int property_id, 
Etk_Property_Value *value)
 {
    Etk_Entry *entry;
-   
+
    if (!(entry = ETK_ENTRY(object)) || !value)
       return;
-   
+
    switch (property_id)
    {
       case ETK_ENTRY_PASSWORD_MODE_PROPERTY:
@@ -241,6 +414,69 @@
    }
 }
 
+/* Resizes the entry to the allocated size */
+static void _etk_entry_size_allocate(Etk_Widget *widget, Etk_Geometry geometry)
+{
+   Etk_Entry *entry;
+
+   if (!(entry = ETK_ENTRY(widget)))
+      return;
+
+   if (!geometry.w || !geometry.h)
+      return;
+
+   if (!entry->primary_image && !entry->secondary_image)
+   {
+      evas_object_move(entry->editable_object, geometry.x, geometry.y);
+      evas_object_resize(entry->editable_object, geometry.w, geometry.h);
+   }
+   else
+   {
+      Etk_Image *image;
+      Etk_Geometry i_geometry;
+      int x, w;
+
+      x = geometry.x;
+      w = geometry.w;
+      if (entry->primary_image)
+      {
+        image = entry->primary_image;
+        etk_image_size_get(image, &i_geometry.w, &i_geometry.h);
+
+        i_geometry.x = geometry.x;
+        i_geometry.y = geometry.y;
+        i_geometry.w = i_geometry.h = ETK_MAX(i_geometry.w, i_geometry.h);
+        if (geometry.h <= i_geometry.h)
+           i_geometry.w = i_geometry.h = geometry.h;
+        else
+           i_geometry.y += (geometry.h - i_geometry.h)/2;
+
+        etk_widget_size_allocate(ETK_WIDGET(image), i_geometry);
+        x += i_geometry.w + entry->inner_part_margin;
+        w -= i_geometry.w + entry->inner_part_margin;
+      }
+      if (entry->secondary_image)
+      {
+        image = entry->secondary_image;
+        etk_image_size_get(image, &i_geometry.w, &i_geometry.h);
+
+        i_geometry.x = geometry.x + geometry.w - i_geometry.w;
+        i_geometry.y = geometry.y;
+        i_geometry.w = i_geometry.h = ETK_MAX(i_geometry.w, i_geometry.h);
+        if (geometry.h <= i_geometry.h)
+           i_geometry.w = i_geometry.h = geometry.h;
+        else
+           i_geometry.y += (geometry.h - i_geometry.h)/2;
+
+        etk_widget_size_allocate(ETK_WIDGET(image), i_geometry);
+        w -= i_geometry.w + entry->inner_part_margin;
+      }
+
+      evas_object_move(entry->editable_object, x, geometry.y);
+      evas_object_resize(entry->editable_object, w, geometry.h);
+   }
+}
+
 /**************************
  *
  * Callbacks and handlers
@@ -257,7 +493,7 @@
       return;
 
    entry->editable_object = etk_editable_add(evas);
-   evas_object_pass_events_set(entry->editable_object, 1);
+   evas_object_repeat_events_set(entry->editable_object, 1);
    etk_editable_theme_set(entry->editable_object, 
etk_widget_theme_file_get(ETK_WIDGET(entry)),
       etk_widget_theme_group_get(ETK_WIDGET(entry)));
    etk_editable_text_set(entry->editable_object, entry->text);
@@ -268,7 +504,33 @@
       etk_editable_selection_hide(entry->editable_object);
    }
    evas_object_show(entry->editable_object);
-   etk_widget_swallow_object(ETK_WIDGET(entry), "etk.swallow.text", 
entry->editable_object);
+   etk_widget_member_object_add(ETK_WIDGET(entry), entry->editable_object);
+
+   evas_object_event_callback_add(entry->editable_object, 
EVAS_CALLBACK_MOUSE_IN,
+      _etk_entry_editable_mouse_in_cb, entry);
+   evas_object_event_callback_add(entry->editable_object, 
EVAS_CALLBACK_MOUSE_OUT,
+      _etk_entry_editable_mouse_out_cb, entry);
+   evas_object_event_callback_add(entry->editable_object, 
EVAS_CALLBACK_MOUSE_DOWN,
+      _etk_entry_editable_mouse_down_cb, entry);
+   evas_object_event_callback_add(entry->editable_object, 
EVAS_CALLBACK_MOUSE_UP,
+      _etk_entry_editable_mouse_up_cb, entry);
+   evas_object_event_callback_add(entry->editable_object, 
EVAS_CALLBACK_MOUSE_MOVE,
+      _etk_entry_editable_mouse_move_cb, entry);
+
+   if (etk_widget_theme_data_get(ETK_WIDGET(entry), "highlight_image_color", 
"%d %d %d %d",
+      &entry->highlight_image_color.r, &entry->highlight_image_color.g,
+      &entry->highlight_image_color.b, &entry->highlight_image_color.a) != 4)
+   {
+      entry->highlight_image_color.r = 128;
+      entry->highlight_image_color.g = 128;
+      entry->highlight_image_color.b = 128;
+      entry->highlight_image_color.a = 255;
+   }
+
+   if (etk_widget_theme_data_get(ETK_WIDGET(entry), "inner_part_margin", "%d",
+      &entry->inner_part_margin) != 1)
+      entry->inner_part_margin = 2;
+
 }
 
 /* Called when the entry is unrealized */
@@ -279,13 +541,13 @@
 
    if (!(entry = ETK_ENTRY(object)))
       return;
-   
+
    free(entry->text);
    if ((text = etk_editable_text_get(entry->editable_object)))
       entry->text = strdup(text);
    else
       entry->text = NULL;
-   
+
    evas_object_del(entry->editable_object);
    entry->editable_object = NULL;
 }
@@ -301,7 +563,7 @@
    Etk_Bool changed = ETK_FALSE;
    Etk_Bool selection_changed = ETK_FALSE;
    Etk_Bool stop_signal = ETK_TRUE;
-   
+
    if (!(entry = ETK_ENTRY(object)))
      return;
 
@@ -311,7 +573,7 @@
    start_pos = ETK_MIN(cursor_pos, selection_pos);
    end_pos = ETK_MAX(cursor_pos, selection_pos);
    selecting = (start_pos != end_pos);
-   
+
    /* Move the cursor/selection to the left */
    if (strcmp(event->keyname, "Left") == 0)
    {
@@ -412,8 +674,8 @@
    }
    else
       stop_signal = ETK_FALSE;
-   
-   
+
+
    if (changed)
       etk_signal_emit(_etk_entry_signals[ETK_ENTRY_TEXT_CHANGED_SIGNAL], 
ETK_OBJECT(entry), NULL);
    if (selection_changed)
@@ -423,11 +685,11 @@
 }
 
 /* Called when the mouse enters the entry */
-static void _etk_entry_mouse_in_cb(Etk_Object *object, Etk_Event_Mouse_In 
*event, void *data)
+static void _etk_entry_editable_mouse_in_cb(void *data, Evas *evas, 
Evas_Object *object, void *event_info)
 {
    Etk_Entry *entry;
 
-   if (!(entry = ETK_ENTRY(object)))
+   if (!(entry = ETK_ENTRY(data)))
       return;
    
    if (!entry->pointer_set)
@@ -438,11 +700,11 @@
 }
 
 /* Called when the mouse leaves the entry */
-static void _etk_entry_mouse_out_cb(Etk_Object *object, Etk_Event_Mouse_Out 
*event, void *data)
+static void _etk_entry_editable_mouse_out_cb(void *data, Evas *evas, 
Evas_Object *object, void *event_info)
 {
    Etk_Entry *entry;
 
-   if (!(entry = ETK_ENTRY(object)))
+   if (!(entry = ETK_ENTRY(data)))
       return;
    
    if (entry->pointer_set)
@@ -453,48 +715,52 @@
 }
 
 /* Called when the entry is pressed by the mouse */
-static void _etk_entry_mouse_down_cb(Etk_Object *object, Etk_Event_Mouse_Down 
*event, void *data)
+static void _etk_entry_editable_mouse_down_cb(void *data, Evas *evas, 
Evas_Object *object, void *event_info)
 {
    Etk_Entry *entry;
+   Etk_Event_Mouse_Down event;
    Evas_Coord ox, oy;
    int pos;
-   
-   if (!(entry = ETK_ENTRY(object)))
+
+   if (!(entry = ETK_ENTRY(data)))
       return;
-   
+
+   etk_event_mouse_down_wrap(ETK_WIDGET(entry), event_info, &event);
    evas_object_geometry_get(entry->editable_object, &ox, &oy, NULL, NULL);
-   pos = etk_editable_pos_get_from_coords(entry->editable_object, 
event->canvas.x - ox, event->canvas.y - oy);
-   if (event->button == 1)
+   pos = etk_editable_pos_get_from_coords(entry->editable_object, 
event.canvas.x - ox, event.canvas.y - oy);
+   if (event.button == 1)
    {
-      if (event->flags & ETK_MOUSE_DOUBLE_CLICK)
+      if (event.flags & ETK_MOUSE_DOUBLE_CLICK)
          etk_editable_select_all(entry->editable_object);
       else
       {
          etk_editable_cursor_pos_set(entry->editable_object, pos);
-         if (!(event->modifiers & ETK_MODIFIER_SHIFT))
+         if (!(event.modifiers & ETK_MODIFIER_SHIFT))
             etk_editable_selection_pos_set(entry->editable_object, pos);
-         
+
          entry->selection_dragging = ETK_TRUE;
       }
    }
-   else if (event->button == 2)
+   else if (event.button == 2)
    {
       etk_editable_cursor_pos_set(entry->editable_object, pos);
       etk_editable_selection_pos_set(entry->editable_object, pos);
-      
+
       etk_selection_text_request(ETK_SELECTION_PRIMARY, ETK_WIDGET(entry));
    }
 }
 
 /* Called when the entry is released by the mouse */
-static void _etk_entry_mouse_up_cb(Etk_Object *object, Etk_Event_Mouse_Up 
*event, void *data)
+static void _etk_entry_editable_mouse_up_cb(void *data, Evas *evas, 
Evas_Object *object, void *event_info)
 {
    Etk_Entry *entry;
-   
-   if (!(entry = ETK_ENTRY(object)))
+   Etk_Event_Mouse_Up event;
+
+   if (!(entry = ETK_ENTRY(data)))
       return;
-   
-   if (event->button == 1)
+
+   etk_event_mouse_up_wrap(ETK_WIDGET(entry), event_info, &event);
+   if (event.button == 1)
    {
       entry->selection_dragging = ETK_FALSE;
       _etk_entry_selection_copy(entry, ETK_SELECTION_PRIMARY, ETK_FALSE);
@@ -502,24 +768,97 @@
 }
 
 /* Called when the mouse moves over the entry */
-static void _etk_entry_mouse_move_cb(Etk_Object *object, Etk_Event_Mouse_Move 
*event, void *data)
+static void _etk_entry_editable_mouse_move_cb(void *data, Evas *evas, 
Evas_Object *object, void *event_info)
 {
    Etk_Entry *entry;
+   Etk_Event_Mouse_Move event;
    Evas_Coord ox, oy;
    int pos;
-   
-   if (!(entry = ETK_ENTRY(object)))
+
+   if (!(entry = ETK_ENTRY(data)))
       return;
-   
+
    if (entry->selection_dragging)
    {
+      etk_event_mouse_move_wrap(ETK_WIDGET(entry), event_info, &event);
       evas_object_geometry_get(entry->editable_object, &ox, &oy, NULL, NULL);
-      pos = etk_editable_pos_get_from_coords(entry->editable_object, 
event->cur.canvas.x - ox, event->cur.canvas.y - oy);
+      pos = etk_editable_pos_get_from_coords(entry->editable_object, 
event.cur.canvas.x - ox, event.cur.canvas.y - oy);
       if (pos >= 0)
          etk_editable_cursor_pos_set(entry->editable_object, pos);
    }
 }
 
+/* Called when the mouse is over the image */
+static void _etk_entry_image_mouse_in_cb(Etk_Widget *widget, 
Etk_Event_Mouse_In *event, void *data)
+{
+   Etk_Entry *entry;
+   Etk_Image *image;
+
+   if (!(entry = ETK_ENTRY(data)))
+      return;
+   if (!(image = ETK_IMAGE(widget)))
+      return;
+
+   evas_object_color_set(etk_image_evas_object_get(image),
+        entry->highlight_image_color.r, entry->highlight_image_color.g,
+        entry->highlight_image_color.b, entry->highlight_image_color.a);
+}
+
+/* Called when the mouse moves out of the image */
+static void _etk_entry_image_mouse_out_cb(Etk_Widget *widget, 
Etk_Event_Mouse_Out *event, void *data)
+{
+   Etk_Entry *entry;
+   Etk_Image *image;
+
+   if (!(entry = ETK_ENTRY(data)))
+      return;
+   if (!(image = ETK_IMAGE(widget)))
+      return;
+
+   evas_object_color_set(etk_image_evas_object_get(image), 255, 255, 255, 255);
+}
+
+/* Called when the mouse is pressed over the image */
+static void _etk_entry_image_mouse_down_cb(Etk_Widget *widget, 
Etk_Event_Mouse_Down *event, void *data)
+{
+   Etk_Entry *entry;
+   Etk_Image *image;
+
+   if (!(entry = ETK_ENTRY(data)))
+      return;
+   if (!(image = ETK_IMAGE(widget)))
+      return;
+
+   evas_object_color_set(etk_image_evas_object_get(image), 255, 255, 255, 255);
+}
+
+/* Called when the mouse released over the image */
+static void _etk_entry_image_mouse_up_cb(Etk_Widget *widget, 
Etk_Event_Mouse_Up *event, void *data)
+{
+   Etk_Entry *entry;
+   Etk_Image *image;
+
+   if (!(entry = ETK_ENTRY(data)))
+      return;
+   if (!(image = ETK_IMAGE(widget)))
+      return;
+
+   evas_object_color_set(etk_image_evas_object_get(image),
+        entry->highlight_image_color.r, entry->highlight_image_color.g,
+        entry->highlight_image_color.b, entry->highlight_image_color.a);
+}
+
+/* Called when the clear button is pressed */
+static void _etk_entry_clear_button_cb(Etk_Widget *widget, Etk_Event_Mouse_Up 
*event, void *data)
+{
+   Etk_Entry *entry;
+
+   if (!(entry = ETK_ENTRY(data)))
+      return;
+
+   etk_entry_clear(entry);
+}
+
 /* Called when the entry is focused */
 static void _etk_entry_focus_cb(Etk_Object *object, void *data)
 {
@@ -527,7 +866,7 @@
 
    if (!(entry = ETK_ENTRY(object)) || !entry->editable_object)
       return;
-   
+
    etk_editable_cursor_show(entry->editable_object);
    etk_editable_selection_show(entry->editable_object);
 }
@@ -539,7 +878,7 @@
 
    if (!(entry = ETK_ENTRY(object)) || !entry->editable_object)
       return;
-   
+
    etk_editable_cursor_move_to_end(entry->editable_object);
    etk_editable_selection_move_to_end(entry->editable_object);
    etk_editable_cursor_hide(entry->editable_object);
@@ -553,27 +892,27 @@
    Evas_Object *editable;
    Etk_Selection_Event *ev = event;
    const char *text;
-   
+
    if (!(entry = ETK_ENTRY(object)) || !(editable = entry->editable_object))
       return;
-   
+
    if (ev->type == ETK_SELECTION_TEXT && (text = ev->data.text) && *text && 
(strlen(text) != 1 || text[0] >= 0x20))
    {
       int cursor_pos, selection_pos;
       int start_pos, end_pos;
       Etk_Bool selecting;
       Etk_Bool changed = ETK_FALSE;
-      
+
       cursor_pos = etk_editable_cursor_pos_get(editable);
       selection_pos = etk_editable_selection_pos_get(editable);
       start_pos = ETK_MIN(cursor_pos, selection_pos);
       end_pos = ETK_MAX(cursor_pos, selection_pos);
       selecting = (start_pos != end_pos);
-      
+
       if (selecting)
          changed |= etk_editable_delete(editable, start_pos, end_pos);
       changed |= etk_editable_insert(editable, start_pos, text);
-      
+
       if (changed)
          etk_signal_emit(_etk_entry_signals[ETK_ENTRY_TEXT_CHANGED_SIGNAL], 
ETK_OBJECT(entry), NULL);
    }
@@ -593,7 +932,7 @@
    int start_pos, end_pos;
    Etk_Bool selecting;
    char *range;
-   
+
    if (!entry)
      return;
 
@@ -603,10 +942,10 @@
    start_pos = ETK_MIN(cursor_pos, selection_pos);
    end_pos = ETK_MAX(cursor_pos, selection_pos);
    selecting = (start_pos != end_pos);
-   
+
    if (!selecting)
       return;
-   
+
    range = etk_editable_text_range_get(editable, start_pos, end_pos);
    if (range)
    {
@@ -637,7 +976,7 @@
  * and get the text with etk_entry_text_get(). @n
  * An entry can work in two modes: the normal mode (the text is visible) and 
the password mode
  * (the text is replaced by '*'). To change the mode of the entry, use 
etk_entry_password_mode_set().
- * 
+ *
  * \par Object Hierarchy:
  * - Etk_Object
  *   - Etk_Widget
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_entry.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- etk_entry.h 12 Jan 2007 02:53:56 -0000      1.8
+++ etk_entry.h 13 Jan 2007 18:39:23 -0000      1.9
@@ -20,6 +20,16 @@
 #define ETK_IS_ENTRY(obj)    (ETK_OBJECT_CHECK_TYPE((obj), ETK_ENTRY_TYPE))
 
 /**
+ * @enum Etk_Entry_Image_Position
+ * @brief The position of the image in the entry
+ */
+typedef enum Etk_Entry_Image_Position
+{
+   ETK_ENTRY_IMAGE_PRIMARY = 1,        /**< The image is primary, usually to 
the left of the editable object */
+   ETK_ENTRY_IMAGE_SECONDARY = 2,      /**< The image is secondary, usually to 
the right of the editable object */
+} Etk_Entry_Image_Position;
+
+/**
  * @brief @widget A field where the user can edit a single-line text
  * @structinfo
  */
@@ -29,11 +39,19 @@
    /* Inherit from Etk_Widget */
    Etk_Widget widget;
 
+   Etk_Image *primary_image;
+   Etk_Image *secondary_image;
+
    Evas_Object *editable_object;
-   Etk_Bool password_mode;
-   Etk_Bool selection_dragging;
-   Etk_Bool pointer_set;
+   Etk_Bool     password_mode;
+   Etk_Bool     selection_dragging;
+   Etk_Bool    pointer_set;
+   Etk_Bool    primary_image_highlight;
+   Etk_Bool    secondary_image_highlight;
+   Etk_Color    highlight_image_color;
+
    char *text;
+   int   inner_part_margin;
 };
 
 
@@ -43,6 +61,10 @@
 void        etk_entry_text_set(Etk_Entry *entry, const char *text);
 const char *etk_entry_text_get(Etk_Entry *entry);
 void        etk_entry_clear(Etk_Entry *entry);
+void        etk_entry_image_set(Etk_Entry *entry, Etk_Entry_Image_Position 
position, Etk_Image *image);
+Etk_Image  *etk_entry_image_get(Etk_Entry *entry, Etk_Entry_Image_Position 
position);
+void       etk_entry_image_highlight_set(Etk_Entry *entry, 
Etk_Entry_Image_Position position, Etk_Bool highlight);
+void       etk_entry_add_clear_button(Etk_Entry *entry);
 void        etk_entry_password_mode_set(Etk_Entry *entry, Etk_Bool 
password_mode);
 Etk_Bool    etk_entry_password_mode_get(Etk_Entry *entry);
 



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to