Enlightenment CVS committal

Author  : codewarrior
Project : e17
Module  : libs/etk

Dir     : e17/libs/etk/src/bin


Modified Files:
        etk_combobox_test.c 


Log Message:
[Etk_Combobox_Entry] A new widget that implements a combobox-entry.
[Misc] Misc additions here and there, helper funcitons, etc.


===================================================================
RCS file: /cvs/e/e17/libs/etk/src/bin/etk_combobox_test.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -3 -r1.14 -r1.15
--- etk_combobox_test.c 22 Mar 2007 19:36:50 -0000      1.14
+++ etk_combobox_test.c 28 Jun 2007 11:05:43 -0000      1.15
@@ -1,130 +1,339 @@
-#include "etk_test.h"
-#include <stdlib.h>
-
-#define STARTING_STOCK_ID ETK_STOCK_DIALOG_APPLY
-#define ENDING_STOCK_ID ETK_STOCK_FOLDER_NEW
-
-static void _active_item_changed_cb(Etk_Object *object, void *data);
-
-/**************************
- *
- * Creation of the test-app window
- *
- **************************/
- 
-/* Creates the window for the combobox test */
-void etk_test_combobox_window_create(void *data)
-{
-   static Etk_Widget *win = NULL;
-   Etk_Widget *vbox;
-   Etk_Widget *combobox;
-   Etk_Widget *image;
-   Etk_Widget *checkbox;
-   Etk_Widget *frame;
-   Etk_Combobox_Item *item;
-   int *stock_id;
-   int i;
-
-   if (win)
-   {
-      etk_widget_show_all(ETK_WIDGET(win));
-      return;
-   }
-   
-   win = etk_window_new();
-   etk_window_title_set(ETK_WINDOW(win), "Etk Combobox Test");
-   etk_container_border_width_set(ETK_CONTAINER(win), 5);
-   etk_signal_connect("delete-event", ETK_OBJECT(win), 
ETK_CALLBACK(etk_window_hide_on_delete), NULL);
-   
-   vbox = etk_vbox_new(ETK_FALSE, 3);
-   etk_container_add(ETK_CONTAINER(win), vbox);
-   
-
-   /*******************
-    * Simple combobox
-    *******************/
-   frame = etk_frame_new("Simple combobox");
-   etk_box_append(ETK_BOX(vbox), frame, ETK_BOX_START, ETK_BOX_NONE, 0);
-   
-   /* Create a simple combobox containing one column of labels and add 3 items 
to it */
-   combobox = etk_combobox_new_default();
-   etk_container_add(ETK_CONTAINER(frame), combobox);
-   etk_combobox_item_append(ETK_COMBOBOX(combobox), "Item 1");
-   etk_combobox_item_append(ETK_COMBOBOX(combobox), "Item 2");
-   etk_combobox_item_append(ETK_COMBOBOX(combobox), "Item 3");
-   
-   
-   /*******************
-    * Disabled combobox
-    *******************/
-   frame = etk_frame_new("Disabled combobox");
-   etk_box_append(ETK_BOX(vbox), frame, ETK_BOX_START, ETK_BOX_NONE, 0);
-   
-   /* Create a simple combobox containing one column of labels and add 3 items 
to it */
-   combobox = etk_combobox_new_default();
-   etk_container_add(ETK_CONTAINER(frame), combobox);
-   etk_combobox_item_append(ETK_COMBOBOX(combobox), "Disabled text");
-   etk_combobox_item_append(ETK_COMBOBOX(combobox), "Item 2");
-   etk_combobox_item_append(ETK_COMBOBOX(combobox), "Item 3");
-   etk_widget_disabled_set(combobox, ETK_TRUE);
-   
-   
-   /*******************
-    * Complex combobox
-    *******************/
-   frame = etk_frame_new("Some stock icons");
-   etk_box_append(ETK_BOX(vbox), frame, ETK_BOX_START, ETK_BOX_NONE, 0);
-   
-   vbox = etk_vbox_new(ETK_FALSE, 3);
-   etk_container_add(ETK_CONTAINER(frame), vbox);
-   
-   image = etk_image_new_from_stock(STARTING_STOCK_ID, ETK_STOCK_BIG);
-   etk_box_append(ETK_BOX(vbox), image, ETK_BOX_START, ETK_BOX_NONE, 0);
-   
-   /* Create a more complex combobox with three columns (an image, a label and 
a checkbox) */
-   combobox = etk_combobox_new();
-   etk_combobox_column_add(ETK_COMBOBOX(combobox), ETK_COMBOBOX_IMAGE, 24, 
ETK_COMBOBOX_NONE, 0.0);
-   etk_combobox_column_add(ETK_COMBOBOX(combobox), ETK_COMBOBOX_LABEL, 75, 
ETK_COMBOBOX_EXPAND, 0.0);
-   etk_combobox_column_add(ETK_COMBOBOX(combobox), ETK_COMBOBOX_OTHER, 24, 
ETK_COMBOBOX_NONE, 1.0);
-   etk_combobox_build(ETK_COMBOBOX(combobox));
-   etk_box_append(ETK_BOX(vbox), combobox, ETK_BOX_START, ETK_BOX_NONE, 0);
-   etk_signal_connect("active-item-changed", ETK_OBJECT(combobox), 
ETK_CALLBACK(_active_item_changed_cb), image);
-   
-   /* We fill the combobox with some stock-ids */
-   for (i = STARTING_STOCK_ID; i <= ENDING_STOCK_ID; i++)
-   {
-      image = etk_image_new_from_stock(i, ETK_STOCK_SMALL);
-      checkbox = etk_check_button_new();
-      item = etk_combobox_item_append(ETK_COMBOBOX(combobox), image, 
etk_stock_label_get(i), checkbox);
-      
-      stock_id = malloc(sizeof(int));
-      *stock_id = i;
-      etk_combobox_item_data_set_full(item, stock_id, free);
-   }
-
-   etk_widget_show_all(win);
-}
-
-/**************************
- *
- * Callbacks
- *
- **************************/
-
-/* Called when the active item of the combobox has been changed */
-static void _active_item_changed_cb(Etk_Object *object, void *data)
-{
-   Etk_Combobox *combobox;
-   Etk_Image *image;
-   Etk_Combobox_Item *active_item;
-   int *stock_id;
-   
-   if (!(combobox = ETK_COMBOBOX(object)) || !(image = ETK_IMAGE(data)))
-      return;
-   if (!(active_item = etk_combobox_active_item_get(combobox)))
-      return;
-   if (!(stock_id = etk_combobox_item_data_get(active_item)))
-      return;
-   
-   etk_image_set_from_stock(image, *stock_id, ETK_STOCK_BIG);
-}
+#include "etk_test.h"

+#include <stdlib.h>

+#include <unistd.h>

+#include <limits.h>

+#include <string.h>

+#include <Ecore.h>

+#include <Ecore_File.h>

+

+#define STARTING_STOCK_ID ETK_STOCK_DIALOG_APPLY

+#define ENDING_STOCK_ID ETK_STOCK_FOLDER_NEW

+

+static void _active_item_changed_cb(Etk_Object *object, void *data);

+static void _etk_combobox_entry_populate(Etk_Combobox_Entry *combobox_entry, 
char *dir);

+static void _etk_combobox_entry_active_item_changed_cb(Etk_Object *object, 
void *data);

+static void _etk_combobox_entry_text_changed_cb(Etk_Object *object, void 
*data);

+static char **str_split(char **str, char *delim);

+  

+static char *cur_dir = NULL;

+static Etk_Widget *win = NULL;

+   static char *_keywords[] = {

+        "Enlightenment Project",

+       "Etk HOWTO",

+       "git introduction",

+       "linux kernel howto",

+       "install on freebsd",

+       "FreeBSD handbook",

+       "Handy BASH tips",

+       "bash scripting faq",

+       "the matrix movie",

+       NULL

+   };

+

+/**************************

+ *

+ * Creation of the test-app window

+ *

+ **************************/

+ 

+/* Creates the window for the combobox test */

+void etk_test_combobox_window_create(void *data)

+{

+   char dir[PATH_MAX];

+   Etk_Widget *vbox;

+   Etk_Widget *combobox;

+   Etk_Widget *image;

+   Etk_Widget *checkbox;

+   Etk_Widget *frame;

+   Etk_Combobox_Item *item;

+   int *stock_id;

+   int i;

+

+   if (win)

+   {

+      etk_widget_show_all(ETK_WIDGET(win));

+      return;

+   }

+   

+   win = etk_window_new();

+   etk_window_title_set(ETK_WINDOW(win), "Etk Combobox Test");

+   etk_container_border_width_set(ETK_CONTAINER(win), 5);

+   etk_signal_connect("delete-event", ETK_OBJECT(win), 
ETK_CALLBACK(etk_window_hide_on_delete), NULL);

+   

+   vbox = etk_vbox_new(ETK_FALSE, 3);

+   etk_container_add(ETK_CONTAINER(win), vbox);

+   

+

+   /*******************

+    * Simple combobox

+    *******************/

+   frame = etk_frame_new("Simple combobox");

+   etk_box_append(ETK_BOX(vbox), frame, ETK_BOX_START, ETK_BOX_NONE, 0);

+   

+   /* Create a simple combobox containing one column of labels and add 3 items 
to it */

+   combobox = etk_combobox_new_default();

+   etk_container_add(ETK_CONTAINER(frame), combobox);

+   etk_combobox_item_append(ETK_COMBOBOX(combobox), "Item 1");

+   etk_combobox_item_append(ETK_COMBOBOX(combobox), "Item 2");

+   etk_combobox_item_append(ETK_COMBOBOX(combobox), "Item 3");   

+   

+   /*******************

+    * Entry combobox with dir listing / navigation

+    *******************/

+   frame = etk_frame_new("Entry combobox");

+   etk_box_append(ETK_BOX(vbox), frame, ETK_BOX_START, ETK_BOX_NONE, 0);

+   

+   /* Create a simple combobox containing one column of labels and add 3 items 
to it */

+   combobox = etk_combobox_entry_new();

+   etk_signal_connect("active-item-changed", ETK_OBJECT(combobox), 
ETK_CALLBACK(_etk_combobox_entry_active_item_changed_cb), NULL);

+   etk_combobox_entry_column_add(ETK_COMBOBOX_ENTRY(combobox), 
ETK_COMBOBOX_ENTRY_IMAGE, 24, ETK_COMBOBOX_ENTRY_NONE, 0.0);

+   etk_combobox_entry_column_add(ETK_COMBOBOX_ENTRY(combobox), 
ETK_COMBOBOX_ENTRY_LABEL, 75, ETK_COMBOBOX_ENTRY_EXPAND, 0.0);

+   etk_combobox_entry_build(ETK_COMBOBOX_ENTRY(combobox));

+   etk_container_add(ETK_CONTAINER(frame), combobox);   

+   getcwd(dir, sizeof(dir));   

+   _etk_combobox_entry_populate(ETK_COMBOBOX_ENTRY(combobox), dir);

+   

+   /*******************

+    * Entry combobox with active searching

+    *******************/

+   frame = etk_frame_new("Entry combobox (search)");

+   etk_box_append(ETK_BOX(vbox), frame, ETK_BOX_START, ETK_BOX_NONE, 0);

+ 

+   combobox = etk_combobox_entry_new_default();

+      

+   for (i = 0; _keywords[i]; i++)   

+     etk_combobox_entry_item_append(ETK_COMBOBOX_ENTRY(combobox), 
_keywords[i], NULL);

+

+   etk_signal_connect("text-changed", 
ETK_OBJECT(etk_combobox_entry_entry_get(ETK_COMBOBOX_ENTRY(combobox))), 
ETK_CALLBACK(_etk_combobox_entry_text_changed_cb), combobox);

+   etk_container_add(ETK_CONTAINER(frame), combobox);   

+   

+   /*******************

+    * Disabled combobox

+    *******************/

+   frame = etk_frame_new("Disabled combobox");

+   etk_box_append(ETK_BOX(vbox), frame, ETK_BOX_START, ETK_BOX_NONE, 0);

+   

+   /* Create a simple combobox containing one column of labels and add 3 items 
to it */

+   combobox = etk_combobox_new_default();

+   etk_container_add(ETK_CONTAINER(frame), combobox);

+   etk_combobox_item_append(ETK_COMBOBOX(combobox), "Disabled text");

+   etk_combobox_item_append(ETK_COMBOBOX(combobox), "Item 2");

+   etk_combobox_item_append(ETK_COMBOBOX(combobox), "Item 3");

+   etk_widget_disabled_set(combobox, ETK_TRUE);

+   

+   

+   /*******************

+    * Complex combobox

+    *******************/

+   frame = etk_frame_new("Some stock icons");

+   etk_box_append(ETK_BOX(vbox), frame, ETK_BOX_START, ETK_BOX_NONE, 0);

+   

+   vbox = etk_vbox_new(ETK_FALSE, 3);

+   etk_container_add(ETK_CONTAINER(frame), vbox);

+   

+   image = etk_image_new_from_stock(STARTING_STOCK_ID, ETK_STOCK_BIG);

+   etk_box_append(ETK_BOX(vbox), image, ETK_BOX_START, ETK_BOX_NONE, 0);

+   

+   /* Create a more complex combobox with three columns (an image, a label and 
a checkbox) */

+   combobox = etk_combobox_new();

+   etk_combobox_column_add(ETK_COMBOBOX(combobox), ETK_COMBOBOX_IMAGE, 24, 
ETK_COMBOBOX_NONE, 0.0);

+   etk_combobox_column_add(ETK_COMBOBOX(combobox), ETK_COMBOBOX_LABEL, 75, 
ETK_COMBOBOX_EXPAND, 0.0);

+   etk_combobox_column_add(ETK_COMBOBOX(combobox), ETK_COMBOBOX_OTHER, 24, 
ETK_COMBOBOX_NONE, 1.0);

+   etk_combobox_build(ETK_COMBOBOX(combobox));

+   etk_box_append(ETK_BOX(vbox), combobox, ETK_BOX_START, ETK_BOX_NONE, 0);

+   etk_signal_connect("active-item-changed", ETK_OBJECT(combobox), 
ETK_CALLBACK(_active_item_changed_cb), image);

+   

+   /* We fill the combobox with some stock-ids */

+   for (i = STARTING_STOCK_ID; i <= ENDING_STOCK_ID; i++)

+   {

+      image = etk_image_new_from_stock(i, ETK_STOCK_SMALL);

+      checkbox = etk_check_button_new();

+      item = etk_combobox_item_append(ETK_COMBOBOX(combobox), image, 
etk_stock_label_get(i), checkbox);

+      

+      stock_id = malloc(sizeof(int));

+      *stock_id = i;

+      etk_combobox_item_data_set_full(item, stock_id, free);

+   }

+

+   etk_widget_show_all(win);

+}

+

+/**************************

+ *

+ * Callbacks

+ *

+ **************************/

+

+/* Called when the active item of the combobox has been changed */

+static void _active_item_changed_cb(Etk_Object *object, void *data)

+{

+   Etk_Combobox *combobox;

+   Etk_Image *image;

+   Etk_Combobox_Item *active_item;

+   int *stock_id;

+   

+   if (!(combobox = ETK_COMBOBOX(object)) || !(image = ETK_IMAGE(data)))

+      return;

+   if (!(active_item = etk_combobox_active_item_get(combobox)))

+      return;

+   if (!(stock_id = etk_combobox_item_data_get(active_item)))

+      return;

+   

+   etk_image_set_from_stock(image, *stock_id, ETK_STOCK_BIG);

+}

+

+static void _etk_combobox_entry_populate(Etk_Combobox_Entry *combobox_entry, 
char *dir)

+{

+   Ecore_List *files;

+   char *file;

+   char *parent;

+   char dir_stripped[PATH_MAX];

+   

+   if (!dir || !ecore_file_is_dir(dir))

+      return;

+   

+   snprintf(dir_stripped, sizeof(dir_stripped), "%s", dir);

+   

+   /* remove any trailing slashes */

+   while (dir_stripped[strlen(dir_stripped) - 1] == '/')

+     dir_stripped[strlen(dir_stripped) - 1] = '\0';

+   

+   if (cur_dir) free(cur_dir);

+   cur_dir = strdup(dir_stripped);

+   

+   files = ecore_file_ls(dir_stripped);

+   ecore_list_sort(files, strcasecmp, 'a');

+   ecore_list_goto_first(files);

+   etk_combobox_entry_clear(combobox_entry);

+   etk_entry_text_set(ETK_ENTRY(etk_combobox_entry_entry_get(combobox_entry)), 

+                     dir_stripped);

+

+   /* add navigation link to parent level dir if possible */

+   parent = ecore_file_get_dir(dir_stripped);

+   if (ecore_file_is_dir(parent))

+     etk_combobox_entry_item_prepend(combobox_entry,

+                                    
etk_image_new_from_stock(ETK_STOCK_PLACES_FOLDER,

+                                                             ETK_STOCK_SMALL),

+                                    "..", NULL);

+   free(parent);

+   

+   for (file = ecore_list_next(files); file; file = ecore_list_next(files))

+     {

+       char path[PATH_MAX];

+       

+       snprintf(path, sizeof(path), "%s/%s", dir_stripped, file);

+       if (ecore_file_is_dir(path))

+         {

+            etk_combobox_entry_item_prepend(combobox_entry,

+                                           
etk_image_new_from_stock(ETK_STOCK_PLACES_FOLDER, 

+                                                                    
ETK_STOCK_SMALL),

+                                           file, NULL);

+         }

+       else

+         {

+            etk_combobox_entry_item_append(combobox_entry,

+                                           
etk_image_new_from_stock(ETK_STOCK_TEXT_X_GENERIC, 

+                                                                    
ETK_STOCK_SMALL),

+                                           file, NULL);             

+         }

+     }

+}

+

+/* Called when the active item of the combobox_entry is changed */

+static void _etk_combobox_entry_active_item_changed_cb(Etk_Object *object, 
void *data)

+{

+   Etk_Combobox_Entry *combobox;

+   Etk_Combobox_Entry_Item *active_item = NULL;

+   char *file;

+   Etk_Widget *img;

+   char path[PATH_MAX];

+    

+   if (!(combobox = ETK_COMBOBOX_ENTRY(object)) || !(active_item = 
etk_combobox_entry_active_item_get(combobox)))

+      return;

+   

+   etk_combobox_entry_item_fields_get(active_item, &img, &file, NULL);   

+ 

+   if (!strcmp(file, ".."))

+     {

+       char *parent;

+       parent = ecore_file_get_dir(cur_dir);

+       snprintf(path, sizeof(path), "%s", parent);

+       free(parent);

+     }

+   else

+     snprintf(path, sizeof(path), "%s/%s", cur_dir, file);

+   

+   if (ecore_file_is_dir(path))

+     {

+       _etk_combobox_entry_populate(combobox, path);

+       return;

+     }

+   

+   if (ecore_file_is_dir(file))

+      _etk_combobox_entry_populate(combobox, file);

+}

+

+static void _etk_combobox_entry_text_changed_cb(Etk_Object *object, void *data)

+{

+   Etk_Combobox_Entry *combobox;

+   Etk_Entry *entry;

+   char *search_str = NULL;

+   const char *entry_text = NULL;

+   char **words = NULL;

+   int i;

+

+   if (!(combobox = ETK_COMBOBOX_ENTRY(data)) || !(entry = ETK_ENTRY(object)))

+      return;

+ 

+   if (!etk_combobox_entry_is_popped_up(combobox))

+     {

+       etk_combobox_entry_pop_up(combobox);

+       etk_popup_window_focused_window_set(win);

+     }

+   

+   entry_text = etk_entry_text_get(entry);

+   if (!entry_text)

+     return;

+   

+   search_str = strdup(entry_text);   

+   words = str_split(&search_str, " ");

+   

+   etk_combobox_entry_clear(combobox);

+   etk_combobox_entry_pop_down(combobox);

+   for (i = 0; _keywords[i]; i++)

+     {

+       int j;

+       

+       for (j = 0; words[j]; j++)

+         {

+            if (!strcasestr(_keywords[i], words[j]))

+              goto brk;

+         }

+       etk_combobox_entry_item_append(combobox, _keywords[i], NULL);

+brk:

+       continue;

+     }

+   etk_combobox_entry_pop_up(combobox);

+   etk_popup_window_focused_window_set(win);   

+   if (words)

+      free(words);

+}

+

+static char **str_split(char **str, char *delim)

+{

+   char **tok;

+   int  i = 0;

+   char *t;

+   

+   tok = calloc(2048, sizeof(char*));

+   tok[i] = strtok(*str, delim);

+   i++;

+   while((t = strtok(NULL, delim)))

+     {

+       tok[i] = t;

+       i++;

+     }

+   tok[i] = NULL;

+   

+   return tok;

+}




-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to