diff options
-rw-r--r-- | widgets/e-table/ChangeLog | 5 | ||||
-rw-r--r-- | widgets/e-table/e-table-item.c | 111 | ||||
-rw-r--r-- | widgets/e-table/e-table-item.h | 67 | ||||
-rw-r--r-- | widgets/table/e-table-item.c | 111 | ||||
-rw-r--r-- | widgets/table/e-table-item.h | 67 |
5 files changed, 159 insertions, 202 deletions
diff --git a/widgets/e-table/ChangeLog b/widgets/e-table/ChangeLog index 93b4103bf7..dc9beda343 100644 --- a/widgets/e-table/ChangeLog +++ b/widgets/e-table/ChangeLog @@ -1,3 +1,8 @@ +2000-06-20 Christopher James Lahey <clahey@helixcode.com> + + * e-table-item.c, e-table-item.h: Started adapting ETableItem to + use the canvas selection/cursor system. + 2000-06-17 Chris Toshok <toshok@helixcode.com> * e-tree-model.c (e_tree_model_node_insert): call diff --git a/widgets/e-table/e-table-item.c b/widgets/e-table/e-table-item.c index 5167c794e6..b5b775d2f8 100644 --- a/widgets/e-table/e-table-item.c +++ b/widgets/e-table/e-table-item.c @@ -17,6 +17,7 @@ #include <gdk/gdkkeysyms.h> #include <math.h> #include "e-table-item.h" +#include "e-table-subset.h" #include "e-cell.h" #include "e-util/e-canvas.h" #include "e-util/e-canvas-utils.h" @@ -58,6 +59,9 @@ enum { static int eti_get_height (ETableItem *eti); static int eti_get_minimum_width (ETableItem *eti); static int eti_row_height (ETableItem *eti, int row); +static void e_table_item_unselect_row (ETableItem *eti, int row); +static void e_table_item_select_row (ETableItem *eti, int row); +static void eti_selection (GnomeCanvasItem *item, int flags, gpointer user_data); #define ETI_ROW_HEIGHT(eti,row) ((eti)->height_cache && (eti)->height_cache[(row)] != -1 ? (eti)->height_cache[(row)] : eti_row_height((eti),(row))) static gboolean @@ -253,6 +257,8 @@ eti_remove_table_model (ETableItem *eti) gtk_signal_disconnect (GTK_OBJECT (eti->table_model), eti->table_model_row_deleted_id); gtk_object_unref (GTK_OBJECT (eti->table_model)); + if (eti->source_model) + gtk_object_unref (GTK_OBJECT (eti->source_model)); eti->table_model_change_id = 0; eti->table_model_row_change_id = 0; @@ -260,6 +266,8 @@ eti_remove_table_model (ETableItem *eti) eti->table_model_row_inserted_id = 0; eti->table_model_row_deleted_id = 0; eti->table_model = NULL; + eti->source_model = NULL; + eti->uses_source_model = 0; } /* @@ -647,6 +655,11 @@ eti_add_table_model (ETableItem *eti, ETableModel *table_model) eti_detach_cell_views (eti); eti_attach_cell_views (eti); } + + if (E_IS_TABLE_SUBSET(table_model)) { + eti->uses_source_model = 1; + eti->source_model = E_TABLE_SUBSET(table_model)->source; + } eti_table_model_changed (table_model, eti); } @@ -810,10 +823,6 @@ eti_init (GnomeCanvasItem *item) { ETableItem *eti = E_TABLE_ITEM (item); - eti->cursor_row = -1; - eti->cursor_col = 0; - eti->cursor_mode = E_TABLE_CURSOR_SIMPLE; - eti->editing_col = -1; eti->editing_row = -1; eti->height = 0; @@ -826,15 +835,21 @@ eti_init (GnomeCanvasItem *item) eti->length_threshold = -1; eti->renderers_can_change_size = 1; + + eti->uses_source_model = 0; + eti->source_model = NULL; -#if 0 - eti->selection_mode = GTK_SELECTION_SINGLE; -#endif + eti->cursor_row = -1; + eti->cursor_col = 0; + eti->cursor_mode = E_TABLE_CURSOR_SIMPLE; + + eti->selection = NULL; eti->needs_redraw = 0; eti->needs_compute_height = 0; e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM (eti), eti_reflow); + e_canvas_item_set_selection_callback (GNOME_CANVAS_ITEM (eti), eti_selection); } #define gray50_width 2 @@ -1587,7 +1602,6 @@ e_table_item_get_focused_column (ETableItem *eti) } -#if 0 const GSList * e_table_item_get_selection (ETableItem *eti) { @@ -1597,29 +1611,6 @@ e_table_item_get_selection (ETableItem *eti) return eti->selection; } -GtkSelectionMode -e_table_item_get_selection_mode (ETableItem *eti) -{ - g_return_val_if_fail (eti != NULL, GTK_SELECTION_SINGLE); - g_return_val_if_fail (E_IS_TABLE_ITEM (eti), GTK_SELECTION_SINGLE); - - return eti->selection_mode; -} - -void -e_table_item_set_selection_mode (ETableItem *eti, GtkSelectionMode selection_mode) -{ - g_return_if_fail (eti != NULL); - g_return_if_fail (E_IS_TABLE_ITEM (eti)); - - if (selection_mode == GTK_SELECTION_BROWSE || - selection_mode == GTK_SELECTION_EXTENDED){ - g_error ("GTK_SELECTION_BROWSE and GTK_SELECTION_EXTENDED are not implemented"); - } - - eti->selection_mode = selection_mode; -} - gboolean e_table_item_is_row_selected (ETableItem *eti, int row) { @@ -1632,53 +1623,49 @@ e_table_item_is_row_selected (ETableItem *eti, int row) return FALSE; } -void +static void e_table_item_unselect_row (ETableItem *eti, int row) { g_return_if_fail (eti != NULL); g_return_if_fail (E_IS_TABLE_ITEM (eti)); - if (e_table_item_is_row_selected (eti, row)){ - gtk_signal_emit ( - GTK_OBJECT (eti), eti_signals [ROW_SELECTION], - row, 0); - } + gtk_signal_emit (GTK_OBJECT (eti), eti_signals [ROW_SELECTION], + row, 0); } -void +static void e_table_item_select_row (ETableItem *eti, int row) { g_return_if_fail (eti != NULL); g_return_if_fail (E_IS_TABLE_ITEM (eti)); - switch (eti->selection_mode){ - case GTK_SELECTION_SINGLE: - if (eti->selection){ - gtk_signal_emit ( - GTK_OBJECT (eti), eti_signals [ROW_SELECTION], - GPOINTER_TO_INT (eti->selection->data), 0); - } - g_slist_free (eti->selection); - eti->selection = NULL; - - gtk_signal_emit ( - GTK_OBJECT (eti), eti_signals [ROW_SELECTION], - GINT_TO_POINTER (row), 1); - break; - - case GTK_SELECTION_MULTIPLE: - if (g_slist_find (eti->selection, GINT_TO_POINTER (row))) - return; - gtk_signal_emit ( - GTK_OBJECT (eti), eti_signals [ROW_SELECTION], - GINT_TO_POINTER (row), 1); - break; + gtk_signal_emit (GTK_OBJECT (eti), eti_signals [ROW_SELECTION], + GINT_TO_POINTER (row), 1); +} - default: +static void +eti_selection (GnomeCanvasItem *item, int flags, gpointer data) +{ + int row = (int) data; + int col = 0; + ETableItem *eti = E_TABLE_ITEM(item); + int selected = e_table_item_is_row_selected(eti, row); + int cursored = row == eti->cursor_row; + + if (selected && (flags & E_CANVAS_ITEM_SELECTION_SELECT) == 0) { + e_table_item_unselect_row (eti, row); + } + if ((!selected) && (flags & E_CANVAS_ITEM_SELECTION_SELECT) != 0) { + e_table_item_select_row (eti, row); + } + if ((!cursored) && (flags & E_CANVAS_ITEM_SELECTION_CURSOR) != 0) { + eti->cursor_row = row; + eti->cursor_col = col; + } + if (flags & E_CANVAS_ITEM_SELECTION_DELETE_DATA) { } } -#endif void e_table_item_enter_edit (ETableItem *eti, int col, int row) diff --git a/widgets/e-table/e-table-item.h b/widgets/e-table/e-table-item.h index 7ad5955cdc..1d522413cd 100644 --- a/widgets/e-table/e-table-item.h +++ b/widgets/e-table/e-table-item.h @@ -25,6 +25,8 @@ typedef struct { ETableModel *table_model; ETableHeader *header; + ETableModel *source_model; + int x1, y1; int minimum_width, width, height; @@ -46,14 +48,17 @@ typedef struct { GdkGC *focus_gc; GdkBitmap *stipple; - guint draw_grid:1; - guint draw_focus:1; - guint renderers_can_change_size:1; - guint cell_views_realized:1; + guint draw_grid:1; + guint draw_focus:1; + guint renderers_can_change_size:1; + guint cell_views_realized:1; + + guint needs_redraw : 1; + guint needs_compute_height : 1; + guint needs_compute_width : 1; + + guint uses_source_model : 1; - guint needs_redraw : 1; - guint needs_compute_height : 1; - guint needs_compute_width : 1; /* * Realized views, per column */ @@ -74,14 +79,10 @@ typedef struct { gint cursor_col; ETableCursorMode cursor_mode; -#if 0 GSList *selection; - gint selection_count; - GtkSelectionMode selection_mode; -#endif /* - * During edition + * During editing */ int editing_col, editing_row; void *edit_ctx; @@ -109,35 +110,23 @@ void e_table_item_unfocus (ETableItem *eti); gint e_table_item_get_focused_column (ETableItem *eti); -#if 0 -/* - * Selection - */ -void e_table_item_select_row (ETableItem *e_table_Item, int row); -void e_table_item_unselect_row (ETableItem *e_table_Item, int row); - /* * Handling the selection */ -const GSList*e_table_item_get_selection (ETableItem *e_table_Item); - -GtkSelectionMode e_table_item_get_selection_mode (ETableItem *e_table_Item); -void e_table_item_set_selection_mode (ETableItem *e_table_Item, - GtkSelectionMode selection_mode); -gboolean e_table_item_is_row_selected (ETableItem *e_table_Item, - int row); -#endif - -void e_table_item_leave_edit (ETableItem *eti); -void e_table_item_enter_edit (ETableItem *eti, int col, int row); - -void e_table_item_redraw_range (ETableItem *eti, - int start_col, int start_row, - int end_col, int end_row); - -EPrintable *e_table_item_get_printable (ETableItem *eti); -void e_table_item_print_height (ETableItem *eti, - GnomePrintContext *context, - gdouble width); +const GSList *e_table_item_get_selection (ETableItem *e_table_Item); +gboolean e_table_item_is_row_selected (ETableItem *e_table_Item, + int row); + +void e_table_item_leave_edit (ETableItem *eti); +void e_table_item_enter_edit (ETableItem *eti, int col, int row); + +void e_table_item_redraw_range (ETableItem *eti, + int start_col, int start_row, + int end_col, int end_row); + +EPrintable *e_table_item_get_printable (ETableItem *eti); +void e_table_item_print_height (ETableItem *eti, + GnomePrintContext *context, + gdouble width); #endif /* _E_TABLE_ITEM_H_ */ diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c index 5167c794e6..b5b775d2f8 100644 --- a/widgets/table/e-table-item.c +++ b/widgets/table/e-table-item.c @@ -17,6 +17,7 @@ #include <gdk/gdkkeysyms.h> #include <math.h> #include "e-table-item.h" +#include "e-table-subset.h" #include "e-cell.h" #include "e-util/e-canvas.h" #include "e-util/e-canvas-utils.h" @@ -58,6 +59,9 @@ enum { static int eti_get_height (ETableItem *eti); static int eti_get_minimum_width (ETableItem *eti); static int eti_row_height (ETableItem *eti, int row); +static void e_table_item_unselect_row (ETableItem *eti, int row); +static void e_table_item_select_row (ETableItem *eti, int row); +static void eti_selection (GnomeCanvasItem *item, int flags, gpointer user_data); #define ETI_ROW_HEIGHT(eti,row) ((eti)->height_cache && (eti)->height_cache[(row)] != -1 ? (eti)->height_cache[(row)] : eti_row_height((eti),(row))) static gboolean @@ -253,6 +257,8 @@ eti_remove_table_model (ETableItem *eti) gtk_signal_disconnect (GTK_OBJECT (eti->table_model), eti->table_model_row_deleted_id); gtk_object_unref (GTK_OBJECT (eti->table_model)); + if (eti->source_model) + gtk_object_unref (GTK_OBJECT (eti->source_model)); eti->table_model_change_id = 0; eti->table_model_row_change_id = 0; @@ -260,6 +266,8 @@ eti_remove_table_model (ETableItem *eti) eti->table_model_row_inserted_id = 0; eti->table_model_row_deleted_id = 0; eti->table_model = NULL; + eti->source_model = NULL; + eti->uses_source_model = 0; } /* @@ -647,6 +655,11 @@ eti_add_table_model (ETableItem *eti, ETableModel *table_model) eti_detach_cell_views (eti); eti_attach_cell_views (eti); } + + if (E_IS_TABLE_SUBSET(table_model)) { + eti->uses_source_model = 1; + eti->source_model = E_TABLE_SUBSET(table_model)->source; + } eti_table_model_changed (table_model, eti); } @@ -810,10 +823,6 @@ eti_init (GnomeCanvasItem *item) { ETableItem *eti = E_TABLE_ITEM (item); - eti->cursor_row = -1; - eti->cursor_col = 0; - eti->cursor_mode = E_TABLE_CURSOR_SIMPLE; - eti->editing_col = -1; eti->editing_row = -1; eti->height = 0; @@ -826,15 +835,21 @@ eti_init (GnomeCanvasItem *item) eti->length_threshold = -1; eti->renderers_can_change_size = 1; + + eti->uses_source_model = 0; + eti->source_model = NULL; -#if 0 - eti->selection_mode = GTK_SELECTION_SINGLE; -#endif + eti->cursor_row = -1; + eti->cursor_col = 0; + eti->cursor_mode = E_TABLE_CURSOR_SIMPLE; + + eti->selection = NULL; eti->needs_redraw = 0; eti->needs_compute_height = 0; e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM (eti), eti_reflow); + e_canvas_item_set_selection_callback (GNOME_CANVAS_ITEM (eti), eti_selection); } #define gray50_width 2 @@ -1587,7 +1602,6 @@ e_table_item_get_focused_column (ETableItem *eti) } -#if 0 const GSList * e_table_item_get_selection (ETableItem *eti) { @@ -1597,29 +1611,6 @@ e_table_item_get_selection (ETableItem *eti) return eti->selection; } -GtkSelectionMode -e_table_item_get_selection_mode (ETableItem *eti) -{ - g_return_val_if_fail (eti != NULL, GTK_SELECTION_SINGLE); - g_return_val_if_fail (E_IS_TABLE_ITEM (eti), GTK_SELECTION_SINGLE); - - return eti->selection_mode; -} - -void -e_table_item_set_selection_mode (ETableItem *eti, GtkSelectionMode selection_mode) -{ - g_return_if_fail (eti != NULL); - g_return_if_fail (E_IS_TABLE_ITEM (eti)); - - if (selection_mode == GTK_SELECTION_BROWSE || - selection_mode == GTK_SELECTION_EXTENDED){ - g_error ("GTK_SELECTION_BROWSE and GTK_SELECTION_EXTENDED are not implemented"); - } - - eti->selection_mode = selection_mode; -} - gboolean e_table_item_is_row_selected (ETableItem *eti, int row) { @@ -1632,53 +1623,49 @@ e_table_item_is_row_selected (ETableItem *eti, int row) return FALSE; } -void +static void e_table_item_unselect_row (ETableItem *eti, int row) { g_return_if_fail (eti != NULL); g_return_if_fail (E_IS_TABLE_ITEM (eti)); - if (e_table_item_is_row_selected (eti, row)){ - gtk_signal_emit ( - GTK_OBJECT (eti), eti_signals [ROW_SELECTION], - row, 0); - } + gtk_signal_emit (GTK_OBJECT (eti), eti_signals [ROW_SELECTION], + row, 0); } -void +static void e_table_item_select_row (ETableItem *eti, int row) { g_return_if_fail (eti != NULL); g_return_if_fail (E_IS_TABLE_ITEM (eti)); - switch (eti->selection_mode){ - case GTK_SELECTION_SINGLE: - if (eti->selection){ - gtk_signal_emit ( - GTK_OBJECT (eti), eti_signals [ROW_SELECTION], - GPOINTER_TO_INT (eti->selection->data), 0); - } - g_slist_free (eti->selection); - eti->selection = NULL; - - gtk_signal_emit ( - GTK_OBJECT (eti), eti_signals [ROW_SELECTION], - GINT_TO_POINTER (row), 1); - break; - - case GTK_SELECTION_MULTIPLE: - if (g_slist_find (eti->selection, GINT_TO_POINTER (row))) - return; - gtk_signal_emit ( - GTK_OBJECT (eti), eti_signals [ROW_SELECTION], - GINT_TO_POINTER (row), 1); - break; + gtk_signal_emit (GTK_OBJECT (eti), eti_signals [ROW_SELECTION], + GINT_TO_POINTER (row), 1); +} - default: +static void +eti_selection (GnomeCanvasItem *item, int flags, gpointer data) +{ + int row = (int) data; + int col = 0; + ETableItem *eti = E_TABLE_ITEM(item); + int selected = e_table_item_is_row_selected(eti, row); + int cursored = row == eti->cursor_row; + + if (selected && (flags & E_CANVAS_ITEM_SELECTION_SELECT) == 0) { + e_table_item_unselect_row (eti, row); + } + if ((!selected) && (flags & E_CANVAS_ITEM_SELECTION_SELECT) != 0) { + e_table_item_select_row (eti, row); + } + if ((!cursored) && (flags & E_CANVAS_ITEM_SELECTION_CURSOR) != 0) { + eti->cursor_row = row; + eti->cursor_col = col; + } + if (flags & E_CANVAS_ITEM_SELECTION_DELETE_DATA) { } } -#endif void e_table_item_enter_edit (ETableItem *eti, int col, int row) diff --git a/widgets/table/e-table-item.h b/widgets/table/e-table-item.h index 7ad5955cdc..1d522413cd 100644 --- a/widgets/table/e-table-item.h +++ b/widgets/table/e-table-item.h @@ -25,6 +25,8 @@ typedef struct { ETableModel *table_model; ETableHeader *header; + ETableModel *source_model; + int x1, y1; int minimum_width, width, height; @@ -46,14 +48,17 @@ typedef struct { GdkGC *focus_gc; GdkBitmap *stipple; - guint draw_grid:1; - guint draw_focus:1; - guint renderers_can_change_size:1; - guint cell_views_realized:1; + guint draw_grid:1; + guint draw_focus:1; + guint renderers_can_change_size:1; + guint cell_views_realized:1; + + guint needs_redraw : 1; + guint needs_compute_height : 1; + guint needs_compute_width : 1; + + guint uses_source_model : 1; - guint needs_redraw : 1; - guint needs_compute_height : 1; - guint needs_compute_width : 1; /* * Realized views, per column */ @@ -74,14 +79,10 @@ typedef struct { gint cursor_col; ETableCursorMode cursor_mode; -#if 0 GSList *selection; - gint selection_count; - GtkSelectionMode selection_mode; -#endif /* - * During edition + * During editing */ int editing_col, editing_row; void *edit_ctx; @@ -109,35 +110,23 @@ void e_table_item_unfocus (ETableItem *eti); gint e_table_item_get_focused_column (ETableItem *eti); -#if 0 -/* - * Selection - */ -void e_table_item_select_row (ETableItem *e_table_Item, int row); -void e_table_item_unselect_row (ETableItem *e_table_Item, int row); - /* * Handling the selection */ -const GSList*e_table_item_get_selection (ETableItem *e_table_Item); - -GtkSelectionMode e_table_item_get_selection_mode (ETableItem *e_table_Item); -void e_table_item_set_selection_mode (ETableItem *e_table_Item, - GtkSelectionMode selection_mode); -gboolean e_table_item_is_row_selected (ETableItem *e_table_Item, - int row); -#endif - -void e_table_item_leave_edit (ETableItem *eti); -void e_table_item_enter_edit (ETableItem *eti, int col, int row); - -void e_table_item_redraw_range (ETableItem *eti, - int start_col, int start_row, - int end_col, int end_row); - -EPrintable *e_table_item_get_printable (ETableItem *eti); -void e_table_item_print_height (ETableItem *eti, - GnomePrintContext *context, - gdouble width); +const GSList *e_table_item_get_selection (ETableItem *e_table_Item); +gboolean e_table_item_is_row_selected (ETableItem *e_table_Item, + int row); + +void e_table_item_leave_edit (ETableItem *eti); +void e_table_item_enter_edit (ETableItem *eti, int col, int row); + +void e_table_item_redraw_range (ETableItem *eti, + int start_col, int start_row, + int end_col, int end_row); + +EPrintable *e_table_item_get_printable (ETableItem *eti); +void e_table_item_print_height (ETableItem *eti, + GnomePrintContext *context, + gdouble width); #endif /* _E_TABLE_ITEM_H_ */ |