+ 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_column_get_sensitivity (sheet->column_geometry, 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)
+{
+ gboolean forbid_move;
+
+ if (row >= g_sheet_row_get_row_count (sheet->row_geometry)
+ || column >= g_sheet_column_get_column_count (sheet->column_geometry))
+ {
+ return FALSE;
+ }
+
+ g_signal_emit (sheet, sheet_signals[TRAVERSE], 0,
+ sheet->active_cell.row, sheet->active_cell.col,
+ &row, &column, &forbid_move);
+
+ if (forbid_move)
+ {
+ if (sheet->state == GTK_STATE_NORMAL)
+ return FALSE;
+
+ row = sheet->active_cell.row;
+ column = sheet->active_cell.col;
+
+ gtk_sheet_activate_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 =
+ g_sheet_column_get_column_count (sheet->column_geometry) - 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
+ {
+ gtk_sheet_deactivate_cell (sheet);
+ gtk_sheet_activate_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);
+
+ width = new_column_width (sheet, sheet->drag_cell.col, &xpos);
+
+ gtk_sheet_set_column_width (sheet, sheet->drag_cell.col, width);
+ return TRUE;
+ }
+
+ if (GTK_SHEET_IN_YDRAG (sheet))
+ {
+ GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_YDRAG);
+ GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
+ gtk_widget_get_pointer (widget, NULL, &y);
+ gdk_display_pointer_ungrab (display, event->time);
+ draw_xor_hline (sheet);
+
+ gtk_sheet_set_row_height (sheet, sheet->drag_cell.row,
+ new_row_height (sheet, sheet->drag_cell.row, &y));
+ g_signal_emit_by_name (sheet->vadjustment, "value_changed");
+ return TRUE;
+ }
+
+
+ if (GTK_SHEET_IN_DRAG (sheet))
+ {
+ GtkSheetRange old_range;
+ draw_xor_rectangle (sheet, sheet->drag_range);
+ GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_DRAG);
+ gdk_display_pointer_ungrab (display, event->time);
+
+ gtk_sheet_real_unselect_range (sheet, NULL);
+
+ sheet->active_cell.row = sheet->active_cell.row +
+ (sheet->drag_range.row0 - sheet->range.row0);
+ sheet->active_cell.col = sheet->active_cell.col +
+ (sheet->drag_range.col0 - sheet->range.col0);
+ sheet->selection_cell.row = sheet->selection_cell.row +
+ (sheet->drag_range.row0 - sheet->range.row0);
+ sheet->selection_cell.col = sheet->selection_cell.col +
+ (sheet->drag_range.col0 - sheet->range.col0);
+ old_range = sheet->range;
+ sheet->range = sheet->drag_range;
+ sheet->drag_range = old_range;
+ g_signal_emit (sheet, sheet_signals[MOVE_RANGE], 0,
+ &sheet->drag_range, &sheet->range);
+ gtk_sheet_select_range (sheet, &sheet->range);
+ }
+
+ if (GTK_SHEET_IN_RESIZE (sheet))
+ {
+ GtkSheetRange old_range;
+ draw_xor_rectangle (sheet, sheet->drag_range);
+ GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_RESIZE);
+ gdk_display_pointer_ungrab (display, event->time);
+
+ gtk_sheet_real_unselect_range (sheet, NULL);
+
+ sheet->active_cell.row = sheet->active_cell.row +
+ (sheet->drag_range.row0 - sheet->range.row0);
+ sheet->active_cell.col = sheet->active_cell.col +
+ (sheet->drag_range.col0 - sheet->range.col0);
+ if (sheet->drag_range.row0 < sheet->range.row0)
+ sheet->selection_cell.row = sheet->drag_range.row0;
+ if (sheet->drag_range.rowi >= sheet->range.rowi)
+ sheet->selection_cell.row = sheet->drag_range.rowi;
+ if (sheet->drag_range.col0 < sheet->range.col0)
+ sheet->selection_cell.col = sheet->drag_range.col0;
+ if (sheet->drag_range.coli >= sheet->range.coli)
+ sheet->selection_cell.col = sheet->drag_range.coli;
+ old_range = sheet->range;
+ sheet->range = sheet->drag_range;
+ sheet->drag_range = old_range;
+
+ if (sheet->state == GTK_STATE_NORMAL) sheet->state = GTK_SHEET_RANGE_SELECTED;
+ g_signal_emit (sheet, sheet_signals[RESIZE_RANGE], 0,
+ &sheet->drag_range, &sheet->range);
+ gtk_sheet_select_range (sheet, &sheet->range);
+ }
+
+ if (sheet->state == GTK_SHEET_NORMAL && GTK_SHEET_IN_SELECTION (sheet))
+ {
+ GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
+ gdk_display_pointer_ungrab (display, event->time);
+ gtk_sheet_activate_cell (sheet, sheet->active_cell.row,
+ sheet->active_cell.col);
+ }
+
+ if (GTK_SHEET_IN_SELECTION)
+ gdk_display_pointer_ungrab (display, event->time);
+ gtk_grab_remove (GTK_WIDGET (sheet));
+
+ GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
+
+ return TRUE;
+}
+
+\f
+
+
+
+/* Shamelessly lifted from gtktooltips */
+static gboolean
+gtk_sheet_subtitle_paint_window (GtkWidget *tip_window)
+{
+ GtkRequisition req;
+
+ gtk_widget_size_request (tip_window, &req);
+ gtk_paint_flat_box (tip_window->style, tip_window->window,
+ GTK_STATE_NORMAL, GTK_SHADOW_OUT,
+ NULL, GTK_WIDGET(tip_window), "tooltip",
+ 0, 0, req.width, req.height);
+
+ return FALSE;
+}
+
+static void
+destroy_hover_window (GtkSheetHoverTitle *h)
+{
+ gtk_widget_destroy (h->window);
+ g_free (h);