Made this conform to the new prototype for e_popup_menu_run.
2001-01-21 Christopher James Lahey <clahey@helixcode.com> * e-table-header-item.c (ethi_header_context_menu): Made this conform to the new prototype for e_popup_menu_run. * e-table-item.c, e-table-item.h: Documented. (e_table_item_is_row_selected): Removed this function. (eti_draw): Changed this so that if the ETableItem is in cursor-mode="row", the cursor is draw all the way across the row. (eti_cursor_move_up, eti_cursor_move_down): Commented these out since they're no longer used. (_do_tooltip, eti_event): Commented out tooltips. (eti_event): Made it so that we call the key_press function in the %ETableSelectionModel on each key press. * e-table-selection-model.c, e-table-selection-model.h: Documented. Added a function e_table_selection_model_key_press that does whatever behavior is correct for the user having pressed the given key. Changed the behavior of this to better match windows (use selection-mode="browse"). * e-table-specification.c, e-table-specification.h: Added a draw_focus variable. * e-table.c: Decide whether to draw the focus based on the ETableSpecification. Removed the argument for setting whether to draw the focus. svn path=/trunk/; revision=7673
This commit is contained in:
committed by
Chris Lahey
parent
50ef085e18
commit
7d1cbbaa10
@ -1288,7 +1288,7 @@ ethi_header_context_menu (ETableHeaderItem *ethi, GdkEventButton *event)
|
||||
info->ethi = ethi;
|
||||
info->col = ethi_find_col_by_x (ethi, event->x);
|
||||
col = e_table_header_get_column (ethi->eth, info->col);
|
||||
e_popup_menu_run (ethi_context_menu, event,
|
||||
e_popup_menu_run (ethi_context_menu, (GdkEvent *) event,
|
||||
1 +
|
||||
(col->sortable ? 0 : 2) +
|
||||
(ethi->table ? 0 : 4), 0, info);
|
||||
|
||||
@ -726,6 +726,17 @@ eti_table_model_row_deleted (ETableModel *table_model, int row, ETableItem *eti)
|
||||
gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_item_redraw_range
|
||||
* @eti: %ETableItem which will be redrawn
|
||||
* @start_col: The first col to redraw.
|
||||
* @start_row: The first row to redraw.
|
||||
* @end_col: The last col to redraw.
|
||||
* @end_row: The last row to redraw.
|
||||
*
|
||||
* This routine redraws the given %ETableItem in the range given. The
|
||||
* range is inclusive at both ends.
|
||||
*/
|
||||
void
|
||||
e_table_item_redraw_range (ETableItem *eti,
|
||||
int start_col, int start_row,
|
||||
@ -1166,7 +1177,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width,
|
||||
int f_x1, f_x2, f_y1, f_y2;
|
||||
gboolean f_found;
|
||||
double i2c [6];
|
||||
ArtPoint eti_base, eti_base_item;
|
||||
ArtPoint eti_base, eti_base_item, lower_right;
|
||||
GtkWidget *canvas = GTK_WIDGET(item->canvas);
|
||||
GdkColor *background;
|
||||
|
||||
@ -1187,6 +1198,10 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width,
|
||||
eti_base_item.y = eti->y1;
|
||||
art_affine_point (&eti_base, &eti_base_item, i2c);
|
||||
|
||||
eti_base_item.x = eti->x1 + eti->width;
|
||||
eti_base_item.y = eti->y1 + eti->height;
|
||||
art_affine_point (&lower_right, &eti_base_item, i2c);
|
||||
|
||||
/*
|
||||
* First column to draw, last column to draw
|
||||
*/
|
||||
@ -1327,12 +1342,27 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width,
|
||||
e_cell_draw (ecell_view, drawable, ecol->col_idx, col, row, flags,
|
||||
xd, yd, xd + ecol->width, yd + height);
|
||||
|
||||
if (view_to_model_col(eti, col) == cursor_col && view_to_model_row(eti, row) == cursor_row){
|
||||
f_x1 = xd;
|
||||
f_x2 = xd + ecol->width;
|
||||
f_y1 = yd;
|
||||
f_y2 = yd + height;
|
||||
f_found = TRUE;
|
||||
if (!f_found) {
|
||||
switch (eti->cursor_mode) {
|
||||
case E_TABLE_CURSOR_LINE:
|
||||
if (view_to_model_row(eti, row) == cursor_row) {
|
||||
f_x1 = floor (eti_base.x) - x;
|
||||
f_x2 = floor (lower_right.x) - x;
|
||||
f_y1 = yd;
|
||||
f_y2 = yd + height;
|
||||
f_found = TRUE;
|
||||
}
|
||||
break;
|
||||
case E_TABLE_CURSOR_SIMPLE:
|
||||
if (view_to_model_col(eti, col) == cursor_col && view_to_model_row(eti, row) == cursor_row) {
|
||||
f_x1 = xd;
|
||||
f_x2 = xd + ecol->width;
|
||||
f_y1 = yd;
|
||||
f_y2 = yd + height;
|
||||
f_found = TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
xd += ecol->width;
|
||||
@ -1367,7 +1397,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width,
|
||||
/*
|
||||
* Draw focus
|
||||
*/
|
||||
if (f_found && eti->draw_focus){
|
||||
if (eti->draw_focus && f_found) {
|
||||
gdk_gc_set_ts_origin (eti->focus_gc, f_x1, f_y1);
|
||||
gdk_draw_rectangle (drawable, eti->focus_gc, FALSE,
|
||||
f_x1, f_y1, f_x2 - f_x1 - 1, f_y2 - f_y1 - 1);
|
||||
@ -1470,6 +1500,7 @@ eti_cursor_move_right (ETableItem *eti)
|
||||
eti_cursor_move (eti, model_to_view_row(eti, cursor_row), model_to_view_col(eti, cursor_col) + 1);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void
|
||||
eti_cursor_move_up (ETableItem *eti)
|
||||
{
|
||||
@ -1493,7 +1524,9 @@ eti_cursor_move_down (ETableItem *eti)
|
||||
|
||||
eti_cursor_move (eti, model_to_view_row(eti, cursor_row) + 1, model_to_view_col(eti, cursor_col));
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
static int
|
||||
_do_tooltip (ETableItem *eti)
|
||||
{
|
||||
@ -1528,6 +1561,7 @@ _do_tooltip (ETableItem *eti)
|
||||
eti->tooltip);
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
static gint
|
||||
eti_e_cell_event (ETableItem *item, ECellView *ecell_view, GdkEvent *event, int time, int model_col, int view_col, int row, ECellFlags flags)
|
||||
@ -1731,11 +1765,13 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e)
|
||||
|
||||
if (eti->tooltip->timer > 0)
|
||||
gtk_timeout_remove (eti->tooltip->timer);
|
||||
#if 0
|
||||
eti->tooltip->col = col;
|
||||
eti->tooltip->row = row;
|
||||
eti->tooltip->cx = e->motion.x;
|
||||
eti->tooltip->cy = e->motion.y;
|
||||
eti->tooltip->timer = gtk_timeout_add (100, (GSourceFunc)_do_tooltip, eti);
|
||||
#endif
|
||||
|
||||
if (cursor_row == view_to_model_row(eti, row) && cursor_col == view_to_model_col(eti, col)){
|
||||
ecell_view = eti->cell_views [col];
|
||||
@ -1775,7 +1811,7 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e)
|
||||
break;
|
||||
}
|
||||
|
||||
if (cursor_col != view_to_model_col(eti, 0))
|
||||
if (eti->cursor_mode != E_TABLE_CURSOR_LINE && cursor_col != view_to_model_col(eti, 0))
|
||||
eti_cursor_move_left (eti);
|
||||
break;
|
||||
|
||||
@ -1785,10 +1821,15 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e)
|
||||
break;
|
||||
}
|
||||
|
||||
if (cursor_col != view_to_model_col(eti, eti->cols - 1))
|
||||
if (eti->cursor_mode != E_TABLE_CURSOR_LINE && cursor_col != view_to_model_col(eti, eti->cols - 1))
|
||||
eti_cursor_move_right (eti);
|
||||
break;
|
||||
|
||||
case GDK_Up:
|
||||
case GDK_Down:
|
||||
return_val = e_table_selection_model_key_press(eti->selection, (GdkEventKey *) e);
|
||||
break;
|
||||
#if 0
|
||||
case GDK_Up:
|
||||
if (cursor_row != view_to_model_row(eti, 0))
|
||||
eti_cursor_move_up (eti);
|
||||
@ -1802,7 +1843,7 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e)
|
||||
else
|
||||
return_val = FALSE;
|
||||
break;
|
||||
|
||||
#endif
|
||||
case GDK_Tab:
|
||||
case GDK_KP_Tab:
|
||||
case GDK_ISO_Left_Tab:
|
||||
@ -1851,9 +1892,11 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e)
|
||||
eti->editing_col, eti->editing_row, E_CELL_EDITING);
|
||||
#endif
|
||||
}
|
||||
return_val = FALSE;
|
||||
gtk_signal_emit (GTK_OBJECT (eti), eti_signals [KEY_PRESS],
|
||||
model_to_view_row(eti, cursor_row), cursor_col, e, &return_val);
|
||||
return_val = e_table_selection_model_key_press(eti->selection, (GdkEventKey *) e);
|
||||
if (!return_val) {
|
||||
gtk_signal_emit (GTK_OBJECT (eti), eti_signals [KEY_PRESS],
|
||||
model_to_view_row(eti, cursor_row), cursor_col, e, &return_val);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -1872,11 +1915,15 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e)
|
||||
if (!eti_editing (eti)){
|
||||
gtk_signal_emit (GTK_OBJECT (eti), eti_signals [KEY_PRESS],
|
||||
model_to_view_row(eti, cursor_row), cursor_col, e, &return_val);
|
||||
if (!return_val)
|
||||
e_table_selection_model_key_press(eti->selection, (GdkEventKey *) e);
|
||||
} else {
|
||||
ecell_view = eti->cell_views [eti->editing_col];
|
||||
return_val = eti_e_cell_event (eti, ecell_view, e, e->key.time,
|
||||
view_to_model_col(eti, eti->editing_col),
|
||||
eti->editing_col, eti->editing_row, E_CELL_EDITING);
|
||||
if (!return_val)
|
||||
e_table_selection_model_key_press(eti->selection, (GdkEventKey *) e);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -2031,6 +2078,14 @@ e_table_item_get_type (void)
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_item_set_cursor:
|
||||
* @eti: %ETableItem which will have the cursor set.
|
||||
* @col: Column to select. -1 means the last column.
|
||||
* @row: Row to select. -1 means the last row.
|
||||
*
|
||||
* This routine sets the cursor of the %ETableItem canvas item.
|
||||
*/
|
||||
void
|
||||
e_table_item_set_cursor (ETableItem *eti, int col, int row)
|
||||
{
|
||||
@ -2058,6 +2113,14 @@ e_table_item_focus (ETableItem *eti, int col, int row, GdkModifierType state)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_item_get_focused_column:
|
||||
* @eti: %ETableItem which will have the cursor retrieved.
|
||||
*
|
||||
* This routine gets the cursor of the %ETableItem canvas item.
|
||||
*
|
||||
* Returns: The current cursor column.
|
||||
*/
|
||||
gint
|
||||
e_table_item_get_focused_column (ETableItem *eti)
|
||||
{
|
||||
@ -2073,15 +2136,6 @@ e_table_item_get_focused_column (ETableItem *eti)
|
||||
return cursor_col;
|
||||
}
|
||||
|
||||
gboolean
|
||||
e_table_item_is_row_selected (ETableItem *eti, int row)
|
||||
{
|
||||
g_return_val_if_fail (eti != NULL, FALSE);
|
||||
g_return_val_if_fail (E_IS_TABLE_ITEM (eti), FALSE);
|
||||
|
||||
return e_table_selection_model_is_row_selected(eti->selection, row);
|
||||
}
|
||||
|
||||
static void
|
||||
eti_cursor_change (ETableSelectionModel *selection, int row, int col, ETableItem *eti)
|
||||
{
|
||||
@ -2110,6 +2164,16 @@ eti_selection_change (ETableSelectionModel *selection, ETableItem *eti)
|
||||
gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(eti));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* e_table_item_enter_edit
|
||||
* @eti: %ETableItem which will start being edited
|
||||
* @col: The view col to edit.
|
||||
* @row: The view row to edit.
|
||||
*
|
||||
* This routine starts the given %ETableItem editing at the given view
|
||||
* column and row.
|
||||
*/
|
||||
void
|
||||
e_table_item_enter_edit (ETableItem *eti, int col, int row)
|
||||
{
|
||||
@ -2125,6 +2189,12 @@ e_table_item_enter_edit (ETableItem *eti, int col, int row)
|
||||
eti->edit_ctx = e_cell_enter_edit (eti->cell_views [col], view_to_model_col(eti, col), col, row);
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_item_leave_edit
|
||||
* @eti: %ETableItem which will stop being edited
|
||||
*
|
||||
* This routine stops the given %ETableItem from editing.
|
||||
*/
|
||||
void
|
||||
e_table_item_leave_edit (ETableItem *eti)
|
||||
{
|
||||
@ -2150,6 +2220,20 @@ e_table_item_leave_edit (ETableItem *eti)
|
||||
col, row, edit_ctx);
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_item_enter_edit
|
||||
* @eti: %ETableItem to look in.
|
||||
* @x: A pointer to the x location to find in the %ETableItem.
|
||||
* @y: A pointer to the y location to find in the %ETableItem.
|
||||
* @row: A pointer to the location to store the found row in.
|
||||
* @col: A pointer to the location to store the found col in.
|
||||
*
|
||||
* This routine locates the pixel location (*x, *y) in the
|
||||
* %ETableItem. If that location is in the %ETableItem, *row and *col
|
||||
* are set to the view row and column where it was found. If that
|
||||
* location is not in the %ETableItem, the height of the %ETableItem
|
||||
* is removed from the value y points to.
|
||||
*/
|
||||
void
|
||||
e_table_item_compute_location (ETableItem *eti,
|
||||
int *x,
|
||||
@ -2448,6 +2532,15 @@ e_table_item_printable_destroy (GtkObject *object,
|
||||
g_free(itemcontext);
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_item_get_printable
|
||||
* @eti: %ETableItem which will be printed
|
||||
*
|
||||
* This routine creates and returns an %EPrintable that can be used to
|
||||
* print the given %ETableItem.
|
||||
*
|
||||
* Returns: The %EPrintable.
|
||||
*/
|
||||
EPrintable *
|
||||
e_table_item_get_printable (ETableItem *item)
|
||||
{
|
||||
|
||||
@ -104,43 +104,35 @@ typedef struct {
|
||||
gint (*click) (ETableItem *eti, int row, int col, GdkEvent *event);
|
||||
gint (*key_press) (ETableItem *eti, int row, int col, GdkEvent *event);
|
||||
} ETableItemClass;
|
||||
|
||||
GtkType e_table_item_get_type (void);
|
||||
GtkType e_table_item_get_type (void);
|
||||
|
||||
|
||||
/*
|
||||
* Focus
|
||||
*/
|
||||
void e_table_item_set_cursor (ETableItem *eti, int col, int row);
|
||||
void e_table_item_set_cursor (ETableItem *eti,
|
||||
int col,
|
||||
int row);
|
||||
|
||||
gint e_table_item_get_focused_column (ETableItem *eti);
|
||||
gint e_table_item_get_focused_column (ETableItem *eti);
|
||||
|
||||
/*
|
||||
* Handling the selection
|
||||
*/
|
||||
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_selected_row_foreach (ETableItem *eti,
|
||||
ETableForeachFunc func,
|
||||
gpointer closure);
|
||||
void e_table_item_redraw_range (ETableItem *eti,
|
||||
int start_col,
|
||||
int start_row,
|
||||
int end_col,
|
||||
int end_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);
|
||||
void e_table_item_compute_location (ETableItem *eti,
|
||||
int *x,
|
||||
int *y,
|
||||
int *row,
|
||||
int *col);
|
||||
EPrintable *e_table_item_get_printable (ETableItem *eti);
|
||||
void e_table_item_compute_location (ETableItem *eti,
|
||||
int *x,
|
||||
int *y,
|
||||
int *row,
|
||||
int *col);
|
||||
|
||||
|
||||
#endif /* _E_TABLE_ITEM_H_ */
|
||||
|
||||
@ -3,14 +3,15 @@
|
||||
* e-table-selection-model.c: a Table Selection Model
|
||||
*
|
||||
* Author:
|
||||
* Miguel de Icaza (miguel@gnu.org)
|
||||
* Christopher James Lahey <clahey@ximian.com>
|
||||
*
|
||||
* (C) 1999 Ximian, Inc.
|
||||
* (C) 2000, 2001 Ximian, Inc.
|
||||
*/
|
||||
#include <config.h>
|
||||
#include <gtk/gtksignal.h>
|
||||
#include "e-table-selection-model.h"
|
||||
#include "gal/util/e-util.h"
|
||||
#include <gdk/gdkkeysyms.h>
|
||||
|
||||
#define ETSM_CLASS(e) ((ETableSelectionModelClass *)((GtkObject *)e)->klass)
|
||||
|
||||
@ -306,12 +307,28 @@ e_table_selection_model_class_init (ETableSelectionModelClass *klass)
|
||||
E_MAKE_TYPE(e_table_selection_model, "ETableSelectionModel", ETableSelectionModel,
|
||||
e_table_selection_model_class_init, e_table_selection_model_init, PARENT_TYPE);
|
||||
|
||||
/**
|
||||
* e_table_selection_model_new
|
||||
*
|
||||
* This routine creates a new #ETableSelectionModel.
|
||||
*
|
||||
* Returns: The new #ETableSelectionModel.
|
||||
*/
|
||||
ETableSelectionModel *
|
||||
e_table_selection_model_new (void)
|
||||
{
|
||||
return gtk_type_new (e_table_selection_model_get_type ());
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_selection_model_is_row_selected
|
||||
* @selection: #ETableSelectionModel to check
|
||||
* @n: The row to check
|
||||
*
|
||||
* This routine calculates whether the given row is selected.
|
||||
*
|
||||
* Returns: %TRUE if the given row is selected
|
||||
*/
|
||||
gboolean
|
||||
e_table_selection_model_is_row_selected (ETableSelectionModel *selection,
|
||||
gint n)
|
||||
@ -322,6 +339,15 @@ e_table_selection_model_is_row_selected (ETableSelectionModel *selection,
|
||||
return (selection->selection[BOX(n)] >> OFFSET(n)) & 0x1;
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_selection_model_foreach
|
||||
* @selection: #ETableSelectionModel to traverse
|
||||
* @callback: The callback function to call back.
|
||||
* @closure: The closure
|
||||
*
|
||||
* This routine calls the given callback function once for each
|
||||
* selected row, passing closure as the closure.
|
||||
*/
|
||||
void
|
||||
e_table_selection_model_foreach (ETableSelectionModel *selection,
|
||||
ETableForeachFunc callback,
|
||||
@ -399,6 +425,8 @@ etsm_select_single_row (ETableSelectionModel *selection, int row)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
selection->selection_start_row = row;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -408,6 +436,7 @@ etsm_toggle_single_row (ETableSelectionModel *selection, int row)
|
||||
selection->selection[BOX(row)] &= ~BITMASK(row);
|
||||
else
|
||||
selection->selection[BOX(row)] |= BITMASK(row);
|
||||
selection->selection_start_row = row;
|
||||
gtk_signal_emit(GTK_OBJECT(selection),
|
||||
e_table_selection_model_signals [SELECTION_CHANGED]);
|
||||
}
|
||||
@ -434,7 +463,7 @@ etsm_move_selection_end (ETableSelectionModel *selection, int row)
|
||||
new_start = MIN (selection->selection_start_row, row);
|
||||
new_end = MAX (selection->selection_start_row, row) + 1;
|
||||
}
|
||||
/* This wouldn't work nearly so smoothly if one end of the selection weren'theld in place. */
|
||||
/* This wouldn't work nearly so smoothly if one end of the selection weren't held in place. */
|
||||
if (old_start < new_start)
|
||||
change_selection(selection, old_start, new_start, FALSE);
|
||||
if (new_start < old_start)
|
||||
@ -447,6 +476,24 @@ etsm_move_selection_end (ETableSelectionModel *selection, int row)
|
||||
e_table_selection_model_signals [SELECTION_CHANGED]);
|
||||
}
|
||||
|
||||
static void
|
||||
etsm_set_selection_end (ETableSelectionModel *selection, int row)
|
||||
{
|
||||
etsm_select_single_row(selection, selection->selection_start_row);
|
||||
selection->cursor_row = selection->selection_start_row;
|
||||
etsm_move_selection_end(selection, row);
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_selection_model_do_something
|
||||
* @selection: #ETableSelectionModel to do something to.
|
||||
* @row: The row to do something in.
|
||||
* @col: The col to do something in.
|
||||
* @state: The state in which to do something.
|
||||
*
|
||||
* This routine does whatever is appropriate as if the user clicked
|
||||
* the mouse in the given row and column.
|
||||
*/
|
||||
void
|
||||
e_table_selection_model_do_something (ETableSelectionModel *selection,
|
||||
guint row,
|
||||
@ -466,20 +513,18 @@ e_table_selection_model_do_something (ETableSelectionModel *selection,
|
||||
switch (selection->mode) {
|
||||
case GTK_SELECTION_SINGLE:
|
||||
etsm_select_single_row (selection, row);
|
||||
selection->selection_start_row = row;
|
||||
break;
|
||||
case GTK_SELECTION_BROWSE:
|
||||
case GTK_SELECTION_MULTIPLE:
|
||||
case GTK_SELECTION_EXTENDED:
|
||||
if (shift_p) {
|
||||
etsm_move_selection_end (selection, row);
|
||||
etsm_set_selection_end (selection, row);
|
||||
} else {
|
||||
if (ctrl_p) {
|
||||
etsm_toggle_single_row (selection, row);
|
||||
} else {
|
||||
etsm_select_single_row (selection, row);
|
||||
}
|
||||
selection->selection_start_row = row;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -493,10 +538,24 @@ e_table_selection_model_do_something (ETableSelectionModel *selection,
|
||||
}
|
||||
}
|
||||
|
||||
void e_table_selection_model_maybe_do_something (ETableSelectionModel *selection,
|
||||
guint row,
|
||||
guint col,
|
||||
GdkModifierType state)
|
||||
/**
|
||||
* e_table_selection_model_maybe_do_something
|
||||
* @selection: #ETableSelectionModel to do something to.
|
||||
* @row: The row to do something in.
|
||||
* @col: The col to do something in.
|
||||
* @state: The state in which to do something.
|
||||
*
|
||||
* If this row is selected, this routine just moves the cursor row and
|
||||
* column. Otherwise, it does the same thing as
|
||||
* e_table_selection_model_do_something(). This is for being used on
|
||||
* right clicks and other events where if the user hit the selection,
|
||||
* they don't want it to change.
|
||||
*/
|
||||
void
|
||||
e_table_selection_model_maybe_do_something (ETableSelectionModel *selection,
|
||||
guint row,
|
||||
guint col,
|
||||
GdkModifierType state)
|
||||
{
|
||||
if (e_table_selection_model_is_row_selected(selection, row)) {
|
||||
selection->cursor_row = row;
|
||||
@ -506,6 +565,85 @@ void e_table_selection_model_maybe_do_something (ETableSelectio
|
||||
}
|
||||
}
|
||||
|
||||
static gint
|
||||
move_selection (ETableSelectionModel *selection,
|
||||
gboolean up,
|
||||
GdkModifierType state)
|
||||
{
|
||||
int row = selection->cursor_row;
|
||||
int col = selection->cursor_col;
|
||||
|
||||
gint shift_p = state & GDK_SHIFT_MASK;
|
||||
gint ctrl_p = state & GDK_CONTROL_MASK;
|
||||
|
||||
row = e_table_sorter_model_to_sorted(selection->sorter, row);
|
||||
if (up)
|
||||
row--;
|
||||
else
|
||||
row++;
|
||||
if (row < 0 || row > selection->row_count)
|
||||
return FALSE;
|
||||
row = e_table_sorter_sorted_to_model(selection->sorter, row);
|
||||
|
||||
switch (selection->mode) {
|
||||
case GTK_SELECTION_BROWSE:
|
||||
if (shift_p) {
|
||||
etsm_set_selection_end (selection, row);
|
||||
} else if (!ctrl_p) {
|
||||
etsm_select_single_row (selection, row);
|
||||
}
|
||||
break;
|
||||
case GTK_SELECTION_SINGLE:
|
||||
case GTK_SELECTION_MULTIPLE:
|
||||
case GTK_SELECTION_EXTENDED:
|
||||
etsm_select_single_row (selection, row);
|
||||
break;
|
||||
}
|
||||
if (row != -1) {
|
||||
selection->cursor_row = row;
|
||||
gtk_signal_emit(GTK_OBJECT(selection),
|
||||
e_table_selection_model_signals[CURSOR_CHANGED], row, col);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_selection_model_key_press
|
||||
* @selection: #ETableSelectionModel to affect.
|
||||
* @key: The event.
|
||||
*
|
||||
* This routine does whatever is appropriate as if the user pressed
|
||||
* the given key.
|
||||
*
|
||||
* Returns: %TRUE if the #ETableSelectionModel used the key.
|
||||
*/
|
||||
gint
|
||||
e_table_selection_model_key_press (ETableSelectionModel *selection,
|
||||
GdkEventKey *key)
|
||||
{
|
||||
switch (key->keyval) {
|
||||
case GDK_Up:
|
||||
return move_selection(selection, TRUE, key->state);
|
||||
break;
|
||||
case GDK_Down:
|
||||
return move_selection(selection, FALSE, key->state);
|
||||
break;
|
||||
case GDK_space:
|
||||
if (selection->mode != GTK_SELECTION_SINGLE) {
|
||||
etsm_toggle_single_row (selection, selection->cursor_row);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_selection_model_clear
|
||||
* @selection: #ETableSelectionModel to clear
|
||||
*
|
||||
* This routine clears the selection to no rows selected.
|
||||
*/
|
||||
void
|
||||
e_table_selection_model_clear(ETableSelectionModel *selection)
|
||||
{
|
||||
@ -523,6 +661,14 @@ e_table_selection_model_clear(ETableSelectionModel *selection)
|
||||
#define PART(x,n) (((x) & (0x01010101 << n)) >> n)
|
||||
#define SECTION(x, n) (((x) >> (n * 8)) & 0xff)
|
||||
|
||||
/**
|
||||
* e_table_selection_model_selected_count
|
||||
* @selection: #ETableSelectionModel to count
|
||||
*
|
||||
* This routine calculates the number of rows selected.
|
||||
*
|
||||
* Returns: The number of rows selected in the given model.
|
||||
*/
|
||||
gint
|
||||
e_table_selection_model_selected_count (ETableSelectionModel *selection)
|
||||
{
|
||||
@ -549,6 +695,13 @@ e_table_selection_model_selected_count (ETableSelectionModel *selection)
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_selection_model_select_all
|
||||
* @selection: #ETableSelectionModel to select all
|
||||
*
|
||||
* This routine selects all the rows in the given
|
||||
* #ETableSelectionModel.
|
||||
*/
|
||||
void
|
||||
e_table_selection_model_select_all (ETableSelectionModel *selection)
|
||||
{
|
||||
@ -590,6 +743,13 @@ e_table_selection_model_select_all (ETableSelectionModel *selection)
|
||||
e_table_selection_model_signals [SELECTION_CHANGED]);
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_selection_model_invert_selection
|
||||
* @selection: #ETableSelectionModel to invert
|
||||
*
|
||||
* This routine inverts all the rows in the given
|
||||
* #ETableSelectionModel.
|
||||
*/
|
||||
void
|
||||
e_table_selection_model_invert_selection (ETableSelectionModel *selection)
|
||||
{
|
||||
|
||||
@ -48,28 +48,29 @@ typedef struct {
|
||||
|
||||
} ETableSelectionModelClass;
|
||||
|
||||
GtkType e_table_selection_model_get_type (void);
|
||||
GtkType e_table_selection_model_get_type (void);
|
||||
gboolean e_table_selection_model_is_row_selected (ETableSelectionModel *selection,
|
||||
gint n);
|
||||
void e_table_selection_model_foreach (ETableSelectionModel *selection,
|
||||
ETableForeachFunc callback,
|
||||
gpointer closure);
|
||||
|
||||
gboolean e_table_selection_model_is_row_selected (ETableSelectionModel *selection,
|
||||
gint n);
|
||||
void e_table_selection_model_foreach (ETableSelectionModel *selection,
|
||||
ETableForeachFunc callback,
|
||||
gpointer closure);
|
||||
void e_table_selection_model_do_something (ETableSelectionModel *selection,
|
||||
guint row,
|
||||
guint col,
|
||||
GdkModifierType state);
|
||||
void e_table_selection_model_maybe_do_something (ETableSelectionModel *selection,
|
||||
guint row,
|
||||
guint col,
|
||||
GdkModifierType state);
|
||||
gint e_table_selection_model_key_press (ETableSelectionModel *selection,
|
||||
GdkEventKey *key);
|
||||
void e_table_selection_model_clear (ETableSelectionModel *selection);
|
||||
gint e_table_selection_model_selected_count (ETableSelectionModel *selection);
|
||||
|
||||
void e_table_selection_model_do_something (ETableSelectionModel *selection,
|
||||
guint row,
|
||||
guint col,
|
||||
GdkModifierType state);
|
||||
void e_table_selection_model_maybe_do_something (ETableSelectionModel *selection,
|
||||
guint row,
|
||||
guint col,
|
||||
GdkModifierType state);
|
||||
void e_table_selection_model_clear (ETableSelectionModel *selection);
|
||||
gint e_table_selection_model_selected_count (ETableSelectionModel *selection);
|
||||
void e_table_selection_model_select_all (ETableSelectionModel *selection);
|
||||
void e_table_selection_model_invert_selection (ETableSelectionModel *selection);
|
||||
|
||||
void e_table_selection_model_select_all (ETableSelectionModel *selection);
|
||||
void e_table_selection_model_invert_selection (ETableSelectionModel *selection);
|
||||
|
||||
ETableSelectionModel *e_table_selection_model_new (void);
|
||||
ETableSelectionModel *e_table_selection_model_new (void);
|
||||
|
||||
#endif /* _E_TABLE_SELECTION_MODEL_H_ */
|
||||
|
||||
@ -62,6 +62,7 @@ etsp_init (ETableSpecification *etsp)
|
||||
etsp->no_headers = FALSE;
|
||||
etsp->click_to_add = FALSE;
|
||||
etsp->draw_grid = FALSE;
|
||||
etsp->draw_focus = TRUE;
|
||||
etsp->cursor_mode = E_TABLE_CURSOR_SIMPLE;
|
||||
etsp->selection_mode = GTK_SELECTION_MULTIPLE;
|
||||
|
||||
@ -158,6 +159,7 @@ e_table_specification_load_from_node (ETableSpecification *specification,
|
||||
specification->no_headers = e_xml_get_bool_prop_by_name (node, "no-headers");
|
||||
specification->click_to_add = e_xml_get_bool_prop_by_name (node, "click-to-add");
|
||||
specification->draw_grid = e_xml_get_bool_prop_by_name (node, "draw-grid");
|
||||
specification->draw_focus = e_xml_get_bool_prop_by_name_with_default (node, "draw-focus", TRUE);
|
||||
|
||||
specification->selection_mode = GTK_SELECTION_MULTIPLE;
|
||||
temp = e_xml_get_string_prop_by_name (node, "selection-mode");
|
||||
@ -293,6 +295,7 @@ e_table_specification_save_to_node (ETableSpecification *specification,
|
||||
e_xml_set_bool_prop_by_name (node, "no-headers", specification->no_headers);
|
||||
e_xml_set_bool_prop_by_name (node, "click-to-add", specification->click_to_add);
|
||||
e_xml_set_bool_prop_by_name (node, "draw-grid", specification->draw_grid);
|
||||
e_xml_set_bool_prop_by_name (node, "draw-focus", specification->draw_focus);
|
||||
|
||||
switch (specification->selection_mode){
|
||||
case GTK_SELECTION_SINGLE:
|
||||
|
||||
@ -23,6 +23,7 @@ typedef struct {
|
||||
guint no_headers : 1;
|
||||
guint click_to_add : 1;
|
||||
guint draw_grid : 1;
|
||||
guint draw_focus : 1;
|
||||
GtkSelectionMode selection_mode;
|
||||
ETableCursorMode cursor_mode;
|
||||
|
||||
|
||||
@ -64,7 +64,6 @@ enum {
|
||||
|
||||
enum {
|
||||
ARG_0,
|
||||
ARG_TABLE_DRAW_FOCUS,
|
||||
ARG_LENGTH_THRESHOLD,
|
||||
};
|
||||
|
||||
@ -944,6 +943,7 @@ et_real_construct (ETable *e_table, ETableModel *etm, ETableExtras *ete,
|
||||
e_table->use_click_to_add = specification->click_to_add;
|
||||
e_table->click_to_add_message = g_strdup (gettext (specification->click_to_add_message));
|
||||
e_table->draw_grid = specification->draw_grid;
|
||||
e_table->draw_focus = specification->draw_focus;
|
||||
e_table->cursor_mode = specification->cursor_mode;
|
||||
e_table->full_header = et_spec_to_full_header(e_table, specification, ete);
|
||||
|
||||
@ -1344,11 +1344,8 @@ e_table_get_printable (ETable *e_table)
|
||||
static void
|
||||
et_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
|
||||
{
|
||||
ETable *etable = E_TABLE (o);
|
||||
|
||||
switch (arg_id){
|
||||
case ARG_TABLE_DRAW_FOCUS:
|
||||
GTK_VALUE_BOOL (*arg) = etable->draw_focus;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1373,14 +1370,6 @@ et_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
|
||||
}
|
||||
break;
|
||||
|
||||
case ARG_TABLE_DRAW_FOCUS:
|
||||
etable->draw_focus = GTK_VALUE_BOOL (*arg);
|
||||
if (etable->group) {
|
||||
gnome_canvas_item_set (GNOME_CANVAS_ITEM(etable->group),
|
||||
"drawfocus", GTK_VALUE_BOOL (*arg),
|
||||
NULL);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2189,11 +2178,8 @@ e_table_class_init (GtkObjectClass *object_class)
|
||||
gtk_marshal_NONE__POINTER_POINTER,
|
||||
GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
|
||||
|
||||
gtk_object_add_arg_type ("ETable::drawfocus", GTK_TYPE_BOOL,
|
||||
GTK_ARG_READWRITE, ARG_TABLE_DRAW_FOCUS);
|
||||
gtk_object_add_arg_type ("ETable::length_threshold", GTK_TYPE_INT,
|
||||
GTK_ARG_WRITABLE, ARG_LENGTH_THRESHOLD);
|
||||
}
|
||||
|
||||
E_MAKE_TYPE(e_table, "ETable", ETable, e_table_class_init, e_table_init, PARENT_TYPE);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user