Hi List,
Since we need to limit the entered text length, we create a patch the allow etk_entry to to that
Adding two functions:

void etk_entry_text_set(Etk_Entry *entry, const char *text)
int etk_entry_text_limit_get(Etk_Entry *entry)
let programmer's to limit the max input length of etk_entry.
if set to 0 that means no limited. default is 0

Cheers, Tick

Index: etk/src/lib/etk_entry.c
===================================================================
--- etk.orig/src/lib/etk_entry.c	2008-04-29 16:09:01.000000000 +0800
+++ etk/src/lib/etk_entry.c	2008-04-29 16:12:24.000000000 +0800
@@ -1,5 +1,6 @@
 /** @file etk_entry.c */
 #ifdef HAVE_CONFIG_H
+#define _GNU_SOURCE
 #include "config.h"
 #endif
 
@@ -126,6 +127,7 @@
  */
 void etk_entry_text_set(Etk_Entry *entry, const char *text)
 {
+   char *text_tmp;
    if (!entry)
       return;
 
@@ -134,11 +136,15 @@
       if (entry->text != text)
       {
          free(entry->text);
-         entry->text = text ? strdup(text) : NULL;
+         entry->text = text ? entry->text_limit==0 ? strdup(text) : strndup(text, entry->text_limit) : NULL;
       }
    }
-   else
-      etk_editable_text_set(entry->editable_object, text);
+   else 
+   {
+      text_tmp = !text || entry->text_limit==0 ? strdup(text) : strndup(text, entry->text_limit);
+      etk_editable_text_set(entry->editable_object, text_tmp);
+      free(text_tmp);
+   }
 
    etk_signal_emit(ETK_ENTRY_TEXT_CHANGED_SIGNAL, ETK_OBJECT(entry));
 }
@@ -159,6 +165,37 @@
       return etk_editable_text_get(entry->editable_object);
 }
 
+
+/**
+ * @brief Set the text limit of the entry
+ * @param entry an entry
+ * @param limit the limit of text length, 0 means no limit
+ */
+void etk_entry_text_limit_set(Etk_Entry *entry, int limit) 
+{
+   if (!entry) 
+      return;
+   if (limit >= 0)
+   {
+      entry->text_limit = limit;
+      return;
+   }
+   entry->text_limit = 0;
+   return;
+}
+
+/**
+ * @brief Get the text limit of the entry
+ * @param entry an entry
+ * @return Returns the limit of text entry, 0 means no limit. 
+ */ 
+int etk_entry_text_limit_get(Etk_Entry *entry) 
+{
+   if (!entry)
+      return -1;
+   return entry->text_limit;
+}
+
 /**
  * @brief Clears the text of the entry
  * @param entry the entry to clear
@@ -375,6 +412,7 @@
    entry->imf_ee_handler_commit = NULL;
    entry->imf_ee_handler_delete = NULL;
    entry->text = NULL;
+   entry->text_limit=0;
 
    entry->internal_entry = etk_widget_new(ETK_WIDGET_TYPE, "repeat-mouse-events", ETK_TRUE,
          "theme-group", "entry", "theme-parent", entry, "parent", entry, "internal", ETK_TRUE, NULL);
@@ -562,6 +600,7 @@
    Evas *evas;
    const char *ctx_id;
    const Ecore_IMF_Context_Info *ctx_info;
+   char *text_tmp;
 
    if (!(internal_entry = ETK_WIDGET(object)) || !(evas = etk_widget_toplevel_evas_get(internal_entry)))
       return ETK_TRUE;
@@ -609,7 +648,14 @@
 
    etk_editable_theme_set(entry->editable_object, etk_widget_theme_file_get(internal_entry),
          etk_widget_theme_group_get(internal_entry));
-   etk_editable_text_set(entry->editable_object, entry->text);
+   if (entry->text_limit==0) 
+      etk_editable_text_set(entry->editable_object, entry->text);
+   else 
+   {
+      text_tmp = entry->text ? strndup(entry->text, entry->text_limit): NULL; 
+      etk_editable_text_set(entry->editable_object, text_tmp);
+      free(text_tmp);
+   }
    etk_editable_password_mode_set(entry->editable_object, entry->password_mode);
 
    if (!etk_widget_is_focused(ETK_WIDGET(entry)))
@@ -665,6 +711,7 @@
 {
    Etk_Entry *entry;
    const char *text;
+   char *text_tmp;
 
    if (!(entry = ETK_ENTRY(etk_object_data_get(object, "_Etk_Entry::Entry"))))
       return ETK_TRUE;
@@ -689,7 +736,12 @@
 
    free(entry->text);
    if ((text = etk_editable_text_get(entry->editable_object)))
-      entry->text = strdup(text);
+   { 
+      if (entry->text_limit==0)
+         entry->text = strdup(text);
+      else 
+         entry->text = strndup(text, entry->text_limit);
+   }
    else
       entry->text = NULL;
 
@@ -823,7 +875,9 @@
    {
       if (selecting)
          changed |= etk_editable_delete(editable, start_pos, end_pos);
-      changed |= etk_editable_insert(editable, start_pos, event->string);
+      if (!entry->text_limit || 
+            (etk_editable_text_length_get(editable) + strlen(event->string)) <= entry->text_limit)
+         changed |= etk_editable_insert(editable, start_pos, event->string);
    }
    else
       stop_signal = ETK_FALSE;
@@ -1187,7 +1241,9 @@
 
       if (selecting)
          changed |= etk_editable_delete(editable, start_pos, end_pos);
-      changed |= etk_editable_insert(editable, start_pos, text);
+      if (!entry->text_limit || 
+            etk_editable_text_length_get(editable) + strlen(text) <= entry->text_limit)
+         changed |= etk_editable_insert(editable, start_pos, text);
 
       if (changed)
          etk_signal_emit(ETK_ENTRY_TEXT_CHANGED_SIGNAL, ETK_OBJECT(entry));
@@ -1286,7 +1342,9 @@
 
    if (selecting)
       changed |= etk_editable_delete(editable, start_pos, end_pos);
-   changed |= etk_editable_insert(editable, start_pos, ev->str);
+   if (!entry->text_limit ||
+         etk_editable_text_length_get(editable) + strlen(ev->str) <= entry->text_limit)
+      changed |= etk_editable_insert(editable, start_pos, ev->str);
 
    if (changed)
       etk_signal_emit(ETK_ENTRY_TEXT_CHANGED_SIGNAL, ETK_OBJECT(entry));
Index: etk/src/lib/etk_entry.h
===================================================================
--- etk.orig/src/lib/etk_entry.h	2008-04-29 16:09:01.000000000 +0800
+++ etk/src/lib/etk_entry.h	2008-04-29 16:10:19.000000000 +0800
@@ -55,6 +55,7 @@
    Ecore_IMF_Context *imf_context;
 
    char *text;
+   int text_limit;
 
    Etk_Color highlight_color;
    int image_interspace;
@@ -75,6 +76,8 @@
 
 void        etk_entry_text_set(Etk_Entry *entry, const char *text);
 const char *etk_entry_text_get(Etk_Entry *entry);
+void        etk_entry_text_limit_set(Etk_Entry *entry, int limit);
+int         etk_entry_text_limit_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);
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to