static gint gnc_header_event (GnomeCanvasItem *item, GdkEvent *event) { GncHeader *header = GNC_HEADER(item); GnomeCanvas *canvas = item->canvas; int x, y; int col; switch (event->type) { case GDK_MOTION_NOTIFY: gnome_canvas_w2c (canvas, event->motion.x, event->motion.y, &x, &y); if (header->in_resize) { int change = x - header->resize_x; int new_width; if (!header->needs_ungrab) { gnome_canvas_item_grab (item, GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, header->resize_cursor, event->button.time); header->needs_ungrab = TRUE; } new_width = header->resize_col_width + change; if (new_width >= 0) { header->resize_x = x; header->resize_col_width = new_width; gnc_header_request_redraw (header); } break; } if (pointer_on_resize_line(header, x, y, &col) && gnucash_style_col_is_resizable (header->style, col)) gdk_window_set_cursor (GTK_WIDGET(canvas)->window, header->resize_cursor); else gdk_window_set_cursor (GTK_WIDGET(canvas)->window, header->normal_cursor); break; case GDK_BUTTON_PRESS: { int col; if (event->button.button != 1) break; gnome_canvas_w2c (canvas, event->button.x, event->button.y, &x, &y); if (pointer_on_resize_line (header, x, y, &col)) col = find_resize_col (header, col); else col = -1; if (col > -1) { CellDimensions *cd; cd = gnucash_style_get_cell_dimensions (header->style, 0, col); header->in_resize = TRUE; header->resize_col = col; header->resize_col_width = cd->pixel_width; header->resize_x = x; } break; } case GDK_BUTTON_RELEASE: { if (event->button.button != 1) break; gnome_canvas_w2c (canvas, event->button.x, event->button.y, &x, &y); if (header->in_resize) { if (header->needs_ungrab) { gnome_canvas_item_ungrab (item, event->button.time); header->needs_ungrab = FALSE; gnc_header_resize_column (header, header->resize_col, header->resize_col_width); } header->in_resize = FALSE; header->resize_col = -1; } break; } case GDK_2BUTTON_PRESS: { gboolean on_line; int ptr_col; int resize_col; if (event->button.button != 1) break; gnome_canvas_w2c (canvas, event->button.x, event->button.y, &x, &y); on_line = pointer_on_resize_line (header, x, y, &ptr_col); /* If we're on a resize line and the column to the right is zero width, resize that one. */ if (on_line) resize_col = find_resize_col (header, ptr_col); else resize_col = ptr_col; if (resize_col > -1) { header->in_resize = FALSE; header->resize_col = -1; if (header->needs_ungrab) { gnome_canvas_item_ungrab (item, event->button.time); header->needs_ungrab = FALSE; } gnc_header_auto_resize_column (header, resize_col); } } break; default: break; } return TRUE; }
static gint gnc_header_event (GtkWidget *widget, GdkEvent *event) { GncHeader *header = GNC_HEADER(widget); int x, y; int col; switch (event->type) { case GDK_MOTION_NOTIFY: x = event->motion.x; y = event->motion.y; if (header->in_resize) { int change = x - header->resize_x; int new_width = header->resize_col_width + change; if (new_width >= 0) { header->resize_x = x; header->resize_col_width = new_width; gnc_header_request_redraw (header); } break; } if (pointer_on_resize_line(header, x, y, &col) && gnucash_style_col_is_resizable (header->style, col)) gdk_window_set_cursor (gtk_widget_get_window (widget), header->resize_cursor); else gdk_window_set_cursor (gtk_widget_get_window (widget), header->normal_cursor); break; case GDK_BUTTON_PRESS: { int col; if (event->button.button != 1) break; x = event->button.x; y = event->button.y; if (pointer_on_resize_line (header, x, y, &col)) col = find_resize_col (header, col); else col = -1; if (col > -1) { CellDimensions *cd; cd = gnucash_style_get_cell_dimensions (header->style, 0, col); header->in_resize = TRUE; header->resize_col = col; header->resize_col_width = cd->pixel_width; header->resize_x = x; } break; } case GDK_BUTTON_RELEASE: { if (event->button.button != 1) break; x = event->button.x; y = event->button.y; if (header->in_resize) { gnc_header_resize_column (header, header->resize_col, header->resize_col_width); header->in_resize = FALSE; header->resize_col = -1; gnc_header_request_redraw (header); } break; } case GDK_2BUTTON_PRESS: { gboolean on_line; int ptr_col; int resize_col; if (event->button.button != 1) break; x = event->button.x; y = event->button.y; on_line = pointer_on_resize_line (header, x, y, &ptr_col); /* If we're on a resize line and the column to the right is zero width, resize that one. */ if (on_line) resize_col = find_resize_col (header, ptr_col); else resize_col = ptr_col; if (resize_col > -1) { header->in_resize = FALSE; header->resize_col = -1; gnc_header_auto_resize_column (header, resize_col); } } break; default: break; } return FALSE; }