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.c293
1 files changed, 138 insertions, 155 deletions
diff --git a/widgets/table/e-table-header-item.c b/widgets/table/e-table-header-item.c
index 6d3329ab11..26ed69c73c 100644
--- a/widgets/table/e-table-header-item.c
+++ b/widgets/table/e-table-header-item.c
@@ -38,11 +38,6 @@ static guint ethi_signals [LAST_SIGNAL] = { 0, };
#define ARROW_DOWN_HEIGHT 16
#define ARROW_PTR 7
-/* Padding above and below of the string in the header display */
-#define PADDING 4
-
-#define MIN_ARROW_SIZE 10
-
/* Defines the tolerance for proximity of the column division to the cursor position */
#define TOLERANCE 4
@@ -54,7 +49,6 @@ static guint ethi_signals [LAST_SIGNAL] = { 0, };
static GnomeCanvasItemClass *ethi_parent_class;
-static void ethi_request_redraw (ETableHeaderItem *ethi);
static void ethi_drop_table_header (ETableHeaderItem *ethi);
/*
@@ -73,20 +67,11 @@ static GdkPixmap *add_col_pixmap, *add_col_mask;
enum {
ARG_0,
ARG_TABLE_HEADER,
- ARG_TABLE_X,
- ARG_TABLE_Y,
+ ARG_DND_CODE,
ARG_TABLE_FONTSET,
ARG_SORT_INFO
};
-static GtkTargetEntry ethi_drag_types [] = {
- { TARGET_ETABLE_COL_TYPE, 0, TARGET_ETABLE_COL_HEADER },
-};
-
-static GtkTargetEntry ethi_drop_types [] = {
- { TARGET_ETABLE_COL_TYPE, 0, TARGET_ETABLE_COL_HEADER },
-};
-
static void
ethi_destroy (GtkObject *object){
ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (object);
@@ -110,9 +95,13 @@ ethi_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags
{
ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
+ double i2c [6];
+ ArtPoint c1, c2, i1, i2;
+
if (GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->update)
(*GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->update)(item, affine, clip_path, flags);
+
if (ethi->sort_info)
ethi->group_indent_width = e_table_sort_info_grouping_get_count(ethi->sort_info) * GROUP_INDENT;
else
@@ -120,16 +109,24 @@ ethi_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags
ethi->width = e_table_header_total_width (ethi->eth) + ethi->group_indent_width;
- if (item->x1 != ethi->x1 ||
- item->y1 != ethi->y1 ||
- item->x2 != ethi->x1 + ethi->width ||
- item->y2 != ethi->y1 + ethi->height)
+ i1.x = i1.y = 0;
+ i2.x = ethi->width;
+ i2.y = ethi->height;
+
+ gnome_canvas_item_i2c_affine (item, i2c);
+ art_affine_point (&c1, &i1, i2c);
+ art_affine_point (&c2, &i2, i2c);
+
+ if (item->x1 != c1.x ||
+ item->y1 != c1.y ||
+ item->x2 != c2.x ||
+ item->y2 != c2.y)
{
gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- item->x1 = ethi->x1;
- item->y1 = ethi->y1;
- item->x2 = ethi->x1 + ethi->width;
- item->y2 = ethi->y1 + ethi->height;
+ item->x1 = c1.x;
+ item->y1 = c1.y;
+ item->x2 = c2.x;
+ item->y2 = c2.y;
gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item);
}
@@ -146,9 +143,9 @@ ethi_font_load (ETableHeaderItem *ethi, char *font)
if (ethi->font == NULL)
ethi->font = gdk_font_load ("-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1");
- ethi->height = ethi->font->ascent + ethi->font->descent + PADDING;
- if (ethi->height < MIN_ARROW_SIZE + 4 + PADDING)
- ethi->height = MIN_ARROW_SIZE + 4 + PADDING;
+ ethi->height = ethi->font->ascent + ethi->font->descent + HEADER_PADDING;
+ if (ethi->height < MIN_ARROW_SIZE + 4 + HEADER_PADDING)
+ ethi->height = MIN_ARROW_SIZE + 4 + HEADER_PADDING;
}
static void
@@ -216,12 +213,9 @@ ethi_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
ethi_add_table_header (ethi, E_TABLE_HEADER(GTK_VALUE_OBJECT (*arg)));
break;
- case ARG_TABLE_X:
- ethi->x1 = GTK_VALUE_INT (*arg);
- break;
-
- case ARG_TABLE_Y:
- ethi->y1 = GTK_VALUE_INT (*arg);
+ case ARG_DND_CODE:
+ g_free(ethi->dnd_code);
+ ethi->dnd_code = g_strdup (GTK_VALUE_STRING (*arg));
break;
case ARG_TABLE_FONTSET:
@@ -254,14 +248,31 @@ ethi_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
break;
}
- ethi_update (item, NULL, NULL, 0);
+ gnome_canvas_item_request_update(item);
+}
+
+static void
+ethi_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
+{
+ ETableHeaderItem *ethi;
+
+ ethi = E_TABLE_HEADER_ITEM (o);
+
+ switch (arg_id){
+ case ARG_DND_CODE:
+ GTK_VALUE_STRING (*arg) = g_strdup (ethi->dnd_code);
+ break;
+ default:
+ arg->type = GTK_TYPE_INVALID;
+ break;
+ }
}
static int
ethi_find_col_by_x (ETableHeaderItem *ethi, int x)
{
const int cols = e_table_header_count (ethi->eth);
- int x1 = ethi->x1;
+ int x1 = 0;
int col;
if (x < x1)
@@ -292,65 +303,6 @@ ethi_remove_drop_marker (ETableHeaderItem *ethi)
ethi->drag_mark = -1;
}
-#if 0
-static void
-ethi_add_drop_marker (ETableHeaderItem *ethi, int col)
-{
- GnomeCanvasPoints *points;
- int x;
-
- if (ethi->drag_mark == col)
- return;
-
- if (ethi->drag_mark_item)
- gtk_object_destroy (GTK_OBJECT (ethi->drag_mark_item));
-
- ethi->drag_mark = col;
-
- ethi->drag_mark_item = gnome_canvas_item_new (
- GNOME_CANVAS_GROUP (GNOME_CANVAS_ITEM (ethi)->canvas->root),
- gnome_canvas_group_get_type (),
- "x", 0,
- "y", 0,
- NULL);
-
- points = gnome_canvas_points_new (3);
-
- x = e_table_header_col_diff (ethi->eth, 0, col);
-
- if (col > 0)
- x += ethi->group_indent_width;
-
- points->coords [0] = ethi->x1 + x - 5;
- points->coords [1] = ethi->y1;
- points->coords [2] = points->coords [0] + 10;
- points->coords [3] = points->coords [1];
- points->coords [4] = ethi->x1 + x;
- points->coords [5] = ethi->y1 + 5;
-
- gnome_canvas_item_new (
- GNOME_CANVAS_GROUP (ethi->drag_mark_item),
- gnome_canvas_polygon_get_type (),
- "points", points,
- "fill_color", "red",
- NULL);
-
- points->coords [0] --;
- points->coords [1] += ethi->height - 1;
- points->coords [3] = points->coords [1];
- points->coords [5] = points->coords [1] - 6;
-
- gnome_canvas_item_new (
- GNOME_CANVAS_GROUP (ethi->drag_mark_item),
- gnome_canvas_polygon_get_type (),
- "points", points,
- "fill_color", "red",
- NULL);
-
- gnome_canvas_points_unref (points);
-}
-#endif
-
static GtkWidget *
make_shapped_window_from_xpm (const char **xpm)
{
@@ -427,7 +379,7 @@ ethi_add_destroy_marker (ETableHeaderItem *ethi)
ethi->stipple = gdk_bitmap_create_from_data (
NULL, gray50_bits, gray50_width, gray50_height);
- x1 = ethi->x1 + (double) e_table_header_col_diff (ethi->eth, 0, ethi->drag_col);
+ x1 = (double) e_table_header_col_diff (ethi->eth, 0, ethi->drag_col);
if (ethi->drag_col > 0)
x1 += ethi->group_indent_width;
@@ -435,11 +387,11 @@ ethi_add_destroy_marker (ETableHeaderItem *ethi)
GNOME_CANVAS_GROUP (GNOME_CANVAS_ITEM (ethi)->canvas->root),
gnome_canvas_rect_get_type (),
"x1", x1 + 1,
- "y1", (double) ethi->y1 + 1,
+ "y1", (double) 1,
"x2", (double) x1 + e_table_header_col_diff (
ethi->eth, ethi->drag_col, ethi->drag_col+1) - 2,
- "y2", (double) ethi->y1 + ethi->height - 2,
+ "y2", (double) ethi->height - 2,
"fill_color", "red",
"fill_stipple", ethi->stipple,
NULL);
@@ -465,8 +417,8 @@ ethi_drag_motion (GtkObject *canvas, GdkDragContext *context,
return FALSE;
gdk_drag_status (context, 0, time);
- if ((x >= ethi->x1) && (x <= (ethi->x1 + ethi->width)) &&
- (y >= ethi->y1) && (y <= (ethi->y1 + ethi->height))){
+ if ((x >= 0) && (x <= (ethi->width)) &&
+ (y >= 0) && (y <= (ethi->height))){
int col;
col = ethi_find_col_by_x (ethi, x);
@@ -493,15 +445,48 @@ ethi_drag_end (GtkWidget *canvas, GdkDragContext *context, ETableHeaderItem *eth
if (ethi->drag_col == -1)
return;
- /* if (canvas == gtk_drag_get_source_widget (context)) { */
if (context->action == 0) {
- ethi_request_redraw (ethi);
e_table_header_remove (ethi->eth, ethi->drag_col);
+ gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
}
ethi_remove_drop_marker (ethi);
ethi_remove_destroy_marker (ethi);
ethi->drag_col = -1;
- /* } */
+}
+
+static void
+ethi_drag_data_received (GtkWidget *canvas,
+ GdkDragContext *drag_context,
+ gint x,
+ gint y,
+ GtkSelectionData *data,
+ guint info,
+ guint time,
+ ETableHeaderItem *ethi)
+{
+ e_table_header_move (ethi->eth, ethi->drag_col, ethi->drop_col);
+ gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
+}
+
+static void
+ethi_drag_data_get (GtkWidget *canvas,
+ GdkDragContext *context,
+ GtkSelectionData *selection_data,
+ guint info,
+ guint time,
+ ETableHeaderItem *ethi)
+{
+ if (ethi->drag_col != -1) {
+ ETableCol *ecol = e_table_header_get_column (ethi->eth, ethi->drag_col);
+
+ gchar *string = g_strdup_printf("%d", ecol->col_idx);
+ gtk_selection_data_set(selection_data,
+ GDK_SELECTION_TYPE_STRING,
+ sizeof(string[0]),
+ string,
+ strlen(string));
+ g_free(string);
+ }
}
static gboolean
@@ -517,24 +502,22 @@ ethi_drag_drop (GtkWidget *canvas,
if (ethi->drag_col == -1)
return FALSE;
- /* if (GTK_WIDGET(canvas) == gtk_drag_get_source_widget (context)) {*/
- if ((x >= ethi->x1) && (x <= (ethi->x1 + ethi->width)) &&
- (y >= ethi->y1) && (y <= (ethi->y1 + ethi->height))){
+ if ((x >= 0) && (x <= (ethi->width)) &&
+ (y >= 0) && (y <= (ethi->height))){
int col;
col = ethi_find_col_by_x (ethi, x);
ethi_add_drop_marker (ethi, col);
+
+ ethi->drop_col = col;
if (col != -1) {
- if (col != ethi->drag_col) {
- ethi_request_redraw (ethi);
- e_table_header_move (ethi->eth, ethi->drag_col, col);
- }
- successful = TRUE;
+ char *target = g_strdup_printf ("%s-%s", TARGET_ETABLE_COL_TYPE, ethi->dnd_code);
+ gtk_drag_get_data (canvas, context, gdk_atom_intern(target, FALSE), time);
+ g_free (target);
}
}
- /* } */
gtk_drag_finish (context, successful, successful, time);
return successful;
}
@@ -545,10 +528,8 @@ ethi_drag_leave (GtkWidget *widget, GdkDragContext *context, guint time, ETableH
if (ethi->drag_col == -1)
return;
- /* if (widget == gtk_drag_get_source_widget (context)) { */
ethi_remove_drop_marker (ethi);
ethi_add_destroy_marker (ethi);
- /* } */
}
static void
@@ -557,6 +538,10 @@ ethi_realize (GnomeCanvasItem *item)
ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
GdkWindow *window;
GdkColor c;
+ GtkTargetEntry ethi_drop_types [] = {
+ { TARGET_ETABLE_COL_TYPE, 0, TARGET_ETABLE_COL_HEADER },
+ };
+
if (GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)-> realize)
(*GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->realize)(item);
@@ -573,25 +558,28 @@ ethi_realize (GnomeCanvasItem *item)
/*
* Now, configure DnD
*/
+ ethi_drop_types[0].target = g_strdup_printf("%s-%s", ethi_drop_types[0].target, ethi->dnd_code);
gtk_drag_dest_set (GTK_WIDGET (item->canvas), 0,
ethi_drop_types, ELEMENTS (ethi_drop_types),
GDK_ACTION_MOVE);
+ g_free(ethi_drop_types[0].target);
+
+ /* Drop signals */
+ ethi->drag_motion_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_motion",
+ GTK_SIGNAL_FUNC (ethi_drag_motion), ethi);
+ ethi->drag_leave_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_leave",
+ GTK_SIGNAL_FUNC (ethi_drag_leave), ethi);
+ ethi->drag_drop_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_drop",
+ GTK_SIGNAL_FUNC (ethi_drag_drop), ethi);
+ ethi->drag_data_received_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_data_received",
+ GTK_SIGNAL_FUNC (ethi_drag_data_received), ethi);
+
+ /* Drag signals */
+ ethi->drag_end_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_end",
+ GTK_SIGNAL_FUNC (ethi_drag_end), ethi);
+ ethi->drag_data_get_id = gtk_signal_connect (GTK_OBJECT (item->canvas), "drag_data_get",
+ GTK_SIGNAL_FUNC (ethi_drag_data_get), ethi);
- ethi->drag_motion_id = gtk_signal_connect (
- GTK_OBJECT (item->canvas), "drag_motion",
- GTK_SIGNAL_FUNC (ethi_drag_motion), ethi);
-
- ethi->drag_leave_id = gtk_signal_connect (
- GTK_OBJECT (item->canvas), "drag_leave",
- GTK_SIGNAL_FUNC (ethi_drag_leave), ethi);
-
- ethi->drag_end_id = gtk_signal_connect (
- GTK_OBJECT (item->canvas), "drag_end",
- GTK_SIGNAL_FUNC (ethi_drag_end), ethi);
-
- ethi->drag_drop_id = gtk_signal_connect (
- GTK_OBJECT (item->canvas), "drag_drop",
- GTK_SIGNAL_FUNC (ethi_drag_drop), ethi);
}
static void
@@ -603,9 +591,12 @@ ethi_unrealize (GnomeCanvasItem *item)
ethi->gc = NULL;
gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_motion_id);
- gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_end_id);
gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_leave_id);
gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_drop_id);
+ gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_data_received_id);
+
+ gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_end_id);
+ gtk_signal_disconnect (GTK_OBJECT (item->canvas), ethi->drag_data_get_id);
if (ethi->stipple){
gdk_bitmap_unref (ethi->stipple);
@@ -633,9 +624,9 @@ draw_button (ETableHeaderItem *ethi, ETableCol *col,
GTK_STATE_NORMAL, GTK_SHADOW_OUT,
x , y, width, height);
- clip.x = x + PADDING / 2;
- clip.y = y + PADDING / 2;
- clip.width = width - PADDING;
+ clip.x = x + HEADER_PADDING / 2;
+ clip.y = y + HEADER_PADDING / 2;
+ clip.width = width - HEADER_PADDING;
clip.height = ethi->height;
gdk_gc_set_clip_rectangle (ethi->gc, &clip);
@@ -643,7 +634,7 @@ draw_button (ETableHeaderItem *ethi, ETableCol *col,
if (col->is_pixbuf){
xtra = (clip.width - gdk_pixbuf_get_width (col->pixbuf))/2;
- xtra += PADDING / 2;
+ xtra += HEADER_PADDING / 2;
gdk_pixbuf_render_to_drawable_alpha (col->pixbuf,
drawable,
@@ -661,11 +652,11 @@ draw_button (ETableHeaderItem *ethi, ETableCol *col,
if (xtra < 0)
xtra = 0;
- xtra += PADDING / 2;
+ xtra += HEADER_PADDING / 2;
gdk_draw_text (
drawable, ethi->font,
- ethi->gc, x + xtra, y + ethi->height - ethi->font->descent - PADDING / 2,
+ ethi->gc, x + xtra, y + ethi->height - ethi->font->descent - HEADER_PADDING / 2,
col->text, strlen (col->text));
}
@@ -690,7 +681,7 @@ draw_button (ETableHeaderItem *ethi, ETableCol *col,
"header",
(arrow == E_TABLE_COL_ARROW_UP) ? GTK_ARROW_UP : GTK_ARROW_DOWN,
TRUE,
- x + PADDING / 2 + clip.width - MIN_ARROW_SIZE - 2,
+ x + HEADER_PADDING / 2 + clip.width - MIN_ARROW_SIZE - 2,
y + (ethi->height - MIN_ARROW_SIZE) / 2,
MIN_ARROW_SIZE,
MIN_ARROW_SIZE);
@@ -733,7 +724,7 @@ ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width
}
ethi->width = e_table_header_total_width (ethi->eth) + ethi->group_indent_width;
- x1 = x2 = ethi->x1;
+ x1 = x2 = 0;
x2 += ethi->group_indent_width;
for (col = 0; col < cols; col++, x1 = x2){
ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
@@ -753,7 +744,7 @@ ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width
draw_button (ethi, ecol, drawable, gc,
GTK_WIDGET (canvas)->style,
- x1 - x, ethi->y1 - y, x2 - x1, ethi->height,
+ x1 - x, - y, x2 - x1, ethi->height,
(ETableColArrow) g_hash_table_lookup (arrows, (gpointer) ecol->col_idx));
}
g_hash_table_destroy (arrows);
@@ -823,18 +814,6 @@ set_cursor (ETableHeaderItem *ethi, int pos)
}
static void
-ethi_request_redraw (ETableHeaderItem *ethi)
-{
- GnomeCanvas *canvas = GNOME_CANVAS_ITEM (ethi)->canvas;
-
- /*
- * request a redraw
- */
- gnome_canvas_request_redraw (
- canvas, ethi->x1, ethi->y1, ethi->x1 + ethi->width, ethi->x1 + ethi->height);
-}
-
-static void
ethi_end_resize (ETableHeaderItem *ethi)
{
ethi->resize_col = -1;
@@ -872,6 +851,10 @@ ethi_start_drag (ETableHeaderItem *ethi, GdkEvent *event)
int group_indent = 0;
GHashTable *arrows = g_hash_table_new (NULL, NULL);
+ GtkTargetEntry ethi_drag_types [] = {
+ { TARGET_ETABLE_COL_TYPE, 0, TARGET_ETABLE_COL_HEADER },
+ };
+
ethi->drag_col = ethi_find_col_by_x (ethi, event->motion.x);
if (ethi->drag_col == -1)
@@ -900,8 +883,10 @@ ethi_start_drag (ETableHeaderItem *ethi, GdkEvent *event)
}
}
+ ethi_drag_types[0].target = g_strdup_printf("%s-%s", ethi_drag_types[0].target, ethi->dnd_code);
list = gtk_target_list_new (ethi_drag_types, ELEMENTS (ethi_drag_types));
context = gtk_drag_begin (widget, list, GDK_ACTION_MOVE, 1, event);
+ g_free(ethi_drag_types[0].target);
ecol = e_table_header_get_column (ethi->eth, ethi->drag_col);
col_width = ecol->width;
@@ -1269,6 +1254,7 @@ ethi_class_init (GtkObjectClass *object_class)
object_class->destroy = ethi_destroy;
object_class->set_arg = ethi_set_arg;
+ object_class->get_arg = ethi_get_arg;
item_class->update = ethi_update;
item_class->realize = ethi_realize;
@@ -1279,10 +1265,8 @@ ethi_class_init (GtkObjectClass *object_class)
gtk_object_add_arg_type ("ETableHeaderItem::ETableHeader", GTK_TYPE_OBJECT,
GTK_ARG_WRITABLE, ARG_TABLE_HEADER);
- gtk_object_add_arg_type ("ETableHeaderItem::x", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_TABLE_X);
- gtk_object_add_arg_type ("ETableHeaderItem::y", GTK_TYPE_INT,
- GTK_ARG_WRITABLE, ARG_TABLE_Y);
+ gtk_object_add_arg_type ("ETableHeaderItem::dnd_code", GTK_TYPE_STRING,
+ GTK_ARG_WRITABLE, ARG_DND_CODE);
gtk_object_add_arg_type ("ETableHeaderItem::fontset", GTK_TYPE_STRING,
GTK_ARG_WRITABLE, ARG_TABLE_FONTSET);
gtk_object_add_arg_type ("ETableHeaderItem::sort_info", GTK_TYPE_OBJECT,
@@ -1355,4 +1339,3 @@ e_table_header_item_get_type (void)
return type;
}
-