Enlightenment CVS committal Author : dj2 Project : e17 Module : libs/ewl
Dir : e17/libs/ewl/src/lib Modified Files: ewl_attach.h ewl_combo.c ewl_combo.h ewl_config.c ewl_dnd.c ewl_embed.c ewl_embed.h ewl_enums.h ewl_filelist.c ewl_list.c ewl_mvc.c ewl_mvc.h ewl_tree2.c ewl_tree2.h Log Message: - add mvc range selection rm - add multiselect capabilities to ewl_list - add single and multiselect capabilities to ewl_tree2, both row and cell based - doxy fixes =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_attach.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- ewl_attach.h 13 Oct 2006 01:53:05 -0000 1.14 +++ ewl_attach.h 18 Oct 2006 16:28:08 -0000 1.15 @@ -89,7 +89,7 @@ ewl_attach_get(EWL_WIDGET(w), EWL_ATTACH_TYPE_NAME) /** - * @def ewl_attach_association_set(w, data) + * @def ewl_attach_widget_association_set(w, data) * Convenience method to attach data to a notebook item */ #define ewl_attach_widget_association_set(w, data) \ @@ -97,7 +97,7 @@ EWL_ATTACH_TYPE_WIDGET_ASSOCIATION, data) /** - * @def ewl_attach_association_get(w) + * @def ewl_attach_widget_association_get(w) * Convenience method to get the data attached to a notebook item */ #define ewl_attach_widget_association_get(w) \ =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_combo.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -3 -r1.34 -r1.35 --- ewl_combo.c 15 Oct 2006 22:34:14 -0000 1.34 +++ ewl_combo.c 18 Oct 2006 16:28:08 -0000 1.35 @@ -3,6 +3,8 @@ #include "ewl_macros.h" #include "ewl_private.h" +static void ewl_combo_cb_selected_change(Ewl_MVC *mvc); + /** * @return Returns a pointer to a new combo on success, NULL on failure. * @brief Create a new combo box @@ -275,13 +277,13 @@ combo = data; i = ewl_container_child_index_get(EWL_CONTAINER(combo->popup), w); - ewl_mvc_selected_set(EWL_MVC(combo), i, 0); + ewl_mvc_selected_set(EWL_MVC(combo), i, -1); ewl_combo_cb_increment_clicked(NULL, NULL, data); DLEAVE_FUNCTION(DLEVEL_STABLE); } -void +static void ewl_combo_cb_selected_change(Ewl_MVC *mvc) { Ewl_View *view; @@ -314,7 +316,7 @@ view->assign(combo->header, model->fetch(mvc_data, idx->row, 0)); } - else + else if (view->header_fetch) combo->header = view->header_fetch(mvc_data, -1); if (combo->header) =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_combo.h,v retrieving revision 1.16 retrieving revision 1.17 diff -u -3 -r1.16 -r1.17 --- ewl_combo.h 3 Oct 2006 05:17:13 -0000 1.16 +++ ewl_combo.h 18 Oct 2006 16:28:08 -0000 1.17 @@ -60,8 +60,6 @@ void ewl_combo_cb_increment_clicked(Ewl_Widget *w, void *ev, void *data); void ewl_combo_cb_item_clicked(Ewl_Widget *w, void *ev, void *data); -void ewl_combo_cb_selected_change(Ewl_MVC *mvc); - /** * @} */ =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_config.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -3 -r1.19 -r1.20 --- ewl_config.c 10 Oct 2006 21:26:24 -0000 1.19 +++ ewl_config.c 18 Oct 2006 16:28:08 -0000 1.20 @@ -148,6 +148,7 @@ * @param cfg: The Ewl_Config to work with * @param k: the key to set in the configuration database * @param v: the string value that will be associated with the key + * @param state: The state of the key being set, persistent or transient * @return Returns no value. * @brief set the value of key to the specified string * @@ -186,6 +187,7 @@ * @param cfg: The Ewl_Config to work with * @param k: the key to set in the configuration database * @param v: the integer value that will be associated with the key + * @param state: The state of the key being set, persistent or transient * @return Returns TRUE on success, FALSE on failure. * @brief Set the value of key to the specified integer * @@ -233,6 +235,7 @@ * @param cfg: The Ewl_Config to work with * @param k: the key to set in the configuration database * @param v: the float value that will be associated with the key + * @param state: The state of the key being set, persistent or transient * @return Returns no value * @brief Set the value of key to the specified float * @@ -283,6 +286,7 @@ * @param g: the green value that will be associated with the key * @param b: the blue value that will be associated with the key * @param a: the alpha value that will be associated with the key + * @param state: The state of the key being set, persistent or transient * @return Returns no value * @brief Set the value of key to the specified color * =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_dnd.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -3 -r1.28 -r1.29 --- ewl_dnd.c 13 Oct 2006 02:08:00 -0000 1.28 +++ ewl_dnd.c 18 Oct 2006 16:28:08 -0000 1.29 @@ -154,7 +154,8 @@ /** * @param w: The widget to test for an provided type - * @param w: The mimetype to test for provideance on a specific widget + * @param type: The mimetype to test for provideance on a specific widget + * @return Returns TRUE if the types contains the given type, FALSE otherwise * @brief: Verifies the specified widget provides the given mimetype */ int @@ -240,7 +241,8 @@ /** * @param w: The widget to test for an accepted type - * @param w: The mimetype to test for acceptance on a specific widget + * @param type: The mimetype to test for acceptance on a specific widget + * @return Returns TRUE if the widget accepts the given type, FALSE otherwise * @brief: Verifies the specified widget accepts the given mimetype */ int =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_embed.c,v retrieving revision 1.89 retrieving revision 1.90 diff -u -3 -r1.89 -r1.90 --- ewl_embed.c 13 Oct 2006 22:02:53 -0000 1.89 +++ ewl_embed.c 18 Oct 2006 16:28:08 -0000 1.90 @@ -999,8 +999,10 @@ /** * @param embed: the embed where the selection data event is to occur + * @param type: The type to feed * @param data: a pointer to the data received that generated the event * @param len: length of the data that generated the event + * @param format: The bit format of the data * @return Returns no value. * @brief Sends the event for selection data received into an embed. */ =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_embed.h,v retrieving revision 1.30 retrieving revision 1.31 diff -u -3 -r1.30 -r1.31 --- ewl_embed.h 13 Oct 2006 22:02:53 -0000 1.30 +++ ewl_embed.h 18 Oct 2006 16:28:08 -0000 1.31 @@ -110,7 +110,6 @@ const char *ewl_embed_dnd_position_feed(Ewl_Embed *embed, int x, int y,int*,int*,int*,int*); const char *ewl_embed_dnd_drop_feed(Ewl_Embed* embed, int x, int y, int internal); void ewl_embed_dnd_data_feed(Ewl_Embed* embed, char *type, void *data, unsigned int len, unsigned int format); -void ewl_embed_selection_data_feed(Ewl_Embed *embed, char *type, void *data, unsigned int len, unsigned int format); void ewl_embed_mouse_out_feed(Ewl_Embed *embed, int x, int y, unsigned int modifiers); =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_enums.h,v retrieving revision 1.61 retrieving revision 1.62 diff -u -3 -r1.61 -r1.62 --- ewl_enums.h 15 Oct 2006 22:34:14 -0000 1.61 +++ ewl_enums.h 18 Oct 2006 16:28:08 -0000 1.62 @@ -724,30 +724,55 @@ */ typedef enum Ewl_Rotate Ewl_Rotate; +/** + * @enum Ewl_Selection_Type + * The selection type enum + */ enum Ewl_Selection_Type { - EWL_SELECTION_TYPE_INDEX, - EWL_SELECTION_TYPE_RANGE + EWL_SELECTION_TYPE_INDEX, /**< Single index */ + EWL_SELECTION_TYPE_RANGE /**< Range of indices */ }; + +/** + * Ewl_Selection_Type + */ typedef enum Ewl_Selection_Type Ewl_Selection_Type; +/** + * @enum Ewl_Selection_Mode + * The slecetion mode enum + */ enum Ewl_Selection_Mode { - EWL_SELECTION_MODE_NONE, - EWL_SELECTION_MODE_SINGLE, - EWL_SELECTION_MODE_MULTI + EWL_SELECTION_MODE_NONE, /**< No selection allowed */ + EWL_SELECTION_MODE_SINGLE, /**< Single select only */ + EWL_SELECTION_MODE_MULTI /**< Multi select mode */ }; + +/** + * Ewl_Selection_Mode + */ typedef enum Ewl_Selection_Mode Ewl_Selection_Mode; +/** + * @enum Ewl_Tree_Selection_Type + * The tree selection type + */ enum Ewl_Tree_Selection_Type { - EWL_TREE_SELECT_ROW, - EWL_TREE_SELECT_CELL + EWL_TREE_SELECTION_TYPE_ROW, /**< Row selection */ + EWL_TREE_SELECTION_TYPE_CELL /**< Cell selection */ }; + +/** + * Ewl_Tree_Selection_Type + */ typedef enum Ewl_Tree_Selection_Type Ewl_Tree_Selection_Type; /** * @} */ -#endif /* __EWL_ENUMS_H__ */ + +#endif =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filelist.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -3 -r1.19 -r1.20 --- ewl_filelist.c 14 Sep 2006 05:35:38 -0000 1.19 +++ ewl_filelist.c 18 Oct 2006 16:28:08 -0000 1.20 @@ -605,6 +605,12 @@ DRETURN_INT(fl->scroll_flags.h, DLEVEL_STABLE); } +/** + * @param fl: The filelist to work with + * @param path: The path to get the icon for + * @return Returns the stock icon for the given file + * @brief Retrieves the stock icon for the given file + */ const char * ewl_filelist_stock_icon_get(Ewl_Filelist *fl, const char *path) { =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_list.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- ewl_list.c 15 Oct 2006 22:34:14 -0000 1.9 +++ ewl_list.c 18 Oct 2006 16:28:08 -0000 1.10 @@ -123,6 +123,10 @@ DCHECK_TYPE("c", c, EWL_CONTAINER_TYPE); DCHECK_TYPE("w", w, EWL_WIDGET_TYPE); + if (ewl_mvc_selection_mode_get(EWL_MVC(c)) == + EWL_SELECTION_MODE_NONE) + DRETURN(DLEVEL_STABLE); + ewl_callback_append(w, EWL_CALLBACK_CLICKED, ewl_list_cb_item_clicked, c); @@ -140,7 +144,7 @@ void ewl_list_cb_item_clicked(Ewl_Widget *w, void *ev __UNUSED__, void *data) { - Ewl_List *list; + int row; DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR("w", w); @@ -148,10 +152,8 @@ DCHECK_TYPE("w", w, EWL_WIDGET_TYPE); 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), 0); + row = ewl_container_child_index_get(EWL_CONTAINER(data), w); + ewl_mvc_handle_click(EWL_MVC(data), row, -1); DLEAVE_FUNCTION(DLEVEL_STABLE); } @@ -173,5 +175,4 @@ DLEAVE_FUNCTION(DLEVEL_STABLE); } - =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_mvc.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- ewl_mvc.c 17 Oct 2006 15:35:37 -0000 1.6 +++ ewl_mvc.c 18 Oct 2006 16:28:08 -0000 1.7 @@ -3,7 +3,23 @@ #include "ewl_macros.h" #include "ewl_debug.h" +/* XXX There is a bit of behaviour that maybe considered a bug in here. If + * the user has a list of say 4 items. The user clicks on item 2 then + * control clicks on item one, then shift clicks on item 4. Item 2 will now + * be in the selected list twice. A rm _should_ remove both instances, but + * this could be confusing for the user. + * + * The only solution is to do a selected_is for each index that is added to + * the selected list, and for each range, check if that range intersects + * anything else in the selected list. This could be slow and painful. + * + * Leaving it with the same item possibly in the list multiple times for + * now. + */ + static void ewl_mvc_selected_change_notify(Ewl_MVC *mvc); +static void ewl_mvc_selected_rm_item(Ewl_MVC *mvc, Ewl_Selection *sel, + int row, int column); /** * @param mvc: The MVC to initialize @@ -144,9 +160,8 @@ 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); + /* new data, clear out the old selection list */ + ewl_mvc_selected_clear(mvc); DLEAVE_FUNCTION(DLEVEL_STABLE); } @@ -255,7 +270,10 @@ DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR("mvc", mvc); DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE); - + + if (mvc->selection_mode == EWL_SELECTION_MODE_NONE) + DRETURN(DLEVEL_STABLE); + ecore_list_clear(mvc->selected); ewl_mvc_selected_change_notify(mvc); @@ -278,7 +296,6 @@ DCHECK_PARAM_PTR("mvc", mvc); DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE); - /* make sure we're selecting and received items to select */ if (mvc->selection_mode == EWL_SELECTION_MODE_NONE) DRETURN(DLEVEL_STABLE); @@ -314,6 +331,9 @@ DCHECK_PARAM_PTR_RET("mvc", mvc, NULL); DCHECK_TYPE_RET("mvc", mvc, EWL_MVC_TYPE, NULL); + if (mvc->selection_mode == EWL_SELECTION_MODE_NONE) + DRETURN_PTR(NULL, DLEVEL_STABLE); + DRETURN_PTR(mvc->selected, DLEVEL_STABLE); } @@ -337,6 +357,9 @@ DCHECK_PARAM_PTR("mvc", mvc); DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE); + if (mvc->selection_mode == EWL_SELECTION_MODE_NONE) + DRETURN(DLEVEL_STABLE); + /* make sure the start comes before the end */ if (erow < srow) { @@ -353,29 +376,10 @@ } if (mvc->selection_mode == EWL_SELECTION_MODE_SINGLE) - { - 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_mvc_selection_index_new(srow, scolumn); - sel = EWL_SELECTION(si); - } else - { - Ewl_Selection_Range *si; - - 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; - - sel = EWL_SELECTION(si); - } + sel = ewl_mvc_selection_range_new(srow, scolumn, erow, ecolumn); ecore_list_append(mvc->selected, sel); ewl_mvc_selected_change_notify(mvc); @@ -397,6 +401,9 @@ DCHECK_PARAM_PTR("mvc", mvc); DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE); + if (mvc->selection_mode == EWL_SELECTION_MODE_NONE) + DRETURN(DLEVEL_STABLE); + ecore_list_clear(mvc->selected); ewl_mvc_selected_add(mvc, row, column); @@ -413,17 +420,16 @@ void ewl_mvc_selected_add(Ewl_MVC *mvc, int row, int column) { - Ewl_Selection_Idx *si; + Ewl_Selection *si; DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR("mvc", mvc); DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE); - si = NEW(Ewl_Selection_Idx, 1); - si->sel.type = EWL_SELECTION_TYPE_INDEX; - si->row = row; - si->column = column; + if (mvc->selection_mode == EWL_SELECTION_MODE_NONE) + DRETURN(DLEVEL_STABLE); + si = ewl_mvc_selection_index_new(row, column); ecore_list_append(mvc->selected, si); ewl_mvc_selected_change_notify(mvc); @@ -445,13 +451,15 @@ DCHECK_PARAM_PTR_RET("mvc", mvc, NULL); DCHECK_TYPE_RET("mvc", mvc, EWL_MVC_TYPE, NULL); + if (mvc->selection_mode == EWL_SELECTION_MODE_NONE) + DRETURN_PTR(NULL, DLEVEL_STABLE); + ecore_list_goto_last(mvc->selected); sel = ecore_list_current(mvc->selected); if (!sel) DRETURN_PTR(NULL, DLEVEL_STABLE); ret = NEW(Ewl_Selection_Idx, 1); ret->sel.type = EWL_SELECTION_TYPE_INDEX; - if (sel->type == EWL_SELECTION_TYPE_INDEX) { Ewl_Selection_Idx *si; @@ -488,9 +496,13 @@ DCHECK_PARAM_PTR("mvc", mvc); DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE); - /* 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? */ + if (mvc->selection_mode == EWL_SELECTION_MODE_NONE) + DRETURN(DLEVEL_STABLE); + + /* We walk the entire list. The reason for this is that you can have + * the same cell in the list multiple times. This can happen if + * they've single selected something, then did a multiselection over + * top of it again. */ ecore_list_goto_first(mvc->selected); while ((sel = ecore_list_current(mvc->selected))) { @@ -501,52 +513,28 @@ si = EWL_SELECTION_IDX(sel); if ((si->row == row) && (si->column == column)) { - ecore_list_remove(mvc->selected); - break; + ewl_mvc_selected_rm_item(mvc, sel, row, column); + continue; } } 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; + ewl_mvc_selected_rm_item(mvc, sel, row, column); + continue; } } ecore_list_next(mvc->selected); } + ewl_mvc_selected_change_notify(mvc); DLEAVE_FUNCTION(DLEVEL_STABLE); } @@ -566,6 +554,9 @@ DCHECK_PARAM_PTR_RET("mvc", mvc, 0); DCHECK_TYPE_RET("mvc", mvc, EWL_MVC_TYPE, 0); + if (mvc->selection_mode == EWL_SELECTION_MODE_NONE) + DRETURN_INT(0, DLEVEL_STABLE); + /* make sure we only return 1 or 0 for the single select case */ if (mvc->selection_mode == EWL_SELECTION_MODE_SINGLE) { @@ -612,6 +603,9 @@ DCHECK_PARAM_PTR_RET("mvc", mvc, FALSE); DCHECK_TYPE_RET("mvc", mvc, EWL_MVC_TYPE, FALSE); + if (mvc->selection_mode == EWL_SELECTION_MODE_NONE) + DRETURN_INT(FALSE, DLEVEL_STABLE); + ecore_list_goto_first(mvc->selected); while ((sel = ecore_list_next(mvc->selected))) { @@ -628,27 +622,9 @@ } 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) @@ -663,6 +639,112 @@ DRETURN_INT(ret, DLEVEL_STABLE); } +Ewl_Selection * +ewl_mvc_selection_index_new(int row, int column) +{ + Ewl_Selection_Idx *sel; + + DENTER_FUNCTION(DLEVEL_STABLE); + + sel = NEW(Ewl_Selection_Idx, 1); + sel->sel.type = EWL_SELECTION_TYPE_INDEX; + sel->row = row; + sel->column = column; + + DRETURN_PTR(sel, DLEVEL_STABLE); +} + +Ewl_Selection * +ewl_mvc_selection_range_new(int srow, int scolumn, int erow, int ecolumn) +{ + Ewl_Selection_Range *sel; + + DENTER_FUNCTION(DLEVEL_STABLE); + + sel = NEW(Ewl_Selection_Range, 1); + sel->sel.type = EWL_SELECTION_TYPE_RANGE; + sel->start.row = srow; + sel->start.column = scolumn; + sel->end.row = erow; + sel->end.column = ecolumn; + + DRETURN_PTR(sel, DLEVEL_STABLE); +} + +/** + * @internal + * @param mvc: The mvc to work 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, int row, int column) +{ + unsigned int modifiers; + int multi_select = FALSE; + + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR("mvc", mvc); + DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE); + + if (ewl_mvc_selection_mode_get(mvc) == EWL_SELECTION_MODE_MULTI) + multi_select = TRUE; + + modifiers = ewl_ev_modifiers_get(); + if (multi_select && (modifiers & EWL_KEY_MODIFIER_SHIFT)) + { + /* is this the first click? */ + if (ewl_mvc_selected_count_get(mvc) > 0) + { + Ewl_Selection *sel; + int srow, scolumn; + + /* A shift will add the current position into a + * range with the last selected item. If the + * last selected is a range, it will take the + * start position */ + sel = ecore_list_goto_last(mvc->selected); + if (sel->type == EWL_SELECTION_TYPE_INDEX) + { + Ewl_Selection_Idx *idx; + + idx = EWL_SELECTION_IDX(sel); + srow = idx->row; + scolumn = idx->column; + } + else + { + Ewl_Selection_Range *idx; + + idx = EWL_SELECTION_RANGE(sel); + srow = idx->start.row; + scolumn = idx->start.column; + } + + /* remove the original and add the extended one to + * the list */ + ecore_list_remove(mvc->selected); + ewl_mvc_selected_range_add(mvc, srow, scolumn, + row, column); + } + else + ewl_mvc_selected_set(mvc, row, column); + } + else if (multi_select && (modifiers & EWL_KEY_MODIFIER_CTRL)) + { + if (ewl_mvc_selected_is(mvc, row, column)) + ewl_mvc_selected_rm(mvc, row, column); + else + ewl_mvc_selected_add(mvc, row, column); + } + else + ewl_mvc_selected_set(mvc, row, column); + + DLEAVE_FUNCTION(DLEVEL_STABLE); +} + /** * @internal * @param mvc: The MVC to set the callback into @@ -720,6 +802,123 @@ /* notify the app */ ewl_callback_call(EWL_WIDGET(mvc), EWL_CALLBACK_VALUE_CHANGED); + + DLEAVE_FUNCTION(DLEVEL_STABLE); +} + +/* This will remove @a sel from the mvc widget @a mvc. Then, if @a sel is a + * range selection it will remove @a row/@a column from the given selection + * and add up to 4 new ranges into the @a mvc widget. + * + * The range remove works like this: + * - first allocate as much space off the top to the first range. + * - this will go from the top left corner, to the selected (row - 1) + * and far right edge. + * - second, from the deletion row, far left to bottom row and (deletion column - 1) + * make this the second range + * - third, from the deletoin row, (deletion column + 1) to the bottom + * right corner this is the third range + * - fourth, from deletion row + 1, deletion column to bottom row, + * deletion column, this is the fourth range + * + * If a range would be only one item, we make it an Ewl_Selection_Index as + * needed. Steps can be skipped if they would result in a zero item range. + */ +static void +ewl_mvc_selected_rm_item(Ewl_MVC *mvc, Ewl_Selection *sel, int row, int column) +{ + Ewl_Selection_Range *si; + + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR("mvc", mvc); + DCHECK_PARAM_PTR("sel", sel); + DCHECK_TYPE("mvc", mvc, EWL_MVC_TYPE); + + ecore_list_goto(mvc->selected, sel); + ecore_list_remove(mvc->selected); + + /* done if this is an index */ + if (sel->type != EWL_SELECTION_TYPE_RANGE) + DRETURN(DLEVEL_STABLE); + + si = EWL_SELECTION_RANGE(sel); + + /* find top cells */ + if (row > si->start.row) + { + Ewl_Selection *n; + int erow; + + erow = (row - 1); + + /* 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(si->start.row, + si->start.column); + + else + n = ewl_mvc_selection_range_new(si->start.row, + si->start.column, + erow, si->end.column); + + ecore_list_append(mvc->selected, n); + } + + /* find left cells */ + if (column > si->start.column) + { + Ewl_Selection *n; + int ecolumn; + + ecolumn = (column - 1); + if ((((si->end.row - row) + 1) * + ((si->start.column - ecolumn) + 1)) == 1) + n = ewl_mvc_selection_index_new(row, si->start.column); + + else + n = ewl_mvc_selection_range_new(row, si->start.column, + si->end.row, ecolumn); + + ecore_list_append(mvc->selected, n); + } + + /* find right cells */ + if (column < si->end.column) + { + Ewl_Selection *n; + int scolumn; + + scolumn = column + 1; + if ((((si->end.row - row) + 1) * + ((scolumn - si->end.column) + 1)) == 1) + n = ewl_mvc_selection_index_new(row, si->end.column); + + else + n = ewl_mvc_selection_range_new(row, scolumn, + si->end.row, + si->end.column); + + ecore_list_append(mvc->selected, n); + } + + /* find bottom cells */ + if (row < si->end.row) + { + Ewl_Selection *n; + int srow; + + srow = row + 1; + if ((((srow - si->end.row) + 1) * + ((column - column) + 1)) == 1) + n = ewl_mvc_selection_index_new(si->end.row, column); + + else + n = ewl_mvc_selection_range_new(srow, column, + si->end.row, column); + + ecore_list_append(mvc->selected, n); + } DLEAVE_FUNCTION(DLEVEL_STABLE); } =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_mvc.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- ewl_mvc.h 17 Oct 2006 15:35:37 -0000 1.6 +++ ewl_mvc.h 18 Oct 2006 16:28:08 -0000 1.7 @@ -27,8 +27,8 @@ { Ewl_Selection sel; - unsigned int row; - unsigned int column; + int row; + int column; }; #define EWL_SELECTION_RANGE(x) ((Ewl_Selection_Range *)x) @@ -39,8 +39,8 @@ struct { - unsigned int row; - unsigned int column; + int row; + int column; } start, end; }; @@ -113,6 +113,10 @@ int ewl_mvc_selected_count_get(Ewl_MVC *mvc); unsigned int ewl_mvc_selected_is(Ewl_MVC *mvc, int row, int column); +Ewl_Selection *ewl_mvc_selection_index_new(int row, int column); +Ewl_Selection *ewl_mvc_selection_range_new(int srow, int scolumn, + int erow, int ecolumn); + /* * internal */ @@ -120,6 +124,12 @@ void ewl_mvc_selected_change_cb_set(Ewl_MVC *mvc, void (*cb)(Ewl_MVC *mvc)); void ewl_mvc_cb_destroy(Ewl_Widget *w, void *ev, void *data); + +void ewl_mvc_handle_click(Ewl_MVC *mvc, int row, int column); + +/** + * @} + */ #endif =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_tree2.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -3 -r1.35 -r1.36 --- ewl_tree2.c 15 Oct 2006 22:34:14 -0000 1.35 +++ ewl_tree2.c 18 Oct 2006 16:28:08 -0000 1.36 @@ -9,6 +9,9 @@ static void ewl_tree2_cb_header_changed(Ewl_Widget *w, void *ev, void *data); +static void ewl_tree2_cb_row_clicked(Ewl_Widget *w, void *ev, void *data); +static void ewl_tree2_cb_cell_clicked(Ewl_Widget *w, void *ev, void *data); + /** * @return Returns NULL on failure, a new tree widget on success. * @brief Allocate and initialize a new tree widget @@ -61,7 +64,7 @@ tree->columns = ecore_list_new(); ecore_list_set_free_cb(tree->columns, ewl_tree2_cb_column_free); - tree->mode = EWL_SELECTION_MODE_NONE; + tree->type = EWL_TREE_SELECTION_TYPE_CELL; tree->header = ewl_hpaned_new(); ewl_container_child_append(EWL_CONTAINER(tree), tree->header); @@ -265,17 +268,18 @@ /** * @param tree: The tree to get the mode from - * @return Returns the current Ewl_Tree_Mode of the tree - * @brief Get the mode from the tree + * @return Returns the current Ewl_Tree_Selection_Type of the tree + * @brief Get the selection type from the tree */ -Ewl_Selection_Mode -ewl_tree2_selection_mode_get(Ewl_Tree2 *tree) +Ewl_Tree_Selection_Type +ewl_tree2_selection_type_get(Ewl_Tree2 *tree) { DENTER_FUNCTION(DLEVEL_STABLE); - DCHECK_PARAM_PTR_RET("tree", tree, EWL_SELECTION_MODE_NONE); - DCHECK_TYPE_RET("tree", tree, EWL_TREE2_TYPE, EWL_SELECTION_MODE_NONE); + DCHECK_PARAM_PTR_RET("tree", tree, EWL_TREE_SELECTION_TYPE_CELL); + DCHECK_TYPE_RET("tree", tree, EWL_TREE2_TYPE, + EWL_TREE_SELECTION_TYPE_CELL); - DRETURN_INT(tree->mode, DLEVEL_STABLE); + DRETURN_INT(tree->type, DLEVEL_STABLE); } /** @@ -285,22 +289,20 @@ * @brief Set the mode of the tree */ void -ewl_tree2_selection_mode_set(Ewl_Tree2 *tree, Ewl_Selection_Mode mode) +ewl_tree2_selection_type_set(Ewl_Tree2 *tree, Ewl_Tree_Selection_Type type) { DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR("tree", tree); DCHECK_TYPE("tree", tree, EWL_TREE2_TYPE); - if (tree->mode == mode) + if (tree->type == type) DRETURN(DLEVEL_STABLE); - tree->mode = mode; - - /* if the mode is none then we don't care about the selected list */ - if (tree->mode == EWL_SELECTION_MODE_NONE) - { - ewl_mvc_selected_list_set(EWL_MVC(tree), NULL); - } + tree->type = type; + + /* if we switched types then the current set of selections isn't + * valid anymore so we clear them out */ + ewl_mvc_selected_clear(EWL_MVC(tree)); DLEAVE_FUNCTION(DLEVEL_STABLE); } @@ -556,6 +558,9 @@ row = ewl_row_new(); ewl_row_header_set(EWL_ROW(row), EWL_ROW(tree->header)); ewl_container_child_append(EWL_CONTAINER(tree->rows), row); + ewl_attach_widget_association_set(row, tree); + ewl_callback_append(row, EWL_CALLBACK_CLICKED, + ewl_tree2_cb_row_clicked, NULL); ewl_widget_show(row); if (i % 2) @@ -573,9 +578,11 @@ cell = ewl_cell_new(); ewl_object_fill_policy_set(EWL_OBJECT(cell), - EWL_FLAG_FILL_HSHRINK | - EWL_FLAG_FILL_HFILL); + EWL_FLAG_FILL_ALL); ewl_container_child_append(EWL_CONTAINER(row), cell); + ewl_attach_widget_association_set(cell, row); + ewl_callback_append(cell, EWL_CALLBACK_CLICKED, + ewl_tree2_cb_cell_clicked, NULL); ewl_widget_show(cell); val = col->model->fetch(mvc_data, i, column); @@ -810,5 +817,49 @@ DRETURN_INT(c->sort, DLEVEL_STABLE); } +static void +ewl_tree2_cb_row_clicked(Ewl_Widget *w, void *ev __UNUSED__, + void *data __UNUSED__) +{ + Ewl_Tree2 *tree; + int row; + + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR("w", w); + DCHECK_TYPE("w", w, EWL_WIDGET_TYPE); + + tree = ewl_attach_widget_association_get(w); + if (tree->type != EWL_TREE_SELECTION_TYPE_ROW) + DRETURN(DLEVEL_STABLE); + + row = ewl_container_child_index_get(EWL_CONTAINER(tree->rows), w); + ewl_mvc_handle_click(EWL_MVC(tree), row, -1); + + DLEAVE_FUNCTION(DLEVEL_STABLE); +} + +static void +ewl_tree2_cb_cell_clicked(Ewl_Widget *w, void *ev __UNUSED__, + void *data __UNUSED__) +{ + Ewl_Row *row; + Ewl_Tree2 *tree; + int r, column; + + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR("w", w); + DCHECK_TYPE("w", w, EWL_WIDGET_TYPE); + + row = ewl_attach_widget_association_get(w); + tree = ewl_attach_widget_association_get(row); + if (tree->type != EWL_TREE_SELECTION_TYPE_CELL) + DRETURN(DLEVEL_STABLE); + + r = ewl_container_child_index_get(EWL_CONTAINER(tree->rows), + EWL_WIDGET(row)); + column = ewl_container_child_index_get(EWL_CONTAINER(row), w); + ewl_mvc_handle_click(EWL_MVC(tree), r, column); + DLEAVE_FUNCTION(DLEVEL_STABLE); +} =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_tree2.h,v retrieving revision 1.32 retrieving revision 1.33 diff -u -3 -r1.32 -r1.33 --- ewl_tree2.h 15 Oct 2006 22:34:14 -0000 1.32 +++ ewl_tree2.h 18 Oct 2006 16:28:08 -0000 1.33 @@ -90,7 +90,7 @@ Ecore_List *columns; /**< The tree columns. */ int *rowcache; /**< Cache of row sizes */ - Ewl_Selection_Mode mode; /**< The mode of the tree */ + Ewl_Tree_Selection_Type type; /**< The selection type of the tree */ unsigned char fixed:1; /**< Rows are fixed height */ unsigned char headers_visible:1; /**< Are the headers visible? */ @@ -138,9 +138,9 @@ unsigned char visible); unsigned int ewl_tree2_headers_visible_get(Ewl_Tree2 *tree); -Ewl_Selection_Mode ewl_tree2_selection_mode_get(Ewl_Tree2 *tree); -void ewl_tree2_selection_mode_set(Ewl_Tree2 *tree, - Ewl_Selection_Mode mode); +Ewl_Tree_Selection_Type ewl_tree2_selection_type_get(Ewl_Tree2 *tree); +void ewl_tree2_selection_type_set(Ewl_Tree2 *tree, + Ewl_Tree_Selection_Type type); 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