+ sheet = GTK_SHEET (widget);
+
+ /* Cancel any pending tooltips */
+ if (sheet->motion_timer)
+ {
+ g_source_remove (sheet->motion_timer);
+ sheet->motion_timer = 0;
+ }
+
+ gtk_widget_get_pointer (widget, &x, &y);
+ gtk_sheet_get_pixel_info (sheet, x, y, &row, &column);
+
+
+ if (event->window == sheet->column_title_window)
+ {
+ g_signal_emit (sheet,
+ sheet_signals[BUTTON_EVENT_COLUMN], 0,
+ column, event);
+
+ if (g_sheet_model_get_column_sensitivity (sheet->model, column))
+ {
+ if ( event->type == GDK_2BUTTON_PRESS && event->button == 1)
+ g_signal_emit (sheet,
+ sheet_signals[DOUBLE_CLICK_COLUMN], 0, column);
+ }
+ }
+ else if (event->window == sheet->row_title_window)
+ {
+ g_signal_emit (sheet,
+ sheet_signals[BUTTON_EVENT_ROW], 0,
+ row, event);
+
+
+ if (g_sheet_row_get_sensitivity (sheet->row_geometry, row))
+ {
+ if ( event->type == GDK_2BUTTON_PRESS && event->button == 1)
+ g_signal_emit (sheet,
+ sheet_signals[DOUBLE_CLICK_ROW], 0, row);
+ }
+ }
+
+ gdk_window_get_pointer (widget->window, NULL, NULL, &mods);
+
+ if (! (mods & GDK_BUTTON1_MASK)) return TRUE;
+
+
+ /* press on resize windows */
+ if (event->window == sheet->column_title_window &&
+ gtk_sheet_columns_resizable (sheet))
+ {
+#if 0
+ gtk_widget_get_pointer (widget, &sheet->x_drag, NULL);
+ if ( sheet->row_titles_visible)
+ sheet->x_drag -= sheet->row_title_area.width;
+#endif
+
+ sheet->x_drag = event->x;
+
+ if (on_column_boundary (sheet, sheet->x_drag, &sheet->drag_cell.col))
+ {
+ guint req;
+ gtk_sheet_column_size_request (sheet, sheet->drag_cell.col, &req);
+ GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_XDRAG);
+ gdk_pointer_grab (sheet->column_title_window, FALSE,
+ GDK_POINTER_MOTION_HINT_MASK |
+ GDK_BUTTON1_MOTION_MASK |
+ GDK_BUTTON_RELEASE_MASK,
+ NULL, NULL, event->time);
+
+ draw_xor_vline (sheet);
+ return TRUE;
+ }
+ }
+
+ if (event->window == sheet->row_title_window && gtk_sheet_rows_resizable (sheet))
+ {
+ gtk_widget_get_pointer (widget, NULL, &sheet->y_drag);
+
+ if (POSSIBLE_YDRAG (sheet, sheet->y_drag, &sheet->drag_cell.row))
+ {
+ guint req;
+ gtk_sheet_row_size_request (sheet, sheet->drag_cell.row, &req);
+ GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_YDRAG);
+ gdk_pointer_grab (sheet->row_title_window, FALSE,
+ GDK_POINTER_MOTION_HINT_MASK |
+ GDK_BUTTON1_MOTION_MASK |
+ GDK_BUTTON_RELEASE_MASK,
+ NULL, NULL, event->time);
+
+ draw_xor_hline (sheet);
+ return TRUE;
+ }
+ }
+
+ /* the sheet itself does not handle other than single click events */
+ if (event->type != GDK_BUTTON_PRESS) return FALSE;
+
+ /* selections on the sheet */
+ if (event->window == sheet->sheet_window)
+ {
+ gtk_widget_get_pointer (widget, &x, &y);
+ gtk_sheet_get_pixel_info (sheet, x, y, &row, &column);
+ gdk_pointer_grab (sheet->sheet_window, FALSE,
+ GDK_POINTER_MOTION_HINT_MASK |
+ GDK_BUTTON1_MOTION_MASK |
+ GDK_BUTTON_RELEASE_MASK,
+ NULL, NULL, event->time);
+ gtk_grab_add (GTK_WIDGET (sheet));
+
+ /* This seems to be a kludge to work around a problem where the sheet
+ scrolls to another position. The timeout scrolls it back to its
+ original posn. JMD 3 July 2007
+ */
+ gtk_widget_grab_focus (GTK_WIDGET (sheet));
+
+ if (sheet->selection_mode != GTK_SELECTION_SINGLE &&
+ sheet->selection_mode != GTK_SELECTION_NONE &&
+ sheet->cursor_drag->type == GDK_SIZING &&
+ !GTK_SHEET_IN_SELECTION (sheet) && !GTK_SHEET_IN_RESIZE (sheet))
+ {
+ if (sheet->state == GTK_STATE_NORMAL)
+ {
+ row = sheet->active_cell.row;
+ column = sheet->active_cell.col;
+ sheet->active_cell.row = row;
+ sheet->active_cell.col = column;
+ sheet->drag_range = sheet->range;
+ sheet->state = GTK_SHEET_RANGE_SELECTED;
+ gtk_sheet_select_range (sheet, &sheet->drag_range);
+ }
+ sheet->x_drag = x;
+ sheet->y_drag = y;
+ if (row > sheet->range.rowi) row--;
+ if (column > sheet->range.coli) column--;
+ sheet->drag_cell.row = row;
+ sheet->drag_cell.col = column;
+ sheet->drag_range = sheet->range;
+ draw_xor_rectangle (sheet, sheet->drag_range);
+ GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_RESIZE);
+ }
+ else if (sheet->cursor_drag->type == GDK_TOP_LEFT_ARROW &&
+ !GTK_SHEET_IN_SELECTION (sheet)
+ && ! GTK_SHEET_IN_DRAG (sheet)
+ && sheet->active_cell.row >= 0
+ && sheet->active_cell.col >= 0
+ )
+ {
+ if (sheet->state == GTK_STATE_NORMAL)
+ {
+ row = sheet->active_cell.row;
+ column = sheet->active_cell.col;
+ sheet->active_cell.row = row;
+ sheet->active_cell.col = column;
+ sheet->drag_range = sheet->range;
+ sheet->state = GTK_SHEET_RANGE_SELECTED;
+ gtk_sheet_select_range (sheet, &sheet->drag_range);
+ }
+ sheet->x_drag = x;
+ sheet->y_drag = y;
+ if (row < sheet->range.row0) row++;
+ if (row > sheet->range.rowi) row--;
+ if (column < sheet->range.col0) column++;
+ if (column > sheet->range.coli) column--;
+ sheet->drag_cell.row = row;
+ sheet->drag_cell.col = column;
+ sheet->drag_range = sheet->range;
+ draw_xor_rectangle (sheet, sheet->drag_range);
+ GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_DRAG);
+ }
+ else
+ {
+ veto = gtk_sheet_click_cell (sheet, row, column);
+ if (veto) GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
+ }
+ }
+
+ if (event->window == sheet->column_title_window)
+ {
+ gtk_widget_get_pointer (widget, &x, &y);
+ if ( sheet->row_titles_visible)
+ x -= sheet->row_title_area.width;
+
+ x += sheet->hadjustment->value;
+
+ column = column_from_xpixel (sheet, x);
+
+ if (g_sheet_model_get_column_sensitivity (sheet->model, column))
+ {
+ veto = gtk_sheet_click_cell (sheet, -1, column);
+ gtk_grab_add (GTK_WIDGET (sheet));
+ gtk_widget_grab_focus (GTK_WIDGET (sheet));
+ GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
+ }
+ }
+
+ if (event->window == sheet->row_title_window)
+ {
+ gtk_widget_get_pointer (widget, &x, &y);
+ if ( sheet->column_titles_visible)
+ y -= sheet->column_title_area.height;
+
+ y += sheet->vadjustment->value;
+
+ row = yyy_row_ypixel_to_row (sheet, y);
+ if (g_sheet_row_get_sensitivity (sheet->row_geometry, row))
+ {
+ veto = gtk_sheet_click_cell (sheet, row, -1);
+ gtk_grab_add (GTK_WIDGET (sheet));
+ gtk_widget_grab_focus (GTK_WIDGET (sheet));
+ GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
+ }
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column)
+{
+ GtkSheetCell cell;
+ gboolean forbid_move;
+
+ cell.row = row;
+ cell.col = column;
+
+ if (row >= g_sheet_row_get_row_count (sheet->row_geometry)
+ || column >= psppire_axis_unit_count (sheet->haxis))
+ {
+ return FALSE;
+ }
+
+ g_signal_emit (sheet, sheet_signals[TRAVERSE], 0,
+ &sheet->active_cell,
+ &cell,
+ &forbid_move);
+
+ if (forbid_move)
+ {
+ if (sheet->state == GTK_STATE_NORMAL)
+ return FALSE;
+
+ row = sheet->active_cell.row;
+ column = sheet->active_cell.col;
+
+ change_active_cell (sheet, row, column);
+ return FALSE;
+ }
+
+ if (row == -1 && column >= 0)
+ {
+ gtk_sheet_select_column (sheet, column);
+ return TRUE;
+ }
+
+ if (column == -1 && row >= 0)
+ {
+ gtk_sheet_select_row (sheet, row);
+ return TRUE;
+ }
+
+ if (row == -1 && column == -1)
+ {
+ sheet->range.row0 = 0;
+ sheet->range.col0 = 0;
+ sheet->range.rowi = g_sheet_row_get_row_count (sheet->row_geometry) - 1;
+ sheet->range.coli =
+ psppire_axis_unit_count (sheet->haxis) - 1;
+ sheet->active_cell.row = 0;
+ sheet->active_cell.col = 0;
+ gtk_sheet_select_range (sheet, NULL);
+ return TRUE;
+ }
+
+ if (sheet->state != GTK_SHEET_NORMAL)
+ {
+ sheet->state = GTK_SHEET_NORMAL;
+ gtk_sheet_real_unselect_range (sheet, NULL);
+ }
+ else
+ {
+ change_active_cell (sheet, row, column);
+ }
+
+ sheet->active_cell.row = row;
+ sheet->active_cell.col = column;
+ sheet->selection_cell.row = row;
+ sheet->selection_cell.col = column;
+ sheet->range.row0 = row;
+ sheet->range.col0 = column;
+ sheet->range.rowi = row;
+ sheet->range.coli = column;
+ sheet->state = GTK_SHEET_NORMAL;
+ GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
+ gtk_sheet_draw_active_cell (sheet);
+ return TRUE;
+}
+
+static gint
+gtk_sheet_button_release (GtkWidget *widget,
+ GdkEventButton *event)
+{
+ gint y;
+ GdkDisplay *display = gtk_widget_get_display (widget);
+
+ GtkSheet *sheet = GTK_SHEET (widget);
+
+ /* release on resize windows */
+ if (GTK_SHEET_IN_XDRAG (sheet))
+ {
+ gint xpos = event->x;
+ gint width;
+ GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_XDRAG);
+ GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
+
+ gdk_display_pointer_ungrab (display, event->time);
+ draw_xor_vline (sheet);