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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs