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