X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=lib%2Fgtksheet%2Fgtksheet.c;h=942b0233117b4641a61b9dadccbec4fed9f51866;hb=5ee84736663824fe12474b78dace867e42893a14;hp=57ae79dfe36d3abb03c3164f5d55df41bb012ec8;hpb=543b33d52255b74980108967e55422a77152a48f;p=pspp-builds.git diff --git a/lib/gtksheet/gtksheet.c b/lib/gtksheet/gtksheet.c index 57ae79df..942b0233 100644 --- a/lib/gtksheet/gtksheet.c +++ b/lib/gtksheet/gtksheet.c @@ -1,5 +1,11 @@ -/* This version of GtkSheet has been *heavily* modified, for the specific - requirements of PSPPIRE. */ +/* + * Copyright (C) 2006, 2008 Free Software Foundation + * + * This version of GtkSheet has been *heavily* modified, for the specific + * requirements of PSPPIRE. The changes are copyright by the + * Free Software Foundation. The copyright notice for the original work is + * below. + */ /* GtkSheet widget for Gtk+. * Copyright (C) 1999-2001 Adrian E. Feiguin @@ -66,45 +72,35 @@ /* sheet flags */ enum { - GTK_SHEET_IS_LOCKED = 1 << 0, GTK_SHEET_IS_FROZEN = 1 << 1, GTK_SHEET_IN_XDRAG = 1 << 2, GTK_SHEET_IN_YDRAG = 1 << 3, GTK_SHEET_IN_DRAG = 1 << 4, GTK_SHEET_IN_SELECTION = 1 << 5, GTK_SHEET_IN_RESIZE = 1 << 6, - GTK_SHEET_IN_CLIP = 1 << 7, - GTK_SHEET_REDRAW_PENDING = 1 << 8, + GTK_SHEET_REDRAW_PENDING = 1 << 7, }; #define GTK_SHEET_FLAGS(sheet) (GTK_SHEET (sheet)->flags) #define GTK_SHEET_SET_FLAGS(sheet,flag) (GTK_SHEET_FLAGS (sheet) |= (flag)) #define GTK_SHEET_UNSET_FLAGS(sheet,flag) (GTK_SHEET_FLAGS (sheet) &= ~ (flag)) -#define GTK_SHEET_IS_LOCKED(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IS_LOCKED) - - #define GTK_SHEET_IS_FROZEN(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IS_FROZEN) #define GTK_SHEET_IN_XDRAG(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IN_XDRAG) #define GTK_SHEET_IN_YDRAG(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IN_YDRAG) #define GTK_SHEET_IN_DRAG(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IN_DRAG) #define GTK_SHEET_IN_SELECTION(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IN_SELECTION) #define GTK_SHEET_IN_RESIZE(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IN_RESIZE) -#define GTK_SHEET_IN_CLIP(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IN_CLIP) #define GTK_SHEET_REDRAW_PENDING(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_REDRAW_PENDING) #define CELL_SPACING 1 #define DRAG_WIDTH 6 -#define TIMEOUT_FLASH 200 -#define TIME_INTERVAL 8 +#define TIMEOUT_HOVER 300 #define COLUMN_MIN_WIDTH 10 -#define MINROWS 1 -#define MINCOLS 1 -#define MAXLENGTH 30 #define CELLOFFSET 4 #define DEFAULT_COLUMN_WIDTH 80 - +static void gtk_sheet_update_primary_selection (GtkSheet *sheet); static void gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column); static void gtk_sheet_row_title_button_draw (GtkSheet *sheet, gint row); @@ -112,8 +108,8 @@ static void gtk_sheet_row_title_button_draw (GtkSheet *sheet, gint row); static gboolean gtk_sheet_cell_empty (const GtkSheet *sheet, gint row, gint col); -static inline -void dispose_string (const GtkSheet *sheet, gchar *text) +static inline void +dispose_string (const GtkSheet *sheet, gchar *text) { GSheetModel *model = gtk_sheet_get_model (sheet); @@ -135,10 +131,13 @@ guint DEFAULT_ROW_HEIGHT (GtkWidget *widget) pango_context_get_metrics (context, widget->style->font_desc, pango_context_get_language (context)); + guint val = pango_font_metrics_get_descent (metrics) + pango_font_metrics_get_ascent (metrics); + pango_font_metrics_unref (metrics); - return PANGO_PIXELS (val)+2 * CELLOFFSET; + + return PANGO_PIXELS (val) + 2 * CELLOFFSET; } } @@ -171,7 +170,7 @@ guint STRING_WIDTH (GtkWidget *widget, pango_layout_get_extents (layout, NULL, &rect); - g_object_unref (G_OBJECT (layout)); + g_object_unref (layout); return PANGO_PIXELS (rect.width); } @@ -198,7 +197,7 @@ yyy_row_is_visible (const GtkSheet *sheet, gint row) { GSheetRow *row_geo = sheet->row_geometry; - return g_sheet_row_get_visibility (row_geo, row, 0); + return g_sheet_row_get_visibility (row_geo, row); } @@ -207,7 +206,7 @@ yyy_row_is_sensitive (const GtkSheet *sheet, gint row) { GSheetRow *row_geo = sheet->row_geometry; - return g_sheet_row_get_sensitivity (row_geo, row, 0); + return g_sheet_row_get_sensitivity (row_geo, row); } @@ -217,7 +216,7 @@ yyy_row_count (const GtkSheet *sheet) { GSheetRow *row_geo = sheet->row_geometry; - return g_sheet_row_get_row_count (row_geo, 0); + return g_sheet_row_get_row_count (row_geo); } static inline gint @@ -225,7 +224,7 @@ yyy_row_height (const GtkSheet *sheet, gint row) { GSheetRow *row_geo = sheet->row_geometry; - return g_sheet_row_get_height (row_geo, row, 0); + return g_sheet_row_get_height (row_geo, row); } static gint @@ -233,7 +232,7 @@ yyy_row_top_ypixel (const GtkSheet *sheet, gint row) { GSheetRow *geo = sheet->row_geometry; - gint y = g_sheet_row_start_pixel (geo, row, 0); + gint y = g_sheet_row_start_pixel (geo, row); if ( sheet->column_titles_visible ) y += sheet->column_title_area.height; @@ -255,7 +254,7 @@ yyy_row_ypixel_to_row (const GtkSheet *sheet, gint y) if (y < cy) return 0; - return g_sheet_row_pixel_to_row (geo, y - cy, 0); + return g_sheet_row_pixel_to_row (geo, y - cy); } @@ -430,7 +429,7 @@ yyy_row_button (GtkSheet *sheet, gint row) { GSheetRow *row_geo = sheet->row_geometry; - return g_sheet_row_get_button (row_geo, row, sheet); + return g_sheet_row_get_button (row_geo, row); } @@ -440,7 +439,7 @@ static inline void yyy_set_row_height (GtkSheet *sheet, gint row, gint height) { if ( sheet->row_geometry ) - g_sheet_row_set_height (sheet->row_geometry, row, height, sheet); + g_sheet_row_set_height (sheet->row_geometry, row, height); } @@ -448,7 +447,7 @@ yyy_set_row_height (GtkSheet *sheet, gint row, gint height) /* returns the total width of the sheet */ static inline gint SHEET_WIDTH (GtkSheet *sheet) { - gint i,cx; + gint i, cx; cx = ( sheet->row_titles_visible ? sheet->row_title_area.width : 0); @@ -459,10 +458,18 @@ static inline gint SHEET_WIDTH (GtkSheet *sheet) return cx; } -#define MIN_VISIBLE_ROW(sheet) sheet->view.row0 -#define MAX_VISIBLE_ROW(sheet) sheet->view.rowi -#define MIN_VISIBLE_COLUMN(sheet) sheet->view.col0 -#define MAX_VISIBLE_COLUMN(sheet) sheet->view.coli +#define MIN_VISIBLE_ROW(sheet) \ + ROW_FROM_YPIXEL (sheet, sheet->column_title_area.height + 1) + +#define MAX_VISIBLE_ROW(sheet) \ + ROW_FROM_YPIXEL (sheet, sheet->sheet_window_height - 1) + +#define MIN_VISIBLE_COLUMN(sheet) \ + COLUMN_FROM_XPIXEL (sheet, sheet->row_title_area.width + 1) + +#define MAX_VISIBLE_COLUMN(sheet) \ + COLUMN_FROM_XPIXEL (sheet, sheet->sheet_window_width) + static inline gboolean @@ -495,7 +502,7 @@ POSSIBLE_YDRAG (const GtkSheet *sheet, gint y, gint *drag_row) row = ROW_FROM_YPIXEL (sheet, y); *drag_row = row; - ydrag = ROW_TOP_YPIXEL (sheet,row)+CELL_SPACING; + ydrag = ROW_TOP_YPIXEL (sheet, row)+CELL_SPACING; if (y <= ydrag + DRAG_WIDTH / 2 && row != 0) { while (!yyy_row_is_visible (sheet, row - 1) && row > 0) row--; @@ -530,7 +537,7 @@ POSSIBLE_DRAG (const GtkSheet *sheet, gint x, gint y, x <= COLUMN_LEFT_XPIXEL (sheet, sheet->range.coli) + xxx_column_width (sheet, sheet->range.coli) + DRAG_WIDTH / 2) { - ydrag = ROW_TOP_YPIXEL (sheet,sheet->range.row0); + ydrag = ROW_TOP_YPIXEL (sheet, sheet->range.row0); if (y >= ydrag - DRAG_WIDTH / 2 && y <= ydrag + DRAG_WIDTH / 2) { *drag_row = sheet->range.row0; @@ -578,20 +585,20 @@ POSSIBLE_RESIZE (const GtkSheet *sheet, gint x, gint y, sheet->range.col0 < 0 || sheet->range.coli < 0 ) return FALSE; - xdrag = COLUMN_LEFT_XPIXEL (sheet,sheet->range.coli)+ + xdrag = COLUMN_LEFT_XPIXEL (sheet, sheet->range.coli)+ xxx_column_width (sheet, sheet->range.coli); - ydrag = ROW_TOP_YPIXEL (sheet,sheet->range.rowi)+ + ydrag = ROW_TOP_YPIXEL (sheet, sheet->range.rowi)+ yyy_row_height (sheet, sheet->range.rowi); if (sheet->state == GTK_SHEET_COLUMN_SELECTED) - ydrag = ROW_TOP_YPIXEL (sheet, sheet->view.row0); + ydrag = ROW_TOP_YPIXEL (sheet, MIN_VISIBLE_ROW (sheet)); if (sheet->state == GTK_SHEET_ROW_SELECTED) - xdrag = COLUMN_LEFT_XPIXEL (sheet, sheet->view.col0); + xdrag = COLUMN_LEFT_XPIXEL (sheet, MIN_VISIBLE_COLUMN (sheet)); - *drag_column = COLUMN_FROM_XPIXEL (sheet,x); - *drag_row = ROW_FROM_YPIXEL (sheet,y); + *drag_column = COLUMN_FROM_XPIXEL (sheet, x); + *drag_row = ROW_FROM_YPIXEL (sheet, y); if (x >= xdrag - DRAG_WIDTH / 2 && x <= xdrag + DRAG_WIDTH / 2 && y >= ydrag - DRAG_WIDTH / 2 && y <= ydrag + DRAG_WIDTH / 2) return TRUE; @@ -601,7 +608,7 @@ POSSIBLE_RESIZE (const GtkSheet *sheet, gint x, gint y, static void gtk_sheet_class_init (GtkSheetClass * klass); static void gtk_sheet_init (GtkSheet * sheet); -static void gtk_sheet_destroy (GtkObject * object); +static void gtk_sheet_dispose (GObject * object); static void gtk_sheet_finalize (GObject * object); static void gtk_sheet_style_set (GtkWidget *widget, GtkStyle *previous_style); @@ -637,14 +644,10 @@ static void gtk_sheet_size_allocate (GtkWidget * widget, /* Sheet queries */ -static gint gtk_sheet_range_isvisible (GtkSheet * sheet, - GtkSheetRange range); -static gint gtk_sheet_cell_isvisible (GtkSheet * sheet, - gint row, gint column); -/* Clipped Range */ - -static gint gtk_sheet_flash (gpointer data); - +static gboolean gtk_sheet_range_isvisible (const GtkSheet * sheet, + GtkSheetRange range); +static gboolean gtk_sheet_cell_isvisible (GtkSheet * sheet, + gint row, gint column); /* Drawing Routines */ /* draw cell background and frame */ @@ -685,7 +688,7 @@ static void gtk_sheet_draw_corners (GtkSheet *sheet, static void gtk_sheet_entry_changed (GtkWidget *widget, gpointer data); -static gboolean gtk_sheet_deactivate_cell (GtkSheet *sheet); +static void gtk_sheet_deactivate_cell (GtkSheet *sheet); static void gtk_sheet_hide_active_cell (GtkSheet *sheet); static gboolean gtk_sheet_activate_cell (GtkSheet *sheet, gint row, gint col); @@ -705,10 +708,6 @@ static void gtk_sheet_draw_backing_pixmap (GtkSheet *sheet, /* Scrollbars */ static void adjust_scrollbars (GtkSheet * sheet); -static void vadjustment_changed (GtkAdjustment * adjustment, - gpointer data); -static void hadjustment_changed (GtkAdjustment * adjustment, - gpointer data); static void vadjustment_value_changed (GtkAdjustment * adjustment, gpointer data); static void hadjustment_value_changed (GtkAdjustment * adjustment, @@ -719,8 +718,7 @@ static void draw_xor_vline (GtkSheet * sheet); static void draw_xor_hline (GtkSheet * sheet); static void draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range); -static void gtk_sheet_draw_flashing_range (GtkSheet *sheet, - GtkSheetRange range); + static guint new_column_width (GtkSheet * sheet, gint column, gint * x); @@ -756,12 +754,11 @@ static void init_attributes (const GtkSheet *sheet, gint col, /* Memory allocation routines */ static void gtk_sheet_real_range_clear (GtkSheet *sheet, - const GtkSheetRange *range, - gboolean delete); + const GtkSheetRange *range); + static void gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, - gint column, - gboolean delete); + gint column); /* Container Functions */ @@ -793,18 +790,15 @@ enum SELECT_COLUMN, DOUBLE_CLICK_ROW, DOUBLE_CLICK_COLUMN, + BUTTON_EVENT_ROW, + BUTTON_EVENT_COLUMN, SELECT_RANGE, - CLIP_RANGE, RESIZE_RANGE, MOVE_RANGE, TRAVERSE, DEACTIVATE, ACTIVATE, - SET_CELL, - CLEAR_CELL, CHANGED, - NEW_COL_WIDTH, - NEW_ROW_HEIGHT, LAST_SIGNAL }; @@ -877,17 +871,105 @@ gtk_sheet_range_get_type (void) return sheet_range_type; } + +static void column_titles_changed (GtkWidget *w, gint first, gint n_columns, gpointer data); + +/* Properties */ +enum + { + PROP_0, + PROP_ROW_GEO, + PROP_COL_GEO, + PROP_MODEL + }; + +static void +gtk_sheet_set_row_geometry (GtkSheet *sheet, GSheetRow *geo) +{ + if ( sheet->row_geometry ) g_object_unref (sheet->row_geometry); + + sheet->row_geometry = geo; + + if ( sheet->row_geometry ) g_object_ref (sheet->row_geometry); +} + +static void +gtk_sheet_set_column_geometry (GtkSheet *sheet, GSheetColumn *geo) +{ + if ( sheet->column_geometry ) g_object_unref (sheet->column_geometry); + + sheet->column_geometry = geo; + + if ( sheet->column_geometry ) g_object_ref (sheet->column_geometry); +} + + +static void +gtk_sheet_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) + +{ + GtkSheet *sheet = GTK_SHEET (object); + + switch (prop_id) + { + case PROP_ROW_GEO: + gtk_sheet_set_row_geometry (sheet, g_value_get_pointer (value)); + break; + case PROP_COL_GEO: + gtk_sheet_set_column_geometry (sheet, g_value_get_pointer (value)); + if ( sheet->column_geometry) + g_signal_connect (sheet->column_geometry, "columns_changed", + G_CALLBACK (column_titles_changed), sheet); + break; + case PROP_MODEL: + gtk_sheet_set_model (sheet, g_value_get_pointer (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + }; +} + +static void +gtk_sheet_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GtkSheet *sheet = GTK_SHEET (object); + + switch (prop_id) + { + case PROP_ROW_GEO: + g_value_set_pointer (value, sheet->row_geometry); + break; + case PROP_COL_GEO: + g_value_set_pointer (value, sheet->column_geometry); + break; + case PROP_MODEL: + g_value_set_pointer (value, sheet->model); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + }; +} + + static void gtk_sheet_class_init (GtkSheetClass * klass) { - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + GParamSpec *row_geo_spec ; + GParamSpec *col_geo_spec ; + GParamSpec *model_spec ; - object_class = (GtkObjectClass *) klass; - widget_class = (GtkWidgetClass *) klass; - container_class = (GtkContainerClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + GtkContainerClass *container_class = (GtkContainerClass *) klass; parent_class = g_type_class_peek_parent (klass); @@ -899,12 +981,16 @@ gtk_sheet_class_init (GtkSheetClass * klass) * A row has been selected. */ sheet_signals[SELECT_ROW] = - gtk_signal_new ("select-row", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, select_row), - gtkextra_VOID__INT, - GTK_TYPE_NONE, 1, GTK_TYPE_INT); + g_signal_new ("select-row", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + offsetof (GtkSheetClass, select_row), + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, + 1, + G_TYPE_INT); + /** * GtkSheet::select - column @@ -914,155 +1000,223 @@ gtk_sheet_class_init (GtkSheetClass * klass) * A column has been selected. */ sheet_signals[SELECT_COLUMN] = - gtk_signal_new ("select-column", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, select_column), - gtkextra_VOID__INT, - GTK_TYPE_NONE, 1, GTK_TYPE_INT); + g_signal_new ("select-column", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + offsetof (GtkSheetClass, select_column), + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, + 1, + G_TYPE_INT); /** - * GtkSheet::double - click - row + * GtkSheet::double-click-row * @sheet: the sheet widget that emitted the signal * @row: the row that was double clicked. * * A row's title button has been double clicked */ sheet_signals[DOUBLE_CLICK_ROW] = - gtk_signal_new ("double-click-row", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - 0, - gtkextra_VOID__INT, - GTK_TYPE_NONE, 1, GTK_TYPE_INT); + g_signal_new ("double-click-row", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, + 1, + G_TYPE_INT); /** - * GtkSheet::double - click - column + * GtkSheet::double-click-column * @sheet: the sheet widget that emitted the signal * @column: the column that was double clicked. * * A column's title button has been double clicked */ sheet_signals[DOUBLE_CLICK_COLUMN] = - gtk_signal_new ("double-click-column", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - 0, - gtkextra_VOID__INT, - GTK_TYPE_NONE, 1, GTK_TYPE_INT); + g_signal_new ("double-click-column", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, + 1, + G_TYPE_INT); + + + /** + * GtkSheet::button-event-column + * @sheet: the sheet widget that emitted the signal + * @column: the column on which the event occured. + * + * A button event occured on a column title button + */ + sheet_signals[BUTTON_EVENT_COLUMN] = + g_signal_new ("button-event-column", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + gtkextra_VOID__INT_POINTER, + G_TYPE_NONE, + 2, + G_TYPE_INT, + G_TYPE_POINTER + ); + + + /** + * GtkSheet::button-event-row + * @sheet: the sheet widget that emitted the signal + * @column: the column on which the event occured. + * + * A button event occured on a row title button + */ + sheet_signals[BUTTON_EVENT_ROW] = + g_signal_new ("button-event-row", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + gtkextra_VOID__INT_POINTER, + G_TYPE_NONE, + 2, + G_TYPE_INT, + G_TYPE_POINTER + ); + sheet_signals[SELECT_RANGE] = - gtk_signal_new ("select-range", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, select_range), - gtkextra_VOID__BOXED, - GTK_TYPE_NONE, 1, GTK_TYPE_SHEET_RANGE); - - sheet_signals[CLIP_RANGE] = - gtk_signal_new ("clip-range", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, clip_range), - gtkextra_VOID__BOXED, - GTK_TYPE_NONE, 1, GTK_TYPE_SHEET_RANGE); + g_signal_new ("select-range", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + offsetof (GtkSheetClass, select_range), + NULL, NULL, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, + 1, + GTK_TYPE_SHEET_RANGE); + sheet_signals[RESIZE_RANGE] = - gtk_signal_new ("resize-range", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, resize_range), - gtkextra_VOID__BOXED_BOXED, - GTK_TYPE_NONE, 2, GTK_TYPE_SHEET_RANGE, GTK_TYPE_SHEET_RANGE); + g_signal_new ("resize-range", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + offsetof (GtkSheetClass, resize_range), + NULL, NULL, + gtkextra_VOID__BOXED_BOXED, + G_TYPE_NONE, + 2, + GTK_TYPE_SHEET_RANGE, GTK_TYPE_SHEET_RANGE + ); + sheet_signals[MOVE_RANGE] = - gtk_signal_new ("move-range", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, move_range), - gtkextra_VOID__BOXED_BOXED, - GTK_TYPE_NONE, 2, GTK_TYPE_SHEET_RANGE, GTK_TYPE_SHEET_RANGE); + g_signal_new ("move-range", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + offsetof (GtkSheetClass, move_range), + NULL, NULL, + gtkextra_VOID__BOXED_BOXED, + G_TYPE_NONE, + 2, + GTK_TYPE_SHEET_RANGE, GTK_TYPE_SHEET_RANGE + ); + sheet_signals[TRAVERSE] = - gtk_signal_new ("traverse", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, traverse), - gtkextra_BOOLEAN__INT_INT_POINTER_POINTER, - GTK_TYPE_BOOL, 4, GTK_TYPE_INT, GTK_TYPE_INT, - GTK_TYPE_POINTER, GTK_TYPE_POINTER); + g_signal_new ("traverse", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + offsetof (GtkSheetClass, traverse), + NULL, NULL, + gtkextra_BOOLEAN__INT_INT_POINTER_POINTER, + G_TYPE_BOOLEAN, 4, G_TYPE_INT, G_TYPE_INT, + G_TYPE_POINTER, G_TYPE_POINTER); + sheet_signals[DEACTIVATE] = - gtk_signal_new ("deactivate", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, deactivate), - gtkextra_BOOLEAN__INT_INT, - GTK_TYPE_BOOL, 2, GTK_TYPE_INT, GTK_TYPE_INT); + g_signal_new ("deactivate", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + offsetof (GtkSheetClass, deactivate), + NULL, NULL, + gtkextra_VOID__INT_INT, + G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); sheet_signals[ACTIVATE] = - gtk_signal_new ("activate", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, activate), - gtkextra_BOOLEAN__INT_INT, - GTK_TYPE_BOOL, 2, GTK_TYPE_INT, GTK_TYPE_INT); - - sheet_signals[SET_CELL] = - gtk_signal_new ("set-cell", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, set_cell), - gtkextra_VOID__INT_INT, - GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT); - - sheet_signals[CLEAR_CELL] = - gtk_signal_new ("clear-cell", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, clear_cell), - gtkextra_VOID__INT_INT, - GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT); + g_signal_new ("activate", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + offsetof (GtkSheetClass, activate), + NULL, NULL, + gtkextra_BOOLEAN__INT_INT, + G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_INT); sheet_signals[CHANGED] = - gtk_signal_new ("changed", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, changed), - gtkextra_VOID__INT_INT, - GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT); - - sheet_signals[NEW_COL_WIDTH] = - gtk_signal_new ("new-column-width", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, changed), - gtkextra_VOID__INT_INT, - GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT); - - sheet_signals[NEW_ROW_HEIGHT] = - gtk_signal_new ("new-row-height", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, changed), - gtkextra_VOID__INT_INT, - GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT); + g_signal_new ("changed", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + offsetof (GtkSheetClass, changed), + NULL, NULL, + gtkextra_VOID__INT_INT, + G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); widget_class->set_scroll_adjustments_signal = - gtk_signal_new ("set-scroll-adjustments", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkSheetClass, set_scroll_adjustments), - gtkextra_VOID__OBJECT_OBJECT, - GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT); + g_signal_new ("set-scroll-adjustments", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + offsetof (GtkSheetClass, set_scroll_adjustments), + NULL, NULL, + gtkextra_VOID__OBJECT_OBJECT, + G_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT); container_class->add = NULL; container_class->remove = gtk_sheet_remove; container_class->forall = gtk_sheet_forall; - object_class->destroy = gtk_sheet_destroy; - gobject_class->finalize = gtk_sheet_finalize; + object_class->dispose = gtk_sheet_dispose; + object_class->finalize = gtk_sheet_finalize; + + + row_geo_spec = + g_param_spec_pointer ("row-geometry", + "Row Geometry", + "A pointer to the model of the row geometry", + G_PARAM_READABLE | G_PARAM_WRITABLE ); + + col_geo_spec = + g_param_spec_pointer ("column-geometry", + "Column Geometry", + "A pointer to the model of the column geometry", + G_PARAM_READABLE | G_PARAM_WRITABLE ); + + model_spec = + g_param_spec_pointer ("model", + "Model", + "A pointer to the data model", + G_PARAM_READABLE | G_PARAM_WRITABLE ); + + + object_class->set_property = gtk_sheet_set_property; + object_class->get_property = gtk_sheet_get_property; + + g_object_class_install_property (object_class, + PROP_ROW_GEO, + row_geo_spec); + + g_object_class_install_property (object_class, + PROP_COL_GEO, + col_geo_spec); + + g_object_class_install_property (object_class, + PROP_MODEL, + model_spec); + widget_class->realize = gtk_sheet_realize; widget_class->unrealize = gtk_sheet_unrealize; @@ -1083,20 +1237,18 @@ gtk_sheet_class_init (GtkSheetClass * klass) klass->select_row = NULL; klass->select_column = NULL; klass->select_range = NULL; - klass->clip_range = NULL; klass->resize_range = NULL; klass->move_range = NULL; klass->traverse = NULL; klass->deactivate = NULL; klass->activate = NULL; - klass->set_cell = NULL; - klass->clear_cell = NULL; klass->changed = NULL; } static void gtk_sheet_init (GtkSheet *sheet) { + sheet->model = NULL; sheet->column_geometry = NULL; sheet->row_geometry = NULL; @@ -1110,11 +1262,6 @@ gtk_sheet_init (GtkSheet *sheet) GTK_WIDGET_UNSET_FLAGS (sheet, GTK_NO_WINDOW); GTK_WIDGET_SET_FLAGS (sheet, GTK_CAN_FOCUS); - sheet->view.row0 = 0; - sheet->view.col0 = 0; - sheet->view.rowi = 0; - sheet->view.coli = 0; - sheet->column_title_window = NULL; sheet->column_title_area.x = 0; sheet->column_title_area.y = 0; @@ -1133,7 +1280,6 @@ gtk_sheet_init (GtkSheet *sheet) sheet->selection_cell.row = 0; sheet->selection_cell.col = 0; - sheet->sheet_entry = NULL; sheet->pixmap = NULL; sheet->range.row0 = 0; @@ -1146,7 +1292,8 @@ gtk_sheet_init (GtkSheet *sheet) sheet->sheet_window = NULL; sheet->sheet_window_width = 0; sheet->sheet_window_height = 0; - sheet->sheet_entry = NULL; + sheet->entry_widget = NULL; + sheet->entry_container = NULL; sheet->button = NULL; sheet->hoffset = 0; @@ -1161,12 +1308,34 @@ gtk_sheet_init (GtkSheet *sheet) sheet->bg_gc = NULL; sheet->x_drag = 0; sheet->y_drag = 0; - gdk_color_parse ("white", &sheet->bg_color); - gdk_color_alloc (gdk_colormap_get_system (), &sheet->bg_color); + gdk_colormap_alloc_color (gdk_colormap_get_system (), &sheet->bg_color, FALSE, + TRUE); gdk_color_parse ("gray", &sheet->grid_color); - gdk_color_alloc (gdk_colormap_get_system (), &sheet->grid_color); + gdk_colormap_alloc_color (gdk_colormap_get_system (), &sheet->grid_color, FALSE, + TRUE); + sheet->show_grid = TRUE; + + sheet->motion_timer = 0; + + sheet->columns_resizable = TRUE; + sheet->rows_resizable = TRUE; + + sheet->row_titles_visible = TRUE; + sheet->row_title_area.width = DEFAULT_COLUMN_WIDTH; + + sheet->column_titles_visible = TRUE; + sheet->autoscroll = TRUE; + sheet->justify_entry = TRUE; + + + /* create sheet entry */ + sheet->entry_type = 0; + create_sheet_entry (sheet); + + /* create global selection button */ + create_global_button (sheet); } @@ -1191,15 +1360,6 @@ columns_inserted_deleted_callback (GSheetModel *model, gint first_column, range.coli = xxx_column_count (sheet) - 1; range.rowi = yyy_row_count (sheet) - 1; - sheet->view.col0 = - COLUMN_FROM_XPIXEL (sheet, sheet->row_title_area.width + 1); - - sheet->view.coli = - COLUMN_FROM_XPIXEL (sheet, sheet->sheet_window_width); - - if ( sheet->view.coli > range.coli) - sheet->view.coli = range.coli; - adjust_scrollbars (sheet); if (sheet->active_cell.col >= model_columns) @@ -1232,14 +1392,6 @@ rows_inserted_deleted_callback (GSheetModel *model, gint first_row, range.rowi = yyy_row_count (sheet) - 1; range.coli = xxx_column_count (sheet) - 1; - sheet->view.row0 = - ROW_FROM_YPIXEL (sheet, sheet->column_title_area.height + 1); - sheet->view.rowi = - ROW_FROM_YPIXEL (sheet, sheet->sheet_window_height - 1); - - if ( sheet->view.rowi > range.rowi) - sheet->view.rowi = range.rowi; - adjust_scrollbars (sheet); if (sheet->active_cell.row >= model_rows) @@ -1268,9 +1420,28 @@ range_update_callback (GSheetModel *m, gint row0, gint col0, range.rowi = rowi; range.coli = coli; + if ( MAX_VISIBLE_ROW (sheet) > + g_sheet_model_get_row_count (sheet->model) + || + MAX_VISIBLE_COLUMN (sheet) > + g_sheet_model_get_column_count (sheet->model)) + { + gtk_sheet_move_query (sheet, 0, 0); + } + if ( ( row0 < 0 && col0 < 0 ) || ( rowi < 0 && coli < 0 ) ) { + gint i; gtk_sheet_range_draw (sheet, NULL); + adjust_scrollbars (sheet); + + for (i = MIN_VISIBLE_ROW (sheet); i <= MAX_VISIBLE_ROW (sheet); i++) + gtk_sheet_row_title_button_draw (sheet, i); + + for (i = MIN_VISIBLE_COLUMN (sheet); + i <= MAX_VISIBLE_COLUMN (sheet); i++) + gtk_sheet_column_title_button_draw (sheet, i); + return; } else if ( row0 < 0 || rowi < 0 ) @@ -1288,12 +1459,6 @@ range_update_callback (GSheetModel *m, gint row0, gint col0, } -static void gtk_sheet_construct (GtkSheet *sheet, - GSheetRow *vgeo, - GSheetColumn *hgeo, - const gchar *title); - - /** * gtk_sheet_new: * @rows: initial number of rows @@ -1306,19 +1471,13 @@ static void gtk_sheet_construct (GtkSheet *sheet, * Returns: the new sheet widget */ GtkWidget * -gtk_sheet_new (GSheetRow *vgeo, GSheetColumn *hgeo, const gchar *title, - GSheetModel *model) +gtk_sheet_new (GSheetRow *vgeo, GSheetColumn *hgeo, GSheetModel *model) { - GtkWidget *widget; - - widget = gtk_type_new (gtk_sheet_get_type ()); - - gtk_sheet_construct (GTK_SHEET (widget), vgeo, hgeo, title); - - if (model) - gtk_sheet_set_model (GTK_SHEET (widget), model); - - + GtkWidget *widget = g_object_new (GTK_TYPE_SHEET, + "row-geometry", vgeo, + "column-geometry", hgeo, + "model", model, + NULL); return widget; } @@ -1335,25 +1494,30 @@ void gtk_sheet_set_model (GtkSheet *sheet, GSheetModel *model) { g_return_if_fail (GTK_IS_SHEET (sheet)); - g_return_if_fail (G_IS_SHEET_MODEL (model)); + + if (sheet->model ) g_object_unref (sheet->model); sheet->model = model; - g_signal_connect (model, "range_changed", - G_CALLBACK (range_update_callback), sheet); + if ( model) + { + g_object_ref (model); - g_signal_connect (model, "rows_inserted", - G_CALLBACK (rows_inserted_deleted_callback), sheet); + g_signal_connect (model, "range_changed", + G_CALLBACK (range_update_callback), sheet); - g_signal_connect (model, "rows_deleted", - G_CALLBACK (rows_inserted_deleted_callback), sheet); + g_signal_connect (model, "rows_inserted", + G_CALLBACK (rows_inserted_deleted_callback), sheet); - g_signal_connect (model, "columns_inserted", - G_CALLBACK (columns_inserted_deleted_callback), sheet); + g_signal_connect (model, "rows_deleted", + G_CALLBACK (rows_inserted_deleted_callback), sheet); - g_signal_connect (model, "columns_deleted", - G_CALLBACK (columns_inserted_deleted_callback), sheet); + g_signal_connect (model, "columns_inserted", + G_CALLBACK (columns_inserted_deleted_callback), sheet); + g_signal_connect (model, "columns_deleted", + G_CALLBACK (columns_inserted_deleted_callback), sheet); + } } @@ -1380,7 +1544,7 @@ column_titles_changed (GtkWidget *w, gint first, gint n_columns, gpointer data) for ( i = first ; i <= first + n_columns ; ++i ) { gtk_sheet_column_title_button_draw (sheet, i); - gtk_signal_emit (GTK_OBJECT (sheet), sheet_signals[CHANGED], -1, i); + g_signal_emit (sheet, sheet_signals[CHANGED], 0, -1, i); } } @@ -1389,75 +1553,6 @@ column_titles_changed (GtkWidget *w, gint first, gint n_columns, gpointer data) } -static void -gtk_sheet_construct (GtkSheet *sheet, - GSheetRow *vgeo, - GSheetColumn *hgeo, - const gchar *title) -{ - g_return_if_fail (G_IS_SHEET_COLUMN (hgeo)); - g_return_if_fail (G_IS_SHEET_ROW (vgeo)); - - sheet->column_geometry = hgeo; - sheet->row_geometry = vgeo; - - - sheet->columns_resizable = TRUE; - sheet->rows_resizable = TRUE; - - sheet->row_titles_visible = TRUE; - sheet->row_title_area.width = DEFAULT_COLUMN_WIDTH; - - sheet->column_titles_visible = TRUE; - sheet->autoscroll = TRUE; - sheet->justify_entry = TRUE; - - - /* create sheet entry */ - sheet->entry_type = 0; - create_sheet_entry (sheet); - - /* create global selection button */ - create_global_button (sheet); - - if (title) - sheet->name = g_strdup (title); - - g_signal_connect (sheet->column_geometry, "columns_changed", - G_CALLBACK (column_titles_changed), sheet); - -} - - -GtkWidget * -gtk_sheet_new_with_custom_entry (GSheetRow *rows, GSheetColumn *columns, - const gchar *title, GtkType entry_type) -{ - GtkWidget *widget; - - widget = gtk_type_new (gtk_sheet_get_type ()); - - gtk_sheet_construct_with_custom_entry (GTK_SHEET (widget), - rows, columns, title, entry_type); - - return widget; -} - -void -gtk_sheet_construct_with_custom_entry (GtkSheet *sheet, - GSheetRow *vgeo, - GSheetColumn *hgeo, - const gchar *title, - GtkType entry_type) -{ - gtk_sheet_construct (sheet, vgeo, hgeo, title); - - sheet->entry_type = entry_type; - create_sheet_entry (sheet); -} - - - void gtk_sheet_change_entry (GtkSheet *sheet, GtkType entry_type) { @@ -1478,7 +1573,7 @@ gtk_sheet_change_entry (GtkSheet *sheet, GtkType entry_type) if (state == GTK_SHEET_NORMAL) { gtk_sheet_show_active_cell (sheet); - g_signal_connect (G_OBJECT (gtk_sheet_get_entry (sheet)), + g_signal_connect (gtk_sheet_get_entry (sheet), "changed", G_CALLBACK (gtk_sheet_entry_changed), sheet); @@ -1517,7 +1612,7 @@ gtk_sheet_set_background (GtkSheet *sheet, GdkColor *color) if (!color) { gdk_color_parse ("white", &sheet->bg_color); - gdk_color_alloc (gdk_colormap_get_system (), &sheet->bg_color); + gdk_colormap_alloc_color (gdk_colormap_get_system (), &sheet->bg_color, FALSE, TRUE); } else sheet->bg_color = *color; @@ -1535,7 +1630,7 @@ gtk_sheet_set_grid (GtkSheet *sheet, GdkColor *color) if (!color) { gdk_color_parse ("black", &sheet->grid_color); - gdk_color_alloc (gdk_colormap_get_system (), &sheet->grid_color); + gdk_colormap_alloc_color (gdk_colormap_get_system (), &sheet->grid_color, FALSE, TRUE); } else sheet->grid_color = *color; @@ -1663,23 +1758,6 @@ gtk_sheet_autoscroll (GtkSheet *sheet) return sheet->autoscroll; } -void -gtk_sheet_set_clip_text (GtkSheet *sheet, gboolean clip_text) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - sheet->clip_text = clip_text; -} - -gboolean -gtk_sheet_clip_text (GtkSheet *sheet) -{ - g_return_val_if_fail (sheet != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); - - return sheet->clip_text; -} void gtk_sheet_set_justify_entry (GtkSheet *sheet, gboolean justify) @@ -1699,64 +1777,7 @@ gtk_sheet_justify_entry (GtkSheet *sheet) return sheet->justify_entry; } -void -gtk_sheet_set_locked (GtkSheet *sheet, gboolean locked) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - if ( locked ) - { - GTK_SHEET_SET_FLAGS (sheet,GTK_SHEET_IS_LOCKED); - gtk_widget_hide (sheet->sheet_entry); - gtk_widget_unmap (sheet->sheet_entry); - } - else - { - GTK_SHEET_UNSET_FLAGS (sheet,GTK_SHEET_IS_LOCKED); - if (GTK_WIDGET_MAPPED (GTK_WIDGET (sheet))) - { - gtk_widget_show (sheet->sheet_entry); - gtk_widget_map (sheet->sheet_entry); - } - } - - gtk_entry_set_editable (GTK_ENTRY (sheet->sheet_entry), locked); - -} - -gboolean -gtk_sheet_locked (const GtkSheet *sheet) -{ - g_return_val_if_fail (sheet != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); - - return GTK_SHEET_IS_LOCKED (sheet); -} - -/* This routine has problems with gtk+- 1.2 related with the - label / button drawing - I think it's a bug in gtk+- 1.2 */ -void -gtk_sheet_set_title (GtkSheet *sheet, const gchar *title) -{ - GtkWidget *label; - - g_return_if_fail (sheet != NULL); - g_return_if_fail (title != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - if (sheet->name) - g_free (sheet->name); - - sheet->name = g_strdup (title); - - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)) || !title) return; - if (GTK_BIN (sheet->button)->child) - label = GTK_BIN (sheet->button)->child; - - size_allocate_global_button (sheet); -} void gtk_sheet_freeze (GtkSheet *sheet) @@ -1787,14 +1808,14 @@ gtk_sheet_thaw (GtkSheet *sheet) sheet->old_hadjustment = -1.; if (sheet->hadjustment) - gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), - "value_changed"); + g_signal_emit_by_name (sheet->hadjustment, + "value_changed"); if (sheet->vadjustment) - gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), - "value_changed"); + g_signal_emit_by_name (sheet->vadjustment, + "value_changed"); if (sheet->state == GTK_STATE_NORMAL) - if (sheet->sheet_entry && GTK_WIDGET_MAPPED (sheet->sheet_entry)) + if (sheet->entry_widget && GTK_WIDGET_MAPPED (sheet->entry_widget)) { gtk_sheet_activate_cell (sheet, sheet->active_cell.row, sheet->active_cell.col); @@ -1808,16 +1829,13 @@ gtk_sheet_set_row_titles_width (GtkSheet *sheet, guint width) if (width < COLUMN_MIN_WIDTH) return; sheet->row_title_area.width = width; - sheet->view.col0 = COLUMN_FROM_XPIXEL (sheet, sheet->row_title_area.width + 1); - sheet->view.coli = COLUMN_FROM_XPIXEL (sheet, sheet->sheet_window_width); - adjust_scrollbars (sheet); sheet->old_hadjustment = -1.; if (sheet->hadjustment) - gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), - "value_changed"); + g_signal_emit_by_name (sheet->hadjustment, + "value_changed"); size_allocate_global_button (sheet); } @@ -1827,16 +1845,13 @@ gtk_sheet_set_column_titles_height (GtkSheet *sheet, guint height) if (height < DEFAULT_ROW_HEIGHT (GTK_WIDGET (sheet))) return; sheet->column_title_area.height = height; - sheet->view.row0 = ROW_FROM_YPIXEL (sheet, - sheet->column_title_area.height + 1); - sheet->view.rowi = ROW_FROM_YPIXEL (sheet, sheet->sheet_window_height - 1); adjust_scrollbars (sheet); sheet->old_vadjustment = -1.; if (sheet->vadjustment) - gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), - "value_changed"); + g_signal_emit_by_name (sheet->vadjustment, + "value_changed"); size_allocate_global_button (sheet); } @@ -1874,8 +1889,8 @@ gtk_sheet_show_column_titles (GtkSheet *sheet) sheet->old_vadjustment = -1.; if (sheet->vadjustment) - gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), - "value_changed"); + g_signal_emit_by_name (sheet->vadjustment, + "value_changed"); size_allocate_global_button (sheet); } @@ -1916,8 +1931,8 @@ gtk_sheet_show_row_titles (GtkSheet *sheet) sheet->old_hadjustment = -1.; if (sheet->hadjustment) - gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), - "value_changed"); + g_signal_emit_by_name (sheet->hadjustment, + "value_changed"); size_allocate_global_button (sheet); } @@ -1952,8 +1967,8 @@ gtk_sheet_hide_column_titles (GtkSheet *sheet) sheet->old_vadjustment = -1.; if (sheet->vadjustment) - gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), - "value_changed"); + g_signal_emit_by_name (sheet->vadjustment, + "value_changed"); } void @@ -1987,8 +2002,8 @@ gtk_sheet_hide_row_titles (GtkSheet *sheet) sheet->old_hadjustment = -1.; if (sheet->hadjustment) - gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), - "value_changed"); + g_signal_emit_by_name (sheet->hadjustment, + "value_changed"); } gboolean @@ -2033,21 +2048,22 @@ gtk_sheet_moveto (GtkSheet *sheet, width = sheet->sheet_window_width; /* adjust vertical scrollbar */ - if (row >= 0 && row_align >= 0.) + if (row >= 0 && row_align >= 0.0) { y = ROW_TOP_YPIXEL (sheet, row) - sheet->voffset - - (gint) ( row_align*height + (1. - row_align) + - (gint) ( row_align * height + (1.0 - row_align) * yyy_row_height (sheet, row)); /* This forces the sheet to scroll when you don't see the entire cell */ min_row = row; adjust = 0; - if (row_align == 1.) + if (row_align >= 1.0) { while (min_row >= 0 && min_row > MIN_VISIBLE_ROW (sheet)) { if (yyy_row_is_visible (sheet, min_row)) adjust += yyy_row_height (sheet, min_row); + if (adjust >= height) { break; @@ -2055,6 +2071,9 @@ gtk_sheet_moveto (GtkSheet *sheet, min_row--; } min_row = MAX (min_row, 0); + + min_row ++; + y = ROW_TOP_YPIXEL (sheet, min_row) - sheet->voffset + yyy_row_height (sheet, min_row) - 1; } @@ -2065,23 +2084,22 @@ gtk_sheet_moveto (GtkSheet *sheet, sheet->vadjustment->value = y; sheet->old_vadjustment = -1.; - gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), - "value_changed"); + g_signal_emit_by_name (sheet->vadjustment, + "value_changed"); } /* adjust horizontal scrollbar */ - if (column >= 0 && col_align >= 0.) + if (column >= 0 && col_align >= 0.0) { x = COLUMN_LEFT_XPIXEL (sheet, column) - sheet->hoffset - - (gint) ( col_align*width + (1.- col_align)* + - (gint) ( col_align*width + (1.0 - col_align)* xxx_column_width (sheet, column)); - /* This forces the sheet to scroll when you don't see the entire cell */ min_col = column; adjust = 0; - if (col_align == 1.) + if (col_align == 1.0) { while (min_col >= 0 && min_col > MIN_VISIBLE_COLUMN (sheet)) { @@ -2105,9 +2123,8 @@ gtk_sheet_moveto (GtkSheet *sheet, sheet->hadjustment->value = x; sheet->old_vadjustment = -1.; - gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), - "value_changed"); - + g_signal_emit_by_name (sheet->hadjustment, + "value_changed"); } } @@ -2134,266 +2151,82 @@ gtk_sheet_columns_resizable (GtkSheet *sheet) void gtk_sheet_rows_set_resizable (GtkSheet *sheet, gboolean resizable) { - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - sheet->rows_resizable = resizable; -} - -gboolean -gtk_sheet_rows_resizable (GtkSheet *sheet) -{ - g_return_val_if_fail (sheet != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); - - return sheet->rows_resizable; -} - - -void -gtk_sheet_select_row (GtkSheet * sheet, - gint row) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - if (row < 0 || row >= yyy_row_count (sheet)) - return; - - if (sheet->state != GTK_SHEET_NORMAL) - gtk_sheet_real_unselect_range (sheet, NULL); - else - { - gboolean veto = TRUE; - veto = gtk_sheet_deactivate_cell (sheet); - if (!veto) return; - } - - sheet->state = GTK_SHEET_ROW_SELECTED; - sheet->range.row0 = row; - sheet->range.col0 = 0; - sheet->range.rowi = row; - sheet->range.coli = xxx_column_count (sheet) - 1; - sheet->active_cell.row = row; - sheet->active_cell.col = 0; - - gtk_signal_emit (GTK_OBJECT (sheet), sheet_signals[SELECT_ROW], row); - gtk_sheet_real_select_range (sheet, NULL); -} - - -void -gtk_sheet_select_column (GtkSheet * sheet, gint column) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - if (column < 0 || column >= xxx_column_count (sheet)) - return; - - if (sheet->state != GTK_SHEET_NORMAL) - gtk_sheet_real_unselect_range (sheet, NULL); - else - { - gboolean veto = TRUE; - veto = gtk_sheet_deactivate_cell (sheet); - if (!veto) return; - } - - sheet->state = GTK_SHEET_COLUMN_SELECTED; - sheet->range.row0 = 0; - sheet->range.col0 = column; - sheet->range.rowi = yyy_row_count (sheet) - 1; - sheet->range.coli = column; - sheet->active_cell.row = 0; - sheet->active_cell.col = column; - - gtk_signal_emit (GTK_OBJECT (sheet), sheet_signals[SELECT_COLUMN], column); - gtk_sheet_real_select_range (sheet, NULL); -} - -void -gtk_sheet_clip_range (GtkSheet *sheet, const GtkSheetRange *range) -{ - - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - if (GTK_SHEET_IN_CLIP (sheet)) return; - - GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_CLIP); - - if (range == NULL) - sheet->clip_range = sheet->range; - else - sheet->clip_range=*range; - - sheet->interval = 0; - sheet->clip_timer = gtk_timeout_add (TIMEOUT_FLASH, gtk_sheet_flash, sheet); - - gtk_signal_emit (GTK_OBJECT (sheet), sheet_signals[CLIP_RANGE], - &sheet->clip_range); - -} - -void -gtk_sheet_unclip_range (GtkSheet *sheet) -{ - - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - if (!GTK_SHEET_IN_CLIP (sheet)) return; - - GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_CLIP); - - gtk_timeout_remove (sheet->clip_timer); - gtk_sheet_range_draw (sheet, &sheet->clip_range); - - if (gtk_sheet_range_isvisible (sheet, sheet->range)) - gtk_sheet_range_draw (sheet, &sheet->range); -} - -gboolean -gtk_sheet_in_clip (GtkSheet *sheet) -{ - g_return_val_if_fail (sheet != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); - - return GTK_SHEET_IN_CLIP (sheet); -} - -static gint -gtk_sheet_flash (gpointer data) -{ - GtkSheet *sheet; - gint x,y,width,height; - GdkRectangle clip_area; - - sheet = GTK_SHEET (data); - - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return TRUE; - if (!GTK_WIDGET_DRAWABLE (GTK_WIDGET (sheet))) return TRUE; - if (!gtk_sheet_range_isvisible (sheet, sheet->clip_range)) return TRUE; - if (GTK_SHEET_IN_XDRAG (sheet)) return TRUE; - if (GTK_SHEET_IN_YDRAG (sheet)) return TRUE; - - GDK_THREADS_ENTER (); - - x = COLUMN_LEFT_XPIXEL (sheet,sheet->clip_range.col0)+1; - y = ROW_TOP_YPIXEL (sheet,sheet->clip_range.row0)+1; - width = COLUMN_LEFT_XPIXEL (sheet,sheet->clip_range.coli)- x+ - xxx_column_width (sheet, sheet->clip_range.coli) - 1; - height = ROW_TOP_YPIXEL (sheet,sheet->clip_range.rowi)- y+ - yyy_row_height (sheet, sheet->clip_range.rowi)- 1; - - clip_area.x = COLUMN_LEFT_XPIXEL (sheet, MIN_VISIBLE_COLUMN (sheet)); - clip_area.y = ROW_TOP_YPIXEL (sheet, MIN_VISIBLE_ROW (sheet)); - clip_area.width = sheet->sheet_window_width; - clip_area.height = sheet->sheet_window_height; - - if (x < 0) - { - width += x + 1; - x =- 1; - } - if (width > clip_area.width) width = clip_area.width + 10; - if (y < 0) - { - height += y + 1; - y =- 1; - } - if (height > clip_area.height) height = clip_area.height + 10; + g_return_if_fail (sheet != NULL); + g_return_if_fail (GTK_IS_SHEET (sheet)); - gdk_draw_pixmap (sheet->sheet_window, - GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], - sheet->pixmap, - x, y, - x, y, - 1, height); + sheet->rows_resizable = resizable; +} - gdk_draw_pixmap (sheet->sheet_window, - GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], - sheet->pixmap, - x, y, - x, y, - width, 1); +gboolean +gtk_sheet_rows_resizable (GtkSheet *sheet) +{ + g_return_val_if_fail (sheet != NULL, FALSE); + g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); - gdk_draw_pixmap (sheet->sheet_window, - GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], - sheet->pixmap, - x, y + height, - x, y + height, - width, 1); + return sheet->rows_resizable; +} - gdk_draw_pixmap (sheet->sheet_window, - GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], - sheet->pixmap, - x + width, y, - x + width, y, - 1, height); +void +gtk_sheet_select_row (GtkSheet * sheet, + gint row) +{ + g_return_if_fail (sheet != NULL); + g_return_if_fail (GTK_IS_SHEET (sheet)); - sheet->interval = sheet->interval + 1; - if (sheet->interval == TIME_INTERVAL) sheet->interval = 0; + if (row < 0 || row >= yyy_row_count (sheet)) + return; - gdk_gc_set_dashes (sheet->xor_gc, sheet->interval, (gint8*)"\4\4", 2); - gtk_sheet_draw_flashing_range (sheet,sheet->clip_range); - gdk_gc_set_dashes (sheet->xor_gc, 0, (gint8*)"\4\4", 2); + if (sheet->state != GTK_SHEET_NORMAL) + gtk_sheet_real_unselect_range (sheet, NULL); + else + gtk_sheet_deactivate_cell (sheet); - GDK_THREADS_LEAVE (); + sheet->state = GTK_SHEET_ROW_SELECTED; + sheet->range.row0 = row; + sheet->range.col0 = 0; + sheet->range.rowi = row; + sheet->range.coli = xxx_column_count (sheet) - 1; + sheet->active_cell.row = row; + sheet->active_cell.col = 0; - return TRUE; + g_signal_emit (sheet, sheet_signals[SELECT_ROW], 0, row); + gtk_sheet_real_select_range (sheet, NULL); } -static void -gtk_sheet_draw_flashing_range (GtkSheet *sheet, GtkSheetRange range) -{ - GdkRectangle clip_area; - gint x,y,width,height; - if (!gtk_sheet_range_isvisible (sheet, sheet->clip_range)) return; +void +gtk_sheet_select_column (GtkSheet * sheet, gint column) +{ + g_return_if_fail (sheet != NULL); + g_return_if_fail (GTK_IS_SHEET (sheet)); - clip_area.x = COLUMN_LEFT_XPIXEL (sheet, MIN_VISIBLE_COLUMN (sheet)); - clip_area.y = ROW_TOP_YPIXEL (sheet, MIN_VISIBLE_ROW (sheet)); - clip_area.width = sheet->sheet_window_width; - clip_area.height = sheet->sheet_window_height; + if (column < 0 || column >= xxx_column_count (sheet)) + return; - gdk_gc_set_clip_rectangle (sheet->xor_gc, &clip_area); + if (sheet->state != GTK_SHEET_NORMAL) + gtk_sheet_real_unselect_range (sheet, NULL); + else + gtk_sheet_deactivate_cell (sheet); - x = COLUMN_LEFT_XPIXEL (sheet,sheet->clip_range.col0)+1; - y = ROW_TOP_YPIXEL (sheet,sheet->clip_range.row0)+1; - width = COLUMN_LEFT_XPIXEL (sheet,sheet->clip_range.coli)- x+ - xxx_column_width (sheet, sheet->clip_range.coli) - 1; - height = ROW_TOP_YPIXEL (sheet,sheet->clip_range.rowi)- y+ - yyy_row_height (sheet, sheet->clip_range.rowi)- 1; - if (x < 0) - { - width += x + 1; - x =- 1; - } - if (width > clip_area.width) width = clip_area.width + 10; - if (y < 0) - { - height += y + 1; - y =- 1; - } - if (height > clip_area.height) height = clip_area.height + 10; + sheet->state = GTK_SHEET_COLUMN_SELECTED; + sheet->range.row0 = 0; + sheet->range.col0 = column; + sheet->range.rowi = yyy_row_count (sheet) - 1; + sheet->range.coli = column; + sheet->active_cell.row = 0; + sheet->active_cell.col = column; - gdk_gc_set_line_attributes (sheet->xor_gc, 1, 1, 0, 0 ); + g_signal_emit (sheet, sheet_signals[SELECT_COLUMN], 0, column); + gtk_sheet_real_select_range (sheet, NULL); +} - gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, FALSE, - x, y, - width, height); - gdk_gc_set_line_attributes (sheet->xor_gc, 1, 0, 0, 0); - gdk_gc_set_clip_rectangle (sheet->xor_gc, NULL); -} -static gint -gtk_sheet_range_isvisible (GtkSheet * sheet, +static gboolean +gtk_sheet_range_isvisible (const GtkSheet * sheet, GtkSheetRange range) { g_return_val_if_fail (sheet != NULL, FALSE); @@ -2425,7 +2258,7 @@ gtk_sheet_range_isvisible (GtkSheet * sheet, return TRUE; } -static gint +static gboolean gtk_sheet_cell_isvisible (GtkSheet * sheet, gint row, gint column) { @@ -2488,23 +2321,23 @@ gtk_sheet_set_vadjustment (GtkSheet *sheet, if (sheet->vadjustment) { - gtk_signal_disconnect_by_data (GTK_OBJECT (sheet->vadjustment), sheet); - gtk_object_unref (GTK_OBJECT (sheet->vadjustment)); + g_signal_handlers_disconnect_matched (sheet->vadjustment, + G_SIGNAL_MATCH_DATA, + 0, 0, 0, 0, + sheet); + g_object_unref (sheet->vadjustment); } sheet->vadjustment = adjustment; if (sheet->vadjustment) { - gtk_object_ref (GTK_OBJECT (sheet->vadjustment)); - gtk_object_sink (GTK_OBJECT (sheet->vadjustment)); + g_object_ref (sheet->vadjustment); + g_object_ref_sink (sheet->vadjustment); - gtk_signal_connect (GTK_OBJECT (sheet->vadjustment), "changed", - (GtkSignalFunc) vadjustment_changed, - (gpointer) sheet); - gtk_signal_connect (GTK_OBJECT (sheet->vadjustment), "value_changed", - (GtkSignalFunc) vadjustment_value_changed, - (gpointer) sheet); + g_signal_connect (sheet->vadjustment, "value_changed", + G_CALLBACK (vadjustment_value_changed), + sheet); } if (!sheet->vadjustment || !old_adjustment) @@ -2534,23 +2367,23 @@ gtk_sheet_set_hadjustment (GtkSheet *sheet, if (sheet->hadjustment) { - gtk_signal_disconnect_by_data (GTK_OBJECT (sheet->hadjustment), sheet); - gtk_object_unref (GTK_OBJECT (sheet->hadjustment)); + g_signal_handlers_disconnect_matched (sheet->hadjustment, + G_SIGNAL_MATCH_DATA, + 0, 0, 0, 0, + sheet); + g_object_unref (sheet->hadjustment); } sheet->hadjustment = adjustment; if (sheet->hadjustment) { - gtk_object_ref (GTK_OBJECT (sheet->hadjustment)); - gtk_object_sink (GTK_OBJECT (sheet->hadjustment)); + g_object_ref (sheet->hadjustment); + g_object_ref_sink (sheet->hadjustment); - gtk_signal_connect (GTK_OBJECT (sheet->hadjustment), "changed", - (GtkSignalFunc) hadjustment_changed, - (gpointer) sheet); - gtk_signal_connect (GTK_OBJECT (sheet->hadjustment), "value_changed", - (GtkSignalFunc) hadjustment_value_changed, - (gpointer) sheet); + g_signal_connect (sheet->hadjustment, "value_changed", + G_CALLBACK (hadjustment_value_changed), + sheet); } if (!sheet->hadjustment || !old_adjustment) @@ -2584,62 +2417,55 @@ gtk_sheet_finalize (GObject * object) sheet = GTK_SHEET (object); - /* get rid of all the cells */ - gtk_sheet_range_clear (sheet, NULL); - gtk_sheet_range_delete (sheet, NULL); - - if (sheet->name) - { - g_free (sheet->name); - sheet->name = NULL; - } - if (G_OBJECT_CLASS (parent_class)->finalize) (*G_OBJECT_CLASS (parent_class)->finalize) (object); } static void -gtk_sheet_destroy (GtkObject * object) +gtk_sheet_dispose (GObject *object) { - GtkSheet *sheet; + GtkSheet *sheet = GTK_SHEET (object); GList *children; g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_SHEET (object)); - sheet = GTK_SHEET (object); + if ( sheet->dispose_has_run ) + return ; - /* destroy the entry */ - if (sheet->sheet_entry && GTK_IS_WIDGET (sheet->sheet_entry)) - { - gtk_widget_destroy (sheet->sheet_entry); - sheet->sheet_entry = NULL; - } + sheet->dispose_has_run = TRUE; - /* destroy the global selection button */ - if (sheet->button && GTK_IS_WIDGET (sheet->button)) - { - gtk_widget_destroy (sheet->button); - sheet->button = NULL; - } + if (sheet->model) g_object_unref (sheet->model); + if (sheet->row_geometry) g_object_unref (sheet->row_geometry); + if (sheet->column_geometry) g_object_unref (sheet->column_geometry); - if (sheet->clip_timer) - { - gtk_timeout_remove (sheet->clip_timer); - sheet->clip_timer = 0; - } + g_object_unref (sheet->entry_container); + sheet->entry_container = NULL; + + g_object_unref (sheet->button); + sheet->button = NULL; /* unref adjustments */ if (sheet->hadjustment) { - gtk_signal_disconnect_by_data (GTK_OBJECT (sheet->hadjustment), sheet); - gtk_object_unref (GTK_OBJECT (sheet->hadjustment)); + g_signal_handlers_disconnect_matched (sheet->hadjustment, + G_SIGNAL_MATCH_DATA, + 0, 0, 0, 0, + sheet); + + g_object_unref (sheet->hadjustment); sheet->hadjustment = NULL; } + if (sheet->vadjustment) { - gtk_signal_disconnect_by_data (GTK_OBJECT (sheet->vadjustment), sheet); - gtk_object_unref (GTK_OBJECT (sheet->vadjustment)); + g_signal_handlers_disconnect_matched (sheet->vadjustment, + G_SIGNAL_MATCH_DATA, + 0, 0, 0, 0, + sheet); + + g_object_unref (sheet->vadjustment); + sheet->vadjustment = NULL; } @@ -2653,8 +2479,8 @@ gtk_sheet_destroy (GtkObject * object) } sheet->children = NULL; - if (GTK_OBJECT_CLASS (parent_class)->destroy) - (*GTK_OBJECT_CLASS (parent_class)->destroy) (object); + if (G_OBJECT_CLASS (parent_class)->dispose) + (*G_OBJECT_CLASS (parent_class)->dispose) (object); } static void @@ -2686,7 +2512,6 @@ gtk_sheet_realize (GtkWidget * widget) gint attributes_mask; GdkGCValues values, auxvalues; GdkColormap *colormap; - gchar *name; GtkSheetChild *child; GList *children; @@ -2773,48 +2598,37 @@ gtk_sheet_realize (GtkWidget * widget) /* GCs */ if (sheet->fg_gc) - gdk_gc_unref (sheet->fg_gc); + g_object_unref (sheet->fg_gc); if (sheet->bg_gc) - gdk_gc_unref (sheet->bg_gc); + g_object_unref (sheet->bg_gc); sheet->fg_gc = gdk_gc_new (widget->window); sheet->bg_gc = gdk_gc_new (widget->window); colormap = gtk_widget_get_colormap (widget); - gdk_color_white (colormap, &widget->style->white); - gdk_color_black (colormap, &widget->style->black); - gdk_gc_get_values (sheet->fg_gc, &auxvalues); values.foreground = widget->style->white; values.function = GDK_INVERT; values.subwindow_mode = GDK_INCLUDE_INFERIORS; if (sheet->xor_gc) - gdk_gc_unref (sheet->xor_gc); + g_object_unref (sheet->xor_gc); sheet->xor_gc = gdk_gc_new_with_values (widget->window, &values, GDK_GC_FOREGROUND | GDK_GC_FUNCTION | GDK_GC_SUBWINDOW); - if (sheet->sheet_entry->parent) - { - gtk_widget_ref (sheet->sheet_entry); - gtk_widget_unparent (sheet->sheet_entry); - } - gtk_widget_set_parent_window (sheet->sheet_entry, sheet->sheet_window); - gtk_widget_set_parent (sheet->sheet_entry, GTK_WIDGET (sheet)); - if (sheet->button && sheet->button->parent) - { - gtk_widget_ref (sheet->button); - gtk_widget_unparent (sheet->button); - } + gtk_widget_set_parent_window (sheet->entry_widget, sheet->sheet_window); + gtk_widget_set_parent (sheet->entry_widget, GTK_WIDGET (sheet)); + gtk_widget_set_parent_window (sheet->button, sheet->sheet_window); gtk_widget_set_parent (sheet->button, GTK_WIDGET (sheet)); - if (!sheet->cursor_drag) - sheet->cursor_drag = gdk_cursor_new (GDK_PLUS); + + gdk_cursor_unref (sheet->cursor_drag); + sheet->cursor_drag = gdk_cursor_new (GDK_PLUS); if (sheet->column_titles_visible) gdk_window_show (sheet->column_title_window); @@ -2824,11 +2638,6 @@ gtk_sheet_realize (GtkWidget * widget) size_allocate_row_title_buttons (sheet); size_allocate_column_title_buttons (sheet); - name = g_strdup (sheet->name); - gtk_sheet_set_title (sheet, name); - - g_free (name); - children = sheet->children; while (children) { @@ -2837,6 +2646,8 @@ gtk_sheet_realize (GtkWidget * widget) gtk_sheet_realize_child (sheet, child); } + + gtk_sheet_update_primary_selection (sheet); } static void @@ -2844,10 +2655,12 @@ create_global_button (GtkSheet *sheet) { sheet->button = gtk_button_new_with_label (" "); - gtk_signal_connect (GTK_OBJECT (sheet->button), - "pressed", - (GtkSignalFunc) global_button_clicked, - (gpointer) sheet); + g_object_ref_sink (sheet->button); + + g_signal_connect (sheet->button, + "pressed", + G_CALLBACK (global_button_clicked), + sheet); } static void @@ -2889,11 +2702,11 @@ gtk_sheet_unrealize (GtkWidget * widget) sheet = GTK_SHEET (widget); - gdk_cursor_destroy (sheet->cursor_drag); + gdk_cursor_unref (sheet->cursor_drag); - gdk_gc_destroy (sheet->xor_gc); - gdk_gc_destroy (sheet->fg_gc); - gdk_gc_destroy (sheet->bg_gc); + g_object_unref (sheet->xor_gc); + g_object_unref (sheet->fg_gc); + g_object_unref (sheet->bg_gc); gdk_window_destroy (sheet->sheet_window); gdk_window_destroy (sheet->column_title_window); @@ -2907,11 +2720,14 @@ gtk_sheet_unrealize (GtkWidget * widget) sheet->column_title_window = NULL; sheet->sheet_window = NULL; - sheet->cursor_drag = NULL; sheet->xor_gc = NULL; sheet->fg_gc = NULL; sheet->bg_gc = NULL; + gtk_widget_unparent (sheet->entry_widget); + if (sheet->button != NULL) + gtk_widget_unparent (sheet->button); + if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); } @@ -2919,23 +2735,18 @@ gtk_sheet_unrealize (GtkWidget * widget) static void gtk_sheet_map (GtkWidget * widget) { - GtkSheet *sheet; + GtkSheet *sheet = GTK_SHEET (widget); GtkSheetChild *child; GList *children; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_SHEET (widget)); - sheet = GTK_SHEET (widget); - if (!GTK_WIDGET_MAPPED (widget)) { GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED); - if (!sheet->cursor_drag) sheet->cursor_drag = gdk_cursor_new (GDK_PLUS); - gdk_window_show (widget->window); - gdk_window_show (sheet->sheet_window); if (sheet->column_titles_visible) @@ -2949,13 +2760,12 @@ gtk_sheet_map (GtkWidget * widget) gdk_window_show (sheet->row_title_window); } - if (!GTK_WIDGET_MAPPED (sheet->sheet_entry) - && ! gtk_sheet_locked (sheet) + if (!GTK_WIDGET_MAPPED (sheet->entry_widget) && sheet->active_cell.row >= 0 && sheet->active_cell.col >= 0 ) { - gtk_widget_show (sheet->sheet_entry); - gtk_widget_map (sheet->sheet_entry); + gtk_widget_show (sheet->entry_widget); + gtk_widget_map (sheet->entry_widget); } if (GTK_WIDGET_VISIBLE (sheet->button) && @@ -3015,8 +2825,8 @@ gtk_sheet_unmap (GtkWidget * widget) gdk_window_hide (sheet->row_title_window); gdk_window_hide (widget->window); - if (GTK_WIDGET_MAPPED (sheet->sheet_entry)) - gtk_widget_unmap (sheet->sheet_entry); + if (GTK_WIDGET_MAPPED (sheet->entry_widget)) + gtk_widget_unmap (sheet->entry_widget); if (GTK_WIDGET_MAPPED (sheet->button)) gtk_widget_unmap (sheet->button); @@ -3067,8 +2877,8 @@ gtk_sheet_cell_draw_default (GtkSheet *sheet, gint row, gint col) fg_gc = sheet->fg_gc; bg_gc = sheet->bg_gc; - area.x = COLUMN_LEFT_XPIXEL (sheet,col); - area.y = ROW_TOP_YPIXEL (sheet,row); + area.x = COLUMN_LEFT_XPIXEL (sheet, col); + area.y = ROW_TOP_YPIXEL (sheet, row); area.width= xxx_column_width (sheet, col); area.height = yyy_row_height (sheet, row); @@ -3098,7 +2908,7 @@ static void gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) { GtkWidget *widget; - GdkRectangle area, clip_area; + GdkRectangle area; gint i; gint text_width, text_height, y; gint xoffset = 0; @@ -3142,12 +2952,11 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) fg_gc = sheet->fg_gc; bg_gc = sheet->bg_gc; - area.x = COLUMN_LEFT_XPIXEL (sheet,col); - area.y = ROW_TOP_YPIXEL (sheet,row); + area.x = COLUMN_LEFT_XPIXEL (sheet, col); + area.y = ROW_TOP_YPIXEL (sheet, row); area.width = xxx_column_width (sheet, col); area.height = yyy_row_height (sheet, row); - clip_area = area; layout = gtk_widget_create_pango_layout (GTK_WIDGET (sheet), label); dispose_string (sheet, label); @@ -3189,19 +2998,18 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) case GTK_JUSTIFY_RIGHT: size = area.width; area.x +=area.width; - if (!gtk_sheet_clip_text (sheet)) - { - for (i = col - 1; i >= MIN_VISIBLE_COLUMN (sheet); i--) - { - if ( !gtk_sheet_cell_empty (sheet, row, i)) break; - if (size >= text_width + CELLOFFSET) break; - size +=xxx_column_width (sheet, i); - xxx_column_set_right_column (sheet, i, - MAX (col, - xxx_column_right_column (sheet, i))); - } - area.width = size; - } + { + for (i = col - 1; i >= MIN_VISIBLE_COLUMN (sheet); i--) + { + if ( !gtk_sheet_cell_empty (sheet, row, i)) break; + if (size >= text_width + CELLOFFSET) break; + size +=xxx_column_width (sheet, i); + xxx_column_set_right_column (sheet, i, + MAX (col, + xxx_column_right_column (sheet, i))); + } + area.width = size; + } area.x -= size; xoffset += area.width - text_width - 2 * CELLOFFSET - attributes.border.width / 2; @@ -3210,29 +3018,28 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) sizel = area.width / 2; sizer = area.width / 2; area.x += area.width / 2; - if (!gtk_sheet_clip_text (sheet)) - { - for (i = col + 1; i <= MAX_VISIBLE_COLUMN (sheet); i++) - { - if ( ! gtk_sheet_cell_empty (sheet, row, i)) break; - if (sizer >= text_width / 2) break; - sizer += xxx_column_width (sheet, i); - xxx_column_set_left_column (sheet, i, - MIN ( - col, - xxx_column_left_column (sheet, i))); - } - for (i = col - 1; i >= MIN_VISIBLE_COLUMN (sheet); i--) - { - if ( ! gtk_sheet_cell_empty (sheet, row, i)) break; - if (sizel >= text_width / 2) break; - sizel +=xxx_column_width (sheet, i); - xxx_column_set_right_column (sheet, i, - MAX (col, - xxx_column_right_column (sheet, i))); - } - size = MIN (sizel, sizer); - } + { + for (i = col + 1; i <= MAX_VISIBLE_COLUMN (sheet); i++) + { + if ( ! gtk_sheet_cell_empty (sheet, row, i)) break; + if (sizer >= text_width / 2) break; + sizer += xxx_column_width (sheet, i); + xxx_column_set_left_column (sheet, i, + MIN ( + col, + xxx_column_left_column (sheet, i))); + } + for (i = col - 1; i >= MIN_VISIBLE_COLUMN (sheet); i--) + { + if ( ! gtk_sheet_cell_empty (sheet, row, i)) break; + if (sizel >= text_width / 2) break; + sizel +=xxx_column_width (sheet, i); + xxx_column_set_right_column (sheet, i, + MAX (col, + xxx_column_right_column (sheet, i))); + } + size = MIN (sizel, sizer); + } area.x -= sizel; xoffset += sizel - text_width / 2 - CELLOFFSET; area.width = sizel + sizer; @@ -3240,27 +3047,25 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) case GTK_JUSTIFY_LEFT: default: size = area.width; - if (!gtk_sheet_clip_text (sheet)) - { - for (i = col + 1; i <= MAX_VISIBLE_COLUMN (sheet); i++) - { - if (! gtk_sheet_cell_empty (sheet, row, i)) break; - if (size >= text_width + CELLOFFSET) break; - size +=xxx_column_width (sheet, i); - xxx_column_set_left_column (sheet, i, - MIN ( - col, - xxx_column_left_column (sheet, i))); - - } - area.width = size; - } + { + for (i = col + 1; i <= MAX_VISIBLE_COLUMN (sheet); i++) + { + if (! gtk_sheet_cell_empty (sheet, row, i)) break; + if (size >= text_width + CELLOFFSET) break; + size +=xxx_column_width (sheet, i); + xxx_column_set_left_column (sheet, i, + MIN ( + col, + xxx_column_left_column (sheet, i))); + + } + area.width = size; + } xoffset += attributes.border.width / 2; break; } - if (!gtk_sheet_clip_text (sheet)) clip_area = area; - gdk_gc_set_clip_rectangle (fg_gc, &clip_area); + gdk_gc_set_clip_rectangle (fg_gc, &area); gdk_draw_layout (sheet->pixmap, fg_gc, @@ -3269,9 +3074,9 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) layout); gdk_gc_set_clip_rectangle (fg_gc, NULL); - g_object_unref (G_OBJECT (layout)); + g_object_unref (layout); - gdk_draw_pixmap (sheet->sheet_window, + gdk_draw_drawable (sheet->sheet_window, GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], sheet->pixmap, area.x, @@ -3286,7 +3091,7 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) static void gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) { - gint i,j; + gint i, j; GtkSheetRange drawing_range; GdkRectangle area; @@ -3301,14 +3106,15 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) { drawing_range.row0 = MIN_VISIBLE_ROW (sheet); drawing_range.col0 = MIN_VISIBLE_COLUMN (sheet); - drawing_range.rowi = MIN (MAX_VISIBLE_ROW (sheet), yyy_row_count (sheet) - 1); + drawing_range.rowi = MIN (MAX_VISIBLE_ROW (sheet), + yyy_row_count (sheet) - 1); drawing_range.coli = MAX_VISIBLE_COLUMN (sheet); gdk_draw_rectangle (sheet->pixmap, GTK_WIDGET (sheet)->style->white_gc, TRUE, - 0,0, + 0, 0, sheet->sheet_window_width, sheet->sheet_window_height); } @@ -3320,7 +3126,6 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) drawing_range.coli = MIN (range->coli, MAX_VISIBLE_COLUMN (sheet)); } - if (drawing_range.coli == xxx_column_count (sheet) - 1) { area.x = COLUMN_LEFT_XPIXEL (sheet, @@ -3334,11 +3139,11 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) gdk_draw_rectangle (sheet->pixmap, sheet->fg_gc, TRUE, - area.x,area.y, + area.x, area.y, sheet->sheet_window_width - area.x, sheet->sheet_window_height); - gdk_draw_pixmap (sheet->sheet_window, + gdk_draw_drawable (sheet->sheet_window, GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], sheet->pixmap, area.x, @@ -3361,11 +3166,11 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) gdk_draw_rectangle (sheet->pixmap, sheet->fg_gc, TRUE, - area.x,area.y, + area.x, area.y, sheet->sheet_window_width, sheet->sheet_window_height - area.y); - gdk_draw_pixmap (sheet->sheet_window, + gdk_draw_drawable (sheet->sheet_window, GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], sheet->pixmap, area.x, @@ -3401,7 +3206,7 @@ static void gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range) { GdkRectangle area; - gint i,j; + gint i, j; GtkSheetRange aux; if (range.col0 > sheet->range.coli || range.coli < sheet->range.col0 || @@ -3432,8 +3237,8 @@ gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range) xxx_column_is_visible (sheet, j) && yyy_row_is_visible (sheet, i)) { - area.x = COLUMN_LEFT_XPIXEL (sheet,j); - area.y = ROW_TOP_YPIXEL (sheet,i); + area.x = COLUMN_LEFT_XPIXEL (sheet, j); + area.y = ROW_TOP_YPIXEL (sheet, i); area.width= xxx_column_width (sheet, j); area.height = yyy_row_height (sheet, i); @@ -3450,13 +3255,13 @@ gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range) } if (j == sheet->range.coli) area.width = area.width - 3; - if (i!=sheet->active_cell.row || j!=sheet->active_cell.col) + if (i != sheet->active_cell.row || j != sheet->active_cell.col) { gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, TRUE, - area.x + 1,area.y + 1, - area.width,area.height); + area.x + 1, area.y + 1, + area.width, area.height); } } @@ -3469,11 +3274,11 @@ gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range) static void gtk_sheet_draw_backing_pixmap (GtkSheet *sheet, GtkSheetRange range) { - gint x,y,width,height; + gint x, y, width, height; if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; - x = COLUMN_LEFT_XPIXEL (sheet,range.col0); + x = COLUMN_LEFT_XPIXEL (sheet, range.col0); y = ROW_TOP_YPIXEL (sheet, range.row0); width = COLUMN_LEFT_XPIXEL (sheet, range.coli) - x + xxx_column_width (sheet, range.coli); @@ -3511,7 +3316,7 @@ gtk_sheet_draw_backing_pixmap (GtkSheet *sheet, GtkSheetRange range) if (range.rowi == yyy_row_count (sheet) - 1) height = sheet->sheet_window_height - y; - gdk_draw_pixmap (sheet->sheet_window, + gdk_draw_drawable (sheet->sheet_window, GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], sheet->pixmap, x, @@ -3594,8 +3399,8 @@ gtk_sheet_set_cell (GtkSheet *sheet, gint row, gint col, range.row0 = row; range.rowi = row; - range.col0 = sheet->view.col0; - range.coli = sheet->view.coli; + range.col0 = MIN_VISIBLE_COLUMN (sheet); + range.coli = MAX_VISIBLE_COLUMN (sheet); if (gtk_sheet_autoresize (sheet) && text_width > xxx_column_width (sheet, col) - @@ -3611,7 +3416,7 @@ gtk_sheet_set_cell (GtkSheet *sheet, gint row, gint col, } if ( changed ) - gtk_signal_emit (GTK_OBJECT (sheet),sheet_signals[CHANGED], row, col); + g_signal_emit (sheet, sheet_signals[CHANGED], 0, row, col); } @@ -3630,33 +3435,10 @@ gtk_sheet_cell_clear (GtkSheet *sheet, gint row, gint column) range.row0 = row; range.rowi = row; - range.col0 = sheet->view.col0; - range.coli = sheet->view.coli; - - gtk_sheet_real_cell_clear (sheet, row, column, FALSE); - - if (!GTK_SHEET_IS_FROZEN (sheet)) - { - gtk_sheet_range_draw (sheet, &range); - } -} - -void -gtk_sheet_cell_delete (GtkSheet *sheet, gint row, gint column) -{ - GtkSheetRange range; - - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - if (column >= xxx_column_count (sheet) || row >= yyy_row_count (sheet)) return; - if (column < 0 || row < 0) return; - - range.row0 = row; - range.rowi = row; - range.col0 = sheet->view.col0; - range.coli = sheet->view.coli; + range.col0 = MIN_VISIBLE_COLUMN (sheet); + range.coli = MAX_VISIBLE_COLUMN (sheet); - gtk_sheet_real_cell_clear (sheet, row, column, TRUE); + gtk_sheet_real_cell_clear (sheet, row, column); if (!GTK_SHEET_IS_FROZEN (sheet)) { @@ -3665,7 +3447,7 @@ gtk_sheet_cell_delete (GtkSheet *sheet, gint row, gint column) } static void -gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column, gboolean delete) +gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column) { GSheetModel *model = gtk_sheet_get_model (sheet); @@ -3674,10 +3456,6 @@ gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column, gboolean dele if (old_text && strlen (old_text) > 0 ) { g_sheet_model_datum_clear (model, row, column); - - if (GTK_IS_OBJECT (sheet) && G_OBJECT (sheet)->ref_count > 0) - gtk_signal_emit (GTK_OBJECT (sheet),sheet_signals[CLEAR_CELL], - row, column); } dispose_string (sheet, old_text); @@ -3689,22 +3467,11 @@ gtk_sheet_range_clear (GtkSheet *sheet, const GtkSheetRange *range) g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_IS_SHEET (sheet)); - gtk_sheet_real_range_clear (sheet, range, FALSE); -} - -void -gtk_sheet_range_delete (GtkSheet *sheet, const GtkSheetRange *range) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - gtk_sheet_real_range_clear (sheet, range, TRUE); + gtk_sheet_real_range_clear (sheet, range); } - static void -gtk_sheet_real_range_clear (GtkSheet *sheet, const GtkSheetRange *range, - gboolean delete) +gtk_sheet_real_range_clear (GtkSheet *sheet, const GtkSheetRange *range) { gint i, j; GtkSheetRange clear; @@ -3727,7 +3494,7 @@ gtk_sheet_real_range_clear (GtkSheet *sheet, const GtkSheetRange *range, for (i = clear.row0; i <= clear.rowi; i++) for (j = clear.col0; j <= clear.coli; j++) { - gtk_sheet_real_cell_clear (sheet, i, j, delete); + gtk_sheet_real_cell_clear (sheet, i, j); } gtk_sheet_range_draw (sheet, NULL); @@ -3803,6 +3570,10 @@ gtk_sheet_cell_get_state (GtkSheet *sheet, gint row, gint col) return GTK_STATE_NORMAL; } +/* Convert X, Y (in pixels) to *ROW, *COLUMN (in cell coords) + -1 indicates the title buttons. + If the function returns FALSE, then the results will be unreliable. +*/ gboolean gtk_sheet_get_pixel_info (GtkSheet *sheet, gint x, @@ -3810,25 +3581,43 @@ gtk_sheet_get_pixel_info (GtkSheet *sheet, gint *row, gint *column) { - gint trow = -1; - gint tcol = -1; + gint trow, tcol; + *row = -G_MAXINT; + *column = -G_MAXINT; g_return_val_if_fail (sheet != NULL, 0); g_return_val_if_fail (GTK_IS_SHEET (sheet), 0); /* bounds checking, return false if the user clicked on a blank area */ - trow = ROW_FROM_YPIXEL (sheet, y); - if (trow >= yyy_row_count (sheet)) + if (y < 0) return FALSE; - *row = trow; - - tcol = COLUMN_FROM_XPIXEL (sheet, x); - if (tcol >= xxx_column_count (sheet)) + if (x < 0) return FALSE; - *column = tcol; + if ( y < sheet->column_title_area.height + sheet->column_title_area.y) + *row = -1; + + else + { + trow = ROW_FROM_YPIXEL (sheet, y); + if (trow > yyy_row_count (sheet)) + return FALSE; + + *row = trow; + } + + if ( x < sheet->row_title_area.width + sheet->row_title_area.x) + *column = -1; + else + { + tcol = COLUMN_FROM_XPIXEL (sheet, x); + if (tcol > xxx_column_count (sheet)) + return FALSE; + + *column = tcol; + } return TRUE; } @@ -3873,9 +3662,7 @@ gtk_sheet_set_active_cell (GtkSheet *sheet, gint row, gint column) return FALSE; if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) - { - if (!gtk_sheet_deactivate_cell (sheet)) return FALSE; - } + gtk_sheet_deactivate_cell (sheet); sheet->active_cell.row = row; sheet->active_cell.col = column; @@ -3900,15 +3687,15 @@ gtk_sheet_get_active_cell (GtkSheet *sheet, gint *row, gint *column) g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_IS_SHEET (sheet)); - *row = sheet->active_cell.row; - *column = sheet->active_cell.col; + if ( row ) *row = sheet->active_cell.row; + if (column) *column = sheet->active_cell.col; } static void gtk_sheet_entry_changed (GtkWidget *widget, gpointer data) { GtkSheet *sheet; - gint row,col; + gint row, col; const char *text; GtkJustification justification; GtkSheetCellAttr attributes; @@ -3926,8 +3713,8 @@ gtk_sheet_entry_changed (GtkWidget *widget, gpointer data) if (row < 0 || col < 0) return; - sheet->active_cell.row =- 1; - sheet->active_cell.col =- 1; + sheet->active_cell.row = -1; + sheet->active_cell.col = -1; text = gtk_entry_get_text (GTK_ENTRY (gtk_sheet_get_entry (sheet))); @@ -3948,29 +3735,26 @@ gtk_sheet_entry_changed (GtkWidget *widget, gpointer data) } -static gboolean +static void gtk_sheet_deactivate_cell (GtkSheet *sheet) { - gboolean veto = TRUE; - - g_return_val_if_fail (sheet != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); + g_return_if_fail (sheet != NULL); + g_return_if_fail (GTK_IS_SHEET (sheet)); - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return FALSE; - if (sheet->state != GTK_SHEET_NORMAL) return FALSE; + if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return ; + if (sheet->state != GTK_SHEET_NORMAL) return ; - _gtkextra_signal_emit (GTK_OBJECT (sheet),sheet_signals[DEACTIVATE], - sheet->active_cell.row, - sheet->active_cell.col, &veto); + if ( sheet->active_cell.row == -1 || sheet->active_cell.col == -1 ) + return ; - if (!veto) return FALSE; + g_signal_emit (sheet, sheet_signals[DEACTIVATE], 0, + sheet->active_cell.row, + sheet->active_cell.col); - if ( sheet->active_cell.row == -1 || sheet->active_cell.col == -1 ) - return TRUE; - gtk_signal_disconnect_by_func (GTK_OBJECT (gtk_sheet_get_entry (sheet)), - (GtkSignalFunc) gtk_sheet_entry_changed, - GTK_OBJECT (GTK_WIDGET (sheet))); + g_signal_handlers_disconnect_by_func (gtk_sheet_get_entry (sheet), + G_CALLBACK (gtk_sheet_entry_changed), + sheet); gtk_sheet_hide_active_cell (sheet); sheet->active_cell.row = -1; @@ -3981,15 +3765,13 @@ gtk_sheet_deactivate_cell (GtkSheet *sheet) GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_REDRAW_PENDING); gtk_sheet_range_draw (sheet, NULL); } - - return TRUE; } static void gtk_sheet_hide_active_cell (GtkSheet *sheet) { const char *text; - gint row,col; + gint row, col; GtkJustification justification; GtkSheetCellAttr attributes; @@ -4008,36 +3790,26 @@ gtk_sheet_hide_active_cell (GtkSheet *sheet) gtk_sheet_get_attributes (sheet, row, col, &attributes); justification = attributes.justification; - if (text && strlen (text) != 0) - { - gtk_sheet_set_cell (sheet, row, col, justification, text); - gtk_signal_emit (GTK_OBJECT (sheet),sheet_signals[SET_CELL], row, col); - } - else - { - gtk_sheet_cell_clear (sheet, row, col); - } - row = sheet->active_cell.row; col = sheet->active_cell.col; - gtk_widget_hide (sheet->sheet_entry); - gtk_widget_unmap (sheet->sheet_entry); + gtk_widget_hide (sheet->entry_widget); + gtk_widget_unmap (sheet->entry_widget); if (row != -1 && col != -1) - gdk_draw_pixmap (sheet->sheet_window, + gdk_draw_drawable (sheet->sheet_window, GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], sheet->pixmap, - COLUMN_LEFT_XPIXEL (sheet,col)- 1, - ROW_TOP_YPIXEL (sheet,row)- 1, - COLUMN_LEFT_XPIXEL (sheet,col)- 1, - ROW_TOP_YPIXEL (sheet,row)- 1, + COLUMN_LEFT_XPIXEL (sheet, col)- 1, + ROW_TOP_YPIXEL (sheet, row)- 1, + COLUMN_LEFT_XPIXEL (sheet, col)- 1, + ROW_TOP_YPIXEL (sheet, row)- 1, xxx_column_width (sheet, col) + 4, yyy_row_height (sheet, row)+4); gtk_widget_grab_focus (GTK_WIDGET (sheet)); - GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (sheet->sheet_entry), GTK_VISIBLE); + GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (sheet->entry_widget), GTK_VISIBLE); } @@ -4050,12 +3822,9 @@ gtk_sheet_activate_cell (GtkSheet *sheet, gint row, gint col) g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); if (row < 0 || col < 0) return FALSE; - if (row >= yyy_row_count (sheet) || col >= xxx_column_count (sheet)) - return FALSE; - /* _gtkextra_signal_emit (GTK_OBJECT (sheet),sheet_signals[ACTIVATE], row, col, &veto); - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return veto; - */ + if ( row > yyy_row_count (sheet) || col > xxx_column_count (sheet)) + return FALSE; if (!veto) return FALSE; if (sheet->state != GTK_SHEET_NORMAL) @@ -4077,13 +3846,12 @@ gtk_sheet_activate_cell (GtkSheet *sheet, gint row, gint col) gtk_sheet_show_active_cell (sheet); - - g_signal_connect (G_OBJECT (gtk_sheet_get_entry (sheet)), + g_signal_connect (gtk_sheet_get_entry (sheet), "changed", G_CALLBACK (gtk_sheet_entry_changed), sheet); - _gtkextra_signal_emit (GTK_OBJECT (sheet),sheet_signals[ACTIVATE], row, col, &veto); + _gtkextra_signal_emit (GTK_OBJECT (sheet), sheet_signals [ACTIVATE], row, col, &veto); return TRUE; } @@ -4112,7 +3880,7 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) if (sheet->state != GTK_SHEET_NORMAL) return; if (GTK_SHEET_IN_SELECTION (sheet)) return; - GTK_WIDGET_SET_FLAGS (GTK_WIDGET (sheet->sheet_entry), GTK_VISIBLE); + GTK_WIDGET_SET_FLAGS (GTK_WIDGET (sheet->entry_widget), GTK_VISIBLE); sheet_entry = GTK_ENTRY (gtk_sheet_get_entry (sheet)); @@ -4129,10 +3897,6 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) gtk_entry_set_visibility (GTK_ENTRY (sheet_entry), attributes.is_visible); - if (gtk_sheet_locked (sheet) || !attributes.is_editable) - gtk_entry_set_editable (GTK_ENTRY (sheet_entry), FALSE); - else - gtk_entry_set_editable (GTK_ENTRY (sheet_entry), TRUE); /*** Added by John Gotts. Mar 25, 2005 *********/ old_text = gtk_entry_get_text (GTK_ENTRY (sheet_entry)); @@ -4147,7 +3911,7 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) gtk_sheet_entry_set_max_size (sheet); gtk_sheet_size_allocate_entry (sheet); - gtk_widget_map (sheet->sheet_entry); + gtk_widget_map (sheet->entry_widget); gtk_widget_grab_focus (GTK_WIDGET (sheet_entry)); @@ -4158,6 +3922,7 @@ static void gtk_sheet_draw_active_cell (GtkSheet *sheet) { gint row, col; + GtkSheetRange range; if (!GTK_WIDGET_DRAWABLE (GTK_WIDGET (sheet))) return; if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; @@ -4169,7 +3934,10 @@ gtk_sheet_draw_active_cell (GtkSheet *sheet) if (!gtk_sheet_cell_isvisible (sheet, row, col)) return; - gtk_sheet_draw_border (sheet, sheet->range); + range.col0 = range.coli = col; + range.row0 = range.rowi = row; + + gtk_sheet_draw_border (sheet, range); } @@ -4197,8 +3965,8 @@ gtk_sheet_make_backing_pixmap (GtkSheet *sheet, guint width, guint height) else { /* reallocate if sizes don't match */ - gdk_window_get_size (sheet->pixmap, - &pixmap_width, &pixmap_height); + gdk_drawable_get_size (sheet->pixmap, + &pixmap_width, &pixmap_height); if ( (pixmap_width != width) || (pixmap_height != height)) { g_object_unref (sheet->pixmap); @@ -4213,9 +3981,9 @@ gtk_sheet_make_backing_pixmap (GtkSheet *sheet, guint width, guint height) static void gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) { - gint i,j, mask1, mask2; + gint i, j, mask1, mask2; gint state, selected; - gint x,y,width,height; + gint x, y, width, height; GtkSheetRange new_range, aux_range; g_return_if_fail (sheet != NULL); @@ -4268,7 +4036,7 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) if (mask1 != mask2) { - x = COLUMN_LEFT_XPIXEL (sheet,j); + x = COLUMN_LEFT_XPIXEL (sheet, j); y = ROW_TOP_YPIXEL (sheet, i); width = COLUMN_LEFT_XPIXEL (sheet, j)- x+ xxx_column_width (sheet, j); @@ -4287,7 +4055,7 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) } if (j == sheet->range.coli) width = width + 3; - gdk_draw_pixmap (sheet->sheet_window, + gdk_draw_drawable (sheet->sheet_window, GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], sheet->pixmap, x + 1, @@ -4299,7 +4067,7 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) if (i != sheet->active_cell.row || j != sheet->active_cell.col) { - x = COLUMN_LEFT_XPIXEL (sheet,j); + x = COLUMN_LEFT_XPIXEL (sheet, j); y = ROW_TOP_YPIXEL (sheet, i); width = COLUMN_LEFT_XPIXEL (sheet, j)- x+ xxx_column_width (sheet, j); @@ -4322,8 +4090,8 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, TRUE, - x + 1,y + 1, - width,height); + x + 1, y + 1, + width, height); } } } @@ -4343,7 +4111,7 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) xxx_column_is_visible (sheet, j) && yyy_row_is_visible (sheet, i)) { - x = COLUMN_LEFT_XPIXEL (sheet,j); + x = COLUMN_LEFT_XPIXEL (sheet, j); y = ROW_TOP_YPIXEL (sheet, i); width = COLUMN_LEFT_XPIXEL (sheet, j)- x+ xxx_column_width (sheet, j); height = ROW_TOP_YPIXEL (sheet, i)- y + yyy_row_height (sheet, i); @@ -4361,7 +4129,7 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) } if (j == sheet->range.coli) width = width + 3; - gdk_draw_pixmap (sheet->sheet_window, + gdk_draw_drawable (sheet->sheet_window, GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], sheet->pixmap, x + 1, @@ -4383,12 +4151,12 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) selected= (i <= new_range.rowi && i >= new_range.row0 && j <= new_range.coli && j >= new_range.col0) ? TRUE : FALSE; - if (state!=GTK_STATE_SELECTED && selected && + if (state != GTK_STATE_SELECTED && selected && xxx_column_is_visible (sheet, j) && yyy_row_is_visible (sheet, i) && (i != sheet->active_cell.row || j != sheet->active_cell.col)) { - x = COLUMN_LEFT_XPIXEL (sheet,j); + x = COLUMN_LEFT_XPIXEL (sheet, j); y = ROW_TOP_YPIXEL (sheet, i); width = COLUMN_LEFT_XPIXEL (sheet, j)- x+ xxx_column_width (sheet, j); height = ROW_TOP_YPIXEL (sheet, i)- y + yyy_row_height (sheet, i); @@ -4409,8 +4177,8 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, TRUE, - x + 1,y + 1, - width,height); + x + 1, y + 1, + width, height); } @@ -4436,9 +4204,9 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) mask2 = i == new_range.rowi ? mask2 + 2 : mask2; mask2 = j == new_range.col0 ? mask2 + 4 : mask2; mask2 = j == new_range.coli ? mask2 + 8 : mask2; - if (mask2!=mask1 || (mask2 == mask1 && state!=GTK_STATE_SELECTED)) + if (mask2 != mask1 || (mask2 == mask1 && state != GTK_STATE_SELECTED)) { - x = COLUMN_LEFT_XPIXEL (sheet,j); + x = COLUMN_LEFT_XPIXEL (sheet, j); y = ROW_TOP_YPIXEL (sheet, i); width = xxx_column_width (sheet, j); height = yyy_row_height (sheet, i); @@ -4446,31 +4214,31 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, TRUE, - x + 1,y - 1, - width,3); + x + 1, y - 1, + width, 3); if (mask2 & 2) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, TRUE, - x + 1,y + height - 1, - width,3); + x + 1, y + height - 1, + width, 3); if (mask2 & 4) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, TRUE, - x - 1,y + 1, - 3,height); + x - 1, y + 1, + 3, height); if (mask2 & 8) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, TRUE, - x + width - 1,y + 1, - 3,height); + x + width - 1, y + 1, + 3, height); @@ -4497,8 +4265,8 @@ gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range) widget = GTK_WIDGET (sheet); - x = COLUMN_LEFT_XPIXEL (sheet,new_range.col0); - y = ROW_TOP_YPIXEL (sheet,new_range.row0); + x = COLUMN_LEFT_XPIXEL (sheet, new_range.col0); + y = ROW_TOP_YPIXEL (sheet, new_range.row0); width = COLUMN_LEFT_XPIXEL (sheet, new_range.coli) - x + xxx_column_width (sheet, new_range.coli); @@ -4525,7 +4293,7 @@ gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range) gdk_gc_set_clip_rectangle (sheet->xor_gc, &area); - for (i =- 1; i <= 1; ++i) + for (i = -1; i <= 1; ++i) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, FALSE, @@ -4543,14 +4311,14 @@ gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range) static void gtk_sheet_draw_corners (GtkSheet *sheet, GtkSheetRange range) { - gint x,y; + gint x, y; guint width = 1; if (gtk_sheet_cell_isvisible (sheet, range.row0, range.col0)) { - x = COLUMN_LEFT_XPIXEL (sheet,range.col0); - y = ROW_TOP_YPIXEL (sheet,range.row0); - gdk_draw_pixmap (sheet->sheet_window, + x = COLUMN_LEFT_XPIXEL (sheet, range.col0); + y = ROW_TOP_YPIXEL (sheet, range.row0); + gdk_draw_drawable (sheet->sheet_window, GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], sheet->pixmap, x - 1, @@ -4562,23 +4330,23 @@ gtk_sheet_draw_corners (GtkSheet *sheet, GtkSheetRange range) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, TRUE, - x - 1,y - 1, - 3,3); + x - 1, y - 1, + 3, 3); } if (gtk_sheet_cell_isvisible (sheet, range.row0, range.coli) || sheet->state == GTK_SHEET_COLUMN_SELECTED) { - x = COLUMN_LEFT_XPIXEL (sheet,range.coli)+ + x = COLUMN_LEFT_XPIXEL (sheet, range.coli)+ xxx_column_width (sheet, range.coli); - y = ROW_TOP_YPIXEL (sheet,range.row0); + y = ROW_TOP_YPIXEL (sheet, range.row0); width = 1; if (sheet->state == GTK_SHEET_COLUMN_SELECTED) { - y = ROW_TOP_YPIXEL (sheet, sheet->view.row0)+3; + y = ROW_TOP_YPIXEL (sheet, MIN_VISIBLE_ROW (sheet))+3; width = 3; } - gdk_draw_pixmap (sheet->sheet_window, + gdk_draw_drawable (sheet->sheet_window, GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], sheet->pixmap, x - width, @@ -4590,23 +4358,23 @@ gtk_sheet_draw_corners (GtkSheet *sheet, GtkSheetRange range) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, TRUE, - x - width + width / 2,y - width + width / 2, - 2 + width,2 + width); + x - width + width / 2, y - width + width / 2, + 2 + width, 2 + width); } if (gtk_sheet_cell_isvisible (sheet, range.rowi, range.col0) || sheet->state == GTK_SHEET_ROW_SELECTED) { - x = COLUMN_LEFT_XPIXEL (sheet,range.col0); - y = ROW_TOP_YPIXEL (sheet,range.rowi)+ + x = COLUMN_LEFT_XPIXEL (sheet, range.col0); + y = ROW_TOP_YPIXEL (sheet, range.rowi)+ yyy_row_height (sheet, range.rowi); width = 1; if (sheet->state == GTK_SHEET_ROW_SELECTED) { - x = COLUMN_LEFT_XPIXEL (sheet, sheet->view.col0)+3; + x = COLUMN_LEFT_XPIXEL (sheet, MIN_VISIBLE_COLUMN (sheet))+3; width = 3; } - gdk_draw_pixmap (sheet->sheet_window, + gdk_draw_drawable (sheet->sheet_window, GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], sheet->pixmap, x - width, @@ -4618,20 +4386,20 @@ gtk_sheet_draw_corners (GtkSheet *sheet, GtkSheetRange range) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, TRUE, - x - width + width / 2,y - width + width / 2, - 2 + width,2 + width); + x - width + width / 2, y - width + width / 2, + 2 + width, 2 + width); } if (gtk_sheet_cell_isvisible (sheet, range.rowi, range.coli)) { - x = COLUMN_LEFT_XPIXEL (sheet,range.coli)+ + x = COLUMN_LEFT_XPIXEL (sheet, range.coli)+ xxx_column_width (sheet, range.coli); - y = ROW_TOP_YPIXEL (sheet,range.rowi)+ + y = ROW_TOP_YPIXEL (sheet, range.rowi)+ yyy_row_height (sheet, range.rowi); width = 1; if (sheet->state == GTK_SHEET_RANGE_SELECTED) width = 3; if (sheet->state == GTK_SHEET_NORMAL) width = 3; - gdk_draw_pixmap (sheet->sheet_window, + gdk_draw_drawable (sheet->sheet_window, GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], sheet->pixmap, x - width, @@ -4643,8 +4411,8 @@ gtk_sheet_draw_corners (GtkSheet *sheet, GtkSheetRange range) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, TRUE, - x - width + width / 2,y - width + width / 2, - 2 + width,2 + width); + x - width + width / 2, y - width + width / 2, + 2 + width, 2 + width); } @@ -4679,9 +4447,21 @@ gtk_sheet_real_select_range (GtkSheet * sheet, gtk_sheet_range_draw_selection (sheet, sheet->range); } - gtk_signal_emit (GTK_OBJECT (sheet), sheet_signals[SELECT_RANGE], &sheet->range); + gtk_sheet_update_primary_selection (sheet); + + g_signal_emit (sheet, sheet_signals[SELECT_RANGE], 0, &sheet->range); +} + + +void +gtk_sheet_get_selected_range (GtkSheet *sheet, + GtkSheetRange *range) +{ + g_return_if_fail (sheet != NULL); + *range = sheet->range; } + void gtk_sheet_select_range (GtkSheet * sheet, const GtkSheetRange *range) { @@ -4693,16 +4473,10 @@ gtk_sheet_select_range (GtkSheet * sheet, const GtkSheetRange *range) if (range->col0 < 0 || range->coli < 0) return; - if ( gtk_sheet_locked (sheet)) return ; - if (sheet->state != GTK_SHEET_NORMAL) gtk_sheet_real_unselect_range (sheet, NULL); else - { - gboolean veto = TRUE; - veto = gtk_sheet_deactivate_cell (sheet); - if (!veto) return; - } + gtk_sheet_deactivate_cell (sheet); sheet->range.row0 = range->row0; sheet->range.rowi = range->rowi; @@ -4721,8 +4495,12 @@ gtk_sheet_select_range (GtkSheet * sheet, const GtkSheetRange *range) void gtk_sheet_unselect_range (GtkSheet * sheet) { + if (! GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) + return; + gtk_sheet_real_unselect_range (sheet, NULL); sheet->state = GTK_STATE_NORMAL; + gtk_sheet_activate_cell (sheet, sheet->active_cell.row, sheet->active_cell.col); } @@ -4741,6 +4519,9 @@ gtk_sheet_real_unselect_range (GtkSheet * sheet, if (range->row0 < 0 || range->rowi < 0) return; if (range->col0 < 0 || range->coli < 0) return; + g_signal_emit (sheet, sheet_signals[SELECT_COLUMN], 0, -1); + g_signal_emit (sheet, sheet_signals[SELECT_ROW], 0, -1); + if (gtk_sheet_range_isvisible (sheet, *range)) gtk_sheet_draw_backing_pixmap (sheet, *range); @@ -4811,11 +4592,7 @@ gtk_sheet_expose (GtkWidget * widget, if ((!GTK_SHEET_IN_XDRAG (sheet)) && (!GTK_SHEET_IN_YDRAG (sheet))) { if (sheet->state == GTK_SHEET_NORMAL) - { - gtk_sheet_draw_active_cell (sheet); - if (!GTK_SHEET_IN_SELECTION (sheet)) - gtk_widget_queue_draw (sheet->sheet_entry); - } + gtk_sheet_draw_active_cell (sheet); } } } @@ -4844,21 +4621,37 @@ gtk_sheet_button_press (GtkWidget * widget, sheet = GTK_SHEET (widget); - if ( event->type == GDK_2BUTTON_PRESS) + /* Cancel any pending tooltips */ + if (sheet->motion_timer) { - gtk_widget_get_pointer (widget, &x, &y); - gtk_sheet_get_pixel_info (sheet, x, y, &row, &column); + 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 ( event->type == GDK_2BUTTON_PRESS && event->button == 1) + g_signal_emit (sheet, + sheet_signals[DOUBLE_CLICK_COLUMN], 0, column); - if (event->window == sheet->column_title_window) - { - gtk_signal_emit (GTK_OBJECT (sheet), - sheet_signals[DOUBLE_CLICK_COLUMN], column); - } - else if (event->window == sheet->row_title_window) - { - gtk_signal_emit (GTK_OBJECT (sheet), - sheet_signals[DOUBLE_CLICK_ROW], row); - } + } + else if (event->window == sheet->row_title_window) + { + g_signal_emit (sheet, + sheet_signals[BUTTON_EVENT_ROW], 0, + row, event); + + if ( event->type == GDK_2BUTTON_PRESS && event->button == 1) + g_signal_emit (sheet, + sheet_signals[DOUBLE_CLICK_ROW], 0, row); } @@ -4944,7 +4737,7 @@ gtk_sheet_button_press (GtkWidget * widget, { row = sheet->active_cell.row; column = sheet->active_cell.col; - if (!gtk_sheet_deactivate_cell (sheet)) return FALSE; + gtk_sheet_deactivate_cell (sheet); sheet->active_cell.row = row; sheet->active_cell.col = column; sheet->drag_range = sheet->range; @@ -4964,7 +4757,6 @@ gtk_sheet_button_press (GtkWidget * widget, else if (sheet->cursor_drag->type == GDK_TOP_LEFT_ARROW && !GTK_SHEET_IN_SELECTION (sheet) && ! GTK_SHEET_IN_DRAG (sheet) - && ! gtk_sheet_locked (sheet) && sheet->active_cell.row >= 0 && sheet->active_cell.col >= 0 ) @@ -4973,7 +4765,7 @@ gtk_sheet_button_press (GtkWidget * widget, { row = sheet->active_cell.row; column = sheet->active_cell.col; - if (!gtk_sheet_deactivate_cell (sheet)) return FALSE; + gtk_sheet_deactivate_cell (sheet); sheet->active_cell.row = row; sheet->active_cell.col = column; sheet->drag_range = sheet->range; @@ -5029,38 +4821,6 @@ gtk_sheet_button_press (GtkWidget * widget, return TRUE; } -#if 0 -static gint -gtk_sheet_scroll (gpointer data) -{ - GtkSheet *sheet; - gint x,y,row,column; - gint move; - - sheet = GTK_SHEET (data); - - GDK_THREADS_ENTER (); - - gtk_widget_get_pointer (GTK_WIDGET (sheet), &x, &y); - gtk_sheet_get_pixel_info (sheet, x, y, &row, &column); - - move = TRUE; - - if (GTK_SHEET_IN_SELECTION (sheet)) - gtk_sheet_extend_selection (sheet, row, column); - - if (GTK_SHEET_IN_DRAG (sheet) || GTK_SHEET_IN_RESIZE (sheet)) - { - move = gtk_sheet_move_query (sheet, row, column); - if (move) draw_xor_rectangle (sheet, sheet->drag_range); - } - - GDK_THREADS_LEAVE (); - - return TRUE; -} -#endif - static void gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column, gboolean *veto) { @@ -5130,11 +4890,8 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column, gboolean *veto) } else { - if (!gtk_sheet_deactivate_cell (sheet)) - { - *veto = FALSE; - return; - } + gtk_sheet_deactivate_cell (sheet); + gtk_sheet_activate_cell (sheet, row, column); } if (gtk_sheet_autoscroll (sheet)) @@ -5163,7 +4920,7 @@ gtk_sheet_button_release (GtkWidget * widget, GdkEventButton * event) { GtkSheet *sheet; - gint x,y; + gint x, y; sheet = GTK_SHEET (widget); @@ -5179,7 +4936,7 @@ gtk_sheet_button_release (GtkWidget * widget, gtk_sheet_set_column_width (sheet, sheet->drag_cell.col, new_column_width (sheet, sheet->drag_cell.col, &x)); sheet->old_hadjustment = -1.; - gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), "value_changed"); + g_signal_emit_by_name (sheet->hadjustment, "value_changed"); return TRUE; } @@ -5193,7 +4950,7 @@ gtk_sheet_button_release (GtkWidget * widget, gtk_sheet_set_row_height (sheet, sheet->drag_cell.row, new_row_height (sheet, sheet->drag_cell.row, &y)); sheet->old_vadjustment = -1.; - gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), "value_changed"); + g_signal_emit_by_name (sheet->vadjustment, "value_changed"); return TRUE; } @@ -5218,8 +4975,8 @@ gtk_sheet_button_release (GtkWidget * widget, old_range = sheet->range; sheet->range = sheet->drag_range; sheet->drag_range = old_range; - gtk_signal_emit (GTK_OBJECT (sheet),sheet_signals[MOVE_RANGE], - &sheet->drag_range, &sheet->range); + g_signal_emit (sheet, sheet_signals[MOVE_RANGE], 0, + &sheet->drag_range, &sheet->range); gtk_sheet_select_range (sheet, &sheet->range); } @@ -5249,8 +5006,8 @@ gtk_sheet_button_release (GtkWidget * widget, sheet->drag_range = old_range; if (sheet->state == GTK_STATE_NORMAL) sheet->state = GTK_SHEET_RANGE_SELECTED; - gtk_signal_emit (GTK_OBJECT (sheet),sheet_signals[RESIZE_RANGE], - &sheet->drag_range, &sheet->range); + g_signal_emit (sheet, sheet_signals[RESIZE_RANGE], 0, + &sheet->drag_range, &sheet->range); gtk_sheet_select_range (sheet, &sheet->range); } @@ -5271,6 +5028,158 @@ gtk_sheet_button_release (GtkWidget * widget, return TRUE; } +/* 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 GtkSheetHoverTitle * +create_hover_window (void) +{ + GtkSheetHoverTitle *hw = malloc (sizeof (*hw)); + + hw->window = gtk_window_new (GTK_WINDOW_POPUP); + +#if GTK_CHECK_VERSION (2, 9, 0) + gtk_window_set_type_hint (GTK_WINDOW (hw->window), + GDK_WINDOW_TYPE_HINT_TOOLTIP); +#endif + + gtk_widget_set_app_paintable (hw->window, TRUE); + gtk_window_set_resizable (GTK_WINDOW (hw->window), FALSE); + gtk_widget_set_name (hw->window, "gtk-tooltips"); + gtk_container_set_border_width (GTK_CONTAINER (hw->window), 4); + + g_signal_connect (hw->window, + "expose_event", + G_CALLBACK (gtk_sheet_subtitle_paint_window), + NULL); + + hw->label = gtk_label_new (NULL); + + + gtk_label_set_line_wrap (GTK_LABEL (hw->label), TRUE); + gtk_misc_set_alignment (GTK_MISC (hw->label), 0.5, 0.5); + + gtk_container_add (GTK_CONTAINER (hw->window), hw->label); + + gtk_widget_show (hw->label); + + g_signal_connect (hw->window, + "destroy", + G_CALLBACK (gtk_widget_destroyed), + &hw->window); + + return hw; +} + +#define HOVER_WINDOW_Y_OFFSET 2 + +static void +show_subtitle (GtkSheet *sheet, gint row, gint column, const gchar *subtitle) +{ + gint x, y; + gint px, py; + gint width; + + if ( ! subtitle ) + return; + + if ( ! sheet->hover_window) + { + sheet->hover_window = create_hover_window (); + gtk_widget_add_events (GTK_WIDGET (sheet), GDK_LEAVE_NOTIFY_MASK); + + g_signal_connect_swapped (sheet, "leave-notify-event", + G_CALLBACK (gtk_widget_hide), + sheet->hover_window->window); + } + + gtk_label_set_text (GTK_LABEL (sheet->hover_window->label), + subtitle); + + + sheet->hover_window->row = row; + sheet->hover_window->column = column; + + gdk_window_get_origin (GTK_WIDGET (sheet)->window, &x, &y); + + gtk_widget_get_pointer (GTK_WIDGET (sheet), &px, &py); + + gtk_widget_show (sheet->hover_window->window); + + width = GTK_WIDGET (sheet->hover_window->label)->allocation.width; + + if (row == -1 ) + { + x += px; + x -= width / 2; + y += sheet->column_title_area.y; + y += sheet->column_title_area.height; + y += HOVER_WINDOW_Y_OFFSET; + } + + if ( column == -1 ) + { + y += py; + x += sheet->row_title_area.x; + x += sheet->row_title_area.width * 2 / 3.0; + } + + gtk_window_move (GTK_WINDOW (sheet->hover_window->window), + x, y); +} + +static gboolean +motion_timeout_callback (gpointer data) +{ + GtkSheet *sheet = GTK_SHEET (data); + gint x, y; + gint row, column; + gtk_widget_get_pointer (GTK_WIDGET (sheet), &x, &y); + + if ( gtk_sheet_get_pixel_info (sheet, x, y, &row, &column) ) + { + if ( column == -1 && row == -1 ) + return FALSE; + + if ( column == -1) + { + GSheetRow *row_geo = sheet->row_geometry; + gchar *text; + + text = g_sheet_row_get_subtitle (row_geo, row); + + show_subtitle (sheet, row, column, text); + g_free (text); + } + + if ( row == -1) + { + GSheetColumn *col_geo = sheet->column_geometry; + gchar *text; + + text = g_sheet_column_get_subtitle (col_geo, column); + + show_subtitle (sheet, row, column, text ); + + g_free (text); + } + } + + return FALSE; +} + static gint gtk_sheet_motion (GtkWidget * widget, GdkEventMotion * event) @@ -5291,6 +5200,27 @@ gtk_sheet_motion (GtkWidget * widget, x = event->x; y = event->y; + if (!sheet->hover_window || ! GTK_WIDGET_VISIBLE (sheet->hover_window->window)) + { + if ( sheet->motion_timer > 0 ) + g_source_remove (sheet->motion_timer); + sheet->motion_timer = g_timeout_add (TIMEOUT_HOVER, motion_timeout_callback, sheet); + } + else + { + gint row, column; + gint wx, wy; + gtk_widget_get_pointer (widget, &wx, &wy); + + if ( gtk_sheet_get_pixel_info (sheet, wx, wy, &row, &column) ) + { + if ( row != sheet->hover_window->row || column != sheet->hover_window->column) + { + gtk_widget_hide (sheet->hover_window->window); + } + } + } + if (event->window == sheet->column_title_window && gtk_sheet_columns_resizable (sheet)) { @@ -5301,7 +5231,7 @@ gtk_sheet_motion (GtkWidget * widget, new_cursor = GDK_SB_H_DOUBLE_ARROW; if (new_cursor != sheet->cursor_drag->type) { - gdk_cursor_destroy (sheet->cursor_drag); + gdk_cursor_unref (sheet->cursor_drag); sheet->cursor_drag = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW); gdk_window_set_cursor (sheet->column_title_window, sheet->cursor_drag); @@ -5313,7 +5243,7 @@ gtk_sheet_motion (GtkWidget * widget, if (!GTK_SHEET_IN_XDRAG (sheet) && new_cursor != sheet->cursor_drag->type) { - gdk_cursor_destroy (sheet->cursor_drag); + gdk_cursor_unref (sheet->cursor_drag); sheet->cursor_drag = gdk_cursor_new (GDK_TOP_LEFT_ARROW); gdk_window_set_cursor (sheet->column_title_window, sheet->cursor_drag); @@ -5325,12 +5255,12 @@ gtk_sheet_motion (GtkWidget * widget, gtk_sheet_rows_resizable (sheet)) { gtk_widget_get_pointer (widget, &x, &y); - if (!GTK_SHEET_IN_SELECTION (sheet) && POSSIBLE_YDRAG (sheet,y, &column)) + if (!GTK_SHEET_IN_SELECTION (sheet) && POSSIBLE_YDRAG (sheet, y, &column)) { new_cursor = GDK_SB_V_DOUBLE_ARROW; if (new_cursor != sheet->cursor_drag->type) { - gdk_cursor_destroy (sheet->cursor_drag); + gdk_cursor_unref (sheet->cursor_drag); sheet->cursor_drag = gdk_cursor_new (GDK_SB_V_DOUBLE_ARROW); gdk_window_set_cursor (sheet->row_title_window, sheet->cursor_drag); } @@ -5341,7 +5271,7 @@ gtk_sheet_motion (GtkWidget * widget, if (!GTK_SHEET_IN_YDRAG (sheet) && new_cursor != sheet->cursor_drag->type) { - gdk_cursor_destroy (sheet->cursor_drag); + gdk_cursor_unref (sheet->cursor_drag); sheet->cursor_drag = gdk_cursor_new (GDK_TOP_LEFT_ARROW); gdk_window_set_cursor (sheet->row_title_window, sheet->cursor_drag); } @@ -5356,20 +5286,20 @@ gtk_sheet_motion (GtkWidget * widget, !GTK_SHEET_IN_RESIZE (sheet) && new_cursor != sheet->cursor_drag->type) { - gdk_cursor_destroy (sheet->cursor_drag); + gdk_cursor_unref (sheet->cursor_drag); sheet->cursor_drag = gdk_cursor_new (GDK_PLUS); gdk_window_set_cursor (sheet->sheet_window, sheet->cursor_drag); } new_cursor = GDK_TOP_LEFT_ARROW; if ( event->window == sheet->sheet_window && - ! (POSSIBLE_RESIZE (sheet,x,y,&row,&column) || GTK_SHEET_IN_RESIZE (sheet)) && (POSSIBLE_DRAG (sheet, x,y,&row,&column) || GTK_SHEET_IN_DRAG (sheet)) && + ! (POSSIBLE_RESIZE (sheet, x, y, &row, &column) || GTK_SHEET_IN_RESIZE (sheet)) && (POSSIBLE_DRAG (sheet, x, y, &row, &column) || GTK_SHEET_IN_DRAG (sheet)) && new_cursor != sheet->cursor_drag->type) { - gdk_cursor_destroy (sheet->cursor_drag); + gdk_cursor_unref (sheet->cursor_drag); sheet->cursor_drag = gdk_cursor_new (GDK_TOP_LEFT_ARROW); - gdk_window_set_cursor (sheet->sheet_window,sheet->cursor_drag); + gdk_window_set_cursor (sheet->sheet_window, sheet->cursor_drag); } new_cursor = GDK_SIZING; @@ -5380,9 +5310,9 @@ gtk_sheet_motion (GtkWidget * widget, GTK_SHEET_IN_RESIZE (sheet)) && new_cursor != sheet->cursor_drag->type) { - gdk_cursor_destroy (sheet->cursor_drag); + gdk_cursor_unref (sheet->cursor_drag); sheet->cursor_drag = gdk_cursor_new (GDK_SIZING); - gdk_window_set_cursor (sheet->sheet_window,sheet->cursor_drag); + gdk_window_set_cursor (sheet->sheet_window, sheet->cursor_drag); } @@ -5426,8 +5356,8 @@ gtk_sheet_motion (GtkWidget * widget, if (GTK_SHEET_IN_DRAG (sheet)) { GtkSheetRange aux; - column = COLUMN_FROM_XPIXEL (sheet,x)- sheet->drag_cell.col; - row = ROW_FROM_YPIXEL (sheet,y)- sheet->drag_cell.row; + column = COLUMN_FROM_XPIXEL (sheet, x)- sheet->drag_cell.col; + row = ROW_FROM_YPIXEL (sheet, y)- sheet->drag_cell.row; if (sheet->state == GTK_SHEET_COLUMN_SELECTED) row = 0; if (sheet->state == GTK_SHEET_ROW_SELECTED) column = 0; sheet->x_drag = x; @@ -5457,17 +5387,18 @@ gtk_sheet_motion (GtkWidget * widget, gint v_h, current_col, current_row, col_threshold, row_threshold; v_h = 1; - if (abs (x - COLUMN_LEFT_XPIXEL (sheet,sheet->drag_cell.col)) > - abs (y - ROW_TOP_YPIXEL (sheet,sheet->drag_cell.row))) v_h = 2; + if (abs (x - COLUMN_LEFT_XPIXEL (sheet, sheet->drag_cell.col)) > + abs (y - ROW_TOP_YPIXEL (sheet, sheet->drag_cell.row))) v_h = 2; - current_col = COLUMN_FROM_XPIXEL (sheet,x); - current_row = ROW_FROM_YPIXEL (sheet,y); + current_col = COLUMN_FROM_XPIXEL (sheet, x); + current_row = ROW_FROM_YPIXEL (sheet, y); column = current_col - sheet->drag_cell.col; row = current_row - sheet->drag_cell.row; /*use half of column width resp. row height as threshold to expand selection*/ - col_threshold = COLUMN_LEFT_XPIXEL (sheet,current_col)+xxx_column_width (sheet,current_col)/2; + col_threshold = COLUMN_LEFT_XPIXEL (sheet, current_col) + + xxx_column_width (sheet, current_col) / 2; if (column > 0) { if (x < col_threshold) @@ -5478,7 +5409,7 @@ gtk_sheet_motion (GtkWidget * widget, if (x > col_threshold) column +=1; } - row_threshold = ROW_TOP_YPIXEL (sheet,current_row) + + row_threshold = ROW_TOP_YPIXEL (sheet, current_row) + yyy_row_height (sheet, current_row)/2; if (row > 0) { @@ -5505,7 +5436,6 @@ gtk_sheet_motion (GtkWidget * widget, if (aux.row0 + row >= 0 && aux.rowi + row < yyy_row_count (sheet) && aux.col0 + column >= 0 && aux.coli + column < xxx_column_count (sheet)) { - aux = sheet->drag_range; sheet->drag_range = sheet->range; @@ -5526,8 +5456,6 @@ gtk_sheet_motion (GtkWidget * widget, return TRUE; } - - gtk_sheet_get_pixel_info (sheet, x, y, &row, &column); if (sheet->state == GTK_SHEET_NORMAL && row == sheet->active_cell.row && @@ -5550,16 +5478,16 @@ gtk_sheet_move_query (GtkSheet *sheet, gint row, gint column) row_move = FALSE; column_move = FALSE; - row_align =- 1.; - col_align =- 1.; + row_align = -1.; + col_align = -1.; height = sheet->sheet_window_height; width = sheet->sheet_window_width; - if (row >= MAX_VISIBLE_ROW (sheet) && sheet->state!=GTK_SHEET_COLUMN_SELECTED) + if (row >= MAX_VISIBLE_ROW (sheet) && sheet->state != GTK_SHEET_COLUMN_SELECTED) { row_align = 1.; - new_row = MIN (yyy_row_count (sheet), row + 1); + new_row = MIN (yyy_row_count (sheet) - 1, row + 1); row_move = TRUE; if (MAX_VISIBLE_ROW (sheet) == yyy_row_count (sheet) - 1 && ROW_TOP_YPIXEL (sheet, yyy_row_count (sheet)- 1) + @@ -5569,12 +5497,12 @@ gtk_sheet_move_query (GtkSheet *sheet, gint row, gint column) row_align = -1.; } } - if (row < MIN_VISIBLE_ROW (sheet) && sheet->state!=GTK_SHEET_COLUMN_SELECTED) + if (row < MIN_VISIBLE_ROW (sheet) && sheet->state != GTK_SHEET_COLUMN_SELECTED) { row_align= 0.; row_move = TRUE; } - if (column >= MAX_VISIBLE_COLUMN (sheet) && sheet->state!=GTK_SHEET_ROW_SELECTED) + if (column >= MAX_VISIBLE_COLUMN (sheet) && sheet->state != GTK_SHEET_ROW_SELECTED) { col_align = 1.; new_col = MIN (xxx_column_count (sheet) - 1, column + 1); @@ -5587,7 +5515,7 @@ gtk_sheet_move_query (GtkSheet *sheet, gint row, gint column) col_align = -1.; } } - if (column < MIN_VISIBLE_COLUMN (sheet) && sheet->state!=GTK_SHEET_ROW_SELECTED) + if (column < MIN_VISIBLE_COLUMN (sheet) && sheet->state != GTK_SHEET_ROW_SELECTED) { col_align = 0.; column_move = TRUE; @@ -5606,7 +5534,7 @@ gtk_sheet_extend_selection (GtkSheet *sheet, gint row, gint column) { GtkSheetRange range; gint state; - gint r,c; + gint r, c; if (row == sheet->selection_cell.row && column == sheet->selection_cell.col) return; @@ -5636,13 +5564,13 @@ gtk_sheet_extend_selection (GtkSheet *sheet, gint row, gint column) sheet->range.row0 = r; sheet->range.coli = c; sheet->range.rowi = r; - gdk_draw_pixmap (sheet->sheet_window, + gdk_draw_drawable (sheet->sheet_window, GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], sheet->pixmap, - COLUMN_LEFT_XPIXEL (sheet,c)- 1, - ROW_TOP_YPIXEL (sheet,r)- 1, - COLUMN_LEFT_XPIXEL (sheet,c)- 1, - ROW_TOP_YPIXEL (sheet,r)- 1, + COLUMN_LEFT_XPIXEL (sheet, c)- 1, + ROW_TOP_YPIXEL (sheet, r)- 1, + COLUMN_LEFT_XPIXEL (sheet, c)- 1, + ROW_TOP_YPIXEL (sheet, r)- 1, xxx_column_width (sheet, c)+4, yyy_row_height (sheet, r)+4); gtk_sheet_range_draw_selection (sheet, sheet->range); @@ -5653,10 +5581,10 @@ gtk_sheet_extend_selection (GtkSheet *sheet, gint row, gint column) sheet->selection_cell.row = row; sheet->selection_cell.col = column; - range.col0 = MIN (column,sheet->active_cell.col); - range.coli = MAX (column,sheet->active_cell.col); - range.row0 = MIN (row,sheet->active_cell.row); - range.rowi = MAX (row,sheet->active_cell.row); + range.col0 = MIN (column, sheet->active_cell.col); + range.coli = MAX (column, sheet->active_cell.col); + range.row0 = MIN (row, sheet->active_cell.row); + range.rowi = MAX (row, sheet->active_cell.row); if (range.row0 != sheet->range.row0 || range.rowi != sheet->range.rowi || range.col0 != sheet->range.col0 || range.coli != sheet->range.coli || @@ -5670,7 +5598,7 @@ gtk_sheet_entry_key_press (GtkWidget *widget, GdkEventKey *key) { gboolean focus; - gtk_signal_emit_by_name (GTK_OBJECT (widget), "key_press_event", key, &focus); + g_signal_emit_by_name (widget, "key_press_event", key, &focus); return focus; } @@ -5704,8 +5632,8 @@ gtk_sheet_key_press (GtkWidget *widget, case GDK_Return: case GDK_KP_Enter: if (sheet->state == GTK_SHEET_NORMAL && !GTK_SHEET_IN_SELECTION (sheet)) - gtk_signal_emit_stop_by_name (GTK_OBJECT (gtk_sheet_get_entry (sheet)), - "key_press_event"); + g_signal_stop_emission_by_name (gtk_sheet_get_entry (sheet), + "key-press-event"); row = sheet->active_cell.row; col = sheet->active_cell.col; if (sheet->state == GTK_SHEET_COLUMN_SELECTED) @@ -5783,7 +5711,7 @@ gtk_sheet_key_press (GtkWidget *widget, col = MIN_VISIBLE_COLUMN (sheet); row = row - scroll; while (!yyy_row_is_visible (sheet, row) && row > 0) row--; - row = MAX (0,row); + row = MAX (0, row); gtk_sheet_click_cell (sheet, row, col, &veto); extend_selection = FALSE; break; @@ -5900,12 +5828,12 @@ gtk_sheet_key_press (GtkWidget *widget, break; case GDK_Home: row = 0; - while (!yyy_row_is_visible (sheet, row) && row < yyy_row_count (sheet)- 1) row++; + while (!yyy_row_is_visible (sheet, row) && row < yyy_row_count (sheet) - 1) row++; gtk_sheet_click_cell (sheet, row, sheet->active_cell.col, &veto); extend_selection = FALSE; break; case GDK_End: - row = yyy_row_count (sheet)- 1; + row = yyy_row_count (sheet) - 1; while (!yyy_row_is_visible (sheet, row) && row > 0) row--; gtk_sheet_click_cell (sheet, row, sheet->active_cell.col, &veto); extend_selection = FALSE; @@ -5957,17 +5885,6 @@ gtk_sheet_size_request (GtkWidget * widget, if (sheet->row_titles_visible) requisition->width += sheet->row_title_area.width; - sheet->view.row0 = ROW_FROM_YPIXEL (sheet, sheet->column_title_area.height + 1); - sheet->view.rowi = ROW_FROM_YPIXEL (sheet, sheet->sheet_window_height - 1); - sheet->view.col0 = COLUMN_FROM_XPIXEL (sheet, sheet->row_title_area.width + 1); - sheet->view.coli = COLUMN_FROM_XPIXEL (sheet, sheet->sheet_window_width); - - if (!sheet->column_titles_visible) - sheet->view.row0 = ROW_FROM_YPIXEL (sheet, 1); - - if (!sheet->row_titles_visible) - sheet->view.col0 = COLUMN_FROM_XPIXEL (sheet, 1); - children = sheet->children; while (children) { @@ -6063,20 +5980,7 @@ gtk_sheet_size_allocate (GtkWidget * widget, /* row button allocation */ size_allocate_row_title_buttons (sheet); - - sheet->view.row0 = ROW_FROM_YPIXEL (sheet, sheet->column_title_area.height + 1); - sheet->view.rowi = ROW_FROM_YPIXEL (sheet, sheet->sheet_window_height - 1); - sheet->view.col0 = COLUMN_FROM_XPIXEL (sheet, sheet->row_title_area.width + 1); - sheet->view.coli = COLUMN_FROM_XPIXEL (sheet, sheet->sheet_window_width); - - if (!sheet->column_titles_visible) - sheet->view.row0 = ROW_FROM_YPIXEL (sheet, 1); - - if (!sheet->row_titles_visible) - sheet->view.col0 = COLUMN_FROM_XPIXEL (sheet, 1); - size_allocate_column_title_buttons (sheet); - size_allocate_row_title_buttons (sheet); /* re - scale backing pixmap */ gtk_sheet_make_backing_pixmap (sheet, 0, 0); @@ -6090,7 +5994,7 @@ static void size_allocate_column_title_buttons (GtkSheet * sheet) { gint i; - gint x,width; + gint x, width; if (!sheet->column_titles_visible) return; if (!GTK_WIDGET_REALIZED (sheet)) @@ -6119,12 +6023,14 @@ size_allocate_column_title_buttons (GtkSheet * sheet) if (MAX_VISIBLE_COLUMN (sheet) == xxx_column_count (sheet) - 1) gdk_window_clear_area (sheet->column_title_window, - 0,0, + 0, 0, sheet->column_title_area.width, sheet->column_title_area.height); if (!GTK_WIDGET_DRAWABLE (sheet)) return; + size_allocate_global_button (sheet); + for (i = MIN_VISIBLE_COLUMN (sheet); i <= MAX_VISIBLE_COLUMN (sheet); i++) gtk_sheet_column_title_button_draw (sheet, i); } @@ -6160,12 +6066,14 @@ size_allocate_row_title_buttons (GtkSheet * sheet) } if (MAX_VISIBLE_ROW (sheet) == yyy_row_count (sheet)- 1) gdk_window_clear_area (sheet->row_title_window, - 0,0, + 0, 0, sheet->row_title_area.width, sheet->row_title_area.height); if (!GTK_WIDGET_DRAWABLE (sheet)) return; + size_allocate_global_button (sheet); + for (i = MIN_VISIBLE_ROW (sheet); i <= MAX_VISIBLE_ROW (sheet); i++) { if ( i >= yyy_row_count (sheet)) @@ -6196,7 +6104,7 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) &attributes) ) return ; - if ( GTK_WIDGET_REALIZED (sheet->sheet_entry) ) + if ( GTK_WIDGET_REALIZED (sheet->entry_widget) ) { if (!GTK_WIDGET (sheet_entry)->style) gtk_widget_ensure_style (GTK_WIDGET (sheet_entry)); @@ -6216,12 +6124,12 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) style->font_desc = pango_font_description_copy (attributes.font_desc); GTK_WIDGET (sheet_entry)->style = style; - gtk_widget_size_request (sheet->sheet_entry, NULL); + gtk_widget_size_request (sheet->entry_widget, NULL); GTK_WIDGET (sheet_entry)->style = previous_style; if (style != previous_style) { - if (!GTK_IS_ITEM_ENTRY (sheet->sheet_entry)) + if (!GTK_IS_ITEM_ENTRY (sheet->entry_widget)) { style->bg[GTK_STATE_NORMAL] = previous_style->bg[GTK_STATE_NORMAL]; style->fg[GTK_STATE_NORMAL] = previous_style->fg[GTK_STATE_NORMAL]; @@ -6229,6 +6137,7 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) style->fg[GTK_STATE_ACTIVE] = previous_style->fg[GTK_STATE_ACTIVE]; } gtk_widget_set_style (GTK_WIDGET (sheet_entry), style); + g_object_unref (style); } } @@ -6245,24 +6154,21 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) column_width = xxx_column_width (sheet, sheet->active_cell.col); size = MIN (text_size, max_size); - size = MAX (size,column_width - 2 * CELLOFFSET); + size = MAX (size, column_width - 2 * CELLOFFSET); row = sheet->active_cell.row; col = sheet->active_cell.col; - shentry_allocation.x = COLUMN_LEFT_XPIXEL (sheet,sheet->active_cell.col); - shentry_allocation.y = ROW_TOP_YPIXEL (sheet,sheet->active_cell.row); + shentry_allocation.x = COLUMN_LEFT_XPIXEL (sheet, sheet->active_cell.col); + shentry_allocation.y = ROW_TOP_YPIXEL (sheet, sheet->active_cell.row); shentry_allocation.width = column_width; shentry_allocation.height = yyy_row_height (sheet, sheet->active_cell.row); - if (GTK_IS_ITEM_ENTRY (sheet->sheet_entry)) + if (GTK_IS_ITEM_ENTRY (sheet->entry_widget)) { shentry_allocation.height -= 2 * CELLOFFSET; shentry_allocation.y += CELLOFFSET; - if (gtk_sheet_clip_text (sheet)) - shentry_allocation.width = column_width - 2 * CELLOFFSET; - else - shentry_allocation.width = size; + shentry_allocation.width = size; switch (GTK_ITEM_ENTRY (sheet_entry)->justification) { @@ -6279,7 +6185,7 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) } } - if (!GTK_IS_ITEM_ENTRY (sheet->sheet_entry)) + if (!GTK_IS_ITEM_ENTRY (sheet->entry_widget)) { shentry_allocation.x += 2; shentry_allocation.y += 2; @@ -6287,9 +6193,9 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) shentry_allocation.height -= MIN (shentry_allocation.height, 3); } - gtk_widget_size_allocate (sheet->sheet_entry, &shentry_allocation); + gtk_widget_size_allocate (sheet->entry_widget, &shentry_allocation); - if (previous_style == style) gtk_style_unref (previous_style); + if (previous_style == style) g_object_unref (previous_style); } static void @@ -6298,17 +6204,17 @@ gtk_sheet_entry_set_max_size (GtkSheet *sheet) gint i; gint size = 0; gint sizel = 0, sizer = 0; - gint row,col; + gint row, col; GtkJustification justification; gchar *s = NULL; row = sheet->active_cell.row; col = sheet->active_cell.col; - if ( ! GTK_IS_ITEM_ENTRY (sheet->sheet_entry) || gtk_sheet_clip_text (sheet)) + if ( ! GTK_IS_ITEM_ENTRY (sheet->entry_widget) ) return; - justification = GTK_ITEM_ENTRY (sheet->sheet_entry)->justification; + justification = GTK_ITEM_ENTRY (sheet->entry_widget)->justification; switch (justification) { @@ -6356,75 +6262,56 @@ gtk_sheet_entry_set_max_size (GtkSheet *sheet) if (size != 0) size += xxx_column_width (sheet, col); - GTK_ITEM_ENTRY (sheet->sheet_entry)->text_max_size = size; + GTK_ITEM_ENTRY (sheet->entry_widget)->text_max_size = size; } + static void create_sheet_entry (GtkSheet *sheet) { - GtkWidget *widget; - GtkWidget *parent; - GtkWidget *entry; - gint found_entry = FALSE; - - widget = GTK_WIDGET (sheet); - - if (sheet->sheet_entry) + if (sheet->entry_widget) { - /* avoids warnings */ - gtk_widget_ref (sheet->sheet_entry); - gtk_widget_unparent (sheet->sheet_entry); - gtk_widget_destroy (sheet->sheet_entry); + gtk_widget_unparent (sheet->entry_widget); } if (sheet->entry_type) { - if (!g_type_is_a (sheet->entry_type, GTK_TYPE_ENTRY)) - { - parent = GTK_WIDGET (gtk_type_new (sheet->entry_type)); - - sheet->sheet_entry = parent; + sheet->entry_container = g_object_new (sheet->entry_type, NULL); + g_object_ref_sink (sheet->entry_container); + sheet->entry_widget = gtk_sheet_get_entry (sheet); - entry = gtk_sheet_get_entry (sheet); - if (GTK_IS_ENTRY (entry)) - found_entry = TRUE; - } - else + if ( NULL == sheet->entry_widget) { - parent = GTK_WIDGET (gtk_type_new (sheet->entry_type)); - entry = parent; - found_entry = TRUE; + g_warning ("Entry type is %s. It must be GtkEntry subclass, or a widget containing one. " + "Using default", g_type_name (sheet->entry_type)); + g_object_unref (sheet->entry_container); + sheet->entry_widget = sheet->entry_container = gtk_item_entry_new (); } - - if (!found_entry) + else { - g_warning ("Entry type must be GtkEntry subclass, using default"); - entry = gtk_item_entry_new (); - sheet->sheet_entry = entry; + sheet->entry_widget = sheet->entry_container ; } - else - sheet->sheet_entry = parent; } else { - entry = gtk_item_entry_new (); - sheet->sheet_entry = entry; + sheet->entry_widget = sheet->entry_container = gtk_item_entry_new (); + g_object_ref_sink (sheet->entry_container); } - gtk_widget_size_request (sheet->sheet_entry, NULL); + gtk_widget_size_request (sheet->entry_widget, NULL); if (GTK_WIDGET_REALIZED (sheet)) { - gtk_widget_set_parent_window (sheet->sheet_entry, sheet->sheet_window); - gtk_widget_set_parent (sheet->sheet_entry, GTK_WIDGET (sheet)); - gtk_widget_realize (sheet->sheet_entry); + gtk_widget_set_parent_window (sheet->entry_widget, sheet->sheet_window); + gtk_widget_set_parent (sheet->entry_widget, GTK_WIDGET (sheet)); + gtk_widget_realize (sheet->entry_widget); } - gtk_signal_connect_object (GTK_OBJECT (entry),"key_press_event", - (GtkSignalFunc) gtk_sheet_entry_key_press, - GTK_OBJECT (sheet)); + g_signal_connect_swapped (sheet->entry_widget, "key_press_event", + G_CALLBACK (gtk_sheet_entry_key_press), + sheet); - gtk_widget_show (sheet->sheet_entry); + gtk_widget_show (sheet->entry_widget); } @@ -6450,11 +6337,12 @@ gtk_sheet_get_entry (GtkSheet *sheet) g_return_val_if_fail (sheet != NULL, NULL); g_return_val_if_fail (GTK_IS_SHEET (sheet), NULL); - g_return_val_if_fail (sheet->sheet_entry != NULL, NULL); + g_return_val_if_fail (sheet->entry_widget != NULL, NULL); - if (GTK_IS_ENTRY (sheet->sheet_entry)) return (sheet->sheet_entry); + if (GTK_IS_ENTRY (sheet->entry_container)) + return (sheet->entry_container); - parent = GTK_WIDGET (sheet->sheet_entry); + parent = sheet->entry_container; if (GTK_IS_TABLE (parent)) children = GTK_TABLE (parent)->children; if (GTK_IS_BOX (parent)) children = GTK_BOX (parent)->children; @@ -6499,9 +6387,9 @@ gtk_sheet_get_entry_widget (GtkSheet *sheet) { g_return_val_if_fail (sheet != NULL, NULL); g_return_val_if_fail (GTK_IS_SHEET (sheet), NULL); - g_return_val_if_fail (sheet->sheet_entry != NULL, NULL); + g_return_val_if_fail (sheet->entry_widget != NULL, NULL); - return (sheet->sheet_entry); + return (sheet->entry_widget); } @@ -6615,7 +6503,7 @@ gtk_sheet_button_draw (GtkSheet *sheet, GdkWindow *window, "label", real_x, real_y, layout); - g_object_unref (G_OBJECT (layout)); + g_object_unref (layout); real_y += text_height + 2; @@ -6671,7 +6559,7 @@ gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column) { GdkWindow *window = NULL; GdkRectangle allocation; - GtkSheetButton *button = NULL; + gboolean is_sensitive = FALSE; if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; @@ -6700,7 +6588,7 @@ gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column) } else { - button = xxx_column_button (sheet, column); + GtkSheetButton *button = xxx_column_button (sheet, column); allocation.x = COLUMN_LEFT_XPIXEL (sheet, column) + CELL_SPACING; if (sheet->row_titles_visible) allocation.x -= sheet->row_title_area.width; @@ -6710,6 +6598,12 @@ gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column) is_sensitive = xxx_column_is_sensitive (sheet, column); gtk_sheet_button_draw (sheet, window, button, is_sensitive, allocation); + + /* FIXME: Not freeing this button is correct (sort of), + because in PSPP the model always returns a static copy */ + + /* gtk_sheet_button_free (button); */ + } } @@ -6747,15 +6641,12 @@ gtk_sheet_row_title_button_draw (GtkSheet *sheet, gint row) * * functions: * adjust_scrollbars - * vadjustment_changed - * hadjustment_changed * vadjustment_value_changed * hadjustment_value_changed */ static void adjust_scrollbars (GtkSheet * sheet) { - if (sheet->vadjustment) { sheet->vadjustment->page_size = sheet->sheet_window_height; @@ -6763,7 +6654,7 @@ adjust_scrollbars (GtkSheet * sheet) sheet->vadjustment->step_increment = DEFAULT_ROW_HEIGHT (GTK_WIDGET (sheet)); sheet->vadjustment->lower = 0; sheet->vadjustment->upper = SHEET_HEIGHT (sheet) + 80; - gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), "changed"); + g_signal_emit_by_name (sheet->vadjustment, "changed"); } @@ -6774,38 +6665,11 @@ adjust_scrollbars (GtkSheet * sheet) sheet->hadjustment->step_increment = DEFAULT_COLUMN_WIDTH; sheet->hadjustment->lower = 0; sheet->hadjustment->upper = SHEET_WIDTH (sheet)+ 80; - gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), "changed"); + g_signal_emit_by_name (sheet->hadjustment, "changed"); } } - -static void -vadjustment_changed (GtkAdjustment * adjustment, - gpointer data) -{ - GtkSheet *sheet; - - g_return_if_fail (adjustment != NULL); - g_return_if_fail (data != NULL); - - sheet = GTK_SHEET (data); - -} - -static void -hadjustment_changed (GtkAdjustment * adjustment, - gpointer data) -{ - GtkSheet *sheet; - - g_return_if_fail (adjustment != NULL); - g_return_if_fail (data != NULL); - - sheet = GTK_SHEET (data); -} - - static void vadjustment_value_changed (GtkAdjustment * adjustment, gpointer data) @@ -6823,16 +6687,14 @@ vadjustment_value_changed (GtkAdjustment * adjustment, if (GTK_SHEET_IS_FROZEN (sheet)) return; - row = ROW_FROM_YPIXEL (sheet,sheet->column_title_area.height + CELL_SPACING); - if (!sheet->column_titles_visible) - row = ROW_FROM_YPIXEL (sheet, CELL_SPACING); + row = ROW_FROM_YPIXEL (sheet, CELL_SPACING); old_value = - sheet->voffset; new_row = g_sheet_row_pixel_to_row (sheet->row_geometry, - adjustment->value,sheet); + adjustment->value); - y = g_sheet_row_start_pixel (sheet->row_geometry, new_row, sheet); + y = g_sheet_row_start_pixel (sheet->row_geometry, new_row); if (adjustment->value > sheet->old_vadjustment && sheet->old_vadjustment > 0. && yyy_row_height (sheet, row) > sheet->vadjustment->step_increment) @@ -6887,12 +6749,7 @@ vadjustment_value_changed (GtkAdjustment * adjustment, sheet->voffset = - value; - sheet->view.row0 = ROW_FROM_YPIXEL (sheet, sheet->column_title_area.height + 1); - sheet->view.rowi = ROW_FROM_YPIXEL (sheet, sheet->sheet_window_height - 1); - if (!sheet->column_titles_visible) - sheet->view.row0 = ROW_FROM_YPIXEL (sheet, 1); - - if (GTK_WIDGET_REALIZED (sheet->sheet_entry) && + if (GTK_WIDGET_REALIZED (sheet->entry_widget) && sheet->state == GTK_SHEET_NORMAL && sheet->active_cell.row >= 0 && sheet->active_cell.col >= 0 && !gtk_sheet_cell_isvisible (sheet, sheet->active_cell.row, @@ -6906,7 +6763,7 @@ vadjustment_value_changed (GtkAdjustment * adjustment, gtk_sheet_cell_clear (sheet, sheet->active_cell.row, sheet->active_cell.col); - gtk_widget_unmap (sheet->sheet_entry); + gtk_widget_unmap (sheet->entry_widget); } gtk_sheet_position_children (sheet); @@ -6933,9 +6790,7 @@ hadjustment_value_changed (GtkAdjustment * adjustment, if (GTK_SHEET_IS_FROZEN (sheet)) return; - column = COLUMN_FROM_XPIXEL (sheet,sheet->row_title_area.width + CELL_SPACING); - if (!sheet->row_titles_visible) - column = COLUMN_FROM_XPIXEL (sheet, CELL_SPACING); + column = COLUMN_FROM_XPIXEL (sheet, CELL_SPACING); old_value = - sheet->hoffset; @@ -6998,13 +6853,7 @@ hadjustment_value_changed (GtkAdjustment * adjustment, } sheet->hoffset = - value; - - sheet->view.col0 = COLUMN_FROM_XPIXEL (sheet, sheet->row_title_area.width + 1); - sheet->view.coli = COLUMN_FROM_XPIXEL (sheet, sheet->sheet_window_width); - if (!sheet->row_titles_visible) - sheet->view.col0 = COLUMN_FROM_XPIXEL (sheet, 1); - - if (GTK_WIDGET_REALIZED (sheet->sheet_entry) && + if (GTK_WIDGET_REALIZED (sheet->entry_widget) && sheet->state == GTK_SHEET_NORMAL && sheet->active_cell.row >= 0 && sheet->active_cell.col >= 0 && !gtk_sheet_cell_isvisible (sheet, sheet->active_cell.row, @@ -7018,7 +6867,7 @@ hadjustment_value_changed (GtkAdjustment * adjustment, sheet->active_cell.row, sheet->active_cell.col); - gtk_widget_unmap (sheet->sheet_entry); + gtk_widget_unmap (sheet->entry_widget); } gtk_sheet_position_children (sheet); @@ -7108,7 +6957,7 @@ draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range) gdk_gc_set_clip_rectangle (sheet->xor_gc, &clip_area); - for (i =- 1; i <= 1; ++i) + for (i = -1; i <= 1; ++i) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, FALSE, @@ -7151,7 +7000,6 @@ new_column_width (GtkSheet * sheet, width = min_width; xxx_set_column_width (sheet, column, width); - sheet->view.coli = COLUMN_FROM_XPIXEL (sheet, sheet->sheet_window_width); size_allocate_column_title_buttons (sheet); return width; @@ -7185,7 +7033,6 @@ new_row_height (GtkSheet * sheet, height = min_height; yyy_set_row_height (sheet, row, height); - sheet->view.rowi = ROW_FROM_YPIXEL (sheet, sheet->sheet_window_height - 1); size_allocate_row_title_buttons (sheet); return height; @@ -7217,9 +7064,7 @@ gtk_sheet_set_column_width (GtkSheet * sheet, gtk_sheet_range_draw (sheet, NULL); } - gtk_signal_emit (GTK_OBJECT (sheet), sheet_signals[CHANGED], - 1, column); - gtk_signal_emit (GTK_OBJECT (sheet), sheet_signals[NEW_COL_WIDTH], - column, width); + g_signal_emit (sheet, sheet_signals[CHANGED], 0, -1, column); } @@ -7250,12 +7095,8 @@ gtk_sheet_set_row_height (GtkSheet * sheet, gtk_sheet_range_draw (sheet, NULL); } - gtk_signal_emit (GTK_OBJECT (sheet), sheet_signals[CHANGED], row, - 1); - gtk_signal_emit (GTK_OBJECT (sheet), sheet_signals[NEW_ROW_HEIGHT], row, height); - + g_signal_emit (sheet, sheet_signals[CHANGED], 0, row, - 1); } - - gboolean gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col, GtkSheetCellAttr *attributes) @@ -7309,7 +7150,6 @@ init_attributes (const GtkSheet *sheet, gint col, GtkSheetCellAttr *attributes) { GdkColormap *colormap; colormap = gdk_colormap_get_system (); - gdk_color_black (colormap, &attributes->foreground); attributes->background = sheet->bg_color; } attributes->justification = xxx_column_justification (sheet, col); @@ -7424,7 +7264,8 @@ gtk_sheet_attach_default (GtkSheet *sheet, return; } - gtk_sheet_attach (sheet, widget, row, col, GTK_EXPAND|GTK_FILL, GTK_EXPAND|GTK_FILL, 0, 0); + gtk_sheet_attach (sheet, widget, row, col, + GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); } void @@ -7650,11 +7491,14 @@ gtk_sheet_column_size_request (GtkSheet *sheet, { GtkRequisition button_requisition; GList *children; + GtkSheetButton *button = xxx_column_button (sheet, col); gtk_sheet_button_size_request (sheet, - xxx_column_button (sheet, col), + button, &button_requisition); + gtk_sheet_button_free (button); + *requisition = button_requisition.width; children = sheet->children; @@ -7831,10 +7675,12 @@ gtk_sheet_forall (GtkContainer *container, (* callback) (child->widget, callback_data); } - if (sheet->button) + + if (sheet->button && sheet->button->parent) (* callback) (sheet->button, callback_data); - if (sheet->sheet_entry) - (* callback) (sheet->sheet_entry, callback_data); + + if (sheet->entry_container && GTK_IS_CONTAINER (sheet->entry_container)) + (* callback) (sheet->entry_container, callback_data); } @@ -7907,6 +7753,7 @@ gtk_sheet_remove (GtkContainer *container, GtkWidget *widget) g_free (child); } + gtk_widget_unparent (sheet->button); } static void @@ -7996,7 +7843,7 @@ gtk_sheet_button_new (void) } -inline void +void gtk_sheet_button_free (GtkSheetButton *button) { if (!button) return ; @@ -8004,3 +7851,155 @@ gtk_sheet_button_free (GtkSheetButton *button) g_free (button->label); g_free (button); } + + +static void +append_cell_text (GString *string, const GtkSheet *sheet, gint r, gint c) +{ + gchar *celltext = gtk_sheet_cell_get_text (sheet, r, c); + + if ( NULL == celltext) + return; + + g_string_append (string, celltext); + g_free (celltext); +} + +static GString * +range_to_text (const GtkSheet *sheet) +{ + gint r, c; + GString *string; + + if ( !gtk_sheet_range_isvisible (sheet, sheet->range)) + return NULL; + + string = g_string_sized_new (80); + + for (r = sheet->range.row0; r <= sheet->range.rowi; ++r) + { + for (c = sheet->range.col0; c < sheet->range.coli; ++c) + { + append_cell_text (string, sheet, r, c); + g_string_append (string, "\t"); + } + append_cell_text (string, sheet, r, c); + if ( r < sheet->range.rowi) + g_string_append (string, "\n"); + } + + return string; +} + +static GString * +range_to_html (const GtkSheet *sheet) +{ + gint r, c; + GString *string; + + if ( !gtk_sheet_range_isvisible (sheet, sheet->range)) + return NULL; + + string = g_string_sized_new (480); + + g_string_append (string, "\n"); + g_string_append (string, "\n"); + g_string_append (string, "\n"); + for (r = sheet->range.row0; r <= sheet->range.rowi; ++r) + { + g_string_append (string, "\n"); + for (c = sheet->range.col0; c <= sheet->range.coli; ++c) + { + g_string_append (string, "\n"); + } + g_string_append (string, "\n"); + } + g_string_append (string, "
"); + append_cell_text (string, sheet, r, c); + g_string_append (string, "
\n"); + g_string_append (string, "\n"); + g_string_append (string, "\n"); + + return string; +} + +enum { + SELECT_FMT_NULL, + SELECT_FMT_TEXT, + SELECT_FMT_HTML +}; + +static void +primary_get_cb (GtkClipboard *clipboard, + GtkSelectionData *selection_data, + guint info, + gpointer data) +{ + GtkSheet *sheet = GTK_SHEET (data); + GString *string = NULL; + + switch (info) + { + case SELECT_FMT_TEXT: + string = range_to_text (sheet); + break; + case SELECT_FMT_HTML: + string = range_to_html (sheet); + break; + default: + g_assert_not_reached (); + } + + gtk_selection_data_set (selection_data, selection_data->target, + 8, + (const guchar *) string->str, string->len); + g_string_free (string, TRUE); +} + +static void +primary_clear_cb (GtkClipboard *clipboard, + gpointer data) +{ + GtkSheet *sheet = GTK_SHEET (data); + if ( ! GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) + return; + + gtk_sheet_real_unselect_range (sheet, NULL); +} + +static void +gtk_sheet_update_primary_selection (GtkSheet *sheet) +{ + static const GtkTargetEntry targets[] = { + { "UTF8_STRING", 0, SELECT_FMT_TEXT }, + { "STRING", 0, SELECT_FMT_TEXT }, + { "TEXT", 0, SELECT_FMT_TEXT }, + { "COMPOUND_TEXT", 0, SELECT_FMT_TEXT }, + { "text/plain;charset=utf-8", 0, SELECT_FMT_TEXT }, + { "text/plain", 0, SELECT_FMT_TEXT }, + { "text/html", 0, SELECT_FMT_HTML } + }; + + GtkClipboard *clipboard; + + if (!GTK_WIDGET_REALIZED (sheet)) + return; + + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (sheet), + GDK_SELECTION_PRIMARY); + + if (gtk_sheet_range_isvisible (sheet, sheet->range)) + { + if (!gtk_clipboard_set_with_owner (clipboard, targets, + G_N_ELEMENTS (targets), + primary_get_cb, primary_clear_cb, + G_OBJECT (sheet))) + primary_clear_cb (clipboard, sheet); + } + else + { + if (gtk_clipboard_get_owner (clipboard) == G_OBJECT (sheet)) + gtk_clipboard_clear (clipboard); + } +} +