aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/table/e-table-header-item.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/table/e-table-header-item.c')
-rw-r--r--widgets/table/e-table-header-item.c197
1 files changed, 35 insertions, 162 deletions
diff --git a/widgets/table/e-table-header-item.c b/widgets/table/e-table-header-item.c
index 14ac50f5aa..932846b6a0 100644
--- a/widgets/table/e-table-header-item.c
+++ b/widgets/table/e-table-header-item.c
@@ -21,6 +21,7 @@
#include "gal/widgets/e-popup-menu.h"
#include "e-table-header.h"
#include "e-table-header-item.h"
+#include "e-table-header-utils.h"
#include "e-table-col-dnd.h"
#include "e-table-defines.h"
#include "e-table-field-chooser-dialog.h"
@@ -102,6 +103,7 @@ e_table_header_item_get_height (ETableHeaderItem *ethi)
ETableHeader *eth;
int numcols, col;
int maxheight;
+ GtkStyle *style;
g_return_val_if_fail (ethi != NULL, 0);
g_return_val_if_fail (E_IS_TABLE_HEADER_ITEM (ethi), 0);
@@ -109,22 +111,19 @@ e_table_header_item_get_height (ETableHeaderItem *ethi)
eth = ethi->eth;
numcols = e_table_header_count (eth);
- if (ethi->font) {
- maxheight = ethi->font->ascent + ethi->font->descent + HEADER_PADDING + 1;
- } else {
- /* FIXME: Default??? */
- maxheight = 16;
- }
+ maxheight = 0;
+
+ style = GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas)->style;
+
for (col = 0; col < numcols; col++) {
ETableCol *ecol = e_table_header_get_column (eth, col);
-
- if (ecol->is_pixbuf) {
- maxheight = MAX (maxheight, gdk_pixbuf_get_height (ecol->pixbuf) + HEADER_PADDING + 1);
- }
- }
+ int height;
- if (maxheight < MIN_ARROW_SIZE + 1 + HEADER_PADDING)
- maxheight = MIN_ARROW_SIZE + 1 + HEADER_PADDING;
+ height = e_table_header_compute_height (ecol, style, ethi->font);
+
+ if (height > maxheight)
+ maxheight = height;
+ }
return maxheight;
}
@@ -396,7 +395,7 @@ ethi_remove_drop_marker (ETableHeaderItem *ethi)
}
static GtkWidget *
-make_shapped_window_from_xpm (const char **xpm)
+make_shaped_window_from_xpm (const char **xpm)
{
GdkPixbuf *pixbuf;
GdkPixmap *pixmap;
@@ -439,8 +438,8 @@ ethi_add_drop_marker (ETableHeaderItem *ethi, int col)
x += ethi->group_indent_width;
if (!arrow_up){
- arrow_up = make_shapped_window_from_xpm (arrow_up_xpm);
- arrow_down = make_shapped_window_from_xpm (arrow_down_xpm);
+ arrow_up = make_shaped_window_from_xpm (arrow_up_xpm);
+ arrow_down = make_shaped_window_from_xpm (arrow_down_xpm);
}
gdk_window_get_origin (
@@ -758,144 +757,10 @@ ethi_unrealize (GnomeCanvasItem *item)
}
static void
-draw_button (ETableHeaderItem *ethi, ETableCol *col,
- GdkDrawable *drawable, GdkGC *gc, GtkStyle *style,
- int x, int y, int width, int height, ETableColArrow arrow)
-{
- GdkRectangle clip;
- int xtra;
-
- clip.x = x;
- clip.y = y;
- clip.width = width;
- clip.height = height;
-
- gdk_window_set_back_pixmap (GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas)->window, NULL, FALSE);
-
- gtk_paint_box (style, drawable,
- GTK_STATE_NORMAL, GTK_SHADOW_OUT,
- &clip, GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas),
- "button", x, y, width, height);
-
- clip.x = x + HEADER_PADDING / 2;
- clip.y = y + HEADER_PADDING / 2;
- clip.width = width - HEADER_PADDING;
- clip.height = ethi->height - HEADER_PADDING;
-
- gdk_gc_set_clip_rectangle (ethi->gc, &clip);
-
- switch (arrow){
- case E_TABLE_COL_ARROW_NONE:
- break;
-
- case E_TABLE_COL_ARROW_UP:
- case E_TABLE_COL_ARROW_DOWN:
- if (!col->is_pixbuf ||
- (clip.width > (gdk_pixbuf_get_width (col->pixbuf) + MIN_ARROW_SIZE))) {
- gtk_paint_arrow (gtk_widget_get_style (GTK_WIDGET(GNOME_CANVAS_ITEM(ethi)->canvas)),
- drawable,
- GTK_STATE_NORMAL,
- GTK_SHADOW_IN,
- &clip,
- GTK_WIDGET(GNOME_CANVAS_ITEM(ethi)->canvas),
- "header",
- (arrow == E_TABLE_COL_ARROW_UP) ? GTK_ARROW_UP : GTK_ARROW_DOWN,
- TRUE,
- x + HEADER_PADDING / 2 + clip.width - MIN_ARROW_SIZE - 2,
- y + (ethi->height - MIN_ARROW_SIZE) / 2,
- MIN_ARROW_SIZE,
- MIN_ARROW_SIZE);
-
- clip.width -= (MIN_ARROW_SIZE + 2 + HEADER_PADDING);
- break;
- }
- }
-
- if (col->is_pixbuf){
- xtra = (clip.width - gdk_pixbuf_get_width (col->pixbuf))/2;
- if (xtra < 0)
- xtra = 0;
-
- xtra += HEADER_PADDING / 2;
-
- gdk_pixbuf_render_to_drawable_alpha (col->pixbuf,
- drawable,
- 0, 0,
- x + xtra, y + (clip.height - gdk_pixbuf_get_height (col->pixbuf)) / 2,
- gdk_pixbuf_get_width (col->pixbuf),
- gdk_pixbuf_get_height (col->pixbuf),
- GDK_PIXBUF_ALPHA_FULL, 128,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- } else {
- int str_width, ellipsis_width, text_len;
- int y_xtra;
-
- text_len = strlen (col->text);
- ellipsis_width = gdk_text_width (ethi->font, "...", 3);
-
- str_width = gdk_text_width (ethi->font, col->text, text_len);
- /* y_xtra = ethi->height / 2 + (ethi->font->ascent + ethi->font->descent) / 2 - ethi->font->descent; */
- y_xtra = (ethi->height + ethi->font->ascent - ethi->font->descent) / 2;
-
- if (str_width < clip.width) {
-
- /* Center the thing */
- xtra = (clip.width - gdk_string_measure (ethi->font, col->text))/2;
-
- /* Skip over border */
- if (xtra < 0)
- xtra = 0;
-
- xtra += HEADER_PADDING / 2;
-
- gdk_draw_text (drawable, ethi->font,
- ethi->gc, clip.x + xtra, y + y_xtra,
- col->text, text_len);
- } else {
- /* Need ellipsis */
- gchar *p;
- int ellipsis_length = 0;
-
- for (p = col->text; p && *p && (p - col->text) < text_len; p++) {
- if (gdk_text_width (ethi->font, col->text, p - col->text) + ellipsis_width <= clip.width)
- ellipsis_length = p - col->text;
- else
- break;
- }
-
- xtra = (clip.width - gdk_text_measure (ethi->font, col->text, ellipsis_length) - gdk_string_measure (ethi->font, "..."))/2;
-
- if (xtra < 0)
- xtra = 0;
-
- xtra += HEADER_PADDING / 2;
-
-
- gdk_draw_text (drawable, ethi->font, ethi->gc,
- x + xtra, y + y_xtra,
- col->text, ellipsis_length);
- gdk_draw_string (drawable, ethi->font, ethi->gc,
- x + xtra + gdk_text_width (ethi->font,
- col->text,
- ellipsis_length),
- y + y_xtra,
- "...");
- }
- }
-
- if (col->pixbuf){
- if ((gdk_pixbuf_get_width (col->pixbuf) + MIN_ARROW_SIZE + 4) > width)
- return;
- }
-}
-
-static void
ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height)
{
ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
GnomeCanvas *canvas = item->canvas;
- GdkGC *gc;
const int cols = e_table_header_count (ethi->eth);
int x1, x2;
int col;
@@ -940,14 +805,18 @@ ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width
if (x2 < x)
continue;
-
- gc = GTK_WIDGET (canvas)->style->bg_gc [GTK_STATE_NORMAL];
- draw_button (ethi, ecol, drawable, gc,
- GTK_WIDGET (canvas)->style,
- x1 - x, - y, x2 - x1, ethi->height,
- (ETableColArrow) g_hash_table_lookup (arrows, (gpointer) ecol->col_idx));
+ e_table_header_draw_button (drawable, ecol,
+ GTK_WIDGET (canvas)->style, ethi->font,
+ GTK_WIDGET_STATE (canvas),
+ GTK_WIDGET (canvas), ethi->gc,
+ x1 - x, -y,
+ width, height,
+ x2 - x1, ethi->height,
+ (ETableColArrow) g_hash_table_lookup (
+ arrows, (gpointer) ecol->col_idx));
}
+
g_hash_table_destroy (arrows);
}
@@ -1074,7 +943,6 @@ ethi_start_drag (ETableHeaderItem *ethi, GdkEvent *event)
ETableCol *ecol;
int col_width;
GdkPixmap *pixmap;
- GdkGC *gc;
int group_indent = 0;
GHashTable *arrows = g_hash_table_new (NULL, NULL);
@@ -1118,11 +986,16 @@ ethi_start_drag (ETableHeaderItem *ethi, GdkEvent *event)
ecol = e_table_header_get_column (ethi->eth, ethi->drag_col);
col_width = ecol->width;
pixmap = gdk_pixmap_new (widget->window, col_width, ethi->height, -1);
- gc = widget->style->bg_gc [GTK_STATE_ACTIVE];
- draw_button (ethi, ecol, pixmap, gc,
- widget->style,
- 0, 0, col_width, ethi->height,
- (ETableColArrow) g_hash_table_lookup (arrows, (gpointer) ecol->col_idx));
+
+ e_table_header_draw_button (pixmap, ecol,
+ widget->style, ethi->font,
+ GTK_WIDGET_STATE (widget),
+ widget, ethi->gc,
+ 0, 0,
+ col_width, ethi->height,
+ col_width, ethi->height,
+ (ETableColArrow) g_hash_table_lookup (
+ arrows, (gpointer) ecol->col_idx));
gtk_drag_set_icon_pixmap (context,
gdk_window_get_colormap (widget->window),
pixmap,