diff options
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/table/e-cell-text.c | 3 | ||||
-rw-r--r-- | widgets/table/e-table-item.c | 123 | ||||
-rw-r--r-- | widgets/table/e-table-tooltip.h | 2 | ||||
-rw-r--r-- | widgets/table/e-tree.c | 6 | ||||
-rw-r--r-- | widgets/table/e-tree.h | 1 |
5 files changed, 112 insertions, 23 deletions
diff --git a/widgets/table/e-cell-text.c b/widgets/table/e-cell-text.c index 1ad50921e3..5136c4e8fc 100644 --- a/widgets/table/e-cell-text.c +++ b/widgets/table/e-cell-text.c @@ -1218,7 +1218,7 @@ ect_show_tooltip (ECellView *ecell_view, "y1", (double) 0.0, "x2", (double) max_width + 4, "y2", (double) text_height, - "fill_color", "light gray", + "fill_color_gdk", tooltip->background, NULL); tooltip_text = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (canvas)), @@ -1227,6 +1227,7 @@ ect_show_tooltip (ECellView *ecell_view, /* "font_gdk", text_view->font, */ "bold", (gboolean) ect->bold_column >= 0 && e_table_model_value_at(ecell_view->e_table_model, ect->bold_column, row), "strikeout", (gboolean) ect->strikeout_column >= 0 && e_table_model_value_at(ecell_view->e_table_model, ect->strikeout_column, row), + "fill_color_gdk", tooltip->foreground, "text", cell.text, "editable", FALSE, "clip_width", max_width, diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c index 85fab6bd64..438c1050a4 100644 --- a/widgets/table/e-table-item.c +++ b/widgets/table/e-table-item.c @@ -141,7 +141,7 @@ view_to_model_col(ETableItem *eti, int col) return ecol ? ecol->col_idx : -1; } -static gboolean +inline static gboolean eti_editing (ETableItem *eti) { if (eti->editing_col == -1) @@ -150,6 +150,60 @@ eti_editing (ETableItem *eti) return TRUE; } +inline static GdkColor * +eti_get_cell_background_color (ETableItem *eti, int row, int col, gboolean selected, gboolean *allocated) +{ + GtkWidget *canvas = GTK_WIDGET(GNOME_CANVAS_ITEM(eti)->canvas); + GdkColor *background; + + if (allocated) + *allocated = FALSE; + + if (selected){ + if (GTK_WIDGET_HAS_FOCUS(canvas)) + background = &canvas->style->bg [GTK_STATE_SELECTED]; + else + background = &canvas->style->bg [GTK_STATE_ACTIVE]; + } else { + background = &canvas->style->base [GTK_STATE_NORMAL]; + } + +#ifdef ALTERNATE_COLORS + if (row % 2) { + + } else { + if (allocated) + *allocated = TRUE; + background = gdk_color_copy (background); + e_hsv_tweak (background, 0.0f, 0.0f, -0.05f); + gdk_color_alloc (gtk_widget_get_colormap (GTK_WIDGET (canvas)), background); + } +#endif + + return background; +} + +inline static GdkColor * +eti_get_cell_foreground_color (ETableItem *eti, int row, int col, gboolean selected, gboolean *allocated) +{ + GtkWidget *canvas = GTK_WIDGET(GNOME_CANVAS_ITEM(eti)->canvas); + GdkColor *foreground; + + if (allocated) + *allocated = FALSE; + + if (selected){ + if (GTK_WIDGET_HAS_FOCUS (canvas)) + foreground = &canvas->style->text [GTK_STATE_SELECTED]; + else + foreground = &canvas->style->text [GTK_STATE_ACTIVE]; + } else { + foreground = &canvas->style->text [GTK_STATE_NORMAL]; + } + + return foreground; +} + /* * During realization, we have to invoke the per-ecell realize routine * (On our current setup, we have one e-cell per column. @@ -965,6 +1019,10 @@ eti_destroy (GtkObject *object) eti->height_cache_idle_count = 0; e_canvas_hide_tooltip (E_CANVAS(GNOME_CANVAS_ITEM(eti)->canvas)); + if (eti->tooltip->background) + gdk_color_free (eti->tooltip->background); + if (eti->tooltip->foreground) + gdk_color_free (eti->tooltip->foreground); if (eti->tooltip->timer) { gtk_timeout_remove (eti->tooltip->timer); eti->tooltip->timer = 0; @@ -1111,6 +1169,8 @@ eti_init (GnomeCanvasItem *item) eti->tooltip = g_new0 (ETableTooltip, 1); eti->tooltip->timer = 0; eti->tooltip->eti = GNOME_CANVAS_ITEM (eti); + eti->tooltip->background = NULL; + eti->tooltip->foreground = NULL; eti->grabbed_col = -1; eti->grabbed_row = -1; @@ -1315,7 +1375,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, ECellView *ecell_view = eti->cell_views [col]; gboolean col_selected = selected; ECellFlags flags; - gboolean free_background = FALSE; + gboolean free_background; GdkColor *background; switch (eti->cursor_mode) { @@ -1329,25 +1389,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, break; } - if (col_selected){ - if (GTK_WIDGET_HAS_FOCUS(canvas)) - background = &canvas->style->bg [GTK_STATE_SELECTED]; - else - background = &canvas->style->bg [GTK_STATE_ACTIVE]; - } else { - background = &canvas->style->base [GTK_STATE_NORMAL]; - } - -#ifdef ALTERNATE_COLORS - if (row % 2) { - - } else { - free_background = TRUE; - background = gdk_color_copy (background); - e_hsv_tweak (background, 0.0f, 0.0f, -0.05f); - gdk_color_alloc (gtk_widget_get_colormap (GTK_WIDGET (canvas)), background); - } -#endif + background = eti_get_cell_background_color (eti, row, col, col_selected, &free_background); gdk_gc_set_foreground (eti->fill_gc, background); gdk_draw_rectangle (drawable, eti->fill_gc, TRUE, @@ -1547,6 +1589,10 @@ _do_tooltip (ETableItem *eti) int x = 0, y = 0; int i; int height_extra = eti->horizontal_draw_grid ? 1 : 0; + gboolean free_color; + ETableCol *ecol; + gboolean selected; + int cursor_row, cursor_col; e_canvas_hide_tooltip (E_CANVAS(GNOME_CANVAS_ITEM(eti)->canvas)); @@ -1564,6 +1610,39 @@ _do_tooltip (ETableItem *eti) eti->tooltip->y = y; eti->tooltip->row_height = ETI_ROW_HEIGHT (eti, i); + selected = e_selection_model_is_row_selected(E_SELECTION_MODEL (eti->selection), view_to_model_row(eti,eti->tooltip->row)); + + if (eti->tooltip->foreground) + gdk_color_free (eti->tooltip->foreground); + if (eti->tooltip->background) + gdk_color_free (eti->tooltip->background); + + switch (eti->cursor_mode) { + case E_CURSOR_SIMPLE: + case E_CURSOR_SPREADSHEET: + ecol = e_table_header_get_column (eti->header, eti->tooltip->col); + + gtk_object_get(GTK_OBJECT(eti->selection), + "cursor_row", &cursor_row, + "cursor_col", &cursor_col, + NULL); + + if (cursor_col == ecol->col_idx && cursor_row == view_to_model_row(eti, eti->tooltip->row)) + selected = !selected; + break; + case E_CURSOR_LINE: + /* Nothing */ + break; + } + + eti->tooltip->background = eti_get_cell_background_color (eti, eti->tooltip->row, eti->tooltip->col, selected, &free_color); + if (!free_color) + eti->tooltip->background = gdk_color_copy(eti->tooltip->background); + + eti->tooltip->foreground = eti_get_cell_foreground_color (eti, eti->tooltip->row, eti->tooltip->col, selected, &free_color); + if (!free_color) + eti->tooltip->foreground = gdk_color_copy(eti->tooltip->foreground); + e_cell_show_tooltip (ecell_view, view_to_model_col (eti, eti->tooltip->col), eti->tooltip->col, @@ -1650,7 +1729,7 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) "cursor_row", &cursor_row, "cursor_col", &cursor_col, NULL); - + if (cursor_row == view_to_model_row(eti, row) && cursor_col == view_to_model_col(eti, col)){ if ((!eti_editing(eti)) && e_table_model_is_cell_editable(eti->table_model, col, row)) { diff --git a/widgets/table/e-table-tooltip.h b/widgets/table/e-table-tooltip.h index 617a0e3b55..259d6398db 100644 --- a/widgets/table/e-table-tooltip.h +++ b/widgets/table/e-table-tooltip.h @@ -12,6 +12,8 @@ typedef struct { int row_height; int x, y; int cx, cy; + GdkColor *foreground; + GdkColor *background; GnomeCanvasItem *eti; } ETableTooltip; diff --git a/widgets/table/e-tree.c b/widgets/table/e-tree.c index 4a81390783..358d7a22b1 100644 --- a/widgets/table/e-tree.c +++ b/widgets/table/e-tree.c @@ -1391,6 +1391,12 @@ e_tree_row_count (ETree *et) return e_table_model_row_count (E_TABLE_MODEL(et->priv->etta)); } +GtkWidget * +e_tree_get_tooltip (ETree *et) +{ + return E_CANVAS(et->priv->table_canvas)->tooltip_window; +} + struct _ETreeDragSourceSite { GdkModifierType start_button_mask; diff --git a/widgets/table/e-tree.h b/widgets/table/e-tree.h index 6c4066a047..5559908e97 100644 --- a/widgets/table/e-tree.h +++ b/widgets/table/e-tree.h @@ -248,6 +248,7 @@ void e_tree_save_expanded_state (ETree *et, char *filename); void e_tree_load_expanded_state (ETree *et, char *filename); int e_tree_row_count (ETree *et); +GtkWidget *e_tree_get_tooltip (ETree *et); END_GNOME_DECLS |