Enlightenment CVS committal

Author  : dj2
Project : e17
Module  : libs/ewl

Dir     : e17/libs/ewl/src/lib


Modified Files:
        ewl_combo.c ewl_filelist_tree.c ewl_filepicker.c ewl_list.c 
        ewl_model.c ewl_model.h ewl_mvc.c ewl_mvc.h ewl_tree2.c 
        ewl_tree2.h 


Log Message:
- working on tree2 selections. the selection struct now contains a pointer
  to the model along with the data.
- this breaks the api to set selections on the tree slightly

===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_combo.c,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -3 -r1.44 -r1.45
--- ewl_combo.c 18 Jan 2007 10:24:59 -0000      1.44
+++ ewl_combo.c 22 Jan 2007 09:33:03 -0000      1.45
@@ -254,7 +254,8 @@
        combo = data;
 
        i = ewl_container_child_index_get(EWL_CONTAINER(combo->popup), w);
-       ewl_mvc_selected_set(EWL_MVC(combo), ewl_mvc_data_get(EWL_MVC(combo)), 
i, -1);
+       ewl_mvc_selected_set(EWL_MVC(combo), NULL, 
+                               ewl_mvc_data_get(EWL_MVC(combo)), i, -1);
 
        ewl_widget_hide(combo->popup);
        ewl_widget_state_set(combo->button, "collapsed",
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filelist_tree.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- ewl_filelist_tree.c 18 Jan 2007 10:24:59 -0000      1.1
+++ ewl_filelist_tree.c 22 Jan 2007 09:33:03 -0000      1.2
@@ -108,12 +108,7 @@
        data = NEW(Ewl_Filelist_Tree_Data, 1);
        data->list = fl;
 
-       fl->tree = ewl_tree2_new();
-       ewl_container_child_append(EWL_CONTAINER(fl), fl->tree);
-       ewl_mvc_data_set(EWL_MVC(fl->tree), data);
-       ewl_widget_show(fl->tree);
-
-       /* Setup the columns model, by default only one column */
+       /* Setup the tree model */
        model = ewl_model_new();
        ewl_model_count_set(model, ewl_filelist_tree_data_count);
        ewl_model_fetch_set(model, ewl_filelist_tree_data_fetch);
@@ -122,8 +117,14 @@
        ewl_model_expansion_data_fetch_set(model,
                        ewl_filelist_tree_data_expansion_data_fetch);
 
+       fl->tree = ewl_tree2_new();
+       ewl_container_child_append(EWL_CONTAINER(fl), fl->tree);
+       ewl_mvc_data_set(EWL_MVC(fl->tree), data);
+       ewl_mvc_model_set(EWL_MVC(fl->tree), model);
+       ewl_widget_show(fl->tree);
+
        view = ewl_label_view_get();
-       ewl_tree2_column_append(EWL_TREE2(fl->tree), model, view);
+       ewl_tree2_column_append(EWL_TREE2(fl->tree), view, TRUE);
 
        DRETURN_INT(TRUE, DLEVEL_STABLE);
 }
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filepicker.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -3 -r1.22 -r1.23
--- ewl_filepicker.c    18 Jan 2007 10:24:59 -0000      1.22
+++ ewl_filepicker.c    22 Jan 2007 09:33:03 -0000      1.23
@@ -149,7 +149,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), fp, 0, 0);
+       ewl_mvc_selected_set(EWL_MVC(fp->type_combo), NULL, fp, 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);
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_list.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -3 -r1.14 -r1.15
--- ewl_list.c  18 Jan 2007 10:24:59 -0000      1.14
+++ ewl_list.c  22 Jan 2007 09:33:03 -0000      1.15
@@ -170,8 +170,8 @@
                                ewl_highlight_follow_get(EWL_HIGHLIGHT(w)));
        }
 
-       ewl_mvc_handle_click(EWL_MVC(data), ewl_mvc_data_get(EWL_MVC(data)),
-                       row, -1);
+       ewl_mvc_handle_click(EWL_MVC(data), NULL,
+                       ewl_mvc_data_get(EWL_MVC(data)), row, -1);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_model.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- ewl_model.c 8 Jan 2007 13:02:35 -0000       1.12
+++ ewl_model.c 22 Jan 2007 09:33:03 -0000      1.13
@@ -93,129 +93,161 @@
 }
 
 /**
- * @param m: The model to set the callback on
- * @param exp: The expandable callback
- * @return Returns no value
- * @brief Sets the expandable callback on the given model
+ * @param m: The Ewl_Model to set the sort callback on
+ * @param sort: The sort callback to set
+ * @return Returns no value.
+ * @brief Sets the sort callback into the model
  */
 void
-ewl_model_expandable_set(Ewl_Model *m, Ewl_Model_Expandable exp)
+ewl_model_sort_set(Ewl_Model *m, Ewl_Model_Sort sort)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("m", m);
 
-       m->expandable = exp;
+       m->sort = sort;
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
 /**
- * @param m: The model to get the expandable callback from
- * @return Returns the expandable callback set on the model
- * @brief Retrieves the expandable callback set on the model
+ * @param m: The Ewl_Model to get the sort callback from
+ * @return Returns the Ewl_Model_Sort set on the model or NULL if none set
+ * @brief Gets the sort callback from the model
  */
-Ewl_Model_Expandable
-ewl_model_expandable_get(Ewl_Model *m)
+Ewl_Model_Sort
+ewl_model_sort_get(Ewl_Model *m)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR_RET("m", m, NULL);
 
-       DRETURN_PTR(m->expandable, DLEVEL_STABLE);
+       DRETURN_INT(m->sort, DLEVEL_STABLE);
 }
 
 /**
- * @param m: The Ewl_Model to set the expansion_data callback into
- * @param get: The Ewl_Model_Expansion_Data_Fetch callback for subrows
+ * @param m: The Ewl_Model to set the count callback on
+ * @param count: The count callback to set on the model
  * @return Returns no value.
- * @brief Sets the subfetch callback into the model
+ * @brief Sets the count callback into the model
  */
 void
-ewl_model_expansion_data_fetch_set(Ewl_Model *m, 
-                               Ewl_Model_Expansion_Data_Fetch get)
+ewl_model_count_set(Ewl_Model *m, Ewl_Model_Count count)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("m", m);
 
-       m->expansion_data = get;
+       m->count = count;
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
 /**
- * @param m: The Ewl_Model to get the expansion_data callback from
- * @return Returns the Ewl_Model_Expansion_Data_Fetch for the model
- * @brief Gets the expansion_data callback from the model
+ * @param m: The Ewl_Model to get the count callback from
+ * @return Returns the Ewl_Model_Count callback set on the model or NULL if
+ * none set.
+ * @brief Gets the count callback from the model
  */
-Ewl_Model_Expansion_Data_Fetch
-ewl_model_expansion_data_fetch_get(Ewl_Model *m)
+Ewl_Model_Count
+ewl_model_count_get(Ewl_Model *m)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR_RET("m", m, NULL);
 
-       DRETURN_INT(m->expansion_data, DLEVEL_STABLE);
+       DRETURN_INT(m->count, DLEVEL_STABLE);
 }
 
 /**
- * @param m: The Ewl_Model to set the sort callback on
- * @param sort: The sort callback to set
- * @return Returns no value.
- * @brief Sets the sort callback into the model
+ * @param m: The model to set the callback on
+ * @param exp: The expandable callback
+ * @return Returns no value
+ * @brief Sets the expandable callback on the given model
  */
 void
-ewl_model_sort_set(Ewl_Model *m, Ewl_Model_Sort sort)
+ewl_model_expandable_set(Ewl_Model *m, Ewl_Model_Expandable exp)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("m", m);
 
-       m->sort = sort;
+       m->expansion.is = exp;
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
 /**
- * @param m: The Ewl_Model to get the sort callback from
- * @return Returns the Ewl_Model_Sort set on the model or NULL if none set
- * @brief Gets the sort callback from the model
+ * @param m: The model to get the expandable callback from
+ * @return Returns the expandable callback set on the model
+ * @brief Retrieves the expandable callback set on the model
  */
-Ewl_Model_Sort
-ewl_model_sort_get(Ewl_Model *m)
+Ewl_Model_Expandable
+ewl_model_expandable_get(Ewl_Model *m)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR_RET("m", m, NULL);
 
-       DRETURN_INT(m->sort, DLEVEL_STABLE);
+       DRETURN_PTR(m->expansion.is, DLEVEL_STABLE);
 }
 
 /**
- * @param m: The Ewl_Model to set the count callback on
- * @param count: The count callback to set on the model
+ * @param m: The Ewl_Model to set the expansion_data callback into
+ * @param get: The Ewl_Model_Expansion_Data_Fetch callback for subrows
  * @return Returns no value.
- * @brief Sets the count callback into the model
+ * @brief Sets the subfetch callback into the model
  */
 void
-ewl_model_count_set(Ewl_Model *m, Ewl_Model_Count count)
+ewl_model_expansion_data_fetch_set(Ewl_Model *m, 
+                               Ewl_Model_Expansion_Data_Fetch get)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("m", m);
 
-       m->count = count;
+       m->expansion.data = get;
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
 /**
- * @param m: The Ewl_Model to get the count callback from
- * @return Returns the Ewl_Model_Count callback set on the model or NULL if
- * none set.
- * @brief Gets the count callback from the model
+ * @param m: The Ewl_Model to get the expansion_data callback from
+ * @return Returns the Ewl_Model_Expansion_Data_Fetch for the model
+ * @brief Gets the expansion_data callback from the model
  */
-Ewl_Model_Count
-ewl_model_count_get(Ewl_Model *m)
+Ewl_Model_Expansion_Data_Fetch
+ewl_model_expansion_data_fetch_get(Ewl_Model *m)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR_RET("m", m, NULL);
 
-       DRETURN_INT(m->count, DLEVEL_STABLE);
+       DRETURN_INT(m->expansion.data, DLEVEL_STABLE);
+}
+
+/**
+ * @param m: The model to work with
+ * @param f: The model expansion model fetch callback
+ * @return Returns no value
+ * @brief Sets the model expansion model fetch callback to @a f
+ */
+void
+ewl_model_expansion_model_fetch_set(Ewl_Model *m, 
+                               Ewl_Model_Expansion_Model_Fetch f)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("m", m);
+
+       m->expansion.model = f;
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param m: The model to work with
+ * @return Returns the model expansion model fetch function
+ * @brief Retrieves the model expansion model fetch function
+ */
+Ewl_Model_Expansion_Model_Fetch
+ewl_model_expansion_model_fetch_get(Ewl_Model *m)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR_RET("m", m, NULL);
+
+       DRETURN_PTR(m->expansion.model, DLEVEL_STABLE);
 }
 
 /**
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_model.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- ewl_model.h 8 Jan 2007 13:02:35 -0000       1.15
+++ ewl_model.h 22 Jan 2007 09:33:03 -0000      1.16
@@ -12,6 +12,11 @@
  */
 
 /**
+ * The Ewl_Model structure
+ */
+typedef struct Ewl_Model Ewl_Model;
+
+/**
  * @def EWL_MODEL_DATA_FETCH(f)
  * Model callback to handle fetching the data at the given row/column
  */
@@ -47,6 +52,18 @@
 typedef void *(*Ewl_Model_Expansion_Data_Fetch)(void *data, unsigned int row);
 
 /**
+ * @def EWL_MODEL_EXPANSION_MODEL_FETCH(f) 
((Ewl_Model_Expansion_Model_Fetch)(f)
+ * Model callback to get the model to use for the expansion point
+ */
+
+/**
+ * A typedef to shorten the definition of the model_expansion_model_fetch
+ * callback
+ */
+typedef Ewl_Model *(*Ewl_Model_Expansion_Model_Fetch)(void *data, 
+                                               unsigned int row);
+
+/**
  * @def EWL_MODEL_DATA_SORT(f)
  * Model callback to inform the program to sort it's data in the given
  * column
@@ -77,20 +94,20 @@
 #define EWL_MODEL(model) ((Ewl_Model *)model)
 
 /**
- * The Ewl_Model structure
- */
-typedef struct Ewl_Model Ewl_Model;
-
-/**
  * This holds the callbacks needed to define a model
  */
 struct Ewl_Model
 {
+       struct
+       {
+               Ewl_Model_Expandable is; /**< Is the row expandable */
+               Ewl_Model_Expansion_Data_Fetch data; /**< Get expansion data */
+               Ewl_Model_Expansion_Model_Fetch model; /**< Get expansion model 
*/
+       } expansion;
+
        Ewl_Model_Fetch fetch;    /**< Retrieve data for a cell */
-       Ewl_Model_Expandable expandable; /**< Is the row expandable */
-       Ewl_Model_Expansion_Data_Fetch expansion_data; /**< Get expansion data 
*/
-       Ewl_Model_Sort sort;      /**< Trigger sort on column */
        Ewl_Model_Count count;    /**< Count of data items */
+       Ewl_Model_Sort sort;      /**< Trigger sort on column */
 };
 
 Ewl_Model      *ewl_model_new(void);
@@ -101,18 +118,23 @@
 void            ewl_model_fetch_set(Ewl_Model *m, Ewl_Model_Fetch get);
 Ewl_Model_Fetch  ewl_model_fetch_get(Ewl_Model *m);
 
-void            ewl_model_expandable_set(Ewl_Model *m, Ewl_Model_Expandable 
exp);
+void            ewl_model_sort_set(Ewl_Model *m, Ewl_Model_Sort sort);
+Ewl_Model_Sort   ewl_model_sort_get(Ewl_Model *m);
+
+void            ewl_model_count_set(Ewl_Model *m, Ewl_Model_Count count);
+Ewl_Model_Count  ewl_model_count_get(Ewl_Model *m);
+
+void            ewl_model_expandable_set(Ewl_Model *m, 
+                                       Ewl_Model_Expandable exp);
 Ewl_Model_Expandable ewl_model_expandable_get(Ewl_Model *m);
 
 void            ewl_model_expansion_data_fetch_set(Ewl_Model *m, 
                                        Ewl_Model_Expansion_Data_Fetch get);
 Ewl_Model_Expansion_Data_Fetch ewl_model_expansion_data_fetch_get(Ewl_Model 
*m);
 
-void            ewl_model_sort_set(Ewl_Model *m, Ewl_Model_Sort sort);
-Ewl_Model_Sort   ewl_model_sort_get(Ewl_Model *m);
-
-void            ewl_model_count_set(Ewl_Model *m, Ewl_Model_Count count);
-Ewl_Model_Count  ewl_model_count_get(Ewl_Model *m);
+void            ewl_model_expansion_model_fetch_set(Ewl_Model *m,
+                                       Ewl_Model_Expansion_Model_Fetch f);
+Ewl_Model_Expansion_Model_Fetch ewl_model_expansion_model_fetch_get(Ewl_Model 
*m);
 
 /*
  * Internal stuff.
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_mvc.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -3 -r1.14 -r1.15
--- ewl_mvc.c   18 Jan 2007 10:24:59 -0000      1.14
+++ ewl_mvc.c   22 Jan 2007 09:33:03 -0000      1.15
@@ -352,6 +352,8 @@
 
 /**
  * @param mvc: The MVC to set the list into
+ * @param model: The model to use for this data. If NULL the model from the
+ * MVC will be used 
  * @param data: The parent data containing the index selection
  * @param srow: The start row
  * @param scolumn:  The start column
@@ -361,10 +363,12 @@
  * @brief Sets the given range, inclusive, as selected in the mvc
  */
 void
-ewl_mvc_selected_range_add(Ewl_MVC *mvc, void *data, int srow, int scolumn,
-                                        int erow, int ecolumn)
+ewl_mvc_selected_range_add(Ewl_MVC *mvc, Ewl_Model *model, void *data, 
+                                       int srow, int scolumn,
+                                       int erow, int ecolumn)
 {
        Ewl_Selection *sel;
+       Ewl_Model *mod;
        int tmp;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
@@ -374,6 +378,9 @@
        if (mvc->selection_mode == EWL_SELECTION_MODE_NONE)
                DRETURN(DLEVEL_STABLE); 
 
+       if (model) mod = model;
+       else mod = ewl_mvc_model_get(mvc);
+
        /* make sure the start comes before the end */
        if (erow < srow)
        {
@@ -390,10 +397,10 @@
        }
 
        if (mvc->selection_mode == EWL_SELECTION_MODE_SINGLE)
-               sel = ewl_mvc_selection_index_new(data, srow, scolumn);
-
+               sel = ewl_mvc_selection_index_new(mod, data, srow, scolumn);
        else
-               sel = ewl_mvc_selection_range_new(data, srow, scolumn, erow, 
ecolumn);
+               sel = ewl_mvc_selection_range_new(mod, data, srow, scolumn, 
+                                                       erow, ecolumn);
 
        ecore_list_append(mvc->selected, sel);
        ewl_mvc_selected_change_notify(mvc);
@@ -403,6 +410,8 @@
 
 /**
  * @param mvc: The MVC to work with
+ * @param model: The model to work with the data. If NULL the model from the
+ * MVC will be used
  * @param data: The parent data containing the index selection
  * @param row: The row to set
  * @param column: The column to set
@@ -410,7 +419,8 @@
  * @brief Sets the given index as selected
  */
 void
-ewl_mvc_selected_set(Ewl_MVC *mvc, void *data, int row, int column)
+ewl_mvc_selected_set(Ewl_MVC *mvc, Ewl_Model *model, void *data, 
+                                               int row, int column)
 {
        Ewl_Selection *sel;
 
@@ -424,13 +434,15 @@
        while ((sel = ecore_list_remove_first(mvc->selected)))
                ewl_mvc_cb_sel_free(sel);
 
-       ewl_mvc_selected_add(mvc, data, row, column);
+       ewl_mvc_selected_add(mvc, model, data, row, column);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
 /**
  * @param mvc: The MVC to work with
+ * @param model: The model to work with. If NULL the model from the MVC will
+ * be used
  * @param data: The parent data containing the index selection
  * @param row: The row to add
  * @param column: The column to add
@@ -438,9 +450,11 @@
  * @brief Adds the given index to the selected list
  */
 void
-ewl_mvc_selected_add(Ewl_MVC *mvc, void *data, int row, int column)
+ewl_mvc_selected_add(Ewl_MVC *mvc, Ewl_Model *model, void *data, 
+                                               int row, int column)
 {
        Ewl_Selection *si;
+       Ewl_Model *mod;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("mvc", mvc);
@@ -449,7 +463,10 @@
        if (mvc->selection_mode == EWL_SELECTION_MODE_NONE)
                DRETURN(DLEVEL_STABLE);
 
-       si = ewl_mvc_selection_index_new(data, row, column);
+       if (model) mod = model;
+       else mod = ewl_mvc_model_get(mvc);
+
+       si = ewl_mvc_selection_index_new(mod, data, row, column);
        ecore_list_append(mvc->selected, si);
        ewl_mvc_selected_change_notify(mvc);
 
@@ -480,6 +497,7 @@
 
        ret = NEW(Ewl_Selection_Idx, 1);
        ret->sel.type = EWL_SELECTION_TYPE_INDEX;
+       ret->sel.model = sel->model;
        if (sel->type == EWL_SELECTION_TYPE_INDEX)
        {
                Ewl_Selection_Idx *si;
@@ -661,6 +679,7 @@
 }
 
 /**
+ * @param model: The model to work with this data
  * @param data: The parent data containing the index selection
  * @param row: The row to create the index selection for
  * @param column: The column to create the index for
@@ -668,13 +687,14 @@
  * @brief Creates a new index selection based on given values
  */
 Ewl_Selection *
-ewl_mvc_selection_index_new(void *data, int row, int column)
+ewl_mvc_selection_index_new(Ewl_Model *model, void *data, int row, int column)
 {
        Ewl_Selection_Idx *sel;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
 
        sel = NEW(Ewl_Selection_Idx, 1);
+       sel->sel.model = model;
        sel->sel.type = EWL_SELECTION_TYPE_INDEX;
        sel->sel.data = data;
        sel->row = row;
@@ -684,6 +704,7 @@
 }
 
 /**
+ * @param model: The model to work with this data
  * @param srow: The start row
  * @param scolumn: The start column
  * @param erow: The end row
@@ -692,15 +713,17 @@
  * @brief Creates a new range selection based on given values
  */
 Ewl_Selection *
-ewl_mvc_selection_range_new(void *data, int srow, int scolumn, int erow, int 
ecolumn)
+ewl_mvc_selection_range_new(Ewl_Model *model, void *data, int srow, 
+                                               int scolumn, int erow, 
+                                               int ecolumn)
 {
        Ewl_Selection_Range *sel;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
 
        sel = NEW(Ewl_Selection_Range, 1);
+       sel->sel.model = model;
        sel->sel.type = EWL_SELECTION_TYPE_RANGE;
-       /* FIXME: Need to scan the data and split on branches */
        sel->sel.data = data;
        sel->start.row = srow;
        sel->start.column = scolumn;
@@ -713,16 +736,20 @@
 /**
  * @internal
  * @param mvc: The mvc to work with
+ * @param model: A model to use. If NULL the MVC model will be used
+ * @param data: The data the model was working with
  * @param row: The row to add
  * @param column: The column to add
  * @return Returns no value
  * @brief Handles the click of the given cell
  */
 void
-ewl_mvc_handle_click(Ewl_MVC *mvc, void *data, int row, int column)
+ewl_mvc_handle_click(Ewl_MVC *mvc, Ewl_Model *model, void *data, int row, 
+                                                       int column)
 {
        unsigned int modifiers;
        int multi_select = FALSE;
+       Ewl_Model *mod;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("mvc", mvc);
@@ -731,6 +758,9 @@
        if (ewl_mvc_selection_mode_get(mvc) == EWL_SELECTION_MODE_MULTI)
                multi_select = TRUE;
 
+       if (model) mod = model;
+       else mod = ewl_mvc_model_get(mvc);
+
        modifiers = ewl_ev_modifiers_get();
        if (multi_select && (modifiers & EWL_KEY_MODIFIER_SHIFT))
        {
@@ -740,6 +770,7 @@
                        Ewl_Selection *sel;
                        void *sdata;
                        int srow, scolumn;
+                       Ewl_Model *smod;
 
                        /* A shift will add the current position into a 
                         * range with the last selected item. If the 
@@ -754,6 +785,7 @@
                                sdata = sel->data;
                                srow = idx->row;
                                scolumn = idx->column;
+                               smod = EWL_SELECTION(idx)->model;
 
                                if (sel->highlight)
                                        ewl_widget_destroy(sel->highlight);
@@ -767,12 +799,14 @@
                                sdata = sel->data;
                                srow = idx->start.row;
                                scolumn = idx->start.column;
+                               smod = EWL_SELECTION(idx)->model;
 
                                if (sel->highlight)
                                {
                                        Ewl_Widget *w;
 
-                                       while ((w = 
ecore_list_remove_first(sel->highlight)))
+                                       while ((w = ecore_list_remove_first(
+                                                               
sel->highlight)))
                                                ewl_widget_destroy(w);
                                }
 
@@ -790,7 +824,8 @@
                                        for (k = scolumn; k <= column; k++)
                                        {
                                                if (ewl_mvc_selected_is(mvc, 
data, i, k))
-                                                       
ewl_mvc_selected_rm(mvc, data, i, k);
+                                                       
ewl_mvc_selected_rm(mvc, 
+                                                                       data, 
i, k);
                                        }
                                }
 
@@ -798,21 +833,21 @@
 
                        ecore_list_remove(mvc->selected);
 
-                       ewl_mvc_selected_range_add(mvc, data, srow, scolumn,
+                       ewl_mvc_selected_range_add(mvc, smod, data, srow, 
scolumn,
                                                        row, column);
                }
                else
-                       ewl_mvc_selected_set(mvc, data, row, column);
+                       ewl_mvc_selected_set(mvc, mod, data, row, column);
        }
        else if (multi_select && (modifiers & EWL_KEY_MODIFIER_CTRL))
        {
                if (ewl_mvc_selected_is(mvc, data, row, column))
                        ewl_mvc_selected_rm(mvc, data, row, column);
                else
-                       ewl_mvc_selected_add(mvc, data, row, column);
+                       ewl_mvc_selected_add(mvc, mod, data, row, column);
        }
        else
-               ewl_mvc_selected_set(mvc, data, row, column);
+               ewl_mvc_selected_set(mvc, mod, data, row, column);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -1006,12 +1041,12 @@
                /* one item left in the grouping */
                if ((((si->start.row - erow) + 1) * 
                                ((si->start.column - si->end.column) + 1)) == 1)
-                       n = ewl_mvc_selection_index_new(sel->data,
+                       n = ewl_mvc_selection_index_new(sel->model, sel->data,
                                                        si->start.row,
                                                        si->start.column);
 
                else
-                       n = ewl_mvc_selection_range_new(sel->data,
+                       n = ewl_mvc_selection_range_new(sel->model, sel->data,
                                                        si->start.row,
                                                        si->start.column,
                                                        erow, si->end.column);
@@ -1028,10 +1063,12 @@
                ecolumn = (column - 1);
                if ((((si->end.row - row) + 1) * 
                                ((si->start.column - ecolumn) + 1)) == 1)
-                       n = ewl_mvc_selection_index_new(sel->data, row, 
si->start.column);
+                       n = ewl_mvc_selection_index_new(sel->model, sel->data, 
+                                                       row, si->start.column);
 
                else
-                       n = ewl_mvc_selection_range_new(sel->data, row, 
si->start.column,
+                       n = ewl_mvc_selection_range_new(sel->model, sel->data, 
+                                                       row, si->start.column,
                                                        si->end.row, ecolumn);
 
                ecore_list_append(mvc->selected, n);
@@ -1046,10 +1083,12 @@
                scolumn = column + 1;
                if ((((si->end.row - row) + 1) * 
                                ((scolumn - si->end.column) + 1)) == 1)
-                       n = ewl_mvc_selection_index_new(sel->data, row, 
si->end.column);
+                       n = ewl_mvc_selection_index_new(sel->model, sel->data, 
+                                                       row, si->end.column);
 
                else
-                       n = ewl_mvc_selection_range_new(sel->data, row, scolumn,
+                       n = ewl_mvc_selection_range_new(sel->model, sel->data, 
+                                                       row, scolumn,
                                                        si->end.row,
                                                        si->end.column);
 
@@ -1065,10 +1104,12 @@
                srow = row + 1;
                if ((((srow - si->end.row) + 1) * 
                                ((column - column) + 1)) == 1)
-                       n = ewl_mvc_selection_index_new(sel->data, si->end.row, 
column);
+                       n = ewl_mvc_selection_index_new(sel->model, sel->data, 
+                                                       si->end.row, column);
 
                else
-                       n = ewl_mvc_selection_range_new(sel->data, srow, column,
+                       n = ewl_mvc_selection_range_new(sel->model, sel->data, 
+                                                       srow, column,
                                                        si->end.row, column);
 
                ecore_list_append(mvc->selected, n);
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_mvc.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- ewl_mvc.h   18 Jan 2007 10:24:59 -0000      1.12
+++ ewl_mvc.h   22 Jan 2007 09:33:03 -0000      1.13
@@ -35,6 +35,8 @@
 struct Ewl_Selection
 {
        Ewl_Selection_Type type;        /**< The type of selection */
+       Ewl_Model *model;               /**< The model to work with this
+                                                               selection */
        void *highlight;                /**< highlight widgets for the MVC */
        void *data;                     /**< Data containing the selection */
 };
@@ -144,20 +146,25 @@
 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, void *data,
+void            ewl_mvc_selected_range_add(Ewl_MVC *mvc, Ewl_Model * model, 
+                                               void *data,
                                                int srow, int scolumn,
                                                int erow, int ecolumn);
 
-void            ewl_mvc_selected_set(Ewl_MVC *mvc, void *data, int row, int 
column);
-void            ewl_mvc_selected_add(Ewl_MVC *mvc, void *data, int row, int 
column);
+void            ewl_mvc_selected_set(Ewl_MVC *mvc, Ewl_Model *model, 
+                                       void *data, int row, int column);
+void            ewl_mvc_selected_add(Ewl_MVC *mvc, Ewl_Model *model, 
+                                       void *data, int row, int column);
 Ewl_Selection_Idx *ewl_mvc_selected_get(Ewl_MVC *mvc);
 void            ewl_mvc_selected_rm(Ewl_MVC *mvc, void *data, int row, int 
column);
 
 int             ewl_mvc_selected_count_get(Ewl_MVC *mvc);
 unsigned int    ewl_mvc_selected_is(Ewl_MVC *mvc, void *data, int row, int 
column);
 
-Ewl_Selection  *ewl_mvc_selection_index_new(void *data, int row, int column);
-Ewl_Selection  *ewl_mvc_selection_range_new(void *data, int srow, int scolumn,
+Ewl_Selection  *ewl_mvc_selection_index_new(Ewl_Model *model, void *data, 
+                                                       int row, int column);
+Ewl_Selection  *ewl_mvc_selection_range_new(Ewl_Model *model, void *data, 
+                                               int srow, int scolumn,
                                                int erow, int ecolumn);
 
 void            ewl_mvc_highlight(Ewl_MVC *mvc, Ewl_Container *c,
@@ -172,7 +179,8 @@
 
 void            ewl_mvc_cb_destroy(Ewl_Widget *w, void *ev, void *data);
 
-void            ewl_mvc_handle_click(Ewl_MVC *mvc, void *data, int row, int 
column);
+void            ewl_mvc_handle_click(Ewl_MVC *mvc, Ewl_Model *model, 
+                                       void *data, int row, int column);
 
 /**
  * @}
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_tree2.c,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -3 -r1.51 -r1.52
--- ewl_tree2.c 18 Jan 2007 10:24:59 -0000      1.51
+++ ewl_tree2.c 22 Jan 2007 09:33:03 -0000      1.52
@@ -7,6 +7,7 @@
 typedef struct Ewl_Tree2_Branch_Cache Ewl_Tree2_Branch_Cache;
 struct Ewl_Tree2_Branch_Cache
 {
+       Ewl_Model *model;
        int row_count;
        void *data;
 };
@@ -109,19 +110,18 @@
 
 /**
  * @param tree: The Ewl_Tree to append the column too
- * @param model: The model to use for this column
  * @param view: The view to use for this column
  * @return Returns no value.
  * @brief Append a new column to the tree
  */
 void
-ewl_tree2_column_append(Ewl_Tree2 *tree, Ewl_Model *model, Ewl_View *view)
+ewl_tree2_column_append(Ewl_Tree2 *tree, Ewl_View *view, 
+                               unsigned int sortable)
 {
        Ewl_Tree2_Column *c;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("tree", tree);
-       DCHECK_PARAM_PTR("model", model);
        DCHECK_PARAM_PTR("view", view);
        DCHECK_TYPE("tree", tree, EWL_TREE2_TYPE);
 
@@ -132,9 +132,9 @@
                DRETURN(DLEVEL_STABLE);
        }
 
-       ewl_tree2_column_model_set(c, model);
        ewl_tree2_column_view_set(c, view);
        ewl_tree2_column_mvc_set(c, EWL_MVC(tree));
+       ewl_tree2_column_sortable_set(c, sortable);
 
        ecore_list_append(tree->columns, c);
        ewl_mvc_dirty_set(EWL_MVC(tree), TRUE);
@@ -144,19 +144,18 @@
 
 /**
  * @param tree: The Ewl_Tree to prepend the column too
- * @param model: The model to use for this column
  * @param view: The view to use for this column
  * @return Returns no value.
  * @brief Prepend a new column to the tree
  */
 void
-ewl_tree2_column_prepend(Ewl_Tree2 *tree, Ewl_Model *model, Ewl_View *view)
+ewl_tree2_column_prepend(Ewl_Tree2 *tree, Ewl_View *view, 
+                               unsigned int sortable)
 {
        Ewl_Tree2_Column *c;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("tree", tree);
-       DCHECK_PARAM_PTR("model", model);
        DCHECK_PARAM_PTR("view", view);
        DCHECK_TYPE("tree", tree, EWL_TREE2_TYPE);
 
@@ -167,9 +166,9 @@
                DRETURN(DLEVEL_STABLE);
        }
 
-       ewl_tree2_column_model_set(c, model);
        ewl_tree2_column_view_set(c, view);
        ewl_tree2_column_mvc_set(c, EWL_MVC(tree));
+       ewl_tree2_column_sortable_set(c, sortable);
 
        ecore_list_prepend(tree->columns, c);
        ewl_mvc_dirty_set(EWL_MVC(tree), TRUE);
@@ -179,21 +178,19 @@
 
 /**
  * @param tree: The Ewl_Tree to insert the column into
- * @param model: The model to use for this column
  * @param view: The view to use for this column
  * @param idx: The index to insert into 
  * @return Returns no value.
  * @brief Insert a new column into the tree
  */
 void
-ewl_tree2_column_insert(Ewl_Tree2 *tree, Ewl_Model *model, Ewl_View *view, 
-                                                       unsigned int idx)
+ewl_tree2_column_insert(Ewl_Tree2 *tree, Ewl_View *view, unsigned int idx,
+                                               unsigned int sortable)
 {
        Ewl_Tree2_Column *c;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("tree", tree);
-       DCHECK_PARAM_PTR("model", model);
        DCHECK_PARAM_PTR("view", view);
        DCHECK_TYPE("tree", tree, EWL_TREE2_TYPE);
 
@@ -204,9 +201,9 @@
                DRETURN(DLEVEL_STABLE);
        }
 
-       ewl_tree2_column_model_set(c, model);
        ewl_tree2_column_view_set(c, view);
        ewl_tree2_column_mvc_set(c, EWL_MVC(tree));
+       ewl_tree2_column_sortable_set(c, sortable);
 
        ecore_list_goto_index(tree->columns, idx);
        ecore_list_insert(tree->columns, c);
@@ -361,6 +358,8 @@
  * @param tree: The tree to work with
  * @return Returns the widget that contains the tree rows
  * @brief Retrieves the widget containing the tree rows
+ *
+ * XXX This is a badly named function. Too close to the MVC view name
  */
 Ewl_Widget *
 ewl_tree2_view_widget_get(Ewl_Tree2 *tree)
@@ -569,6 +568,8 @@
                                                                void *data)
 {
        Ewl_Tree2_Column *c, *col;
+       Ewl_MVC *mvc;
+       Ewl_Model *model;
        int index = 0;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
@@ -576,22 +577,25 @@
 
        c = data;
 
+       mvc = ewl_tree2_column_mvc_get(c);
+       model = ewl_mvc_model_get(mvc);
+
        /* sanity check */
-       if (!c->model || !c->model->sort)
+       if (!model || !model->sort)
        {
                DWARNING("In ewl_tree2_cb_column_sort without a sort cb.");
                DRETURN(DLEVEL_STABLE);
        }
 
        /* loop over the columns and reset the sort settings */
-       ecore_list_goto_first(EWL_TREE2(c->parent)->columns);
-       while ((col = ecore_list_next(EWL_TREE2(c->parent)->columns)))
+       ecore_list_goto_first(EWL_TREE2(mvc)->columns);
+       while ((col = ecore_list_next(EWL_TREE2(mvc)->columns)))
        {
                /* skip the current column */
                if (col == c)
                {
                        /* we're the index before the one we're now on */
-                       index = ecore_list_index(EWL_TREE2(c->parent)->columns) 
- 1;
+                       index = ecore_list_index(EWL_TREE2(mvc)->columns) - 1;
                        continue;
                }
 
@@ -603,8 +607,8 @@
        c->sort = ((c->sort + 1) % EWL_SORT_DIRECTION_MAX);
        if (!c->sort) c->sort ++;
 
-       c->model->sort(ewl_mvc_data_get(c->parent), index, c->sort);
-       ewl_mvc_dirty_set(c->parent, TRUE);
+       model->sort(ewl_mvc_data_get(mvc), index, c->sort);
+       ewl_mvc_dirty_set(mvc, TRUE);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -637,6 +641,7 @@
 ewl_tree2_header_build(Ewl_Tree2 *tree, Ewl_Tree2_Column *col, void *mvc_data, 
int column)
 {
        Ewl_Widget *h, *c;
+       Ewl_Model *model;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("tree", tree);
@@ -651,12 +656,14 @@
                DRETURN(DLEVEL_STABLE);
        }
 
+       model = ewl_mvc_model_get(EWL_MVC(tree));
+
        h = ewl_hbox_new();
        ewl_container_child_append(EWL_CONTAINER(tree->header), h);
        ewl_widget_appearance_set(h, "header");
        ewl_widget_show(h);
 
-       if (col->model->sort)
+       if (col->sortable)
                ewl_callback_append(h, EWL_CALLBACK_CLICKED, 
                                        ewl_tree2_cb_column_sort, col);
 
@@ -666,7 +673,7 @@
        ewl_container_child_append(EWL_CONTAINER(h), c);
 
        /* display the sort arrow if needed */
-       if (col->model->sort)
+       if (col->sortable)
        {
                char *state_str;
 
@@ -691,8 +698,8 @@
 }
 
 static void
-ewl_tree2_column_build(Ewl_Row *row, Ewl_Tree2_Column *col, void *mvc_data, 
-                                               int r, int c, Ewl_Widget *node)
+ewl_tree2_column_build(Ewl_Row *row, Ewl_Model *model, Ewl_View *view, 
+                               void *mvc_data, int r, int c, Ewl_Widget *node)
 {
        Ewl_Widget *cell;
        Ewl_Widget *child;
@@ -700,7 +707,8 @@
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("row", row);
-       DCHECK_PARAM_PTR("col", col);
+       DCHECK_PARAM_PTR("model", model);
+       DCHECK_PARAM_PTR("view", view);
        DCHECK_TYPE("row", row, EWL_ROW_TYPE);
 
        cell = ewl_cell_new();
@@ -711,7 +719,7 @@
                                ewl_tree2_cb_cell_clicked, node);
        ewl_widget_show(cell);
 
-       val = col->model->fetch(mvc_data, r, c);
+       val = model->fetch(mvc_data, r, c);
        if (!val)
        {
                child = ewl_label_new();
@@ -719,8 +727,8 @@
        }
        else
        {
-               child = col->view->construct();
-               col->view->assign(child, val);
+               child = view->construct();
+               view->assign(child, val);
        }
        ewl_container_child_append(EWL_CONTAINER(cell), child);
        ewl_widget_show(child);
@@ -732,8 +740,9 @@
 ewl_tree2_build_tree(Ewl_Tree2 *tree)
 {
        Ewl_Tree2_Column *col;
-       int column = 0, rows = 0;
+       int column = 0;
        void *mvc_data;
+       Ewl_Model *model;
        Ewl_Tree2_Branch_Cache *head;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
@@ -741,25 +750,21 @@
        DCHECK_TYPE("tree", tree, EWL_TREE2_TYPE);
 
        mvc_data = ewl_mvc_data_get(EWL_MVC(tree));
+       model = ewl_mvc_model_get(EWL_MVC(tree));
 
        /* setup the headers */
        ewl_container_reset(EWL_CONTAINER(tree->header));
        ecore_list_goto_first(tree->columns);
        while ((col = ecore_list_next(tree->columns)))
        {
-               int r;
-
                ewl_tree2_header_build(tree, col, mvc_data, column);
-
-               r = col->model->count(mvc_data);
-               if (r > rows) rows = r;
-
                column ++;
        }
 
        head = NEW(Ewl_Tree2_Branch_Cache, 1);
-       head->row_count = rows;
+       head->row_count = model->count(mvc_data);
        head->data = mvc_data;
+       head->model = model;
 
        ewl_container_reset(EWL_CONTAINER(tree->rows));
        ewl_tree2_build_tree_rows(tree, head, 0, tree->rows, FALSE);
@@ -786,10 +791,11 @@
                node = ewl_tree2_node_new();
                EWL_TREE2_NODE(node)->tree = EWL_WIDGET(tree);
                EWL_TREE2_NODE(node)->row_num = i;
+               EWL_TREE2_NODE(node)->model = curbranch->model;
+               EWL_TREE2_NODE(node)->data = curbranch->data;
 
                ewl_container_child_append(EWL_CONTAINER(parent), node);
-               if (!hidden)
-                       ewl_widget_show(node);
+               if (!hidden) ewl_widget_show(node);
 
                row = ewl_row_new();
                ewl_row_header_set(EWL_ROW(row), EWL_ROW(tree->header));
@@ -811,49 +817,51 @@
                ecore_list_goto_first(tree->columns);
                while((col = ecore_list_next(tree->columns)))
                {
-                       ewl_tree2_column_build(EWL_ROW(row), col, 
+                       ewl_tree2_column_build(EWL_ROW(row),
+                                       curbranch->model, col->view,
                                        curbranch->data, i, column, node);
                        column ++;
                }
 
                /* check if this is an expansion point */
                col = ecore_list_goto_first(tree->columns);
-               if (col && col->model->expandable &&
-                               col->model->expandable(curbranch->data, i))
+               if (col && curbranch->model->expansion.is &&
+                               curbranch->model->expansion.is(curbranch->data, 
i))
                {
                        Ewl_Tree2_Branch_Cache *tmp;
                        int hidden = TRUE;
 
-                       if (!col->model->expansion_data)
+                       if (!curbranch->model->expansion.data)
                        {
-                               DWARNING("In ewl_tree2_build_tree_rows, model 
expandable but without expansion_data_fetch cb.");
+                               DWARNING("In ewl_tree2_build_tree_rows, "
+                                       "model expandable but without "
+                                       "expansion_data_fetch cb.");
                                DRETURN(DLEVEL_STABLE);
                        }
 
                        tmp = NEW(Ewl_Tree2_Branch_Cache, 1);
-                       tmp->data = col->model->expansion_data(curbranch->data, 
i);
+                       tmp->data = curbranch->model->expansion.data(
+                                               curbranch->data, i);
                        tmp->row_count = 0;
+                       if (curbranch->model->expansion.model)
+                               tmp->model =
+                                       curbranch->model->expansion.model(
+                                                       curbranch->data, i);
 
-                       ewl_tree2_node_expandable_set(EWL_TREE2_NODE(node), 
curbranch->data);
+                       if (!tmp->model)
+                               tmp->model = curbranch->model;
 
-                       if (col->model->expansion_data &&
+                       ewl_tree2_node_expandable_set(EWL_TREE2_NODE(node), 
+                                                               
curbranch->data);
+
+                       if (curbranch->model->expansion.data &&
                                ewl_tree2_row_expanded_is(tree, 
curbranch->data, i))
                        {
                                ewl_tree2_node_expand(EWL_TREE2_NODE(node));
                                hidden = FALSE;
                        }
 
-                       /* XXX probably need a better way to do this? */
-                       ecore_list_goto_first(tree->columns);
-                       while ((col = ecore_list_next(tree->columns)))
-                       {
-                               int r;
-                               r = col->model->count(tmp->data);
-                               if (r > tmp->row_count) tmp->row_count = r;
-
-                               column ++;
-                       }
-
+                       tmp->row_count = tmp->model->count(tmp->data);
                        ewl_tree2_build_tree_rows(tree, tmp, colour, node, 
hidden);
                        FREE(tmp);
                }
@@ -901,7 +909,7 @@
 ewl_tree2_cb_row_clicked(Ewl_Widget *w, void *ev __UNUSED__, void *data)
 {
        Ewl_Tree2 *tree;
-       int row;
+       Ewl_Tree2_Node *node;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("w", w);
@@ -911,10 +919,10 @@
        if (tree->type != EWL_TREE_SELECTION_TYPE_ROW)
                DRETURN(DLEVEL_STABLE);
 
-       row = ewl_container_child_index_get(EWL_CONTAINER(tree->rows), 
-                                                       EWL_WIDGET(data));
-       ewl_mvc_handle_click(EWL_MVC(tree), ewl_mvc_data_get(EWL_MVC(tree)),
-                               row, -1);
+       node = data;
+       ewl_mvc_handle_click(EWL_MVC(tree), node->model,
+                               node->data,
+                               node->row_num, -1);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -924,7 +932,8 @@
 {
        Ewl_Row *row;
        Ewl_Tree2 *tree;
-       int r, column;
+       Ewl_Tree2_Node *node;
+       int column;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("w", w);
@@ -935,12 +944,12 @@
        if (tree->type != EWL_TREE_SELECTION_TYPE_CELL)
                DRETURN(DLEVEL_STABLE);
 
-       r = ewl_container_child_index_get(EWL_CONTAINER(tree->rows), 
-                                               EWL_WIDGET(data));
+       node = data;
        column = ewl_container_child_index_get(EWL_CONTAINER(row), w);
 
-       ewl_mvc_handle_click(EWL_MVC(tree), ewl_mvc_data_get(EWL_MVC(tree)),
-                       r, column);
+       ewl_mvc_handle_click(EWL_MVC(tree), node->model,
+                       node->data, node->row_num, 
+                       column);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -1011,7 +1020,6 @@
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("c", c);
 
-       c->model = NULL;
        c->view = NULL;
        c->parent = NULL;
        c->sort = EWL_SORT_DIRECTION_NONE;
@@ -1023,38 +1031,6 @@
 
 /**
  * @param c: The column to work with
- * @param m: The model to set
- * @return Returns no value
- * @brief Sets the given model @a m into the column @a c
- */
-void
-ewl_tree2_column_model_set(Ewl_Tree2_Column *c, Ewl_Model *m)
-{
-       DENTER_FUNCTION(DLEVEL_STABLE);
-       DCHECK_PARAM_PTR("c", c);
-       DCHECK_PARAM_PTR("m", m);
-
-       c->model = m;
-
-       DLEAVE_FUNCTION(DLEVEL_STABLE);
-}
-
-/**
- * @param c: The column to work with
- * @return Returns the model for the column
- * @brief Retrieves the model for the given column
- */
-Ewl_Model * 
-ewl_tree2_column_model_get(Ewl_Tree2_Column *c)
-{
-       DENTER_FUNCTION(DLEVEL_STABLE);
-       DCHECK_PARAM_PTR_RET("c", c, NULL);
-
-       DRETURN_PTR(c->model, DLEVEL_STABLE);
-}
-
-/**
- * @param c: The column to work with
  * @param v: The view to set
  * @return Returns no value
  * @brief Sets the given view @a v into the column @a c
@@ -1120,6 +1096,37 @@
 }
 
 /**
+ * @param c: The column to work with
+ * @param sortable: The sortable flag to set
+ * @return Returns no value
+ * @brief Sets the sortable flag of column @a c to @a sortable
+ */
+void
+ewl_tree2_column_sortable_set(Ewl_Tree2_Column *c, unsigned int sortable)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("c", c);
+
+       c->sortable = !!sortable;
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param c: The column to work with
+ * @return Returns TRUE if the column is sortable, FALSE otherwise
+ * @brief Retrieves the sort flag for the column @a c
+ */
+unsigned int
+ewl_tree2_column_sortable_get(Ewl_Tree2_Column *c)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR_RET("c", c, FALSE);
+
+       DRETURN_INT(c->sortable, DLEVEL_STABLE);
+}
+
+/**
  * @param c: The Ewl_Tree2_Column to work with
  * @return Returns the parent tree for this column or NULL if none set
  * @brief Retrieves the parent tree for this column or NULL if none set
@@ -1226,11 +1233,7 @@
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("node", node);
 
-       if (node->data == data)
-               DRETURN(DLEVEL_STABLE);
-
-       node->data = data;
-       if (data)
+       if (data && !node->handle)
        {
                node->handle = ewl_check_new();
                ewl_object_fill_policy_set(EWL_OBJECT(node->handle),
@@ -1242,7 +1245,7 @@
                                                ewl_tree2_cb_node_toggle, node);
                ewl_widget_show(node->handle);
        }
-       else if (node->handle)
+       else if (node->handle && !data)
        {
                ewl_widget_destroy(node->handle);
                node->handle = NULL;
@@ -1347,11 +1350,13 @@
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR_RET("node", node, FALSE);
 
-       DRETURN_INT(((node->expanded == EWL_TREE_NODE_EXPANDED) ? TRUE : 
FALSE), DLEVEL_STABLE);
+       DRETURN_INT(((node->expanded == EWL_TREE_NODE_EXPANDED) ? TRUE : 
FALSE), 
+                                                               DLEVEL_STABLE);
 }
 
 void
-ewl_tree2_cb_node_configure(Ewl_Widget *w, void *ev_data __UNUSED__, void 
*user_data __UNUSED__)
+ewl_tree2_cb_node_configure(Ewl_Widget *w, void *ev_data __UNUSED__, 
+                                               void *user_data __UNUSED__)
 {
        Ewl_Tree2_Node *node;
        Ewl_Container *c;
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_tree2.h,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -3 -r1.38 -r1.39
--- ewl_tree2.h 8 Jan 2007 13:02:35 -0000       1.38
+++ ewl_tree2.h 22 Jan 2007 09:33:03 -0000      1.39
@@ -102,42 +102,19 @@
        unsigned char headers_visible:1; /**< Are the headers visible? */
 };
 
-/**
- * @def EWL_TREE2_COLUMN
- * Typecasts a pointer to an Ewl_Tree2_Column pointer.
- */
-#define EWL_TREE2_COLUMN(c) ((Ewl_Tree2_Column *)c)
-
-/**
- * The Ewl_Tree2_Column type
- */
-typedef struct Ewl_Tree2_Column Ewl_Tree2_Column;
-
-/**
- * Holdes the model and view to use for this column in the tree
- */
-struct Ewl_Tree2_Column
-{
-       Ewl_Model *model;       /**< The model for the column */
-       Ewl_View  *view;        /**< The view for the column */
-       
-       Ewl_MVC *parent;        /**< The mvc this column is for */
-       Ewl_Sort_Direction sort; /**< direction the column is sorted in */
-};
-
 /*
  * Tree view/controller manipulation
  */
 Ewl_Widget     *ewl_tree2_new(void);
 int             ewl_tree2_init(Ewl_Tree2 *tree);
 
-void            ewl_tree2_column_append(Ewl_Tree2 *t, Ewl_Model *m, 
-                                                       Ewl_View *v);
-void            ewl_tree2_column_prepend(Ewl_Tree2 *t, Ewl_Model *m, 
-                                                       Ewl_View *v);
-void            ewl_tree2_column_insert(Ewl_Tree2 *t, Ewl_Model *m, 
-                                                       Ewl_View *v, 
-                                                       unsigned int idx);
+void            ewl_tree2_column_append(Ewl_Tree2 *t, Ewl_View *v, 
+                                               unsigned int sortable);
+void            ewl_tree2_column_prepend(Ewl_Tree2 *t, Ewl_View *v,
+                                               unsigned int sortable);
+void            ewl_tree2_column_insert(Ewl_Tree2 *t, Ewl_View *v, 
+                                                       unsigned int idx,
+                                                       unsigned int sortable);
 void            ewl_tree2_column_remove(Ewl_Tree2 *t, unsigned int idx);
 
 void            ewl_tree2_headers_visible_set(Ewl_Tree2 *tree,
@@ -171,18 +148,44 @@
 /*
  * Ewl_Tree2_Column stuff
  */
+
+/**
+ * @def EWL_TREE2_COLUMN
+ * Typecasts a pointer to an Ewl_Tree2_Column pointer.
+ */
+#define EWL_TREE2_COLUMN(c) ((Ewl_Tree2_Column *)c)
+
+/**
+ * The Ewl_Tree2_Column type
+ */
+typedef struct Ewl_Tree2_Column Ewl_Tree2_Column;
+
+/**
+ * Holdes the model and view to use for this column in the tree
+ */
+struct Ewl_Tree2_Column
+{
+       Ewl_View *view;          /**< The view for the column */
+       
+       Ewl_MVC *parent;         /**< The mvc this column is for */
+       Ewl_Sort_Direction sort; /**< direction the column is sorted in */
+
+       unsigned char sortable:1; /**< Is this column sortable */
+};
+
 Ewl_Tree2_Column       *ewl_tree2_column_new(void);
 void                    ewl_tree2_column_destroy(Ewl_Tree2_Column *c);
 
-void                    ewl_tree2_column_model_set(Ewl_Tree2_Column *c, 
Ewl_Model *m);
-Ewl_Model              *ewl_tree2_column_model_get(Ewl_Tree2_Column *c);
-
 void                    ewl_tree2_column_view_set(Ewl_Tree2_Column *c, 
Ewl_View *v);
 Ewl_View               *ewl_tree2_column_view_get(Ewl_Tree2_Column *c);
 
 void                    ewl_tree2_column_mvc_set(Ewl_Tree2_Column *c, Ewl_MVC 
*mvc);
 Ewl_MVC                *ewl_tree2_column_mvc_get(Ewl_Tree2_Column *c);
 
+void                    ewl_tree2_column_sortable_set(Ewl_Tree2_Column *c, 
+                                                       unsigned int sortable);
+unsigned int            ewl_tree2_column_sortable_get(Ewl_Tree2_Column *c);
+
 void                    ewl_tree2_column_sort_direction_set(Ewl_Tree2_Column 
*c, 
                                                                
Ewl_Sort_Direction sort);
 Ewl_Sort_Direction      ewl_tree2_column_sort_direction_get(Ewl_Tree2_Column 
*c);
@@ -201,6 +204,7 @@
        Ewl_Widget *row;                /**< The row this node is for */
        Ewl_Widget *handle;             /**< the expansion handle */
 
+       Ewl_Model *model;               /**< The model used to make this row */
        void *data;                     /**< The data that this nodes row comes 
from */
        unsigned int row_num;           /**< The row number of this row */
        Ewl_Tree_Node_Flags expanded;
@@ -227,8 +231,6 @@
                                                      Ewl_Orientation o);
 void ewl_tree2_cb_node_child_add(Ewl_Container *c, Ewl_Widget *w);
 void ewl_tree2_cb_node_child_del(Ewl_Container *c, Ewl_Widget *w, int idx);
-
-
 
 /**
  * @}



-------------------------------------------------------------------------
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