this is a better mouse trap than before. it actually works like it
should, and it probably doesn't require [much] cleaning before
committing.


Index: src/lib/etk_entry.c
===================================================================
RCS file: /root/e17/proto/etk/src/lib/etk_entry.c,v
retrieving revision 1.1.1.7
diff -u -r1.1.1.7 etk_entry.c
--- src/lib/etk_entry.c	15 Jan 2006 11:36:25 -0000	1.1.1.7
+++ src/lib/etk_entry.c	27 Jan 2006 14:52:15 -0000
@@ -18,6 +18,11 @@
    ETK_ENTRY_NUM_SIGNALS
 };
 
+enum _Etk_Entry_Property_Id
+{
+   ETK_ENTRY_EDITABLE_PROPERTY
+};
+
 static void _etk_entry_constructor(Etk_Entry *entry);
 static void _etk_entry_realize_cb(Etk_Object *object, void *data);
 static void _etk_entry_unrealize_cb(Etk_Object *object, void *data);
@@ -26,6 +31,9 @@
 static void _etk_entry_mouse_out_cb(Etk_Object *object, Etk_Event_Mouse_In_Out *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_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value);
+static void _etk_entry_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value);
+
 
 static Etk_Signal *_etk_entry_signals[ETK_ENTRY_NUM_SIGNALS];
 
@@ -48,6 +56,11 @@
       entry_type = etk_type_new("Etk_Entry", ETK_WIDGET_TYPE, sizeof(Etk_Entry), ETK_CONSTRUCTOR(_etk_entry_constructor), NULL);
 
       _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, "editable", ETK_ENTRY_EDITABLE_PROPERTY, ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE,  etk_property_value_bool(ETK_TRUE));
+      
+      entry_type->property_set = _etk_entry_property_set;
+      entry_type->property_get = _etk_entry_property_get;
    }
 
    return entry_type;
@@ -87,6 +100,31 @@
    return etk_editable_text_object_text_get(entry->editable_object);
 }
 
+/**
+ * @brief Sets whether the user can edit the text in the entry
+ * @param entry an entry
+ * @param is_editable ETK_TRUE if it's editable, ETK_FALSE if it's not.
+ */
+void etk_entry_set_editable(Etk_Entry *entry, Etk_Bool is_editable)
+{
+   if (!entry)
+      return;
+   entry->editable = is_editable;
+   etk_object_notify(ETK_OBJECT(entry), "editable");
+}
+
+/**
+ * @brief Retrieves whether the entry is editable
+ * @param entry an entry
+ * @return ETK_TRUE if it's editable, ETK_FALSE if it's not.
+ */
+Etk_Bool etk_entry_get_editable(Etk_Entry *entry)
+{
+   if (!entry)
+      return ETK_FALSE;
+   return entry->editable;
+}
+
 /**************************
  *
  * Etk specific functions
@@ -99,6 +137,7 @@
    if (!entry)
       return;
 
+   entry->editable = ETK_TRUE;
    entry->editable_object = NULL;
 
    etk_signal_connect("realize", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_realize_cb), NULL);
@@ -110,6 +149,42 @@
    etk_signal_connect("unfocus", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_unfocus_cb), NULL);
 }
 
+/* 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_EDITABLE_PROPERTY:
+          etk_entry_set_editable(entry, etk_property_value_bool_get(value));
+         break;
+      default:
+         break;
+   }
+}
+
+/* Gets the value of the property whose id is "property_id" */
+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_EDITABLE_PROPERTY:
+         etk_property_value_bool_set(value, entry->editable);
+         break;
+      default:
+         break;
+   }
+}
+
 /**************************
  *
  * Callbacks and handlers
@@ -153,11 +228,7 @@
    if (!(entry = ETK_ENTRY(object)) || !entry->editable_object)
       return;
 
-   if (strcmp(key_event->key, "BackSpace") == 0)
-      text_changed = etk_editable_text_object_delete_char_before(entry->editable_object);
-   else if (strcmp(key_event->key, "Delete") == 0)
-      text_changed = etk_editable_text_object_delete_char_after(entry->editable_object);
-   else if (strcmp(key_event->key, "Left") == 0)
+   if (strcmp(key_event->key, "Left") == 0)
       etk_editable_text_object_cursor_move_left(entry->editable_object);
    else if (strcmp(key_event->key, "Right") == 0)
       etk_editable_text_object_cursor_move_right(entry->editable_object);
@@ -165,8 +236,12 @@
       etk_editable_text_object_cursor_move_at_start(entry->editable_object);
    else if (strcmp(key_event->key, "End") == 0)
       etk_editable_text_object_cursor_move_at_end(entry->editable_object);
-   else
-      text_changed = etk_editable_text_object_insert(entry->editable_object, key_event->string);
+   else if (strcmp(key_event->key, "BackSpace") == 0 && entry->editable)
+      text_changed = etk_editable_text_object_delete_char_before(entry->editable_object);
+   else if (strcmp(key_event->key, "Delete") == 0 && entry->editable)
+      text_changed = etk_editable_text_object_delete_char_after(entry->editable_object);
+   else if (entry->editable)
+       text_changed = etk_editable_text_object_insert(entry->editable_object, key_event->string);
 
    if (text_changed)
       etk_signal_emit(_etk_entry_signals[ETK_ENTRY_TEXT_CHANGED_SIGNAL], object, NULL);
@@ -199,6 +274,7 @@
 
    if (!(entry = ETK_ENTRY(object)) || !entry->editable_object)
       return;
+   etk_editable_text_object_cursor_move_at_end(entry->editable_object);
    etk_editable_text_object_cursor_show(entry->editable_object);
 }
 
Index: src/lib/etk_entry.h
===================================================================
RCS file: /root/e17/proto/etk/src/lib/etk_entry.h,v
retrieving revision 1.1.1.2
diff -u -r1.1.1.2 etk_entry.h
--- src/lib/etk_entry.h	1 Nov 2005 12:24:51 -0000	1.1.1.2
+++ src/lib/etk_entry.h	27 Jan 2006 14:52:15 -0000
@@ -29,6 +29,8 @@
    Etk_Widget widget;
 
    Evas_Object *editable_object;
+
+   Etk_Bool editable : 1;
 };
 
 Etk_Type *etk_entry_type_get();
@@ -37,6 +39,9 @@
 void etk_entry_text_set(Etk_Entry *entry, const char *text);
 const char *etk_entry_text_get(Etk_Entry *entry);
 
+void etk_entry_set_editable(Etk_Entry *entry, Etk_Bool is_editable);
+Etk_Bool etk_entry_get_editable(Etk_Entry *entry);
+
 /** @} */
 
 #endif

Reply via email to