Don't draw or interact with the popup button if a cell isn't editable
2002-06-14 Christopher James Lahey <clahey@ximian.com> * e-cell-popup.c (ecp_draw, ecp_event): Don't draw or interact with the popup button if a cell isn't editable (based on a patch by JPR.) * e-table-col.c, e-table-col.h: Added the compare_col field to this structure. Added a GtkArg to set it. * e-table-column-specification.c, e-table-column-specification.h: Added the compare_col field here. Made it load properly from xml. * e-table-sorting-utils.c: Sort based on the compare_col in the ETableCol instead of the col_idx. * e-table-utils.c (et_col_spec_to_col): Set the compare_col field in the ETableCol properly. * e-table.c, e-table.h: Removed the drag_get_data_row and drag_get_data_col fields since they're not used any longer. (e_table_construct): If specification loading fails, return a NULL ETable instead of just ignoring it. (e_table_drag_highlight): Only destroy table->drop_highlight if it exists. svn path=/trunk/; revision=17190
This commit is contained in:

committed by
Chris Lahey

parent
c397a95d08
commit
bfccd5b470
@ -264,17 +264,18 @@ ecp_draw (ECellView *ecv, GdkDrawable *drawable,
|
|||||||
GtkWidget *canvas = GTK_WIDGET (GNOME_CANVAS_ITEM (ecv->e_table_item_view)->canvas);
|
GtkWidget *canvas = GTK_WIDGET (GNOME_CANVAS_ITEM (ecv->e_table_item_view)->canvas);
|
||||||
GtkShadowType shadow;
|
GtkShadowType shadow;
|
||||||
GdkRectangle rect;
|
GdkRectangle rect;
|
||||||
gboolean show_popup_arrow = FALSE;
|
gboolean show_popup_arrow;
|
||||||
|
|
||||||
/* Display the popup arrow if we are the cursor cell, or the popup
|
/* Display the popup arrow if we are the cursor cell, or the popup
|
||||||
is shown for this cell. */
|
is shown for this cell. */
|
||||||
if (flags & E_CELL_CURSOR) {
|
show_popup_arrow = e_table_model_is_cell_editable (ecv->e_table_model, model_col, row) &&
|
||||||
show_popup_arrow = TRUE;
|
(flags & E_CELL_CURSOR ||
|
||||||
ecp->popup_arrow_shown = TRUE;
|
(ecp->popup_shown && ecp->popup_view_col == view_col
|
||||||
} else if (ecp->popup_shown && ecp->popup_view_col == view_col
|
&& ecp->popup_row == row
|
||||||
&& ecp->popup_row == row && ecp->popup_model == ((ECellView *) ecp_view)->e_table_model) {
|
&& ecp->popup_model == ((ECellView *) ecp_view)->e_table_model));
|
||||||
show_popup_arrow = TRUE;
|
|
||||||
}
|
if (flags & E_CELL_CURSOR)
|
||||||
|
ecp->popup_arrow_shown = show_popup_arrow;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
g_print ("In ecp_draw row:%i col: %i %i,%i %i,%i Show Arrow:%i\n",
|
g_print ("In ecp_draw row:%i col: %i %i,%i %i,%i Show Arrow:%i\n",
|
||||||
@ -329,7 +330,8 @@ ecp_event (ECellView *ecv, GdkEvent *event, int model_col, int view_col,
|
|||||||
|
|
||||||
switch (event->type) {
|
switch (event->type) {
|
||||||
case GDK_BUTTON_PRESS:
|
case GDK_BUTTON_PRESS:
|
||||||
if (flags & E_CELL_CURSOR
|
if (e_table_model_is_cell_editable (ecv->e_table_model, model_col, row) &&
|
||||||
|
flags & E_CELL_CURSOR
|
||||||
&& ecp->popup_arrow_shown) {
|
&& ecp->popup_arrow_shown) {
|
||||||
width = e_table_header_col_diff (eti->header, view_col,
|
width = e_table_header_col_diff (eti->header, view_col,
|
||||||
view_col + 1);
|
view_col + 1);
|
||||||
@ -344,10 +346,9 @@ ecp_event (ECellView *ecv, GdkEvent *event, int model_col, int view_col,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GDK_BUTTON_RELEASE:
|
|
||||||
break;
|
|
||||||
case GDK_KEY_PRESS:
|
case GDK_KEY_PRESS:
|
||||||
if (event->key.state & GDK_MOD1_MASK
|
if (e_table_model_is_cell_editable (ecv->e_table_model, model_col, row) &&
|
||||||
|
event->key.state & GDK_MOD1_MASK
|
||||||
&& event->key.keyval == GDK_Down) {
|
&& event->key.keyval == GDK_Down) {
|
||||||
g_print ("## Alt-Down pressed\n");
|
g_print ("## Alt-Down pressed\n");
|
||||||
return e_cell_popup_do_popup (ecp_view, event, row, view_col);
|
return e_cell_popup_do_popup (ecp_view, event, row, view_col);
|
||||||
|
@ -34,7 +34,8 @@ static GtkObjectClass *parent_class;
|
|||||||
|
|
||||||
enum {
|
enum {
|
||||||
ARG_0,
|
ARG_0,
|
||||||
ARG_SORTABLE
|
ARG_SORTABLE,
|
||||||
|
ARG_COMPARE_COL
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -62,6 +63,9 @@ etc_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
|
|||||||
case ARG_SORTABLE:
|
case ARG_SORTABLE:
|
||||||
etc->sortable = GTK_VALUE_BOOL(*arg);
|
etc->sortable = GTK_VALUE_BOOL(*arg);
|
||||||
break;
|
break;
|
||||||
|
case ARG_COMPARE_COL:
|
||||||
|
etc->compare_col = GTK_VALUE_INT(*arg);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,6 +78,9 @@ etc_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
|
|||||||
case ARG_SORTABLE:
|
case ARG_SORTABLE:
|
||||||
GTK_VALUE_BOOL(*arg) = etc->sortable;
|
GTK_VALUE_BOOL(*arg) = etc->sortable;
|
||||||
break;
|
break;
|
||||||
|
case ARG_COMPARE_COL:
|
||||||
|
GTK_VALUE_INT(*arg) = etc->compare_col;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
arg->type = GTK_TYPE_INVALID;
|
arg->type = GTK_TYPE_INVALID;
|
||||||
break;
|
break;
|
||||||
@ -90,6 +97,8 @@ e_table_col_class_init (GtkObjectClass *object_class)
|
|||||||
|
|
||||||
gtk_object_add_arg_type ("ETableCol::sortable",
|
gtk_object_add_arg_type ("ETableCol::sortable",
|
||||||
GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SORTABLE);
|
GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SORTABLE);
|
||||||
|
gtk_object_add_arg_type ("ETableCol::compare_col",
|
||||||
|
GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_COMPARE_COL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -148,6 +157,7 @@ e_table_col_new (int col_idx, const char *text, double expansion, int min_width,
|
|||||||
etc->is_pixbuf = FALSE;
|
etc->is_pixbuf = FALSE;
|
||||||
|
|
||||||
etc->col_idx = col_idx;
|
etc->col_idx = col_idx;
|
||||||
|
etc->compare_col = col_idx;
|
||||||
etc->text = g_strdup (text);
|
etc->text = g_strdup (text);
|
||||||
etc->pixbuf = NULL;
|
etc->pixbuf = NULL;
|
||||||
etc->expansion = expansion;
|
etc->expansion = expansion;
|
||||||
@ -208,6 +218,7 @@ e_table_col_new_with_pixbuf (int col_idx, const char *text, GdkPixbuf *pixbuf, d
|
|||||||
etc->is_pixbuf = TRUE;
|
etc->is_pixbuf = TRUE;
|
||||||
|
|
||||||
etc->col_idx = col_idx;
|
etc->col_idx = col_idx;
|
||||||
|
etc->compare_col = col_idx;
|
||||||
etc->text = g_strdup(text);
|
etc->text = g_strdup(text);
|
||||||
etc->pixbuf = pixbuf;
|
etc->pixbuf = pixbuf;
|
||||||
etc->expansion = expansion;
|
etc->expansion = expansion;
|
||||||
|
@ -63,6 +63,7 @@ typedef struct {
|
|||||||
unsigned int sortable:1;
|
unsigned int sortable:1;
|
||||||
unsigned int groupable:1;
|
unsigned int groupable:1;
|
||||||
int col_idx;
|
int col_idx;
|
||||||
|
int compare_col;
|
||||||
int priority;
|
int priority;
|
||||||
|
|
||||||
GtkJustification justification;
|
GtkJustification justification;
|
||||||
|
@ -66,6 +66,7 @@ static void
|
|||||||
etcs_init (ETableColumnSpecification *specification)
|
etcs_init (ETableColumnSpecification *specification)
|
||||||
{
|
{
|
||||||
specification->model_col = 0;
|
specification->model_col = 0;
|
||||||
|
specification->compare_col = 0;
|
||||||
specification->title = g_strdup("");
|
specification->title = g_strdup("");
|
||||||
specification->pixbuf = NULL;
|
specification->pixbuf = NULL;
|
||||||
|
|
||||||
@ -97,6 +98,7 @@ e_table_column_specification_load_from_node (ETableColumnSpecification *etcs,
|
|||||||
free_strings(etcs);
|
free_strings(etcs);
|
||||||
|
|
||||||
etcs->model_col = e_xml_get_integer_prop_by_name (node, "model_col");
|
etcs->model_col = e_xml_get_integer_prop_by_name (node, "model_col");
|
||||||
|
etcs->compare_col = e_xml_get_integer_prop_by_name_with_default (node, "compare_col", etcs->model_col);
|
||||||
etcs->title = e_xml_get_string_prop_by_name (node, "_title");
|
etcs->title = e_xml_get_string_prop_by_name (node, "_title");
|
||||||
etcs->pixbuf = e_xml_get_string_prop_by_name (node, "pixbuf");
|
etcs->pixbuf = e_xml_get_string_prop_by_name (node, "pixbuf");
|
||||||
|
|
||||||
@ -125,6 +127,8 @@ e_table_column_specification_save_to_node (ETableColumnSpecification *specificat
|
|||||||
node = xmlNewNode(NULL, "ETableColumn");
|
node = xmlNewNode(NULL, "ETableColumn");
|
||||||
|
|
||||||
e_xml_set_integer_prop_by_name(node, "model_col", specification->model_col);
|
e_xml_set_integer_prop_by_name(node, "model_col", specification->model_col);
|
||||||
|
if (specification->compare_col != specification->model_col)
|
||||||
|
e_xml_set_integer_prop_by_name(node, "compare_col", specification->compare_col);
|
||||||
e_xml_set_string_prop_by_name(node, "_title", specification->title);
|
e_xml_set_string_prop_by_name(node, "_title", specification->title);
|
||||||
e_xml_set_string_prop_by_name(node, "pixbuf", specification->pixbuf);
|
e_xml_set_string_prop_by_name(node, "pixbuf", specification->pixbuf);
|
||||||
|
|
||||||
|
@ -42,6 +42,7 @@ extern "C" {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
GtkObject base;
|
GtkObject base;
|
||||||
int model_col;
|
int model_col;
|
||||||
|
int compare_col;
|
||||||
char *title;
|
char *title;
|
||||||
char *pixbuf;
|
char *pixbuf;
|
||||||
|
|
||||||
|
@ -43,8 +43,8 @@ etsu_compare(ETableModel *source, ETableSortInfo *sort_info, ETableHeader *full_
|
|||||||
col = e_table_header_get_column_by_col_idx(full_header, column.column);
|
col = e_table_header_get_column_by_col_idx(full_header, column.column);
|
||||||
if (col == NULL)
|
if (col == NULL)
|
||||||
col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
|
col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
|
||||||
comp_val = (*col->compare)(e_table_model_value_at (source, col->col_idx, row1),
|
comp_val = (*col->compare)(e_table_model_value_at (source, col->compare_col, row1),
|
||||||
e_table_model_value_at (source, col->col_idx, row2));
|
e_table_model_value_at (source, col->compare_col, row2));
|
||||||
ascending = column.ascending;
|
ascending = column.ascending;
|
||||||
if (comp_val != 0)
|
if (comp_val != 0)
|
||||||
break;
|
break;
|
||||||
@ -133,7 +133,7 @@ e_table_sorting_utils_sort(ETableModel *source, ETableSortInfo *sort_info, ETabl
|
|||||||
if (col == NULL)
|
if (col == NULL)
|
||||||
col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
|
col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
|
||||||
for (i = 0; i < rows; i++) {
|
for (i = 0; i < rows; i++) {
|
||||||
closure.vals[map_table[i] * cols + j] = e_table_model_value_at (source, col->col_idx, map_table[i]);
|
closure.vals[map_table[i] * cols + j] = e_table_model_value_at (source, col->compare_col, map_table[i]);
|
||||||
}
|
}
|
||||||
closure.compare[j] = col->compare;
|
closure.compare[j] = col->compare;
|
||||||
closure.ascending[j] = column.ascending;
|
closure.ascending[j] = column.ascending;
|
||||||
@ -167,7 +167,7 @@ e_table_sorting_utils_affects_sort (ETableSortInfo *sort_info,
|
|||||||
tablecol = e_table_header_get_column_by_col_idx(full_header, column.column);
|
tablecol = e_table_header_get_column_by_col_idx(full_header, column.column);
|
||||||
if (tablecol == NULL)
|
if (tablecol == NULL)
|
||||||
tablecol = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
|
tablecol = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
|
||||||
if (col == tablecol->col_idx)
|
if (col == tablecol->compare_col)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -229,8 +229,8 @@ etsu_tree_compare(ETreeModel *source, ETableSortInfo *sort_info, ETableHeader *f
|
|||||||
col = e_table_header_get_column_by_col_idx(full_header, column.column);
|
col = e_table_header_get_column_by_col_idx(full_header, column.column);
|
||||||
if (col == NULL)
|
if (col == NULL)
|
||||||
col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
|
col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
|
||||||
comp_val = (*col->compare)(e_tree_model_value_at (source, path1, col->col_idx),
|
comp_val = (*col->compare)(e_tree_model_value_at (source, path1, col->compare_col),
|
||||||
e_tree_model_value_at (source, path2, col->col_idx));
|
e_tree_model_value_at (source, path2, col->compare_col));
|
||||||
ascending = column.ascending;
|
ascending = column.ascending;
|
||||||
if (comp_val != 0)
|
if (comp_val != 0)
|
||||||
break;
|
break;
|
||||||
@ -281,7 +281,7 @@ e_table_sorting_utils_tree_sort(ETreeModel *source, ETableSortInfo *sort_info, E
|
|||||||
col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
|
col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
closure.vals[i * cols + j] = e_tree_model_value_at (source, map_table[i], col->col_idx);
|
closure.vals[i * cols + j] = e_tree_model_value_at (source, map_table[i], col->compare_col);
|
||||||
}
|
}
|
||||||
closure.ascending[j] = column.ascending;
|
closure.ascending[j] = column.ascending;
|
||||||
closure.compare[j] = col->compare;
|
closure.compare[j] = col->compare;
|
||||||
|
@ -112,6 +112,10 @@ et_col_spec_to_col (ETableColumnSpecification *col_spec,
|
|||||||
|
|
||||||
g_free (title);
|
g_free (title);
|
||||||
}
|
}
|
||||||
|
if (col && col_spec->compare_col != col_spec->model_col)
|
||||||
|
gtk_object_set (GTK_OBJECT (col),
|
||||||
|
"compare_col", col_spec->compare_col,
|
||||||
|
NULL);
|
||||||
return col;
|
return col;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -489,8 +489,6 @@ e_table_init (GtkObject *object)
|
|||||||
e_table->click_to_add_message = NULL;
|
e_table->click_to_add_message = NULL;
|
||||||
e_table->domain = NULL;
|
e_table->domain = NULL;
|
||||||
|
|
||||||
e_table->drag_get_data_row = -1;
|
|
||||||
e_table->drag_get_data_col = -1;
|
|
||||||
e_table->drop_row = -1;
|
e_table->drop_row = -1;
|
||||||
e_table->drop_col = -1;
|
e_table->drop_col = -1;
|
||||||
e_table->site = NULL;
|
e_table->site = NULL;
|
||||||
@ -1519,7 +1517,10 @@ e_table_construct (ETable *e_table, ETableModel *etm, ETableExtras *ete,
|
|||||||
g_return_val_if_fail(spec_str != NULL, NULL);
|
g_return_val_if_fail(spec_str != NULL, NULL);
|
||||||
|
|
||||||
specification = e_table_specification_new();
|
specification = e_table_specification_new();
|
||||||
e_table_specification_load_from_string(specification, spec_str);
|
if (!e_table_specification_load_from_string(specification, spec_str)) {
|
||||||
|
gtk_object_unref(GTK_OBJECT(specification));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
if (state_str) {
|
if (state_str) {
|
||||||
state = e_table_state_new();
|
state = e_table_state_new();
|
||||||
e_table_state_load_from_string(state, state_str);
|
e_table_state_load_from_string(state, state_str);
|
||||||
@ -2338,8 +2339,6 @@ e_table_drag_get_data (ETable *table,
|
|||||||
g_return_if_fail(table != NULL);
|
g_return_if_fail(table != NULL);
|
||||||
g_return_if_fail(E_IS_TABLE(table));
|
g_return_if_fail(E_IS_TABLE(table));
|
||||||
|
|
||||||
table->drag_get_data_row = row;
|
|
||||||
table->drag_get_data_col = col;
|
|
||||||
gtk_drag_get_data(GTK_WIDGET(table),
|
gtk_drag_get_data(GTK_WIDGET(table),
|
||||||
context,
|
context,
|
||||||
target,
|
target,
|
||||||
@ -2392,8 +2391,10 @@ e_table_drag_highlight (ETable *table,
|
|||||||
"y2", (double) y + height - 1,
|
"y2", (double) y + height - 1,
|
||||||
NULL);
|
NULL);
|
||||||
} else {
|
} else {
|
||||||
gtk_object_destroy (GTK_OBJECT (table->drop_highlight));
|
if (table->drop_highlight) {
|
||||||
table->drop_highlight = NULL;
|
gtk_object_destroy (GTK_OBJECT (table->drop_highlight));
|
||||||
|
table->drop_highlight = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,9 +140,6 @@ typedef struct {
|
|||||||
|
|
||||||
ECursorMode cursor_mode;
|
ECursorMode cursor_mode;
|
||||||
|
|
||||||
int drag_get_data_row;
|
|
||||||
int drag_get_data_col;
|
|
||||||
|
|
||||||
int drop_row;
|
int drop_row;
|
||||||
int drop_col;
|
int drop_col;
|
||||||
GnomeCanvasItem *drop_highlight;
|
GnomeCanvasItem *drop_highlight;
|
||||||
|
Reference in New Issue
Block a user