Enlightenment CVS committal

Author  : dj2
Project : e17
Module  : libs/ewl

Dir     : e17/libs/ewl/src/lib


Modified Files:
        ewl_combo.c ewl_enums.h ewl_filepicker.c ewl_list.c ewl_mvc.c 
        ewl_mvc.h ewl_tree.c ewl_tree.h ewl_tree2.c ewl_tree2.h 


Log Message:
- do some more work on the mvc selection code.
- this breaks the current api
- EWL_TREE_MODE is now EWL_SELECTION_MODE
- the selection_rm is missing the ability to remove from ranges
- still need to fill the unit tests

===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_combo.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -3 -r1.33 -r1.34
--- ewl_combo.c 3 Oct 2006 05:17:13 -0000       1.33
+++ ewl_combo.c 15 Oct 2006 22:34:14 -0000      1.34
@@ -153,9 +153,6 @@
                ewl_floater_position_set(EWL_FLOATER(combo->popup->popup),
                                                0, CURRENT_H(w));
 
-//     if (combo->selected_idx < -1)
-//             ewl_combo_selected_set(combo, -1);
-
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
@@ -278,18 +275,15 @@
        combo = data;
 
        i = ewl_container_child_index_get(EWL_CONTAINER(combo->popup), w);
-       ewl_mvc_selected_set(EWL_MVC(combo), i);
+       ewl_mvc_selected_set(EWL_MVC(combo), i, 0);
        ewl_combo_cb_increment_clicked(NULL, NULL, data);
 
-       ewl_callback_call(EWL_WIDGET(combo), EWL_CALLBACK_VALUE_CHANGED);
-
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
 void
 ewl_combo_cb_selected_change(Ewl_MVC *mvc)
 {
-       int idx;
        Ewl_View *view;
        Ewl_Model *model;
        Ewl_Combo *combo;
@@ -304,22 +298,24 @@
        model = ewl_mvc_model_get(mvc);
        mvc_data = ewl_mvc_data_get(mvc);
 
+       if (!mvc_data)
+               DRETURN(DLEVEL_STABLE);
+
        /* remove the previously selected value */
        if (combo->header)
                ewl_widget_destroy(combo->header);
 
-       idx = ewl_mvc_selected_get(mvc);
-
-       /* if we have a selected value then show it in the top, else show
-        * the header */
-       if ((idx > -1) && (!combo->editable))
+       if (ewl_mvc_selected_count_get(mvc))
        {
+               Ewl_Selection_Idx *idx;
+
+               idx = ewl_mvc_selected_get(mvc);
                combo->header = view->construct();
                view->assign(combo->header, 
-                               model->fetch(mvc_data, idx, 0));
+                               model->fetch(mvc_data, idx->row, 0));
        }
-       else if (view && view->header_fetch)
-               combo->header = view->header_fetch(mvc_data, idx);
+       else
+               combo->header = view->header_fetch(mvc_data, -1);
 
        if (combo->header)
        {
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_enums.h,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -3 -r1.60 -r1.61
--- ewl_enums.h 13 Oct 2006 02:11:52 -0000      1.60
+++ ewl_enums.h 15 Oct 2006 22:34:14 -0000      1.61
@@ -493,22 +493,6 @@
 typedef enum Ewl_Media_Module_Type Ewl_Media_Module_Type;
 
 /**
- * @enum Ewl_Tree_Mode
- * The possible tree mode settings
- */
-enum Ewl_Tree_Mode
-{
-       EWL_TREE_MODE_NONE,
-       EWL_TREE_MODE_SINGLE,
-       EWL_TREE_MODE_MULTI
-};
-
-/**
- * The Ewl_Tree_Mode type
- */
-typedef enum Ewl_Tree_Mode Ewl_Tree_Mode;
-
-/**
  * @enum Ewl_Text_Context_Mask
  * The possible context masks for the ewl_text
  */
@@ -739,6 +723,28 @@
  * The Ewl_Rotate
  */
 typedef enum Ewl_Rotate Ewl_Rotate;
+
+enum Ewl_Selection_Type
+{
+       EWL_SELECTION_TYPE_INDEX,
+       EWL_SELECTION_TYPE_RANGE
+};
+typedef enum Ewl_Selection_Type Ewl_Selection_Type;
+
+enum Ewl_Selection_Mode
+{
+       EWL_SELECTION_MODE_NONE,
+       EWL_SELECTION_MODE_SINGLE,
+       EWL_SELECTION_MODE_MULTI
+};
+typedef enum Ewl_Selection_Mode Ewl_Selection_Mode;
+
+enum Ewl_Tree_Selection_Type
+{
+       EWL_TREE_SELECT_ROW,
+       EWL_TREE_SELECT_CELL
+};
+typedef enum Ewl_Tree_Selection_Type Ewl_Tree_Selection_Type;
 
 /**
  * @}
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filepicker.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- ewl_filepicker.c    3 Oct 2006 05:17:13 -0000       1.12
+++ ewl_filepicker.c    15 Oct 2006 22:34:14 -0000      1.13
@@ -144,7 +144,7 @@
        ewl_mvc_model_set(EWL_MVC(fp->type_combo), model);
        ewl_mvc_view_set(EWL_MVC(fp->type_combo), view);
        ewl_mvc_data_set(EWL_MVC(fp->type_combo), fp);
-       ewl_mvc_selected_set(EWL_MVC(fp->type_combo), 0);
+       ewl_mvc_selected_set(EWL_MVC(fp->type_combo), 0, 0);
        ewl_combo_editable_set(EWL_COMBO(fp->type_combo), TRUE);
        ewl_callback_append(fp->type_combo, EWL_CALLBACK_VALUE_CHANGED,
                                        ewl_filepicker_cb_type_change, fp);
@@ -712,7 +712,7 @@
                ecore_list_prepend(fp->path, strdup(path));
 
        ewl_mvc_dirty_set(EWL_MVC(fp->path_combo), TRUE);
-       ewl_mvc_selected_set(EWL_MVC(fp->path_combo), 0);
+       ewl_mvc_selected_set(EWL_MVC(fp->path_combo), 0, 0);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -722,6 +722,7 @@
                                                        void *data)
 {
        Ewl_Filepicker *fp;
+       Ewl_Selection_Idx *idx;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("w", w);
@@ -729,8 +730,9 @@
        DCHECK_TYPE("w", w, EWL_WIDGET_TYPE);
 
        fp = data;
-       ecore_list_goto_index(fp->path,
-                       ewl_mvc_selected_get(EWL_MVC(w)));
+       idx = ewl_mvc_selected_get(EWL_MVC(w));
+       ecore_list_goto_index(fp->path, idx->row);
+                       
        ewl_filepicker_directory_set(fp, ecore_list_current(fp->path));
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
@@ -758,7 +760,7 @@
 {
        Ewl_Filepicker *fp;
        Ewl_Filepicker_Filter *filter;
-       int idx;
+       Ewl_Selection_Idx *idx;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("w", w);
@@ -767,9 +769,9 @@
 
        fp = data;
        idx = ewl_mvc_selected_get(EWL_MVC(w));
-       if (idx > -1)
+       if (idx)
        {
-               ecore_list_goto_index(fp->filters, idx);
+               ecore_list_goto_index(fp->filters, idx->row);
                filter = ecore_list_current(fp->filters);
                ewl_filepicker_filter_set(fp, filter->filter);
        }
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_list.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- ewl_list.c  3 Oct 2006 05:52:02 -0000       1.8
+++ ewl_list.c  15 Oct 2006 22:34:14 -0000      1.9
@@ -149,10 +149,9 @@
        DCHECK_TYPE("data", data, EWL_LIST_TYPE);
 
        list = data;
-       ewl_mvc_selected_set(EWL_MVC(list), 
-               ewl_container_child_index_get(EWL_CONTAINER(list), w));
 
-       ewl_callback_call(EWL_WIDGET(list), EWL_CALLBACK_VALUE_CHANGED);
+       ewl_mvc_selected_set(EWL_MVC(list), 
+               ewl_container_child_index_get(EWL_CONTAINER(list), w), 0);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_mvc.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -3 -r1.4 -r1.5
--- ewl_mvc.c   3 Oct 2006 06:09:05 -0000       1.4
+++ ewl_mvc.c   15 Oct 2006 22:34:14 -0000      1.5
@@ -3,6 +3,8 @@
 #include "ewl_macros.h"
 #include "ewl_debug.h"
 
+static void ewl_mvc_selected_change_notify(Ewl_MVC *mvc);
+
 /**
  * @param mvc: The MVC to initialize
  * @return Returns TRUE on success or FALSE if unsuccessful
@@ -23,6 +25,8 @@
        ewl_callback_append(EWL_WIDGET(mvc), EWL_CALLBACK_DESTROY,
                                        ewl_mvc_cb_destroy, NULL);
 
+       ewl_mvc_selection_mode_set(mvc, EWL_SELECTION_MODE_SINGLE);
+
        DRETURN_INT(TRUE, DLEVEL_STABLE);
 }
 
@@ -140,6 +144,10 @@
        mvc->data = data;
        ewl_mvc_dirty_set(mvc, TRUE);
 
+       /* let the inheriting widget know that the data has changed */
+       if (mvc->cb.selected_change)
+               mvc->cb.selected_change(mvc);
+
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
@@ -197,239 +205,331 @@
 
 /**
  * @param mvc: The MVC widget to use
- * @param multi: Is this widget multiselect capable
+ * @param mode: The selection mode to set
  * @return Returns no value
- * @brief Sets the multiselect capabilities of the mvc widget
+ * @brief Sets the selection capabilities of the mvc widget
  */
 void
-ewl_mvc_multiselect_set(Ewl_MVC *mvc, unsigned int multi)
+ewl_mvc_selection_mode_set(Ewl_MVC *mvc, Ewl_Selection_Mode mode)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("mvc", mvc);
        DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE);
 
-       mvc->multiselect = !!multi;
+       mvc->selection_mode = mode;
+       if (mode == EWL_SELECTION_MODE_NONE)
+       {
+               if (mvc->selected)
+                       ecore_list_destroy(mvc->selected);
+               mvc->selected = NULL;
+       }
+       else if (!mvc->selected)
+               mvc->selected = ecore_list_new();
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
 /**
  * @param mvc: The MVC widget to use
- * @return Returns the multiselect setting of the mvc widget
- * @brief Retrieves the multiselect setting of the widget
+ * @return Returns the selection mode of the mvc widget
+ * @brief Retrieves the selection mode of the widget
  */
-unsigned int
-ewl_mvc_multiselect_get(Ewl_MVC *mvc)
+Ewl_Selection_Mode
+ewl_mvc_selection_mode_get(Ewl_MVC *mvc)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
-       DCHECK_PARAM_PTR_RET("mvc", mvc, FALSE);
-       DCHECK_TYPE_RET("mvc", mvc, EWL_MVC_TYPE, FALSE);
+       DCHECK_PARAM_PTR_RET("mvc", mvc, EWL_SELECTION_MODE_NONE);
+       DCHECK_TYPE_RET("mvc", mvc, EWL_MVC_TYPE, EWL_SELECTION_MODE_NONE);
 
-       DRETURN_INT(mvc->multiselect, DLEVEL_STABLE);
+       DRETURN_INT(mvc->selection_mode, DLEVEL_STABLE);
 }
 
 /**
- * @param mvc: The MVC to work with
- * @param list: The list of indicies to set selected, list is -1 terminated
+ * @param mvc: The mvc to clear
  * @return Returns no value
- * @brief Sets the list of indices selected 
+ * @brief clears the selection list 
  */
 void
-ewl_mvc_selected_list_set(Ewl_MVC *mvc, int *list)
+ewl_mvc_selected_clear(Ewl_MVC *mvc)
 {
-       int i, size;
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("mvc", mvc);
+       DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE);
+       
+       ecore_list_clear(mvc->selected);
+       ewl_mvc_selected_change_notify(mvc);
 
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param mvc: The MVC to work with
+ * @param list: The list of items to set selected.
+ * @return Returns no value
+ * @brief Sets the list of items to select. This will remove any items it
+ * needs from the list.
+ */
+void
+ewl_mvc_selected_list_set(Ewl_MVC *mvc, Ecore_List *list)
+{
+       Ewl_Selection *sel;
+               
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("mvc", mvc);
        DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE);
 
-       if (!list)
-       {
-               mvc->selected.count = 0;
-               mvc->selected.items = realloc(mvc->selected.items, 2 * 
(sizeof(int)));
-               mvc->selected.items[0] = -1;
-       }
-       else if (mvc->multiselect)
-       {
-               mvc->selected.count = 0;
-               for (i = 0; list[i] != -1; i++)
-                       mvc->selected.count ++;
-
-               size = (mvc->selected.count + 1) * (sizeof(int));
-               mvc->selected.items = realloc(mvc->selected.items, size);
-               mvc->selected.items[mvc->selected.count] = -1;
-       
-               if (mvc->selected.count > 0)
-                       memcpy(mvc->selected.items, list, size);
-       }
-       else
+       /* make sure we're selecting and received items to select */
+       if (mvc->selection_mode == EWL_SELECTION_MODE_NONE)
+               DRETURN(DLEVEL_STABLE);
+
+       ecore_list_clear(mvc->selected);
+
+       if (!list || (ecore_list_nodes(list) == 0))
+               DRETURN(DLEVEL_STABLE);
+
+       sel = ecore_list_remove_first(list);
+       ecore_list_append(mvc->selected, sel);
+
+       if (mvc->selection_mode == EWL_SELECTION_MODE_MULTI)
        {
-               mvc->selected.count = 1;
-               mvc->selected.items = realloc(mvc->selected.items, 2 * 
sizeof(int));
-               mvc->selected.items[0] = list[0];
-               mvc->selected.items[1] = -1;
+               while ((sel = ecore_list_remove_first(list)))
+                       ecore_list_append(mvc->selected, sel);
        }
 
-       if (mvc->cb.selected_change)
-               mvc->cb.selected_change(mvc);
+       ewl_mvc_selected_change_notify(mvc);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
 /**
  * @param mvc: The MVC to get the list from
- * @return Returns the list of selected indices, list is -1 terminated.
- * @brief Retrieves the list of selected indicies
+ * @return Returns the list of selected indices
+ * @brief Retrieves the list of selected indicies. DO NOT remove or change
+ * items in this list.
  */
-const int *
+Ecore_List *
 ewl_mvc_selected_list_get(Ewl_MVC *mvc)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR_RET("mvc", mvc, NULL);
        DCHECK_TYPE_RET("mvc", mvc, EWL_MVC_TYPE, NULL);
 
-       DRETURN_PTR(mvc->selected.items, DLEVEL_STABLE);
+       DRETURN_PTR(mvc->selected, DLEVEL_STABLE);
 }
 
 /**
  * @param mvc: The MVC to set the list into
- * @param start: The range start
- * @param end: The range end
+ * @param srow: The start row
+ * @param scolumn:  The start column
+ * @param erow: The end row
+ * @param ecolumn: The end column
  * @return Returns no value
  * @brief Sets the given range, inclusive, as selected in the mvc
  */
 void
-ewl_mvc_selected_range_set(Ewl_MVC *mvc, int start, int end)
+ewl_mvc_selected_range_add(Ewl_MVC *mvc, int srow, int scolumn,
+                                        int erow, int ecolumn)
 {
-       int t;
+       Ewl_Selection *sel;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("mvc", mvc);
        DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE);
 
-       if (start < 0) start = 0;
-       if (end < 0) end = 0;
-
-       /* make sure the start comes first */
-       if (end < start)
+       if (mvc->selection_mode == EWL_SELECTION_MODE_SINGLE)
        {
-               t = start;
-               start = end;
-               end = t;
+               Ewl_Selection_Idx *si;
+
+               si = NEW(Ewl_Selection_Idx, 1);
+               si->sel.type = EWL_SELECTION_TYPE_INDEX;
+               si->row = srow;
+               si->column = scolumn;
+
+               sel = EWL_SELECTION(si);
        }
+       else
+       {
+               Ewl_Selection_Range *si;
 
-       /* this isn't multiselect so make this one item, the start */
-       if (!mvc->multiselect)
-               end = start;
-
-       t = (end - start) + 1;
-       mvc->selected.count = t;
-       mvc->selected.items = realloc(mvc->selected.items, (t + 1) * 
sizeof(int));
-       mvc->selected.items[mvc->selected.count] = -1;
+               si = NEW(Ewl_Selection_Range, 1);
+               si->sel.type = EWL_SELECTION_TYPE_RANGE;
+               si->start.row = srow;
+               si->start.column = scolumn;
+               si->end.row = erow;
+               si->end.column = ecolumn;
 
-       for (t = 0; t < mvc->selected.count; t++)
-               mvc->selected.items[t] = start + t;
+               sel = EWL_SELECTION(si);
+       }
 
-       if (mvc->cb.selected_change)
-               mvc->cb.selected_change(mvc);
+       ecore_list_append(mvc->selected, sel);
+       ewl_mvc_selected_change_notify(mvc);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
 /**
  * @param mvc: The MVC to work with
- * @param i: The index to set selected
+ * @param row: The row to set
+ * @param column: The column to set
  * @return Returns no value
  * @brief Sets the given index as selected
  */
 void
-ewl_mvc_selected_set(Ewl_MVC *mvc, int i)
+ewl_mvc_selected_set(Ewl_MVC *mvc, int row, int column)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("mvc", mvc);
        DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE);
 
-       mvc->selected.count = 1;
-       mvc->selected.items = realloc(mvc->selected.items, 2 * sizeof(int));
-       mvc->selected.items[0] = i;
-       mvc->selected.items[1] = -1;
-
-       if (mvc->cb.selected_change)
-               mvc->cb.selected_change(mvc);
+       ecore_list_clear(mvc->selected);
+       ewl_mvc_selected_add(mvc, row, column);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
 /**
  * @param mvc: The MVC to work with
- * @param i: The index to add to the selected list
+ * @param row: The row to add
+ * @param column: The column to add
  * @return Returns no value
  * @brief Adds the given index to the selected list
  */
 void
-ewl_mvc_selected_add(Ewl_MVC *mvc, int i)
+ewl_mvc_selected_add(Ewl_MVC *mvc, int row, int column)
 {
+       Ewl_Selection_Idx *si;
+
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("mvc", mvc);
        DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE);
 
-       mvc->selected.count ++;
-       mvc->selected.items = realloc(mvc->selected.items, 
-                               (mvc->selected.count + 1) * sizeof(int));
-       mvc->selected.items[mvc->selected.count - 1] = i;
-       mvc->selected.items[mvc->selected.count] = -1;
+       si = NEW(Ewl_Selection_Idx, 1);
+       si->sel.type = EWL_SELECTION_TYPE_INDEX;
+       si->row = row;
+       si->column = column;
 
-       if (mvc->cb.selected_change)
-               mvc->cb.selected_change(mvc);
+       ecore_list_append(mvc->selected, si);
+       ewl_mvc_selected_change_notify(mvc);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
 /**
  * @param mvc: The MVC to get the data from
- * @return Returns the last selected item
- * @brief Retrieves the last selected item
+ * @return Returns the last selected item. Return must be free'd
+ * @brief Retrieves the last selected item. Return must be free'd.
  */
-int
+Ewl_Selection_Idx *
 ewl_mvc_selected_get(Ewl_MVC *mvc)
 {
+       Ewl_Selection *sel;
+       Ewl_Selection_Idx *ret;
+
        DENTER_FUNCTION(DLEVEL_STABLE);
-       DCHECK_PARAM_PTR_RET("mvc", mvc, -1);
-       DCHECK_TYPE_RET("mvc", mvc, EWL_MVC_TYPE, -1);
+       DCHECK_PARAM_PTR_RET("mvc", mvc, NULL);
+       DCHECK_TYPE_RET("mvc", mvc, EWL_MVC_TYPE, NULL);
+
+       ecore_list_goto_last(mvc->selected);
+       sel = ecore_list_current(mvc->selected);
+       if (!sel) DRETURN_PTR(NULL, DLEVEL_STABLE);
 
-       if (mvc->selected.count == 0)
-               DRETURN_INT(-1, DLEVEL_STABLE);
+       ret = NEW(Ewl_Selection_Idx, 1);
+       ret->sel.type = EWL_SELECTION_TYPE_INDEX;
 
-       DRETURN_INT(mvc->selected.items[mvc->selected.count - 1], 
-                                                       DLEVEL_STABLE);
+       if (sel->type == EWL_SELECTION_TYPE_INDEX)
+       {
+               Ewl_Selection_Idx *si;
+
+               si = EWL_SELECTION_IDX(sel);
+               ret->row = si->row;
+               ret->column = si->column;
+       }
+       else
+       {
+               Ewl_Selection_Range *si;
+
+               si = EWL_SELECTION_RANGE(sel);
+               ret->row = si->start.row;
+               ret->column = si->start.column;
+       }
+
+       DRETURN_PTR(ret, DLEVEL_STABLE);
 }
 
 /**
  * @param mvc: The MVC to work with
- * @param idx: The index to remove
+ * @param int row: The row to remove
+ * @param int colum: The column to remove
  * @return Returns no value
  * @brief Removes the given index from the list of selected indices
  */
 void
-ewl_mvc_selected_rm(Ewl_MVC *mvc, int idx)
+ewl_mvc_selected_rm(Ewl_MVC *mvc, int row, int column)
 {
-       int i;
+       Ewl_Selection *sel;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("mvc", mvc);
        DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE);
 
-       for (i = 0; i < mvc->selected.count; i++)
+       /* XXX should this check for the same selected area bein in the list
+        * twice? What if the user does a box select on the tree, then
+        * another, larger, box select? */
+       ecore_list_goto_first(mvc->selected);
+       while ((sel = ecore_list_current(mvc->selected)))
        {
-               if (mvc->selected.items[i] == idx)
+               if (sel->type == EWL_SELECTION_TYPE_INDEX)
                {
-                       mvc->selected.count --;
-                       memmove((mvc->selected.items + i), 
-                                       (mvc->selected.items + i + 1),
-                                       ((mvc->selected.count - i) * 
sizeof(int)));
-                       mvc->selected.items[mvc->selected.count] = -1;
-                       break;
+                       Ewl_Selection_Idx *si;
+
+                       si = EWL_SELECTION_IDX(sel);
+                       if ((si->row == row) && (si->column == column))
+                       {
+                               ecore_list_remove(mvc->selected);
+                               break;
+                       }
                }
+               else
+               {
+                       Ewl_Selection_Range *si;
+                       int tmp;
+
+                       si = EWL_SELECTION_RANGE(sel);
+                               
+                       /* verify the range has the top/left most
+                        * cell first */
+                       if (si->end.row < si->start.row)
+                       {
+                               tmp = si->end.row;
+                               si->end.row = si->start.row;
+                               si->start.row = tmp;
+                       }
+       
+                       if (si->end.column < si->start.column)
+                       {
+                               tmp = si->end.column;
+                               si->end.column = si->start.column;
+                               si->start.column = tmp;
+                       }
+
+                       if ((si->start.row <= row) 
+                                       && (si->end.row >= row)
+                                       && (si->start.column <= column) 
+                                       && (si->end.column >= column))
+                       {
+                               ecore_list_remove(mvc->selected);
+
+                               DWARNING("Can't rm from range's yet\n");
+                               /* find top cells */
+                               /* find left cells */
+                               /* find right cells */
+                               /* find bottom cells */
+
+                               break;
+                       }
+               }
+
+               ecore_list_next(mvc->selected);
        }
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
@@ -447,7 +547,7 @@
        DCHECK_PARAM_PTR_RET("mvc", mvc, 0);
        DCHECK_TYPE_RET("mvc", mvc, EWL_MVC_TYPE, 0);
 
-       DRETURN_INT(mvc->selected.count, DLEVEL_STABLE);
+       DRETURN_INT(ecore_list_nodes(mvc->selected), DLEVEL_STABLE);
 }
 
 /**
@@ -457,21 +557,64 @@
  * @brief Checks if the given index is selected or not.
  */
 unsigned int
-ewl_mvc_is_selected(Ewl_MVC *mvc, int idx)
+ewl_mvc_is_selected(Ewl_MVC *mvc, int row, int column)
 {
-       int i;
+       Ewl_Selection *sel;
+       int ret = FALSE;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR_RET("mvc", mvc, FALSE);
        DCHECK_TYPE_RET("mvc", mvc, EWL_MVC_TYPE, FALSE);
 
-       for (i = 0; i < mvc->selected.count; i++)
+       ecore_list_goto_first(mvc->selected);
+       while ((sel = ecore_list_next(mvc->selected)))
        {
-               if (mvc->selected.items[i] == idx)
-                       DRETURN_INT(TRUE, DLEVEL_STABLE);
+               if (sel->type == EWL_SELECTION_TYPE_INDEX)
+               {
+                       Ewl_Selection_Idx *si;
+
+                       si = EWL_SELECTION_IDX(sel);
+                       if ((si->row == row) && (si->column == column))
+                       {
+                               ret = TRUE;
+                               break;
+                       }
+               }
+               else
+               {
+                       int tmp;
+                       Ewl_Selection_Range *si;
+
+                       si = EWL_SELECTION_RANGE(sel);
+                               
+                       /* verify the range has the top/left most
+                        * cell first */
+                       if (si->end.row < si->start.row)
+                       {
+                               tmp = si->end.row;
+                               si->end.row = si->start.row;
+                               si->start.row = tmp;
+                       }
+       
+                       if (si->end.column < si->start.column)
+                       {
+                               tmp = si->end.column;
+                               si->end.column = si->start.column;
+                               si->start.column = tmp;
+                       }
+
+                       if ((si->start.row <= row) 
+                                       && (si->end.row >= row)
+                                       && (si->start.column <= column) 
+                                       && (si->end.column >= column))
+                       {
+                               ret = TRUE;
+                               break;
+                       }
+               }
        }
 
-       DRETURN_INT(FALSE, DLEVEL_STABLE);
+       DRETURN_INT(ret, DLEVEL_STABLE);
 }
 
 /**
@@ -489,59 +632,12 @@
        DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE);
 
        mvc->cb.selected_change = cb;
-       if (mvc->selected.count > 0)
+       if (mvc->selected && (ecore_list_nodes(mvc->selected) > 0))
                cb(mvc);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
-/** 
- * @internal
- * @param c: The container
- * @param w: UNUSED
- * @param idx: The index removed from
- * @return Returns no value
- * @brief Checks if the given widget index is in the selected array and
- * removes it
- */
-void
-ewl_mvc_cb_child_del(Ewl_Container *c, Ewl_Widget *w __UNUSED__, int idx)
-{
-       DENTER_FUNCTION(DLEVEL_STABLE);
-       DCHECK_PARAM_PTR("c", c);
-       DCHECK_TYPE("c", c, EWL_CONTAINER_TYPE);
-
-       if (ewl_mvc_is_selected(EWL_MVC(c), idx))
-               ewl_mvc_selected_rm(EWL_MVC(c), idx);
-
-       DLEAVE_FUNCTION(DLEVEL_STABLE);
-}
-
-/**
- * @internal
- * @param c: The container to work with
- * @param w: The widget
- * @return Returns no value
- * @brief Checks if the widget is in the selected list and removes it
- */
-void
-ewl_mvc_cb_child_hide(Ewl_Container *c, Ewl_Widget *w)
-{
-       int idx;
-
-       DENTER_FUNCTION(DLEVEL_STABLE);
-       DCHECK_PARAM_PTR("c", c);
-       DCHECK_PARAM_PTR("w", w);
-       DCHECK_TYPE("c", c, EWL_CONTAINER_TYPE);
-       DCHECK_TYPE("w", w, EWL_WIDGET_TYPE);
-
-       idx = ewl_container_child_index_get(c, w);
-       if (idx > -1 && ewl_mvc_is_selected(EWL_MVC(c), idx))
-               ewl_mvc_selected_rm(EWL_MVC(c), idx);
-
-       DLEAVE_FUNCTION(DLEVEL_STABLE);
-}
-
 /**
  * @internal
  * @param w: The wiget to destroy
@@ -559,8 +655,25 @@
        DCHECK_PARAM_PTR("w", w);
 
        mvc = EWL_MVC(w);
-       if (mvc->selected.items)
-               FREE(mvc->selected.items);
+       if (mvc->selected)
+               ecore_list_destroy(mvc->selected);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+static void
+ewl_mvc_selected_change_notify(Ewl_MVC *mvc)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("mvc", mvc);
+       DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE);
+
+       /* notify any inheriting widgets */
+       if (mvc->cb.selected_change)
+               mvc->cb.selected_change(mvc);
+
+       /* notify the app */
+       ewl_callback_call(EWL_WIDGET(mvc), EWL_CALLBACK_VALUE_CHANGED);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_mvc.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -3 -r1.4 -r1.5
--- ewl_mvc.h   3 Oct 2006 06:09:05 -0000       1.4
+++ ewl_mvc.h   15 Oct 2006 22:34:14 -0000      1.5
@@ -14,6 +14,37 @@
  */
 #define EWL_MVC_TYPE "mvc"
 
+#define EWL_SELECTION(x) ((Ewl_Selection *)x)
+typedef struct Ewl_Selection Ewl_Selection;
+struct Ewl_Selection
+{
+       Ewl_Selection_Type type;
+};
+
+#define EWL_SELECTION_IDX(x) ((Ewl_Selection_Idx *)x)
+typedef struct Ewl_Selection_Idx Ewl_Selection_Idx;
+struct Ewl_Selection_Idx
+{
+       Ewl_Selection sel;
+
+       unsigned int row;
+       unsigned int column;
+};
+
+#define EWL_SELECTION_RANGE(x) ((Ewl_Selection_Range *)x)
+typedef struct Ewl_Selection_Range Ewl_Selection_Range;
+struct Ewl_Selection_Range
+{
+       Ewl_Selection sel;
+
+       struct
+       {
+               unsigned int row;
+               unsigned int column;
+       } start,
+         end;
+};
+
 /**
  * A simple mvc base class
  */
@@ -41,13 +72,9 @@
                void (*selected_change)(Ewl_MVC *mvc);
        } cb;
 
-       struct
-       {
-               int *items;             /**< Selected items */
-               int count;              /**< Number of selected */
-       } selected;                     /**< The selected info */
+       Ecore_List *selected;           /**< The selected cells */
 
-       unsigned char multiselect:1;    /**< is the widget multiselect capable 
*/
+       Ewl_Selection_Mode selection_mode;      /**< The widget selection mode*/
        unsigned char dirty:1;          /**< Is the data dirty */
 };
 
@@ -65,30 +92,32 @@
 void            ewl_mvc_dirty_set(Ewl_MVC *mvc, unsigned int dirty);
 unsigned int    ewl_mvc_dirty_get(Ewl_MVC *mvc);
 
-void            ewl_mvc_multiselect_set(Ewl_MVC *mvc, unsigned int multi);
-unsigned int    ewl_mvc_multiselect_get(Ewl_MVC *mvc);
-
-void            ewl_mvc_selected_list_set(Ewl_MVC *mvc, int *list);
-const int      *ewl_mvc_selected_list_get(Ewl_MVC *mvc);
-
-void            ewl_mvc_selected_range_set(Ewl_MVC *mvc, int start, int end);
-
-void            ewl_mvc_selected_set(Ewl_MVC *mvc, int i);
-void            ewl_mvc_selected_add(Ewl_MVC *mvc, int i);
-int             ewl_mvc_selected_get(Ewl_MVC *mvc);
-void            ewl_mvc_selected_rm(Ewl_MVC *mvc, int idx);
+void            ewl_mvc_selection_mode_set(Ewl_MVC *mvc, 
+                                       Ewl_Selection_Mode mode);
+Ewl_Selection_Mode ewl_mvc_selection_mode_get(Ewl_MVC *mvc);
+
+void            ewl_mvc_selected_clear(Ewl_MVC *mvc);
+
+void            ewl_mvc_selected_list_set(Ewl_MVC *mvc, Ecore_List *list);
+Ecore_List     *ewl_mvc_selected_list_get(Ewl_MVC *mvc);
+
+void            ewl_mvc_selected_range_add(Ewl_MVC *mvc, 
+                                               int srow, int scolumn,
+                                               int erow, int ecolumn);
+
+void            ewl_mvc_selected_set(Ewl_MVC *mvc, int row, int column);
+void            ewl_mvc_selected_add(Ewl_MVC *mvc, int row, int column);
+Ewl_Selection_Idx *ewl_mvc_selected_get(Ewl_MVC *mvc);
+void            ewl_mvc_selected_rm(Ewl_MVC *mvc, int row, int column);
 
 int             ewl_mvc_selected_count_get(Ewl_MVC *mvc);
-unsigned int    ewl_mvc_is_selected(Ewl_MVC *mvc, int idx);
+unsigned int    ewl_mvc_is_selected(Ewl_MVC *mvc, int row, int column);
 
 /* 
  * internal
  */
 void            ewl_mvc_view_change_cb_set(Ewl_MVC *mvc, void (*cb)(Ewl_MVC 
*mvc));
 void            ewl_mvc_selected_change_cb_set(Ewl_MVC *mvc, void 
(*cb)(Ewl_MVC *mvc));
-
-void            ewl_mvc_cb_child_del(Ewl_Container *c, Ewl_Widget *w, int idx);
-void            ewl_mvc_cb_child_hide(Ewl_Container *c, Ewl_Widget *w);
 
 void            ewl_mvc_cb_destroy(Ewl_Widget *w, void *ev, void *data);
 
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_tree.c,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -3 -r1.41 -r1.42
--- ewl_tree.c  30 Sep 2006 18:41:01 -0000      1.41
+++ ewl_tree.c  15 Oct 2006 22:34:14 -0000      1.42
@@ -548,7 +548,7 @@
  * @return Returns no value.
  */
 void
-ewl_tree_mode_set(Ewl_Tree *tree, Ewl_Tree_Mode mode)
+ewl_tree_mode_set(Ewl_Tree *tree, Ewl_Selection_Mode mode)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("tree", tree);
@@ -559,7 +559,7 @@
 
        tree->mode = mode;
 
-       if (mode == EWL_TREE_MODE_NONE)
+       if (mode == EWL_SELECTION_MODE_NONE)
                ewl_tree_selected_clear(tree);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
@@ -570,12 +570,12 @@
  * @brief Retrieve the current selection mode of a tree.
  * @return Returns the current selection mode of the tree.
  */
-Ewl_Tree_Mode
+Ewl_Selection_Mode
 ewl_tree_mode_get(Ewl_Tree *tree)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
-       DCHECK_PARAM_PTR_RET("tree", tree, EWL_TREE_MODE_NONE);
-       DCHECK_TYPE_RET("tree", tree, EWL_TREE_TYPE, EWL_TREE_MODE_NONE);
+       DCHECK_PARAM_PTR_RET("tree", tree, EWL_SELECTION_MODE_NONE);
+       DCHECK_TYPE_RET("tree", tree, EWL_TREE_TYPE, EWL_SELECTION_MODE_NONE);
 
        DRETURN_INT(tree->mode, DLEVEL_STABLE);
 }
@@ -1353,11 +1353,11 @@
        node = EWL_TREE_NODE(w->parent);
        tree = node->tree;
 
-       if (tree->mode == EWL_TREE_MODE_SINGLE ||
+       if (tree->mode == EWL_SELECTION_MODE_SINGLE ||
            !(ev->modifiers & EWL_KEY_MODIFIER_SHIFT))
                ewl_tree_selected_clear(tree);
 
-       if (tree->mode != EWL_TREE_MODE_NONE) {
+       if (tree->mode != EWL_SELECTION_MODE_NONE) {
                if (ecore_list_goto(tree->selected, w) == NULL)
                        ecore_list_append(tree->selected, w);
                ewl_widget_state_set(w, "tree-selected", EWL_STATE_PERSISTENT);
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_tree.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -3 -r1.21 -r1.22
--- ewl_tree.h  30 Sep 2006 18:41:01 -0000      1.21
+++ ewl_tree.h  15 Oct 2006 22:34:14 -0000      1.22
@@ -48,7 +48,7 @@
        Ewl_Widget    *header;     /**< Array of widgets in the header */
        Ewl_Widget    *scrollarea; /**< Scrollable area of rows */
        Ecore_List    *selected;   /**< The currently selected rows */
-       Ewl_Tree_Mode  mode;       /**< Mode for selecting rows */
+       Ewl_Selection_Mode  mode;       /**< Mode for selecting rows */
        unsigned short ncols;      /**< Number of columns in tree */
        unsigned short headers_visible; /**< Are the headers visible */
        unsigned short expands_visible; /**< Are the rows expandable */
@@ -104,8 +104,8 @@
 void            ewl_tree_selected_clear(Ewl_Tree *tree);
 Ewl_Widget     *ewl_tree_row_column_get(Ewl_Row *row, int i);
 
-Ewl_Tree_Mode           ewl_tree_mode_get(Ewl_Tree *tree);
-void            ewl_tree_mode_set(Ewl_Tree *tree, Ewl_Tree_Mode mode);
+Ewl_Selection_Mode      ewl_tree_mode_get(Ewl_Tree *tree);
+void            ewl_tree_mode_set(Ewl_Tree *tree, Ewl_Selection_Mode mode);
 
 Ewl_Widget     *ewl_tree_row_add(Ewl_Tree *tree, Ewl_Row *prow,
                                             Ewl_Widget **children);
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_tree2.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -3 -r1.34 -r1.35
--- ewl_tree2.c 3 Oct 2006 06:09:05 -0000       1.34
+++ ewl_tree2.c 15 Oct 2006 22:34:14 -0000      1.35
@@ -61,7 +61,7 @@
        tree->columns = ecore_list_new();
        ecore_list_set_free_cb(tree->columns, ewl_tree2_cb_column_free);
 
-       tree->mode = EWL_TREE_MODE_NONE;
+       tree->mode = EWL_SELECTION_MODE_NONE;
 
        tree->header = ewl_hpaned_new();
        ewl_container_child_append(EWL_CONTAINER(tree), tree->header);
@@ -268,12 +268,12 @@
  * @return Returns the current Ewl_Tree_Mode of the tree
  * @brief Get the mode from the tree
  */
-Ewl_Tree_Mode 
-ewl_tree2_mode_get(Ewl_Tree2 *tree)
+Ewl_Selection_Mode 
+ewl_tree2_selection_mode_get(Ewl_Tree2 *tree)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
-       DCHECK_PARAM_PTR_RET("tree", tree, EWL_TREE_MODE_NONE);
-       DCHECK_TYPE_RET("tree", tree, EWL_TREE2_TYPE, EWL_TREE_MODE_NONE);
+       DCHECK_PARAM_PTR_RET("tree", tree, EWL_SELECTION_MODE_NONE);
+       DCHECK_TYPE_RET("tree", tree, EWL_TREE2_TYPE, EWL_SELECTION_MODE_NONE);
 
        DRETURN_INT(tree->mode, DLEVEL_STABLE);
 }
@@ -285,7 +285,7 @@
  * @brief Set the mode of the tree
  */
 void 
-ewl_tree2_mode_set(Ewl_Tree2 *tree, Ewl_Tree_Mode mode)
+ewl_tree2_selection_mode_set(Ewl_Tree2 *tree, Ewl_Selection_Mode mode)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("tree", tree);
@@ -297,7 +297,7 @@
        tree->mode = mode;
  
        /* if the mode is none then we don't care about the selected list */
-       if (tree->mode == EWL_TREE_MODE_NONE)
+       if (tree->mode == EWL_SELECTION_MODE_NONE)
        {
                ewl_mvc_selected_list_set(EWL_MVC(tree), NULL);
        }
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_tree2.h,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -3 -r1.31 -r1.32
--- ewl_tree2.h 3 Oct 2006 06:09:05 -0000       1.31
+++ ewl_tree2.h 15 Oct 2006 22:34:14 -0000      1.32
@@ -90,7 +90,7 @@
        Ecore_List *columns;     /**< The tree columns. */
        int *rowcache;           /**< Cache of row sizes */
 
-       Ewl_Tree_Mode mode;      /**< The mode of the tree */
+       Ewl_Selection_Mode mode;         /**< The mode of the tree */
 
        unsigned char fixed:1;    /**< Rows are fixed height */
        unsigned char headers_visible:1; /**< Are the headers visible? */
@@ -138,8 +138,9 @@
                                               unsigned char visible);
 unsigned int    ewl_tree2_headers_visible_get(Ewl_Tree2 *tree);
 
-Ewl_Tree_Mode   ewl_tree2_mode_get(Ewl_Tree2 *tree);
-void            ewl_tree2_mode_set(Ewl_Tree2 *tree, Ewl_Tree_Mode mode);
+Ewl_Selection_Mode ewl_tree2_selection_mode_get(Ewl_Tree2 *tree);
+void            ewl_tree2_selection_mode_set(Ewl_Tree2 *tree, 
+                                               Ewl_Selection_Mode mode);
 
 void            ewl_tree2_fixed_rows_set(Ewl_Tree2 *tree, unsigned int fixed);
 unsigned int    ewl_tree2_fixed_rows_get(Ewl_Tree2 *tree);



-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to