X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtksheet%2Fgtksheet.c;h=31f242d28f1283648c517f7d122a2a1bd53a3751;hb=11706f97dd318697e43e6468b130ca5b7f1bff87;hp=6b0e640bd5a57e48692fff8f3998c3ac7d463e41;hpb=f82fc1927db3d6a1bd1b83089e53678203b36d1b;p=pspp-builds.git diff --git a/lib/gtksheet/gtksheet.c b/lib/gtksheet/gtksheet.c index 6b0e640b..31f242d2 100644 --- a/lib/gtksheet/gtksheet.c +++ b/lib/gtksheet/gtksheet.c @@ -1,6 +1,3 @@ -#define GLIB_DISABLE_DEPRECATED 1 -#define GDK_DISABLE_DEPRECATED 1 -#define GTK_DISABLE_DEPRECATED 1 /* * Copyright (C) 2006, 2008 Free Software Foundation * @@ -58,6 +55,8 @@ #include "gtksheet.h" #include "gtkextra-marshal.h" #include "gsheetmodel.h" +#include +#include /* sheet flags */ enum @@ -85,6 +84,7 @@ enum #define COLUMN_MIN_WIDTH 10 #define COLUMN_TITLES_HEIGHT 4 #define DEFAULT_COLUMN_WIDTH 80 +#define DEFAULT_ROW_HEIGHT 25 static void gtk_sheet_update_primary_selection (GtkSheet *sheet); static void gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column); @@ -113,29 +113,6 @@ dispose_string (const GtkSheet *sheet, gchar *text) g_free (text); } -static guint -default_row_height (const GtkSheet *sheet) -{ - GtkWidget *widget = GTK_WIDGET (sheet); - - if (!widget->style->font_desc) return 25; - else - { - PangoContext *context = gtk_widget_get_pango_context (widget); - PangoFontMetrics *metrics = - 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 * COLUMN_TITLES_HEIGHT; - } -} - static guint STRING_WIDTH (GtkWidget *widget, const PangoFontDescription *font, const gchar *text) @@ -158,22 +135,31 @@ yyy_row_ypixel_to_row (const GtkSheet *sheet, gint y) { GSheetRow *geo = sheet->row_geometry; - if (y < 0) - { - g_error ("This shouldnt happen"); - return -1; - } + g_return_val_if_fail (y >= 0, -1); return g_sheet_row_pixel_to_row (geo, y); } - +/* Return the lowest row number which is wholly or partially on + the visible range of the sheet */ static inline glong min_visible_row (const GtkSheet *sheet) { return yyy_row_ypixel_to_row (sheet, sheet->vadjustment->value); } +static inline glong +min_fully_visible_row (const GtkSheet *sheet) +{ + glong row = yyy_row_ypixel_to_row (sheet, sheet->vadjustment->value); + + if ( g_sheet_row_start_pixel (sheet->row_geometry, row) < sheet->vadjustment->value) + row++; + + return row; +} + + static inline glong max_visible_row (const GtkSheet *sheet) @@ -184,36 +170,51 @@ max_visible_row (const GtkSheet *sheet) } -/* returns the column index from a x pixel location */ -static inline gint -column_from_xpixel (const GtkSheet *sheet, gint x) +static inline glong +max_fully_visible_row (const GtkSheet *sheet) { - gint i; - gint cx = 0; + glong row = max_visible_row (sheet); - if (x < 0) return -1; - for (i = 0; - i < g_sheet_column_get_column_count (sheet->column_geometry); i++) - { - if (x >= cx && - x <= (cx + g_sheet_column_get_width (sheet->column_geometry, i))) - return i; + if ( g_sheet_row_start_pixel (sheet->row_geometry, row) + + + g_sheet_row_get_height (sheet->row_geometry, row) + > sheet->vadjustment->value) + row--; - cx += g_sheet_column_get_width (sheet->column_geometry, i); - } + return row; +} - /* no match */ - return g_sheet_column_get_column_count (sheet->column_geometry) - 1; + +/* returns the column index from a pixel location */ +static inline gint +column_from_xpixel (const GtkSheet *sheet, gint pixel) +{ + return psppire_axis_get_unit_at_pixel (sheet->haxis, pixel); } +/* Returns the lowest column number which is wholly or partially + on the sheet */ static inline glong min_visible_column (const GtkSheet *sheet) { return column_from_xpixel (sheet, sheet->hadjustment->value); } +static inline glong +min_fully_visible_column (const GtkSheet *sheet) +{ + glong col = min_visible_column (sheet); + + if ( psppire_axis_pixel_start (sheet->haxis, col) < sheet->hadjustment->value) + col++; + + return col; +} + +/* Returns the highest column number which is wholly or partially + on the sheet */ static inline glong max_visible_column (const GtkSheet *sheet) { @@ -222,6 +223,21 @@ max_visible_column (const GtkSheet *sheet) sheet->hadjustment->page_size); } +static inline glong +max_fully_visible_column (const GtkSheet *sheet) +{ + glong col = max_visible_column (sheet); + + if ( psppire_axis_pixel_start (sheet->haxis, col) + + + psppire_axis_unit_size (sheet->haxis, col) + > sheet->hadjustment->value) + col--; + + return col; +} + + /* The size of the region (in pixels) around the row/column boundaries where the height/width may be grabbed to change size */ @@ -289,9 +305,9 @@ POSSIBLE_DRAG (const GtkSheet *sheet, gint x, gint y, *drag_column = column_from_xpixel (sheet, x); *drag_row = yyy_row_ypixel_to_row (sheet, y); - if (x >= g_sheet_column_start_pixel (sheet->column_geometry, sheet->range.col0) - DRAG_WIDTH / 2 && - x <= g_sheet_column_start_pixel (sheet->column_geometry, sheet->range.coli) + - g_sheet_column_get_width (sheet->column_geometry, sheet->range.coli) + DRAG_WIDTH / 2) + if (x >= psppire_axis_pixel_start (sheet->haxis, sheet->range.col0) - DRAG_WIDTH / 2 && + x <= psppire_axis_pixel_start (sheet->haxis, sheet->range.coli) + + psppire_axis_unit_size (sheet->haxis, sheet->range.coli) + DRAG_WIDTH / 2) { ydrag = g_sheet_row_start_pixel (sheet->row_geometry, sheet->range.row0); if (y >= ydrag - DRAG_WIDTH / 2 && y <= ydrag + DRAG_WIDTH / 2) @@ -312,14 +328,14 @@ POSSIBLE_DRAG (const GtkSheet *sheet, gint x, gint y, y <= g_sheet_row_start_pixel (sheet->row_geometry, sheet->range.rowi) + g_sheet_row_get_height (sheet->row_geometry, sheet->range.rowi) + DRAG_WIDTH / 2) { - xdrag = g_sheet_column_start_pixel (sheet->column_geometry, sheet->range.col0); + xdrag = psppire_axis_pixel_start (sheet->haxis, sheet->range.col0); if (x >= xdrag - DRAG_WIDTH / 2 && x <= xdrag + DRAG_WIDTH / 2) { *drag_column = sheet->range.col0; return TRUE; } - xdrag = g_sheet_column_start_pixel (sheet->column_geometry, sheet->range.coli) + - g_sheet_column_get_width (sheet->column_geometry, sheet->range.coli); + xdrag = psppire_axis_pixel_start (sheet->haxis, sheet->range.coli) + + psppire_axis_unit_size (sheet->haxis, sheet->range.coli); if (x >= xdrag - DRAG_WIDTH / 2 && x <= xdrag + DRAG_WIDTH / 2) { *drag_column = sheet->range.coli; @@ -341,8 +357,8 @@ POSSIBLE_RESIZE (const GtkSheet *sheet, gint x, gint y, sheet->range.col0 < 0 || sheet->range.coli < 0 ) return FALSE; - xdrag = g_sheet_column_start_pixel (sheet->column_geometry, sheet->range.coli)+ - g_sheet_column_get_width (sheet->column_geometry, sheet->range.coli); + xdrag = psppire_axis_pixel_start (sheet->haxis, sheet->range.coli)+ + psppire_axis_unit_size (sheet->haxis, sheet->range.coli); ydrag = g_sheet_row_start_pixel (sheet->row_geometry, sheet->range.rowi) + g_sheet_row_get_height (sheet->row_geometry, sheet->range.rowi); @@ -351,7 +367,7 @@ POSSIBLE_RESIZE (const GtkSheet *sheet, gint x, gint y, ydrag = g_sheet_row_start_pixel (sheet->row_geometry, min_visible_row (sheet)); if (sheet->state == GTK_SHEET_ROW_SELECTED) - xdrag = g_sheet_column_start_pixel (sheet->column_geometry, min_visible_column (sheet)); + xdrag = psppire_axis_pixel_start (sheet->haxis, min_visible_column (sheet)); *drag_column = column_from_xpixel (sheet, x); *drag_row = yyy_row_ypixel_to_row (sheet, y); @@ -369,22 +385,22 @@ rectangle_from_range (GtkSheet *sheet, const GtkSheetRange *range, { g_return_val_if_fail (range, FALSE); - r->x = g_sheet_column_start_pixel (sheet->column_geometry, range->col0); - r->x -= sheet->hadjustment->value; + r->x = psppire_axis_pixel_start (sheet->haxis, range->col0); + r->x -= round (sheet->hadjustment->value); if ( sheet->row_titles_visible) r->x += sheet->row_title_area.width; r->y = g_sheet_row_start_pixel (sheet->row_geometry, range->row0); - r->y -= sheet->vadjustment->value; + r->y -= round (sheet->vadjustment->value); if ( sheet->column_titles_visible) r->y += sheet->column_title_area.height; - r->width = g_sheet_column_start_pixel (sheet->column_geometry, range->coli) - - g_sheet_column_start_pixel (sheet->column_geometry, range->col0) + - g_sheet_column_get_width (sheet->column_geometry, range->coli); + r->width = psppire_axis_pixel_start (sheet->haxis, range->coli) - + psppire_axis_pixel_start (sheet->haxis, range->col0) + + psppire_axis_unit_size (sheet->haxis, range->coli); r->height = g_sheet_row_start_pixel (sheet->row_geometry, range->rowi) - g_sheet_row_start_pixel (sheet->row_geometry, range->row0) + @@ -468,8 +484,6 @@ static void gtk_sheet_range_draw_selection (GtkSheet *sheet, /* Selection */ -static gboolean gtk_sheet_move_query (GtkSheet *sheet, - gint row, gint column); static void gtk_sheet_real_select_range (GtkSheet *sheet, const GtkSheetRange *range); static void gtk_sheet_real_unselect_range (GtkSheet *sheet, @@ -486,7 +500,7 @@ static void gtk_sheet_draw_border (GtkSheet *sheet, static void gtk_sheet_entry_changed (GtkWidget *widget, gpointer data); static void gtk_sheet_hide_active_cell (GtkSheet *sheet); -static void activate_cell (GtkSheet *sheet, +static void change_active_cell (GtkSheet *sheet, gint row, gint col); static void gtk_sheet_draw_active_cell (GtkSheet *sheet); static void gtk_sheet_show_active_cell (GtkSheet *sheet); @@ -563,7 +577,6 @@ enum MOVE_RANGE, TRAVERSE, ACTIVATE, - CHANGED, LAST_SIGNAL }; @@ -599,6 +612,8 @@ gtk_sheet_get_type () return sheet_type; } + + static GtkSheetRange* gtk_sheet_range_copy (const GtkSheetRange *range) { @@ -637,6 +652,44 @@ gtk_sheet_range_get_type (void) return sheet_range_type; } +static GtkSheetCell* +gtk_sheet_cell_copy (const GtkSheetCell *cell) +{ + GtkSheetCell *new_cell; + + g_return_val_if_fail (cell != NULL, NULL); + + new_cell = g_new (GtkSheetCell, 1); + + *new_cell = *cell; + + return new_cell; +} + +static void +gtk_sheet_cell_free (GtkSheetCell *cell) +{ + g_return_if_fail (cell != NULL); + + g_free (cell); +} + +GType +gtk_sheet_cell_get_type (void) +{ + static GType sheet_cell_type = 0; + + if (!sheet_cell_type) + { + sheet_cell_type = + g_boxed_type_register_static ("GtkSheetCell", + (GBoxedCopyFunc) gtk_sheet_cell_copy, + (GBoxedFreeFunc) gtk_sheet_cell_free); + } + + return sheet_cell_type; +} + static void column_titles_changed (GtkWidget *w, gint first, gint n_columns, gpointer data); @@ -646,7 +699,7 @@ enum { PROP_0, PROP_ROW_GEO, - PROP_COL_GEO, + PROP_HAXIS, PROP_MODEL }; @@ -661,13 +714,15 @@ gtk_sheet_set_row_geometry (GtkSheet *sheet, GSheetRow *geo) } static void -gtk_sheet_set_column_geometry (GtkSheet *sheet, GSheetColumn *geo) +gtk_sheet_set_horizontal_axis (GtkSheet *sheet, PsppireAxis *a) { - if ( sheet->column_geometry ) g_object_unref (sheet->column_geometry); + if ( sheet->haxis ) + g_object_unref (sheet->haxis); - sheet->column_geometry = geo; + sheet->haxis = a; - if ( sheet->column_geometry ) g_object_ref (sheet->column_geometry); + if ( sheet->haxis ) + g_object_ref (sheet->haxis); } @@ -685,11 +740,8 @@ gtk_sheet_set_property (GObject *object, 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); + case PROP_HAXIS: + gtk_sheet_set_horizontal_axis (sheet, g_value_get_pointer (value)); break; case PROP_MODEL: gtk_sheet_set_model (sheet, g_value_get_pointer (value)); @@ -713,8 +765,8 @@ gtk_sheet_get_property (GObject *object, 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); + case PROP_HAXIS: + g_value_set_pointer (value, sheet->haxis); break; case PROP_MODEL: g_value_set_pointer (value, sheet->model); @@ -732,7 +784,7 @@ gtk_sheet_class_init (GtkSheetClass *klass) GObjectClass *object_class = G_OBJECT_CLASS (klass); GParamSpec *row_geo_spec ; - GParamSpec *col_geo_spec ; + GParamSpec *haxis_spec ; GParamSpec *model_spec ; GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); @@ -900,9 +952,10 @@ gtk_sheet_class_init (GtkSheetClass *klass) 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); + gtkextra_BOOLEAN__BOXED_POINTER, + G_TYPE_BOOLEAN, 2, + GTK_TYPE_SHEET_CELL, + G_TYPE_POINTER); sheet_signals[ACTIVATE] = @@ -916,15 +969,6 @@ gtk_sheet_class_init (GtkSheetClass *klass) G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); - sheet_signals[CHANGED] = - 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 = g_signal_new ("set-scroll-adjustments", G_TYPE_FROM_CLASS (object_class), @@ -949,10 +993,10 @@ gtk_sheet_class_init (GtkSheetClass *klass) "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", + haxis_spec = + g_param_spec_pointer ("horizontal-axis", + "Horizontal Axis", + "A pointer to the PsppireAxis object for the columns", G_PARAM_READABLE | G_PARAM_WRITABLE ); model_spec = @@ -970,8 +1014,8 @@ gtk_sheet_class_init (GtkSheetClass *klass) row_geo_spec); g_object_class_install_property (object_class, - PROP_COL_GEO, - col_geo_spec); + PROP_HAXIS, + haxis_spec); g_object_class_install_property (object_class, PROP_MODEL, @@ -1010,7 +1054,7 @@ static void gtk_sheet_init (GtkSheet *sheet) { sheet->model = NULL; - sheet->column_geometry = NULL; + sheet->haxis = NULL; sheet->row_geometry = NULL; sheet->flags = 0; @@ -1024,7 +1068,7 @@ gtk_sheet_init (GtkSheet *sheet) sheet->column_title_area.x = 0; sheet->column_title_area.y = 0; sheet->column_title_area.width = 0; - sheet->column_title_area.height = default_row_height (sheet); + sheet->column_title_area.height = DEFAULT_ROW_HEIGHT; sheet->row_title_window = NULL; sheet->row_title_area.x = 0; @@ -1048,6 +1092,7 @@ gtk_sheet_init (GtkSheet *sheet) sheet->sheet_window = NULL; sheet->entry_widget = NULL; sheet->entry_container = NULL; + sheet->entry_handler_id = 0; sheet->button = NULL; sheet->hadjustment = NULL; @@ -1100,13 +1145,13 @@ columns_inserted_deleted_callback (GSheetModel *model, gint first_column, */ range.col0 = first_column; range.row0 = 0; - range.coli = g_sheet_column_get_column_count (sheet->column_geometry) - 1; + range.coli = psppire_axis_unit_count (sheet->haxis) - 1; range.rowi = g_sheet_row_get_row_count (sheet->row_geometry) - 1; adjust_scrollbars (sheet); if (sheet->active_cell.col >= model_columns) - activate_cell (sheet, sheet->active_cell.row, model_columns - 1); + change_active_cell (sheet, sheet->active_cell.row, model_columns - 1); for (i = first_column; i <= max_visible_column (sheet); i++) gtk_sheet_column_title_button_draw (sheet, i); @@ -1133,12 +1178,12 @@ rows_inserted_deleted_callback (GSheetModel *model, gint first_row, range.row0 = first_row; range.col0 = 0; range.rowi = g_sheet_row_get_row_count (sheet->row_geometry) - 1; - range.coli = g_sheet_column_get_column_count (sheet->column_geometry) - 1; + range.coli = psppire_axis_unit_count (sheet->haxis) - 1; adjust_scrollbars (sheet); if (sheet->active_cell.row >= model_rows) - activate_cell (sheet, model_rows - 1, sheet->active_cell.col); + change_active_cell (sheet, model_rows - 1, sheet->active_cell.col); for (i = first_row; i <= max_visible_row (sheet); i++) gtk_sheet_row_title_button_draw (sheet, i); @@ -1163,13 +1208,14 @@ 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) + if ( !GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) + return; + + 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)) + max_visible_column (sheet) > g_sheet_model_get_column_count (sheet->model)) { - gtk_sheet_move_query (sheet, 0, 0); + gtk_sheet_moveto (sheet, 0, 0, 0, 0); } if ( ( row0 < 0 && col0 < 0 ) || ( rowi < 0 && coli < 0 ) ) @@ -1214,11 +1260,10 @@ range_update_callback (GSheetModel *m, gint row0, gint col0, * Returns: the new sheet widget */ GtkWidget * -gtk_sheet_new (GSheetRow *vgeo, GSheetColumn *hgeo, GSheetModel *model) +gtk_sheet_new (GSheetRow *vgeo, void *hgeo, GSheetModel *model) { GtkWidget *widget = g_object_new (GTK_TYPE_SHEET, "row-geometry", vgeo, - "column-geometry", hgeo, "model", model, NULL); return widget; @@ -1278,21 +1323,11 @@ column_titles_changed (GtkWidget *w, gint first, gint n_columns, gpointer data) if ( n_columns == -1 ) { extremity = TRUE; - n_columns = g_sheet_column_get_column_count (sheet->column_geometry) - 1 ; + n_columns = psppire_axis_unit_count (sheet->haxis) - 1 ; } - { - gint i; - for ( i = first ; i <= first + n_columns ; ++i ) - { - gtk_sheet_column_title_button_draw (sheet, i); - g_signal_emit (sheet, sheet_signals[CHANGED], 0, -1, i); - } - } - if ( extremity) gtk_sheet_column_title_button_draw (sheet, -1); - } void @@ -1315,11 +1350,8 @@ gtk_sheet_change_entry (GtkSheet *sheet, GtkType entry_type) if (state == GTK_SHEET_NORMAL) { gtk_sheet_show_active_cell (sheet); - g_signal_connect (gtk_sheet_get_entry (sheet), - "changed", - G_CALLBACK (gtk_sheet_entry_changed), - sheet); } + } void @@ -1350,7 +1382,7 @@ gtk_sheet_get_columns_count (GtkSheet *sheet) g_return_val_if_fail (sheet != NULL, 0); g_return_val_if_fail (GTK_IS_SHEET (sheet), 0); - return g_sheet_column_get_column_count (sheet->column_geometry); + return psppire_axis_unit_count (sheet->haxis); } static void @@ -1367,7 +1399,7 @@ gtk_sheet_autoresize_column (GtkSheet *sheet, gint column) g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_IS_SHEET (sheet)); - if (column >= g_sheet_column_get_column_count (sheet->column_geometry) || column < 0) return; + if (column >= psppire_axis_unit_count (sheet->haxis) || column < 0) return; for (row = 0; row < g_sheet_row_get_row_count (sheet->row_geometry); row++) { @@ -1389,7 +1421,7 @@ gtk_sheet_autoresize_column (GtkSheet *sheet, gint column) dispose_string (sheet, text); } - if (text_width > g_sheet_column_get_width (sheet->column_geometry, column) ) + if (text_width > psppire_axis_unit_size (sheet->haxis, column) ) { gtk_sheet_set_column_width (sheet, column, text_width); } @@ -1516,7 +1548,7 @@ gtk_sheet_moveto (GtkSheet *sheet, g_return_if_fail (col_align <= 1); g_return_if_fail (col < - g_sheet_column_get_column_count (sheet->column_geometry)); + psppire_axis_unit_count (sheet->haxis)); g_return_if_fail (row < g_sheet_row_get_row_count (sheet->row_geometry)); @@ -1533,7 +1565,7 @@ gtk_sheet_moveto (GtkSheet *sheet, if (col >= 0) { - gint x = g_sheet_column_start_pixel (sheet->column_geometry, col); + gint x = psppire_axis_pixel_start (sheet->haxis, col); gtk_adjustment_set_value (sheet->hadjustment, x - width * col_align); } @@ -1576,7 +1608,7 @@ gtk_sheet_select_row (GtkSheet *sheet, gint row) sheet->range.row0 = row; sheet->range.col0 = 0; sheet->range.rowi = row; - sheet->range.coli = g_sheet_column_get_column_count (sheet->column_geometry) - 1; + sheet->range.coli = psppire_axis_unit_count (sheet->haxis) - 1; sheet->active_cell.row = row; sheet->active_cell.col = 0; @@ -1591,7 +1623,7 @@ 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 >= g_sheet_column_get_column_count (sheet->column_geometry)) + if (column < 0 || column >= psppire_axis_unit_count (sheet->haxis)) return; if (sheet->state != GTK_SHEET_NORMAL) @@ -1624,10 +1656,10 @@ gtk_sheet_range_isvisible (const GtkSheet *sheet, if (range.rowi < 0 || range.rowi >= g_sheet_row_get_row_count (sheet->row_geometry)) return FALSE; - if (range.col0 < 0 || range.col0 >= g_sheet_column_get_column_count (sheet->column_geometry)) + if (range.col0 < 0 || range.col0 >= psppire_axis_unit_count (sheet->haxis)) return FALSE; - if (range.coli < 0 || range.coli >= g_sheet_column_get_column_count (sheet->column_geometry)) + if (range.coli < 0 || range.coli >= psppire_axis_unit_count (sheet->haxis)) return FALSE; if (range.rowi < min_visible_row (sheet)) @@ -1732,7 +1764,7 @@ gtk_sheet_dispose (GObject *object) 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->haxis) g_object_unref (sheet->haxis); g_object_unref (sheet->entry_container); sheet->entry_container = NULL; @@ -2053,7 +2085,7 @@ gtk_sheet_map (GtkWidget *widget) gtk_widget_map (GTK_BIN (sheet->button)->child); gtk_sheet_range_draw (sheet, NULL); - activate_cell (sheet, + change_active_cell (sheet, sheet->active_cell.row, sheet->active_cell.col); } @@ -2106,7 +2138,7 @@ gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col) return; if (col < 0 || - col >= g_sheet_column_get_column_count (sheet->column_geometry)) + col >= psppire_axis_unit_count (sheet->haxis)) return; gtk_sheet_get_attributes (sheet, row, col, &attributes); @@ -2326,13 +2358,12 @@ gtk_sheet_set_cell (GtkSheet *sheet, gint row, gint col, const gchar *text) { GSheetModel *model ; - gboolean changed = FALSE; gchar *old_text ; g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_IS_SHEET (sheet)); - if (col >= g_sheet_column_get_column_count (sheet->column_geometry) + if (col >= psppire_axis_unit_count (sheet->haxis) || row >= g_sheet_row_get_row_count (sheet->row_geometry)) return; @@ -2342,14 +2373,8 @@ gtk_sheet_set_cell (GtkSheet *sheet, gint row, gint col, old_text = g_sheet_model_get_string (model, row, col); - if (0 != safe_strcmp (old_text, text)) - changed = g_sheet_model_set_string (model, text, row, col); - if ( g_sheet_model_free_strings (model)) g_free (old_text); - - if ( changed ) - g_signal_emit (sheet, sheet_signals[CHANGED], 0, row, col); } @@ -2360,7 +2385,7 @@ gtk_sheet_cell_clear (GtkSheet *sheet, gint row, gint column) g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_IS_SHEET (sheet)); - if (column >= g_sheet_column_get_column_count (sheet->column_geometry) || + if (column >= psppire_axis_unit_count (sheet->haxis) || row >= g_sheet_row_get_row_count (sheet->row_geometry)) return; if (column < 0 || row < 0) return; @@ -2397,7 +2422,7 @@ gtk_sheet_cell_get_text (const GtkSheet *sheet, gint row, gint col) g_return_val_if_fail (sheet != NULL, NULL); g_return_val_if_fail (GTK_IS_SHEET (sheet), NULL); - if (col >= g_sheet_column_get_column_count (sheet->column_geometry) || row >= g_sheet_row_get_row_count (sheet->row_geometry)) + if (col >= psppire_axis_unit_count (sheet->haxis) || row >= g_sheet_row_get_row_count (sheet->row_geometry)) return NULL; if (col < 0 || row < 0) return NULL; @@ -2418,7 +2443,7 @@ gtk_sheet_cell_get_state (GtkSheet *sheet, gint row, gint col) g_return_val_if_fail (sheet != NULL, 0); g_return_val_if_fail (GTK_IS_SHEET (sheet), 0); - if (col >= g_sheet_column_get_column_count (sheet->column_geometry) || row >= g_sheet_row_get_row_count (sheet->row_geometry)) return 0; + if (col >= psppire_axis_unit_count (sheet->haxis) || row >= g_sheet_row_get_row_count (sheet->row_geometry)) return 0; if (col < 0 || row < 0) return 0; state = sheet->state; @@ -2501,7 +2526,7 @@ gtk_sheet_get_pixel_info (GtkSheet *sheet, else { tcol = column_from_xpixel (sheet, x); - if (tcol > g_sheet_column_get_column_count (sheet->column_geometry)) + if (tcol > psppire_axis_unit_count (sheet->haxis)) return FALSE; } @@ -2519,14 +2544,14 @@ gtk_sheet_get_cell_area (GtkSheet *sheet, g_return_val_if_fail (sheet != NULL, 0); g_return_val_if_fail (GTK_IS_SHEET (sheet), 0); - if (row >= g_sheet_row_get_row_count (sheet->row_geometry) || column >= g_sheet_column_get_column_count (sheet->column_geometry)) + if (row >= g_sheet_row_get_row_count (sheet->row_geometry) || column >= psppire_axis_unit_count (sheet->haxis)) return FALSE; - area->x = (column == -1) ? 0 : g_sheet_column_start_pixel (sheet->column_geometry, column); + area->x = (column == -1) ? 0 : psppire_axis_pixel_start (sheet->haxis, column); area->y = (row == -1) ? 0 : g_sheet_row_start_pixel (sheet->row_geometry, row); area->width= (column == -1) ? sheet->row_title_area.width - : g_sheet_column_get_width (sheet->column_geometry, column); + : psppire_axis_unit_size (sheet->haxis, column); area->height= (row == -1) ? sheet->column_title_area.height : g_sheet_row_get_height (sheet->row_geometry, row); @@ -2545,7 +2570,7 @@ gtk_sheet_set_active_cell (GtkSheet *sheet, gint row, gint col) if (row >= g_sheet_row_get_row_count (sheet->row_geometry) || - col >= g_sheet_column_get_column_count (sheet->column_geometry)) + col >= psppire_axis_unit_count (sheet->haxis)) return; sheet->active_cell.row = row; @@ -2560,7 +2585,7 @@ gtk_sheet_set_active_cell (GtkSheet *sheet, gint row, gint col) return; } - activate_cell (sheet, row, col); + change_active_cell (sheet, row, col); } void @@ -2643,17 +2668,18 @@ gtk_sheet_hide_active_cell (GtkSheet *sheet) } static void -activate_cell (GtkSheet *sheet, gint row, gint col) +change_active_cell (GtkSheet *sheet, gint row, gint col) { gint old_row, old_col; - g_return_if_fail (sheet != NULL); + glong old_handler_id = sheet->entry_handler_id; + g_return_if_fail (GTK_IS_SHEET (sheet)); if (row < 0 || col < 0) return; if ( row > g_sheet_row_get_row_count (sheet->row_geometry) - || col > g_sheet_column_get_column_count (sheet->column_geometry)) + || col > psppire_axis_unit_count (sheet->haxis)) return; if (sheet->state != GTK_SHEET_NORMAL) @@ -2662,6 +2688,8 @@ activate_cell (GtkSheet *sheet, gint row, gint col) gtk_sheet_real_unselect_range (sheet, NULL); } + g_signal_handler_block (sheet->entry_widget, sheet->entry_handler_id); + old_row = sheet->active_cell.row; old_col = sheet->active_cell.col; @@ -2678,13 +2706,12 @@ activate_cell (GtkSheet *sheet, gint row, gint col) gtk_sheet_show_active_cell (sheet); - g_signal_connect (gtk_sheet_get_entry (sheet), - "changed", - G_CALLBACK (gtk_sheet_entry_changed), - sheet); g_signal_emit (sheet, sheet_signals [ACTIVATE], 0, row, col, old_row, old_col); + + if ( old_handler_id == sheet->entry_handler_id) + g_signal_handler_unblock (sheet->entry_widget, sheet->entry_handler_id); } static void @@ -2751,6 +2778,7 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) gtk_widget_grab_focus (GTK_WIDGET (sheet_entry)); dispose_string (sheet, text); + } static void @@ -2835,10 +2863,10 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) if (mask1 != mask2) { - x = g_sheet_column_start_pixel (sheet->column_geometry, j); + x = psppire_axis_pixel_start (sheet->haxis, j); y = g_sheet_row_start_pixel (sheet->row_geometry, i); - width = g_sheet_column_start_pixel (sheet->column_geometry, j)- x+ - g_sheet_column_get_width (sheet->column_geometry, j); + width = psppire_axis_pixel_start (sheet->haxis, j)- x+ + psppire_axis_unit_size (sheet->haxis, j); height = g_sheet_row_start_pixel (sheet->row_geometry, i) - y + g_sheet_row_get_height (sheet->row_geometry, i); if (i == sheet->range.row0) @@ -2856,10 +2884,10 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) if (i != sheet->active_cell.row || j != sheet->active_cell.col) { - x = g_sheet_column_start_pixel (sheet->column_geometry, j); + x = psppire_axis_pixel_start (sheet->haxis, j); y = g_sheet_row_start_pixel (sheet->row_geometry, i); - width = g_sheet_column_start_pixel (sheet->column_geometry, j)- x+ - g_sheet_column_get_width (sheet->column_geometry, j); + width = psppire_axis_pixel_start (sheet->haxis, j)- x+ + psppire_axis_unit_size (sheet->haxis, j); height = g_sheet_row_start_pixel (sheet->row_geometry, i) - y + g_sheet_row_get_height (sheet->row_geometry, i); @@ -2899,9 +2927,9 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) if (state == GTK_STATE_SELECTED && !selected) { - x = g_sheet_column_start_pixel (sheet->column_geometry, j); + x = psppire_axis_pixel_start (sheet->haxis, j); y = g_sheet_row_start_pixel (sheet->row_geometry, i); - width = g_sheet_column_start_pixel (sheet->column_geometry, j) - x + g_sheet_column_get_width (sheet->column_geometry, j); + width = psppire_axis_pixel_start (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j); height = g_sheet_row_start_pixel (sheet->row_geometry, i) - y + g_sheet_row_get_height (sheet->row_geometry, i); if (i == sheet->range.row0) @@ -2934,9 +2962,9 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) (i != sheet->active_cell.row || j != sheet->active_cell.col)) { - x = g_sheet_column_start_pixel (sheet->column_geometry, j); + x = psppire_axis_pixel_start (sheet->haxis, j); y = g_sheet_row_start_pixel (sheet->row_geometry, i); - width = g_sheet_column_start_pixel (sheet->column_geometry, j) - x + g_sheet_column_get_width (sheet->column_geometry, j); + width = psppire_axis_pixel_start (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j); height = g_sheet_row_start_pixel (sheet->row_geometry, i) - y + g_sheet_row_get_height (sheet->row_geometry, i); if (i == new_range.row0) @@ -2980,9 +3008,9 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) mask2 = j == new_range.coli ? mask2 + 8 : mask2; if (mask2 != mask1 || (mask2 == mask1 && state != GTK_STATE_SELECTED)) { - x = g_sheet_column_start_pixel (sheet->column_geometry, j); + x = psppire_axis_pixel_start (sheet->haxis, j); y = g_sheet_row_start_pixel (sheet->row_geometry, i); - width = g_sheet_column_get_width (sheet->column_geometry, j); + width = psppire_axis_unit_size (sheet->haxis, j); height = g_sheet_row_get_height (sheet->row_geometry, i); if (mask2 & 1) gdk_draw_rectangle (sheet->sheet_window, @@ -3116,7 +3144,7 @@ gtk_sheet_unselect_range (GtkSheet *sheet) gtk_sheet_real_unselect_range (sheet, NULL); sheet->state = GTK_STATE_NORMAL; - activate_cell (sheet, + change_active_cell (sheet, sheet->active_cell.row, sheet->active_cell.col); } @@ -3274,10 +3302,12 @@ gtk_sheet_button_press (GtkWidget *widget, 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 (g_sheet_model_get_column_sensitivity (sheet->model, column)) + { + if ( event->type == GDK_2BUTTON_PRESS && event->button == 1) + g_signal_emit (sheet, + sheet_signals[DOUBLE_CLICK_COLUMN], 0, column); + } } else if (event->window == sheet->row_title_window) { @@ -3285,11 +3315,14 @@ gtk_sheet_button_press (GtkWidget *widget, 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); - } + if (g_sheet_row_get_sensitivity (sheet->row_geometry, row)) + { + if ( event->type == GDK_2BUTTON_PRESS && event->button == 1) + g_signal_emit (sheet, + sheet_signals[DOUBLE_CLICK_ROW], 0, row); + } + } gdk_window_get_pointer (widget->window, NULL, NULL, &mods); @@ -3442,7 +3475,7 @@ gtk_sheet_button_press (GtkWidget *widget, column = column_from_xpixel (sheet, x); - if (g_sheet_column_get_sensitivity (sheet->column_geometry, column)) + if (g_sheet_model_get_column_sensitivity (sheet->model, column)) { veto = gtk_sheet_click_cell (sheet, -1, column); gtk_grab_add (GTK_WIDGET (sheet)); @@ -3475,17 +3508,22 @@ gtk_sheet_button_press (GtkWidget *widget, static gboolean gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column) { + GtkSheetCell cell; gboolean forbid_move; + cell.row = row; + cell.col = column; + if (row >= g_sheet_row_get_row_count (sheet->row_geometry) - || column >= g_sheet_column_get_column_count (sheet->column_geometry)) + || column >= psppire_axis_unit_count (sheet->haxis)) { return FALSE; } g_signal_emit (sheet, sheet_signals[TRAVERSE], 0, - sheet->active_cell.row, sheet->active_cell.col, - &row, &column, &forbid_move); + &sheet->active_cell, + &cell, + &forbid_move); if (forbid_move) { @@ -3495,7 +3533,7 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column) row = sheet->active_cell.row; column = sheet->active_cell.col; - activate_cell (sheet, row, column); + change_active_cell (sheet, row, column); return FALSE; } @@ -3517,7 +3555,7 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column) sheet->range.col0 = 0; sheet->range.rowi = g_sheet_row_get_row_count (sheet->row_geometry) - 1; sheet->range.coli = - g_sheet_column_get_column_count (sheet->column_geometry) - 1; + psppire_axis_unit_count (sheet->haxis) - 1; sheet->active_cell.row = 0; sheet->active_cell.col = 0; gtk_sheet_select_range (sheet, NULL); @@ -3531,7 +3569,7 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column) } else { - activate_cell (sheet, row, column); + change_active_cell (sheet, row, column); } sheet->active_cell.row = row; @@ -3649,7 +3687,7 @@ gtk_sheet_button_release (GtkWidget *widget, { GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); gdk_display_pointer_ungrab (display, event->time); - activate_cell (sheet, sheet->active_cell.row, + change_active_cell (sheet, sheet->active_cell.row, sheet->active_cell.col); } @@ -3788,9 +3826,7 @@ motion_timeout_callback (gpointer data) if (sheet->row_title_under) { GSheetRow *row_geo = sheet->row_geometry; - gchar *text; - - text = g_sheet_row_get_subtitle (row_geo, row); + gchar *text = g_sheet_row_get_subtitle (row_geo, row); show_subtitle (sheet, row, -1, text); g_free (text); @@ -3798,10 +3834,8 @@ motion_timeout_callback (gpointer data) if (sheet->column_title_under) { - GSheetColumn *col_geo = sheet->column_geometry; - gchar *text; - - text = g_sheet_column_get_subtitle (col_geo, column); + gchar *text = g_sheet_model_get_column_subtitle (sheet->model, + column); show_subtitle (sheet, -1, column, text); @@ -3999,7 +4033,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) sheet->y_drag = y; aux = sheet->range; if (aux.row0 + row >= 0 && aux.rowi + row < g_sheet_row_get_row_count (sheet->row_geometry) && - aux.col0 + column >= 0 && aux.coli + column < g_sheet_column_get_column_count (sheet->column_geometry)) + aux.col0 + column >= 0 && aux.coli + column < psppire_axis_unit_count (sheet->haxis)) { aux = sheet->drag_range; sheet->drag_range.row0 = sheet->range.row0 + row; @@ -4021,7 +4055,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) GtkSheetRange aux; gint v_h, current_col, current_row, col_threshold, row_threshold; v_h = 1; - if (abs (x - g_sheet_column_start_pixel (sheet->column_geometry, sheet->drag_cell.col)) > + if (abs (x - psppire_axis_pixel_start (sheet->haxis, sheet->drag_cell.col)) > abs (y - g_sheet_row_start_pixel (sheet->row_geometry, sheet->drag_cell.row))) v_h = 2; current_col = column_from_xpixel (sheet, x); @@ -4031,8 +4065,8 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) /*use half of column width resp. row height as threshold to expand selection*/ - col_threshold = g_sheet_column_start_pixel (sheet->column_geometry, current_col) + - g_sheet_column_get_width (sheet->column_geometry, current_col) / 2; + col_threshold = psppire_axis_pixel_start (sheet->haxis, current_col) + + psppire_axis_unit_size (sheet->haxis, current_col) / 2; if (column > 0) { if (x < col_threshold) @@ -4068,7 +4102,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) row = 0; if (aux.row0 + row >= 0 && aux.rowi + row < g_sheet_row_get_row_count (sheet->row_geometry) && - aux.col0 + column >= 0 && aux.coli + column < g_sheet_column_get_column_count (sheet->column_geometry)) + aux.col0 + column >= 0 && aux.coli + column < psppire_axis_unit_count (sheet->haxis)) { aux = sheet->drag_range; sheet->drag_range = sheet->range; @@ -4115,71 +4149,6 @@ gtk_sheet_crossing_notify (GtkWidget *widget, return TRUE; } - -static gboolean -gtk_sheet_move_query (GtkSheet *sheet, gint row, gint column) -{ - gint height, width; - gint new_row = row; - gint new_col = column; - - gint row_move = FALSE; - gint column_move = FALSE; - gfloat row_align = -1.0; - gfloat col_align = -1.0; - - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) - return FALSE; - - gdk_drawable_get_size (sheet->sheet_window, &width, &height); - - if (row >= max_visible_row (sheet) && - sheet->state != GTK_SHEET_COLUMN_SELECTED) - { - row_align = 1.; - new_row = MIN (g_sheet_row_get_row_count (sheet->row_geometry) - 1, row + 1); - row_move = TRUE; - if (max_visible_row (sheet) == g_sheet_row_get_row_count (sheet->row_geometry) - 1 && - g_sheet_row_start_pixel (sheet->row_geometry, g_sheet_row_get_row_count (sheet->row_geometry) - 1) + - g_sheet_row_get_height (sheet->row_geometry, g_sheet_row_get_row_count (sheet->row_geometry) - 1) < height) - { - row_move = FALSE; - row_align = -1.; - } - } - - 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) - { - col_align = 1.; - new_col = MIN (g_sheet_column_get_column_count (sheet->column_geometry) - 1, column + 1); - column_move = TRUE; - if (max_visible_column (sheet) == (g_sheet_column_get_column_count (sheet->column_geometry) - 1) && - g_sheet_column_start_pixel (sheet->column_geometry, g_sheet_column_get_column_count (sheet->column_geometry) - 1) + - g_sheet_column_get_width (sheet->column_geometry, g_sheet_column_get_column_count (sheet->column_geometry) - 1) < width) - { - column_move = FALSE; - col_align = -1.; - } - } - if (column < min_visible_column (sheet) && sheet->state != GTK_SHEET_ROW_SELECTED) - { - col_align = 0.0; - column_move = TRUE; - } - - if (row_move || column_move) - { - gtk_sheet_moveto (sheet, new_row, new_col, row_align, col_align); - } - - return (row_move || column_move); -} - static void gtk_sheet_extend_selection (GtkSheet *sheet, gint row, gint column) { @@ -4192,7 +4161,6 @@ gtk_sheet_extend_selection (GtkSheet *sheet, gint row, gint column) if (sheet->selection_mode == GTK_SELECTION_SINGLE) return; - gtk_sheet_move_query (sheet, row, column); gtk_widget_grab_focus (GTK_WIDGET (sheet)); if (GTK_SHEET_IN_DRAG (sheet)) return; @@ -4202,7 +4170,7 @@ gtk_sheet_extend_selection (GtkSheet *sheet, gint row, gint column) switch (sheet->state) { case GTK_SHEET_ROW_SELECTED: - column = g_sheet_column_get_column_count (sheet->column_geometry) - 1; + column = psppire_axis_unit_count (sheet->haxis) - 1; break; case GTK_SHEET_COLUMN_SELECTED: row = g_sheet_row_get_row_count (sheet->row_geometry) - 1; @@ -4284,7 +4252,7 @@ page_vertical (GtkSheet *sheet, GtkScrollType dir) new_row = yyy_row_ypixel_to_row (sheet, vpixel); - activate_cell (sheet, new_row, + change_active_cell (sheet, new_row, sheet->active_cell.col); } @@ -4294,57 +4262,91 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir) { gint current_row = sheet->active_cell.row; gint current_col = sheet->active_cell.col; - gint new_row = current_row; - gint new_col = current_col; + GtkSheetCell new_cell ; gboolean forbidden = FALSE; + new_cell.row = current_row; + new_cell.col = current_col; + switch ( dir) { case GTK_SCROLL_STEP_DOWN: - new_row++; + new_cell.row++; break; case GTK_SCROLL_STEP_UP: - new_row--; + new_cell.row--; break; case GTK_SCROLL_STEP_RIGHT: - new_col++; + new_cell.col++; break; case GTK_SCROLL_STEP_LEFT: - new_col--; + new_cell.col--; break; default: g_assert_not_reached (); break; } + + maximize_int (&new_cell.row, 0); + maximize_int (&new_cell.col, 0); + + minimize_int (&new_cell.row, + g_sheet_row_get_row_count (sheet->row_geometry) - 1); + + minimize_int (&new_cell.col, + psppire_axis_unit_count (sheet->haxis) - 1); + g_signal_emit (sheet, sheet_signals[TRAVERSE], 0, - current_row, current_col, - &new_row, &new_col, &forbidden); + &sheet->active_cell, + &new_cell, + &forbidden); if (forbidden) return; - activate_cell (sheet, new_row, new_col); + change_active_cell (sheet, new_cell.row, new_cell.col); - if ( sheet->active_cell.col >= max_visible_column (sheet)) + if ( new_cell.col > max_fully_visible_column (sheet)) { glong hpos = - g_sheet_column_start_pixel (sheet->column_geometry, - sheet->active_cell.col + 1); + psppire_axis_pixel_start (sheet->haxis, + new_cell.col + 1); hpos -= sheet->hadjustment->page_size; gtk_adjustment_set_value (sheet->hadjustment, hpos); } - else if ( sheet->active_cell.col <= min_visible_column (sheet)) + else if ( new_cell.col < min_fully_visible_column (sheet)) { glong hpos = - g_sheet_column_start_pixel (sheet->column_geometry, - sheet->active_cell.col); + psppire_axis_pixel_start (sheet->haxis, + new_cell.col); gtk_adjustment_set_value (sheet->hadjustment, hpos); } + + + if ( new_cell.row > max_fully_visible_row (sheet)) + { + glong vpos = + g_sheet_row_start_pixel (sheet->row_geometry, + new_cell.row + 1); + vpos -= sheet->vadjustment->page_size; + + gtk_adjustment_set_value (sheet->vadjustment, + vpos); + } + else if ( new_cell.row < min_fully_visible_row (sheet)) + { + glong vpos = + g_sheet_row_start_pixel (sheet->row_geometry, + new_cell.row); + + gtk_adjustment_set_value (sheet->vadjustment, + vpos); + } } @@ -4385,7 +4387,7 @@ gtk_sheet_key_press (GtkWidget *widget, gtk_adjustment_set_value (sheet->vadjustment, sheet->vadjustment->lower); - activate_cell (sheet, 0, + change_active_cell (sheet, 0, sheet->active_cell.col); break; @@ -4397,7 +4399,7 @@ gtk_sheet_key_press (GtkWidget *widget, sheet->vadjustment->page_increment); /* - activate_cell (sheet, + change_active_cellx (sheet, g_sheet_row_get_row_count (sheet->row_geometry) - 1, sheet->active_cell.col); */ @@ -4426,7 +4428,7 @@ gtk_sheet_size_request (GtkWidget *widget, sheet = GTK_SHEET (widget); requisition->width = 3 * DEFAULT_COLUMN_WIDTH; - requisition->height = 3 * default_row_height (sheet); + requisition->height = 3 * DEFAULT_ROW_HEIGHT; /* compute the size of the column title area */ if (sheet->column_titles_visible) @@ -4561,7 +4563,7 @@ draw_column_title_buttons (GtkSheet *sheet) } if (max_visible_column (sheet) == - g_sheet_column_get_column_count (sheet->column_geometry) - 1) + psppire_axis_unit_count (sheet->haxis) - 1) gdk_window_clear_area (sheet->column_title_window, 0, 0, sheet->column_title_area.width, @@ -4713,6 +4715,12 @@ create_sheet_entry (GtkSheet *sheet) G_CALLBACK (gtk_sheet_entry_key_press), sheet); + sheet->entry_handler_id = + g_signal_connect (sheet->entry_widget, + "changed", + G_CALLBACK (gtk_sheet_entry_changed), + sheet); + gtk_widget_show (sheet->entry_widget); } @@ -4819,7 +4827,7 @@ gtk_sheet_button_draw (GtkSheet *sheet, GdkWindow *window, if (button->label_visible) { - text_height = default_row_height (sheet) - + text_height = DEFAULT_ROW_HEIGHT - 2 * COLUMN_TITLES_HEIGHT; gdk_gc_set_clip_rectangle (GTK_WIDGET (sheet)->style->fg_gc[button->state], @@ -4916,14 +4924,14 @@ gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column) if (column < min_visible_column (sheet)) return; if (column > max_visible_column (sheet)) return; - button = g_sheet_column_get_button (sheet->column_geometry, column); + button = g_sheet_model_get_column_button (sheet->model, column); allocation.y = 0; - allocation.x = g_sheet_column_start_pixel (sheet->column_geometry, column) + CELL_SPACING; + allocation.x = psppire_axis_pixel_start (sheet->haxis, column) + CELL_SPACING; allocation.x -= sheet->hadjustment->value; allocation.height = sheet->column_title_area.height; - allocation.width = g_sheet_column_get_width (sheet->column_geometry, column); - is_sensitive = g_sheet_column_get_sensitivity (sheet->column_geometry, column); + allocation.width = psppire_axis_unit_size (sheet->haxis, column); + is_sensitive = g_sheet_model_get_column_sensitivity (sheet->model, column); gtk_sheet_button_draw (sheet, sheet->column_title_window, button, is_sensitive, allocation); @@ -4975,6 +4983,12 @@ adjust_scrollbars (GtkSheet *sheet) gdk_drawable_get_size (sheet->sheet_window, &width, &height); + if ( sheet->row_titles_visible) + width -= sheet->row_title_area.width; + + if (sheet->column_titles_visible) + height -= sheet->column_title_area.height; + if (sheet->vadjustment) { glong last_row = g_sheet_row_get_row_count (sheet->row_geometry) - 1; @@ -4996,9 +5010,6 @@ adjust_scrollbars (GtkSheet *sheet) g_sheet_row_get_height (sheet->row_geometry, last_row) ; - if (sheet->column_titles_visible) - sheet->vadjustment->upper += sheet->column_title_area.height; - sheet->vadjustment->lower = 0; sheet->vadjustment->page_size = height; @@ -5012,17 +5023,14 @@ adjust_scrollbars (GtkSheet *sheet) sheet->hadjustment->page_increment = width; - last_col = g_sheet_column_get_column_count (sheet->column_geometry) - 1; + last_col = psppire_axis_unit_count (sheet->haxis) - 1; sheet->hadjustment->upper = - g_sheet_column_start_pixel (sheet->column_geometry, last_col) + psppire_axis_pixel_start (sheet->haxis, last_col) + - g_sheet_column_get_width (sheet->column_geometry, last_col) + psppire_axis_unit_size (sheet->haxis, last_col) ; - if (sheet->row_titles_visible) - sheet->hadjustment->upper += sheet->row_title_area.width; - sheet->hadjustment->lower = 0; sheet->hadjustment->page_size = width; @@ -5135,10 +5143,10 @@ draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range) GdkRectangle clip_area, area; GdkGCValues values; - area.x = g_sheet_column_start_pixel (sheet->column_geometry, range.col0); + area.x = psppire_axis_pixel_start (sheet->haxis, range.col0); area.y = g_sheet_row_start_pixel (sheet->row_geometry, range.row0); - area.width = g_sheet_column_start_pixel (sheet->column_geometry, range.coli)- area.x+ - g_sheet_column_get_width (sheet->column_geometry, range.coli); + area.width = psppire_axis_pixel_start (sheet->haxis, range.coli)- area.x+ + psppire_axis_unit_size (sheet->haxis, range.coli); area.height = g_sheet_row_start_pixel (sheet->row_geometry, range.rowi)- area.y + g_sheet_row_get_height (sheet->row_geometry, range.rowi); @@ -5193,7 +5201,7 @@ draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range) static guint new_column_width (GtkSheet *sheet, gint column, gint *x) { - gint left_pos = g_sheet_column_start_pixel (sheet->column_geometry, column) + gint left_pos = psppire_axis_pixel_start (sheet->haxis, column) - sheet->hadjustment->value; gint width = *x - left_pos; @@ -5204,7 +5212,9 @@ new_column_width (GtkSheet *sheet, gint column, gint *x) *x = left_pos + width; } +#if AXIS_TRANSITION g_sheet_column_set_width (sheet->column_geometry, column, width); +#endif draw_column_title_buttons (sheet); @@ -5252,13 +5262,15 @@ gtk_sheet_set_column_width (GtkSheet *sheet, g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_IS_SHEET (sheet)); - if (column < 0 || column >= g_sheet_column_get_column_count (sheet->column_geometry)) + if (column < 0 || column >= psppire_axis_unit_count (sheet->haxis)) return; gtk_sheet_column_size_request (sheet, column, &min_width); if (width < min_width) return; +#if AXIS_TRANSITION g_sheet_column_set_width (sheet->column_geometry, column, width); +#endif if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) { @@ -5267,8 +5279,6 @@ gtk_sheet_set_column_width (GtkSheet *sheet, gtk_sheet_size_allocate_entry (sheet); gtk_sheet_range_draw (sheet, NULL); } - - g_signal_emit (sheet, sheet_signals[CHANGED], 0, -1, column); } @@ -5298,8 +5308,6 @@ gtk_sheet_set_row_height (GtkSheet *sheet, gtk_sheet_size_allocate_entry (sheet); gtk_sheet_range_draw (sheet, NULL); } - - g_signal_emit (sheet, sheet_signals[CHANGED], 0, row, - 1); } gboolean @@ -5349,7 +5357,7 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col, } attr->justification = - g_sheet_column_get_justification (sheet->column_geometry, col); + g_sheet_model_get_column_justification (sheet->model, col); j = g_sheet_model_get_justification (sheet->model, row, col); if (j) @@ -5373,10 +5381,10 @@ gtk_sheet_button_size_request (GtkSheet *sheet, GtkRequisition requisition; GtkRequisition label_requisition; - label_requisition.height = default_row_height (sheet); + label_requisition.height = DEFAULT_ROW_HEIGHT; label_requisition.width = COLUMN_MIN_WIDTH; - requisition.height = default_row_height (sheet); + requisition.height = DEFAULT_ROW_HEIGHT; requisition.width = COLUMN_MIN_WIDTH; @@ -5409,7 +5417,7 @@ gtk_sheet_column_size_request (GtkSheet *sheet, { GtkRequisition button_requisition; - GtkSheetButton *button = g_sheet_column_get_button (sheet->column_geometry, col); + GtkSheetButton *button = g_sheet_model_get_column_button (sheet->model, col); gtk_sheet_button_size_request (sheet, button, @@ -5473,7 +5481,6 @@ gtk_sheet_button_free (GtkSheetButton *button) g_free (button); } - static void append_cell_text (GString *string, const GtkSheet *sheet, gint r, gint c) {