diff options
author | Christopher James Lahey <clahey@helixcode.com> | 2000-06-21 11:07:30 +0800 |
---|---|---|
committer | Chris Lahey <clahey@src.gnome.org> | 2000-06-21 11:07:30 +0800 |
commit | c62863d0877fd19c90ba8a15d4438611599b0979 (patch) | |
tree | d2668eab8bcb699aa1bcb547c17075c5226bdcfe /widgets/table/e-table-item.c | |
parent | 798b2b01e6ecdbaea70860ca357b5c3eb5ecddfb (diff) | |
download | gsoc2013-evolution-c62863d0877fd19c90ba8a15d4438611599b0979.tar.gz gsoc2013-evolution-c62863d0877fd19c90ba8a15d4438611599b0979.tar.zst gsoc2013-evolution-c62863d0877fd19c90ba8a15d4438611599b0979.zip |
Removed the unfocus method since that's handled by the canvas itself now.
2000-06-20 Christopher James Lahey <clahey@helixcode.com>
* e-table-group-container.c, e-table-group-leaf.c,
e-table-group.c, e-table-group.h: Removed the unfocus method since
that's handled by the canvas itself now.
* e-table-item.c, e-table-item.h: Finished adapting ETableItem to
use the canvas selection/cursor system. Selection and cursor now
use row numbers associated with the source model instead of the
sorted model (if the model they are given is an ETableSubset.)
This has no effect on the interface, except that unfocus was
removed and e_table_item_focus was renamed to
e_table_item_set_cursor.
svn path=/trunk/; revision=3660
Diffstat (limited to 'widgets/table/e-table-item.c')
-rw-r--r-- | widgets/table/e-table-item.c | 184 |
1 files changed, 85 insertions, 99 deletions
diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c index b5b775d2f8..e385d97181 100644 --- a/widgets/table/e-table-item.c +++ b/widgets/table/e-table-item.c @@ -62,8 +62,42 @@ 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); +static void e_table_item_focus (ETableItem *eti, int col, int row); #define ETI_ROW_HEIGHT(eti,row) ((eti)->height_cache && (eti)->height_cache[(row)] != -1 ? (eti)->height_cache[(row)] : eti_row_height((eti),(row))) +static gint +model_to_view_row(ETableItem *eti, int row) +{ + int i; + if (eti->uses_source_model) { + ETableSubset *etss = E_TABLE_SUBSET(eti->table_model); + if (eti->row_guess >= 0 && eti->row_guess < etss->n_map) { + if (etss->map_table[eti->row_guess] == row) { + return eti->row_guess; + } + } + for (i = 0; i < etss->n_map; i++) { + if (etss->map_table[i] == row) + return i; + } + return -1; + } else + return row; +} + +static gint +view_to_model_row(ETableItem *eti, int row) +{ + if (eti->uses_source_model) { + ETableSubset *etss = E_TABLE_SUBSET(eti->table_model); + if (row >= 0 && row < etss->n_map) + return etss->map_table[row]; + else + return -1; + } else + return row; +} + static gboolean eti_editing (ETableItem *eti) { @@ -490,11 +524,6 @@ eti_table_model_changed (ETableModel *table_model, ETableItem *eti) { eti->rows = e_table_model_row_count (eti->table_model); - /* FIXME: cursor */ - if (eti->cursor_row > eti->rows - 1) - eti->cursor_row = eti->rows - 1; - - free_height_cache(eti); eti->needs_compute_height = 1; @@ -614,8 +643,8 @@ e_table_item_redraw_range (ETableItem *eti, if ((start_col == eti->cursor_col) || (end_col == eti->cursor_col) || - (start_row == eti->cursor_row) || - (end_row == eti->cursor_row)) + (view_to_model_row(eti, start_row) == eti->cursor_row) || + (view_to_model_row(eti, end_row) == eti->cursor_row)) border = 2; else border = 0; @@ -783,6 +812,9 @@ eti_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) if (eti->minimum_width < eti->width) e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti)); break; + case ARG_CURSOR_ROW: + e_table_item_focus (eti, eti->cursor_col != -1 ? eti->cursor_col : 0, view_to_model_row(eti, GTK_VALUE_INT (*arg))); + break; } eti->needs_redraw = 1; gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(eti)); @@ -811,7 +843,7 @@ eti_get_arg (GtkObject *o, GtkArg *arg, guint arg_id) GTK_VALUE_BOOL (*arg) = (eti->cursor_row != -1); break; case ARG_CURSOR_ROW: - GTK_VALUE_INT (*arg) = eti->cursor_row; + GTK_VALUE_INT (*arg) = model_to_view_row(eti, eti->cursor_row); break; default: arg->type = GTK_TYPE_INVALID; @@ -839,6 +871,7 @@ eti_init (GnomeCanvasItem *item) eti->uses_source_model = 0; eti->source_model = NULL; + eti->row_guess = -1; eti->cursor_row = -1; eti->cursor_col = 0; eti->cursor_mode = E_TABLE_CURSOR_SIMPLE; @@ -1031,11 +1064,8 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, xd = x_offset; /* printf ("paint: %d %d\n", yd, yd + height); */ - -#if 0 - selected = g_slist_find (eti->selection, GINT_TO_POINTER (row)) != NULL; -#endif - selected = (row == eti->cursor_row); + + selected = g_slist_find (eti->selection, GINT_TO_POINTER (view_to_model_row(eti, row))) != NULL; for (col = first_col; col < last_col; col++){ ETableCol *ecol = e_table_header_get_column (eti->header, col); @@ -1043,7 +1073,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, gboolean col_selected = selected; switch (eti->cursor_mode) { case E_TABLE_CURSOR_SIMPLE: - if (eti->cursor_col == col && eti->cursor_row == row) + if (eti->cursor_col == col && eti->cursor_row == view_to_model_row(eti, row)) col_selected = !col_selected; break; case E_TABLE_CURSOR_LINE: @@ -1054,7 +1084,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, e_cell_draw (ecell_view, drawable, ecol->col_idx, col, row, col_selected, xd, yd, xd + ecol->width, yd + height); - if (col == eti->cursor_col && row == eti->cursor_row){ + if (col == eti->cursor_col && view_to_model_row(eti, row) == eti->cursor_row){ f_x1 = xd; f_x2 = xd + ecol->width; f_y1 = yd; @@ -1161,31 +1191,31 @@ static void eti_cursor_move (ETableItem *eti, gint row, gint column) { e_table_item_leave_edit (eti); - e_table_item_focus (eti, column, row); + e_table_item_focus (eti, column, view_to_model_row(eti, row)); } static void eti_cursor_move_left (ETableItem *eti) { - eti_cursor_move (eti, eti->cursor_row, eti->cursor_col - 1); + eti_cursor_move (eti, model_to_view_row(eti, eti->cursor_row), eti->cursor_col - 1); } static void eti_cursor_move_right (ETableItem *eti) { - eti_cursor_move (eti, eti->cursor_row, eti->cursor_col + 1); + eti_cursor_move (eti, model_to_view_row(eti, eti->cursor_row), eti->cursor_col + 1); } static void eti_cursor_move_up (ETableItem *eti) { - eti_cursor_move (eti, eti->cursor_row - 1, eti->cursor_col); + eti_cursor_move (eti, model_to_view_row(eti, eti->cursor_row) - 1, eti->cursor_col); } static void eti_cursor_move_down (ETableItem *eti) { - eti_cursor_move (eti, eti->cursor_row + 1, eti->cursor_col); + eti_cursor_move (eti, model_to_view_row(eti, eti->cursor_row) + 1, eti->cursor_col); } /* FIXME: cursor */ @@ -1212,15 +1242,15 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1)) return TRUE; - if (eti->cursor_row != row || eti->cursor_col != col){ + if (eti->cursor_row != view_to_model_row(eti, row) || eti->cursor_col != col){ /* * Focus the cell, and select the row */ e_table_item_leave_edit (eti); - e_table_item_focus (eti, col, row); + e_table_item_focus (eti, col, view_to_model_row(eti, row)); } - if (eti->cursor_row == row && eti->cursor_col == col){ + if (eti->cursor_row == view_to_model_row(eti, row) && eti->cursor_col == col){ ecol = e_table_header_get_column (eti->header, col); ecell_view = eti->cell_views [col]; @@ -1277,7 +1307,7 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) if (!find_cell (eti, e->motion.x, e->motion.y, &col, &row, &x1, &y1)) return TRUE; - if (eti->cursor_row == row && eti->cursor_col == col){ + if (eti->cursor_row == view_to_model_row(eti, row) && eti->cursor_col == col){ ecol = e_table_header_get_column (eti->header, col); ecell_view = eti->cell_views [col]; @@ -1318,14 +1348,14 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) break; case GDK_Up: - if (eti->cursor_row > 0) + if (eti->cursor_row != view_to_model_row(eti, 0)) eti_cursor_move_up (eti); else return_val = FALSE; break; case GDK_Down: - if ((eti->cursor_row + 1) < eti->rows) + if (eti->cursor_row != view_to_model_row(eti, eti->rows - 1)) eti_cursor_move_down (eti); else return_val = FALSE; @@ -1338,15 +1368,15 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) /* shift tab */ if (eti->cursor_col > 0) eti_cursor_move_left (eti); - else if (eti->cursor_row > 0) - eti_cursor_move (eti, eti->cursor_row - 1, eti->cols - 1); + else if (eti->cursor_row != view_to_model_row(eti, 0)) + eti_cursor_move (eti, model_to_view_row(eti, eti->cursor_row) - 1, eti->cols - 1); else return_val = FALSE; } else { if (eti->cursor_col < eti->cols - 1) eti_cursor_move_right (eti); - else if (eti->cursor_row < eti->rows - 1) - eti_cursor_move (eti, eti->cursor_row + 1, 0); + else if (eti->cursor_row != view_to_model_row(eti, eti->rows - 1)) + eti_cursor_move (eti, model_to_view_row(eti, eti->cursor_row) + 1, 0); else return_val = FALSE; } @@ -1355,11 +1385,11 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) default: if (!eti_editing (eti)){ gtk_signal_emit (GTK_OBJECT (eti), eti_signals [KEY_PRESS], - eti->cursor_row, eti->cursor_col, e, &return_val); + model_to_view_row(eti, eti->cursor_row), eti->cursor_col, e, &return_val); } else { ecol = e_table_header_get_column (eti->header, eti->cursor_col); ecell_view = eti->cell_views [eti->cursor_col]; - e_cell_event (ecell_view, e, ecol->col_idx, eti->cursor_col, eti->cursor_row); + e_cell_event (ecell_view, e, ecol->col_idx, eti->cursor_col, model_to_view_row(eti, eti->cursor_row)); } } break; @@ -1387,15 +1417,13 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) static void eti_row_selection (ETableItem *eti, int row, gboolean selected) { -#if 0 - eti_request_region_redraw (eti, 0, row, eti->cols - 1, row, 0); + int view_row = model_to_view_row(eti, row); + eti_request_region_redraw (eti, 0, view_row, eti->cols - 1, view_row, 0); if (selected) eti->selection = g_slist_prepend (eti->selection, GINT_TO_POINTER (row)); else eti->selection = g_slist_remove (eti->selection, GINT_TO_POINTER (row)); -#endif - } static void @@ -1445,7 +1473,7 @@ eti_class_init (GtkObjectClass *object_class) gtk_object_add_arg_type ("ETableItem::has_cursor", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_CURSOR); gtk_object_add_arg_type ("ETableItem::cursor_row", GTK_TYPE_INT, - GTK_ARG_READABLE, ARG_CURSOR_ROW); + GTK_ARG_READWRITE, ARG_CURSOR_ROW); eti_signals [ROW_SELECTION] = gtk_signal_new ("row_selection", @@ -1515,83 +1543,32 @@ e_table_item_get_type (void) } void +e_table_item_set_cursor (ETableItem *eti, int col, int row) +{ + e_table_item_focus(eti, col, view_to_model_row(eti, row)); +} + +static void e_table_item_focus (ETableItem *eti, int col, int row) { g_return_if_fail (eti != NULL); g_return_if_fail (E_IS_TABLE_ITEM (eti)); - /* - * make sure we have the Gtk Focus - */ - gnome_canvas_item_grab_focus (GNOME_CANVAS_ITEM (eti)); - - e_table_item_unfocus (eti); - if (row == -1) { - row = eti->rows - 1; + row = view_to_model_row(eti, eti->rows - 1); } if (col == -1) { - col = eti->cursor_col; - row = -1; + col = eti->cols - 1; } eti->cursor_col = col; - eti->cursor_row = row; - gtk_signal_emit (GTK_OBJECT (eti), eti_signals [CURSOR_CHANGE], - row); if (row != -1) { - /* FIXME: remove once selection stuff is done. */ -#if 0 - if (eti->cursor_mode == E_TABLE_CURSOR_SPREADSHEET) - eti_request_region_redraw (eti, col, row, col, row, FOCUSED_BORDER); - else -#endif - eti_request_region_redraw (eti, 0, row, eti->cols - 1, row, FOCUSED_BORDER); - - eti_request_region_show (eti, 0, row, eti->cols - 1, row); - -#if 0 - e_table_item_select_row (eti, row); -#endif + e_canvas_item_set_cursor(GNOME_CANVAS_ITEM(eti), (gpointer) row); } } -void -e_table_item_unfocus (ETableItem *eti) -{ - g_return_if_fail (eti != NULL); - g_return_if_fail (E_IS_TABLE_ITEM (eti)); - - if (eti->cursor_row == -1) - return; - - { -#if 0 - const int col = eti->cursor_col; -#endif - const int row = eti->cursor_row; - -#if 0 - if (eti->cursor_mode == E_TABLE_CURSOR_SPREADSHEET) - eti_request_region_redraw (eti, col, row, col, row, FOCUSED_BORDER); - else -#endif - /* FIXME: remove once selection stuff is done. */ - gtk_signal_emit (GTK_OBJECT (eti), eti_signals [ROW_SELECTION], - row, 0); - eti_request_region_redraw (eti, 0, row, eti->cols - 1, row, FOCUSED_BORDER); -#if 0 - while (eti->selection){ - e_table_item_unselect_row (eti, GPOINTER_TO_INT(eti->selection->data)); - } -#endif - } - eti->cursor_col = -1; - eti->cursor_row = -1; -} - gint e_table_item_get_focused_column (ETableItem *eti) { @@ -1650,7 +1627,7 @@ eti_selection (GnomeCanvasItem *item, int flags, gpointer 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; + int cursored = (row == eti->cursor_row); if (selected && (flags & E_CANVAS_ITEM_SELECTION_SELECT) == 0) { e_table_item_unselect_row (eti, row); @@ -1659,8 +1636,17 @@ eti_selection (GnomeCanvasItem *item, int flags, gpointer data) e_table_item_select_row (eti, row); } if ((!cursored) && (flags & E_CANVAS_ITEM_SELECTION_CURSOR) != 0) { - eti->cursor_row = row; + int view_row = model_to_view_row(eti, row); + eti->cursor_col = col; + eti->cursor_row = row; + gtk_signal_emit (GTK_OBJECT (eti), eti_signals [CURSOR_CHANGE], + view_row); + eti_request_region_show (eti, col, view_row, col, view_row); + } + if ((cursored) && (flags & E_CANVAS_ITEM_SELECTION_CURSOR) == 0) { + eti->cursor_row = -1; + eti->cursor_col = -1; } if (flags & E_CANVAS_ITEM_SELECTION_DELETE_DATA) { |