X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=lib%2Fgtksheet%2Fgtksheet.c;h=e70b5a21475b7f1b43eb60ee2eaa9433dfdf66f6;hb=9909ba1908eb9485aff7e6da15de84de0ee4a504;hp=ec8e3840d6d0cc016954bf75060b1715534b216d;hpb=b5a632fd4b0ea7139fc5423bb3ebebaf3e6d539e;p=pspp diff --git a/lib/gtksheet/gtksheet.c b/lib/gtksheet/gtksheet.c index ec8e3840d6..e70b5a2147 100644 --- a/lib/gtksheet/gtksheet.c +++ b/lib/gtksheet/gtksheet.c @@ -1,3 +1,6 @@ +#define GLIB_DISABLE_DEPRECATED 1 +#define GDK_DISABLE_DEPRECATED 1 +#define GTK_DISABLE_DEPRECATED 1 /* * Copyright (C) 2006, 2008 Free Software Foundation * @@ -51,9 +54,7 @@ #include #include #include -#include #include -#include "gtkitementry.h" #include "gtksheet.h" #include "gtkextra-marshal.h" #include "gsheetmodel.h" @@ -92,12 +93,16 @@ static void gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column); static void gtk_sheet_row_title_button_draw (GtkSheet *sheet, gint row); - -static gboolean gtk_sheet_cell_empty (const GtkSheet *, gint, gint); +static void gtk_sheet_set_row_height (GtkSheet *sheet, + gint row, + guint height); static void destroy_hover_window (GtkSheetHoverTitle *); static GtkSheetHoverTitle *create_hover_window (void); +static GtkStateType gtk_sheet_cell_get_state (GtkSheet *sheet, gint row, gint col); + + static inline void dispose_string (const GtkSheet *sheet, gchar *text) { @@ -110,10 +115,12 @@ dispose_string (const GtkSheet *sheet, gchar *text) g_free (text); } -static inline -guint DEFAULT_ROW_HEIGHT (GtkWidget *widget) +static guint +default_row_height (const GtkSheet *sheet) { - if (!widget->style->font_desc) return 24; + GtkWidget *widget = GTK_WIDGET (sheet); + + if (!widget->style->font_desc) return 25; else { PangoContext *context = gtk_widget_get_pango_context (widget); @@ -131,24 +138,7 @@ guint DEFAULT_ROW_HEIGHT (GtkWidget *widget) } } -static inline -guint DEFAULT_FONT_ASCENT (GtkWidget *widget) -{ - if (!widget->style->font_desc) return 12; - 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_ascent (metrics); - pango_font_metrics_unref (metrics); - return PANGO_PIXELS (val); - } -} - -static inline +static guint STRING_WIDTH (GtkWidget *widget, const PangoFontDescription *font, const gchar *text) { @@ -164,58 +154,41 @@ guint STRING_WIDTH (GtkWidget *widget, return PANGO_PIXELS (rect.width); } -static inline -guint DEFAULT_FONT_DESCENT (GtkWidget *widget) -{ - if (!widget->style->font_desc) return 12; - 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_unref (metrics); - return PANGO_PIXELS (val); - } -} - - /* Return the row containing pixel Y */ static gint yyy_row_ypixel_to_row (const GtkSheet *sheet, gint y) { GSheetRow *geo = sheet->row_geometry; - if (y < 0) return -1; + if (y < 0) + { + g_error ("This shouldnt happen"); + return -1; + } return g_sheet_row_pixel_to_row (geo, y); } -#define MIN_VISIBLE_ROW(sheet) yyy_row_ypixel_to_row (sheet, sheet->vadjustment->value) - -#define MAX_VISIBLE_ROW(sheet) \ - yyy_row_ypixel_to_row (sheet, sheet->vadjustment->value + sheet->vadjustment->page_size) - -#define MIN_VISIBLE_COLUMN(sheet) COLUMN_FROM_XPIXEL (sheet, sheet->hadjustment->value) +static inline glong +min_visible_row (const GtkSheet *sheet) +{ + return yyy_row_ypixel_to_row (sheet, sheet->vadjustment->value); +} -#define MAX_VISIBLE_COLUMN(sheet) \ - COLUMN_FROM_XPIXEL (sheet, sheet->hadjustment->value + sheet->hadjustment->page_size) -/* gives the left pixel of the given column in context of - * the sheet's hoffset */ -static inline gint -COLUMN_LEFT_XPIXEL (const GtkSheet *sheet, gint ncol) +static inline glong +max_visible_row (const GtkSheet *sheet) { - return g_sheet_column_start_pixel (sheet->column_geometry, ncol); + return yyy_row_ypixel_to_row (sheet, + sheet->vadjustment->value + + sheet->vadjustment->page_size); } /* returns the column index from a x pixel location */ static inline gint -COLUMN_FROM_XPIXEL (const GtkSheet *sheet, gint x) +column_from_xpixel (const GtkSheet *sheet, gint x) { gint i; gint cx = 0; @@ -225,17 +198,33 @@ COLUMN_FROM_XPIXEL (const GtkSheet *sheet, gint x) 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)) && - g_sheet_column_get_visibility (sheet->column_geometry, i)) + x <= (cx + g_sheet_column_get_width (sheet->column_geometry, i))) return i; - if ( g_sheet_column_get_visibility (sheet->column_geometry, i)) - cx += g_sheet_column_get_width (sheet->column_geometry, i); + + cx += g_sheet_column_get_width (sheet->column_geometry, i); } /* no match */ return g_sheet_column_get_column_count (sheet->column_geometry) - 1; } + +static inline glong +min_visible_column (const GtkSheet *sheet) +{ + return column_from_xpixel (sheet, sheet->hadjustment->value); +} + + +static inline glong +max_visible_column (const GtkSheet *sheet) +{ + return column_from_xpixel (sheet, + sheet->hadjustment->value + + sheet->hadjustment->page_size); +} + + /* The size of the region (in pixels) around the row/column boundaries where the height/width may be grabbed to change size */ #define DRAG_WIDTH 6 @@ -247,15 +236,15 @@ on_column_boundary (const GtkSheet *sheet, gint x, gint *column) x += sheet->hadjustment->value; - col = COLUMN_FROM_XPIXEL (sheet, x); + col = column_from_xpixel (sheet, x); - if ( COLUMN_FROM_XPIXEL (sheet, x - DRAG_WIDTH / 2) < col ) -{ + if ( column_from_xpixel (sheet, x - DRAG_WIDTH / 2) < col ) + { *column = col - 1; return TRUE; -} + } - if ( COLUMN_FROM_XPIXEL (sheet, x + DRAG_WIDTH / 2) > col ) + if ( column_from_xpixel (sheet, x + DRAG_WIDTH / 2) > col ) { *column = col; return TRUE; @@ -276,7 +265,6 @@ POSSIBLE_YDRAG (const GtkSheet *sheet, gint y, gint *drag_row) ydrag = g_sheet_row_start_pixel (sheet->row_geometry, row) + CELL_SPACING; if (y <= ydrag + DRAG_WIDTH / 2 && row != 0) { - while (!g_sheet_row_get_visibility (sheet->row_geometry, row - 1) && row > 0) row--; *drag_row = row - 1; return g_sheet_row_get_sensitivity (sheet->row_geometry, row - 1); } @@ -300,11 +288,11 @@ POSSIBLE_DRAG (const GtkSheet *sheet, gint x, gint y, sheet->range.col0 < 0 || sheet->range.coli < 0 ) return FALSE; - *drag_column = COLUMN_FROM_XPIXEL (sheet, x); + *drag_column = column_from_xpixel (sheet, x); *drag_row = yyy_row_ypixel_to_row (sheet, y); - if (x >= COLUMN_LEFT_XPIXEL (sheet, sheet->range.col0) - DRAG_WIDTH / 2 && - x <= COLUMN_LEFT_XPIXEL (sheet, sheet->range.coli) + + 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) { ydrag = g_sheet_row_start_pixel (sheet->row_geometry, sheet->range.row0); @@ -326,13 +314,13 @@ 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 = COLUMN_LEFT_XPIXEL (sheet, sheet->range.col0); + xdrag = g_sheet_column_start_pixel (sheet->column_geometry, sheet->range.col0); if (x >= xdrag - DRAG_WIDTH / 2 && x <= xdrag + DRAG_WIDTH / 2) { *drag_column = sheet->range.col0; return TRUE; } - xdrag = COLUMN_LEFT_XPIXEL (sheet, sheet->range.coli) + + xdrag = g_sheet_column_start_pixel (sheet->column_geometry, sheet->range.coli) + g_sheet_column_get_width (sheet->column_geometry, sheet->range.coli); if (x >= xdrag - DRAG_WIDTH / 2 && x <= xdrag + DRAG_WIDTH / 2) { @@ -355,19 +343,19 @@ 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 = g_sheet_column_start_pixel (sheet->column_geometry, sheet->range.coli)+ g_sheet_column_get_width (sheet->column_geometry, 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); if (sheet->state == GTK_SHEET_COLUMN_SELECTED) - ydrag = g_sheet_row_start_pixel (sheet->row_geometry, MIN_VISIBLE_ROW (sheet)); + ydrag = g_sheet_row_start_pixel (sheet->row_geometry, min_visible_row (sheet)); if (sheet->state == GTK_SHEET_ROW_SELECTED) - xdrag = COLUMN_LEFT_XPIXEL (sheet, MIN_VISIBLE_COLUMN (sheet)); + xdrag = g_sheet_column_start_pixel (sheet->column_geometry, min_visible_column (sheet)); - *drag_column = COLUMN_FROM_XPIXEL (sheet, x); + *drag_column = column_from_xpixel (sheet, x); *drag_row = yyy_row_ypixel_to_row (sheet, y); if (x >= xdrag - DRAG_WIDTH / 2 && x <= xdrag + DRAG_WIDTH / 2 && @@ -376,18 +364,64 @@ POSSIBLE_RESIZE (const GtkSheet *sheet, gint x, gint y, return FALSE; } -static void gtk_sheet_class_init (GtkSheetClass * klass); -static void gtk_sheet_init (GtkSheet * sheet); -static void gtk_sheet_dispose (GObject * object); -static void gtk_sheet_finalize (GObject * object); + +static gboolean +rectangle_from_range (GtkSheet *sheet, const GtkSheetRange *range, + GdkRectangle *r) +{ + g_return_val_if_fail (range, FALSE); + + r->x = g_sheet_column_start_pixel (sheet->column_geometry, range->col0); + r->x -= 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; + + 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->height = g_sheet_row_start_pixel (sheet->row_geometry, range->rowi) - + g_sheet_row_start_pixel (sheet->row_geometry, range->row0) + + g_sheet_row_get_height (sheet->row_geometry, range->rowi); + + return TRUE; +} + +static gboolean +rectangle_from_cell (GtkSheet *sheet, gint row, gint col, + GdkRectangle *r) +{ + GtkSheetRange range; + g_return_val_if_fail (row >= 0, FALSE); + g_return_val_if_fail (col >= 0, FALSE); + + range.row0 = range.rowi = row; + range.col0 = range.coli = col; + + return rectangle_from_range (sheet, &range, r); +} + + +static void gtk_sheet_class_init (GtkSheetClass *klass); +static void gtk_sheet_init (GtkSheet *sheet); +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); -static void gtk_sheet_realize (GtkWidget * widget); -static void gtk_sheet_unrealize (GtkWidget * widget); -static void gtk_sheet_map (GtkWidget * widget); -static void gtk_sheet_unmap (GtkWidget * widget); -static gint gtk_sheet_expose (GtkWidget * widget, - GdkEventExpose * event); +static void gtk_sheet_realize (GtkWidget *widget); +static void gtk_sheet_unrealize (GtkWidget *widget); +static void gtk_sheet_map (GtkWidget *widget); +static void gtk_sheet_unmap (GtkWidget *widget); +static gint gtk_sheet_expose (GtkWidget *widget, + GdkEventExpose *event); static void gtk_sheet_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, @@ -397,42 +431,38 @@ static void gtk_sheet_set_scroll_adjustments (GtkSheet *sheet, GtkAdjustment *hadjustment, GtkAdjustment *vadjustment); -static gint gtk_sheet_button_press (GtkWidget * widget, - GdkEventButton * event); -static gint gtk_sheet_button_release (GtkWidget * widget, - GdkEventButton * event); -static gint gtk_sheet_motion (GtkWidget * widget, - GdkEventMotion * event); +static gint gtk_sheet_button_press (GtkWidget *widget, + GdkEventButton *event); +static gint gtk_sheet_button_release (GtkWidget *widget, + GdkEventButton *event); +static gint gtk_sheet_motion (GtkWidget *widget, + GdkEventMotion *event); static gboolean gtk_sheet_crossing_notify (GtkWidget *widget, GdkEventCrossing *event); static gint gtk_sheet_entry_key_press (GtkWidget *widget, GdkEventKey *key); -static gint gtk_sheet_key_press (GtkWidget *widget, +static gboolean gtk_sheet_key_press (GtkWidget *widget, GdkEventKey *key); -static void gtk_sheet_size_request (GtkWidget * widget, - GtkRequisition * requisition); -static void gtk_sheet_size_allocate (GtkWidget * widget, - GtkAllocation * allocation); +static void gtk_sheet_size_request (GtkWidget *widget, + GtkRequisition *requisition); +static void gtk_sheet_size_allocate (GtkWidget *widget, + GtkAllocation *allocation); /* Sheet queries */ -static gboolean gtk_sheet_range_isvisible (const GtkSheet * sheet, +static gboolean gtk_sheet_range_isvisible (const GtkSheet *sheet, GtkSheetRange range); -static gboolean gtk_sheet_cell_isvisible (GtkSheet * sheet, +static gboolean gtk_sheet_cell_isvisible (GtkSheet *sheet, gint row, gint column); /* Drawing Routines */ -/* draw cell background and frame */ -static void gtk_sheet_cell_draw_default (GtkSheet *sheet, - gint row, gint column); +/* draw cell */ +static void gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint column); -/* draw cell contents */ -static void gtk_sheet_cell_draw_label (GtkSheet *sheet, - gint row, gint column); /* draw visible part of range. If range == NULL then draw the whole screen */ -static void gtk_sheet_range_draw (GtkSheet *sheet, - const GtkSheetRange *range); +static void gtk_sheet_range_draw (GtkSheet *sheet, + const GtkSheetRange *range); /* highlight the visible part of the selected range */ static void gtk_sheet_range_draw_selection (GtkSheet *sheet, @@ -442,10 +472,10 @@ static void gtk_sheet_range_draw_selection (GtkSheet *sheet, 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, - const GtkSheetRange * range); +static void gtk_sheet_real_select_range (GtkSheet *sheet, + const GtkSheetRange *range); +static void gtk_sheet_real_unselect_range (GtkSheet *sheet, + const GtkSheetRange *range); static void gtk_sheet_extend_selection (GtkSheet *sheet, gint row, gint column); static void gtk_sheet_new_selection (GtkSheet *sheet, @@ -459,41 +489,35 @@ static void gtk_sheet_entry_changed (GtkWidget *widget, gpointer data); 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, +static void gtk_sheet_activate_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); -static void gtk_sheet_click_cell (GtkSheet *sheet, +static gboolean gtk_sheet_click_cell (GtkSheet *sheet, gint row, - gint column, - gboolean *veto); - -/* Backing Pixmap */ + gint column); -static void gtk_sheet_make_backing_pixmap (GtkSheet *sheet); -static void gtk_sheet_draw_backing_pixmap (GtkSheet *sheet, - GtkSheetRange range); /* Scrollbars */ -static void adjust_scrollbars (GtkSheet * sheet); -static void vadjustment_value_changed (GtkAdjustment * adjustment, +static void adjust_scrollbars (GtkSheet *sheet); +static void vadjustment_value_changed (GtkAdjustment *adjustment, gpointer data); -static void hadjustment_value_changed (GtkAdjustment * adjustment, +static void hadjustment_value_changed (GtkAdjustment *adjustment, gpointer data); -static void draw_xor_vline (GtkSheet * sheet); -static void draw_xor_hline (GtkSheet * sheet); +static void draw_xor_vline (GtkSheet *sheet); +static void draw_xor_hline (GtkSheet *sheet); static void draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range); -static guint new_column_width (GtkSheet * sheet, +static guint new_column_width (GtkSheet *sheet, gint column, - gint * x); -static guint new_row_height (GtkSheet * sheet, + gint *x); +static guint new_row_height (GtkSheet *sheet, gint row, - gint * y); + gint *y); /* Sheet Button */ static void create_global_button (GtkSheet *sheet); @@ -503,12 +527,11 @@ static void global_button_clicked (GtkWidget *widget, static void create_sheet_entry (GtkSheet *sheet); static void gtk_sheet_size_allocate_entry (GtkSheet *sheet); -static void gtk_sheet_entry_set_max_size (GtkSheet *sheet); /* Sheet button gadgets */ -static void size_allocate_column_title_buttons (GtkSheet * sheet); -static void size_allocate_row_title_buttons (GtkSheet * sheet); +static void draw_column_title_buttons (GtkSheet *sheet); +static void draw_row_title_buttons (GtkSheet *sheet); static void size_allocate_global_button (GtkSheet *sheet); @@ -516,16 +539,6 @@ static void gtk_sheet_button_size_request (GtkSheet *sheet, const GtkSheetButton *button, GtkRequisition *requisition); -/* Attributes routines */ -static void init_attributes (const GtkSheet *sheet, - gint col, - GtkSheetCellAttr *attributes); - - -/* Memory allocation routines */ -static void gtk_sheet_real_range_clear (GtkSheet *sheet, - const GtkSheetRange *range); - static void gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column); @@ -540,10 +553,6 @@ static void gtk_sheet_row_size_request (GtkSheet *sheet, /* Signals */ - -extern void -_gtkextra_signal_emit (GtkObject *object, guint signal_id, ...); - enum { SELECT_ROW, @@ -722,7 +731,7 @@ gtk_sheet_get_property (GObject *object, static void -gtk_sheet_class_init (GtkSheetClass * klass) +gtk_sheet_class_init (GtkSheetClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -915,8 +924,8 @@ gtk_sheet_class_init (GtkSheetClass * klass) G_SIGNAL_RUN_LAST, offsetof (GtkSheetClass, activate), NULL, NULL, - gtkextra_BOOLEAN__INT_INT, - G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_INT); + gtkextra_VOID__INT_INT, + G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); sheet_signals[CHANGED] = g_signal_new ("changed", @@ -1027,7 +1036,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 (GTK_WIDGET (sheet)); + sheet->column_title_area.height = default_row_height (sheet); sheet->row_title_window = NULL; sheet->row_title_area.x = 0; @@ -1041,8 +1050,6 @@ gtk_sheet_init (GtkSheet *sheet) sheet->selection_cell.row = 0; sheet->selection_cell.col = 0; - sheet->pixmap = NULL; - sheet->range.row0 = 0; sheet->range.rowi = 0; sheet->range.col0 = 0; @@ -1051,8 +1058,6 @@ gtk_sheet_init (GtkSheet *sheet) sheet->state = GTK_SHEET_NORMAL; sheet->sheet_window = NULL; - sheet->sheet_window_width = 0; - sheet->sheet_window_height = 0; sheet->entry_widget = NULL; sheet->entry_container = NULL; sheet->button = NULL; @@ -1078,8 +1083,6 @@ gtk_sheet_init (GtkSheet *sheet) sheet->row_title_area.width = DEFAULT_COLUMN_WIDTH; sheet->column_titles_visible = TRUE; - sheet->autoscroll = TRUE; - sheet->justify_entry = TRUE; /* create sheet entry */ @@ -1117,7 +1120,7 @@ columns_inserted_deleted_callback (GSheetModel *model, gint first_column, if (sheet->active_cell.col >= model_columns) gtk_sheet_activate_cell (sheet, sheet->active_cell.row, model_columns - 1); - for (i = first_column; i <= MAX_VISIBLE_COLUMN (sheet); i++) + for (i = first_column; i <= max_visible_column (sheet); i++) gtk_sheet_column_title_button_draw (sheet, i); gtk_sheet_range_draw (sheet, &range); @@ -1149,7 +1152,7 @@ rows_inserted_deleted_callback (GSheetModel *model, gint first_row, if (sheet->active_cell.row >= model_rows) gtk_sheet_activate_cell (sheet, model_rows - 1, sheet->active_cell.col); - for (i = first_row; i <= MAX_VISIBLE_ROW (sheet); i++) + for (i = first_row; i <= max_visible_row (sheet); i++) gtk_sheet_row_title_button_draw (sheet, i); gtk_sheet_range_draw (sheet, &range); @@ -1172,10 +1175,10 @@ range_update_callback (GSheetModel *m, gint row0, gint col0, range.rowi = rowi; range.coli = coli; - if ( MAX_VISIBLE_ROW (sheet) > + if ( max_visible_row (sheet) > g_sheet_model_get_row_count (sheet->model) || - MAX_VISIBLE_COLUMN (sheet) > + max_visible_column (sheet) > g_sheet_model_get_column_count (sheet->model)) { gtk_sheet_move_query (sheet, 0, 0); @@ -1187,24 +1190,24 @@ range_update_callback (GSheetModel *m, gint row0, gint col0, gtk_sheet_range_draw (sheet, NULL); adjust_scrollbars (sheet); - for (i = MIN_VISIBLE_ROW (sheet); i <= MAX_VISIBLE_ROW (sheet); i++) + 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++) + 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 ) { - range.row0 = MIN_VISIBLE_ROW (sheet); - range.rowi = MAX_VISIBLE_ROW (sheet); + range.row0 = min_visible_row (sheet); + range.rowi = max_visible_row (sheet); } else if ( col0 < 0 || coli < 0 ) { - range.col0 = MIN_VISIBLE_COLUMN (sheet); - range.coli = MAX_VISIBLE_COLUMN (sheet); + range.col0 = min_visible_column (sheet); + range.coli = max_visible_column (sheet); } gtk_sheet_range_draw (sheet, &range); @@ -1275,8 +1278,8 @@ gtk_sheet_set_model (GtkSheet *sheet, GSheetModel *model) /* Call back for when the column titles have changed. FIRST is the first column changed. - N_COLUMNS is the number of columns which have changed, or - 1, which - indicates that the column has changed to its right - most extremity + N_COLUMNS is the number of columns which have changed, or -1, which + indicates that the column has changed to its right-most extremity */ static void column_titles_changed (GtkWidget *w, gint first, gint n_columns, gpointer data) @@ -1290,14 +1293,14 @@ column_titles_changed (GtkWidget *w, gint first, gint n_columns, gpointer data) n_columns = g_sheet_column_get_column_count (sheet->column_geometry) - 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); - } - } + { + 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); @@ -1341,7 +1344,7 @@ gtk_sheet_show_grid (GtkSheet *sheet, gboolean show) sheet->show_grid = show; - gtk_sheet_range_draw (sheet, NULL); + gtk_sheet_range_draw (sheet, NULL); } gboolean @@ -1353,40 +1356,6 @@ gtk_sheet_grid_visible (GtkSheet *sheet) return sheet->show_grid; } -void -gtk_sheet_set_background (GtkSheet *sheet, GdkColor *color) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - if (!color) - { - gdk_color_parse ("white", &sheet->bg_color); - gdk_colormap_alloc_color (gdk_colormap_get_system (), &sheet->bg_color, FALSE, TRUE); - } - else - sheet->bg_color = *color; - - gtk_sheet_range_draw (sheet, NULL); -} - -void -gtk_sheet_set_grid (GtkSheet *sheet, GdkColor *color) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - if (!color) - { - gdk_color_parse ("black", &sheet->grid_color); - gdk_colormap_alloc_color (gdk_colormap_get_system (), &sheet->grid_color, FALSE, TRUE); - } - else - sheet->grid_color = *color; - - gtk_sheet_range_draw (sheet, NULL); -} - guint gtk_sheet_get_columns_count (GtkSheet *sheet) { @@ -1396,47 +1365,8 @@ gtk_sheet_get_columns_count (GtkSheet *sheet) return g_sheet_column_get_column_count (sheet->column_geometry); } -guint -gtk_sheet_get_rows_count (GtkSheet *sheet) -{ - g_return_val_if_fail (sheet != NULL, 0); - g_return_val_if_fail (GTK_IS_SHEET (sheet), 0); - - return g_sheet_row_get_row_count (sheet->row_geometry); -} - -void -gtk_sheet_set_selection_mode (GtkSheet *sheet, gint mode) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - if (GTK_WIDGET_REALIZED (sheet)) - gtk_sheet_real_unselect_range (sheet, NULL); - - sheet->selection_mode = mode; -} - -void -gtk_sheet_set_autoresize (GtkSheet *sheet, gboolean autoresize) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - sheet->autoresize = autoresize; -} - -gboolean -gtk_sheet_autoresize (GtkSheet *sheet) -{ - g_return_val_if_fail (sheet != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); - - return sheet->autoresize; -} - static void -gtk_sheet_set_column_width (GtkSheet * sheet, +gtk_sheet_set_column_width (GtkSheet *sheet, gint column, guint width); @@ -1478,75 +1408,6 @@ gtk_sheet_autoresize_column (GtkSheet *sheet, gint column) } } - -void -gtk_sheet_set_autoscroll (GtkSheet *sheet, gboolean autoscroll) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - sheet->autoscroll = autoscroll; -} - -gboolean -gtk_sheet_autoscroll (GtkSheet *sheet) -{ - g_return_val_if_fail (sheet != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); - - return sheet->autoscroll; -} - - -void -gtk_sheet_set_justify_entry (GtkSheet *sheet, gboolean justify) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - sheet->justify_entry = justify; -} - -gboolean -gtk_sheet_justify_entry (GtkSheet *sheet) -{ - g_return_val_if_fail (sheet != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); - - return sheet->justify_entry; -} - - -void -gtk_sheet_set_row_titles_width (GtkSheet *sheet, guint width) -{ - if (width < COLUMN_MIN_WIDTH) return; - - sheet->row_title_area.width = width; - - adjust_scrollbars (sheet); - - if (sheet->hadjustment) - g_signal_emit_by_name (sheet->hadjustment, - "value_changed"); - size_allocate_global_button (sheet); -} - -void -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; - - adjust_scrollbars (sheet); - - if (sheet->vadjustment) - g_signal_emit_by_name (sheet->vadjustment, - "value_changed"); - size_allocate_global_button (sheet); -} - void gtk_sheet_show_column_titles (GtkSheet *sheet) { @@ -1557,14 +1418,14 @@ gtk_sheet_show_column_titles (GtkSheet *sheet) if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; - gdk_window_show (sheet->column_title_window); - gdk_window_move_resize (sheet->column_title_window, - sheet->column_title_area.x, - sheet->column_title_area.y, - sheet->column_title_area.width, - sheet->column_title_area.height); + gdk_window_show (sheet->column_title_window); + gdk_window_move_resize (sheet->column_title_window, + sheet->column_title_area.x, + sheet->column_title_area.y, + sheet->column_title_area.width, + sheet->column_title_area.height); - adjust_scrollbars (sheet); + adjust_scrollbars (sheet); if (sheet->vadjustment) g_signal_emit_by_name (sheet->vadjustment, @@ -1645,140 +1506,64 @@ gtk_sheet_hide_row_titles (GtkSheet *sheet) } +/* Scroll the sheet so that the cell ROW, COLUMN is visible. + If {ROW,COL}_ALIGN is zero, then the cell will be placed + at the {top,left} of the sheet. If it's 1, then it'll + be placed at the {bottom,right}. + ROW or COL may be -1, in which case scrolling in that dimension + does not occur. + */ void gtk_sheet_moveto (GtkSheet *sheet, gint row, - gint column, + gint col, gfloat row_align, gfloat col_align) { - gint x, y; - guint width, height; - gint adjust; - gint min_row, min_col; + gint width, height; - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - g_return_if_fail (sheet->hadjustment != NULL); - g_return_if_fail (sheet->vadjustment != NULL); + g_return_if_fail (row_align >= 0); + g_return_if_fail (col_align >= 0); - if (row < 0 || row >= g_sheet_row_get_row_count (sheet->row_geometry)) - return; - if (column < 0 || column >= g_sheet_column_get_column_count (sheet->column_geometry)) - return; + g_return_if_fail (row_align <= 1); + g_return_if_fail (col_align <= 1); - height = sheet->sheet_window_height; - width = sheet->sheet_window_width; + g_return_if_fail (col < + g_sheet_column_get_column_count (sheet->column_geometry)); + g_return_if_fail (row < + g_sheet_row_get_row_count (sheet->row_geometry)); - /* adjust vertical scrollbar */ - if (row >= 0 && row_align >= 0.0) - { - y = g_sheet_row_start_pixel (sheet->row_geometry, row) - - (gint) ( row_align * height + (1.0 - row_align) - * g_sheet_row_get_height (sheet->row_geometry, row)); + gdk_drawable_get_size (sheet->sheet_window, &width, &height); - /* This forces the sheet to scroll when you don't see the entire cell */ - min_row = row; - adjust = 0; - if (row_align >= 1.0) - { - while (min_row >= 0 && min_row > MIN_VISIBLE_ROW (sheet)) - { - if (g_sheet_row_get_visibility (sheet->row_geometry, min_row)) - adjust += g_sheet_row_get_height (sheet->row_geometry, min_row); - if (adjust >= height) - { - break; - } - min_row--; - } - min_row = MAX (min_row, 0); + if (row >= 0) + { + gint y = g_sheet_row_start_pixel (sheet->row_geometry, row); - min_row ++; + gtk_adjustment_set_value (sheet->vadjustment, y - height * row_align); + } - y = g_sheet_row_start_pixel (sheet->row_geometry, min_row) + - g_sheet_row_get_height (sheet->row_geometry, min_row) - 1; - } - if (y < 0) - sheet->vadjustment->value = 0.0; - else - sheet->vadjustment->value = y; + if (col >= 0) + { + gint x = g_sheet_column_start_pixel (sheet->column_geometry, col); - g_signal_emit_by_name (sheet->vadjustment, - "value_changed"); + gtk_adjustment_set_value (sheet->hadjustment, x - width * col_align); + } +} - } - /* adjust horizontal scrollbar */ - if (column >= 0 && col_align >= 0.0) - { - x = COLUMN_LEFT_XPIXEL (sheet, column) - - (gint) ( col_align*width + (1.0 - col_align)* - g_sheet_column_get_width (sheet->column_geometry, column)); +static gboolean +gtk_sheet_columns_resizable (GtkSheet *sheet) +{ + g_return_val_if_fail (sheet != NULL, FALSE); + g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); - /* This forces the sheet to scroll when you don't see the entire cell */ - min_col = column; - adjust = 0; - if (col_align == 1.0) - { - while (min_col >= 0 && min_col > MIN_VISIBLE_COLUMN (sheet)) - { - if (g_sheet_column_get_visibility (sheet->column_geometry, min_col)) - adjust += g_sheet_column_get_width (sheet->column_geometry, min_col); - - if (adjust >= width) - { - break; - } - min_col--; - } - min_col = MAX (min_col, 0); - x = COLUMN_LEFT_XPIXEL (sheet, min_col) + - g_sheet_column_get_width (sheet->column_geometry, min_col) - 1; - } - - if (x < 0) - sheet->hadjustment->value = 0.0; - else - sheet->hadjustment->value = x; - - g_signal_emit_by_name (sheet->hadjustment, - "value_changed"); - } -} - - -void -gtk_sheet_columns_set_resizable (GtkSheet *sheet, gboolean resizable) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - sheet->columns_resizable = resizable; -} - -gboolean -gtk_sheet_columns_resizable (GtkSheet *sheet) -{ - g_return_val_if_fail (sheet != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); - - return sheet->columns_resizable; -} + return sheet->columns_resizable; +} -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 +static gboolean gtk_sheet_rows_resizable (GtkSheet *sheet) { g_return_val_if_fail (sheet != NULL, FALSE); @@ -1816,7 +1601,7 @@ gtk_sheet_select_row (GtkSheet *sheet, gint row) void -gtk_sheet_select_column (GtkSheet * sheet, gint column) +gtk_sheet_select_column (GtkSheet *sheet, gint column) { g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_IS_SHEET (sheet)); @@ -1846,7 +1631,7 @@ gtk_sheet_select_column (GtkSheet * sheet, gint column) static gboolean -gtk_sheet_range_isvisible (const GtkSheet * sheet, +gtk_sheet_range_isvisible (const GtkSheet *sheet, GtkSheetRange range) { g_return_val_if_fail (sheet != NULL, FALSE); @@ -1863,23 +1648,23 @@ gtk_sheet_range_isvisible (const GtkSheet * sheet, if (range.coli < 0 || range.coli >= g_sheet_column_get_column_count (sheet->column_geometry)) return FALSE; - if (range.rowi < MIN_VISIBLE_ROW (sheet)) + if (range.rowi < min_visible_row (sheet)) return FALSE; - if (range.row0 > MAX_VISIBLE_ROW (sheet)) + if (range.row0 > max_visible_row (sheet)) return FALSE; - if (range.coli < MIN_VISIBLE_COLUMN (sheet)) + if (range.coli < min_visible_column (sheet)) return FALSE; - if (range.col0 > MAX_VISIBLE_COLUMN (sheet)) + if (range.col0 > max_visible_column (sheet)) return FALSE; return TRUE; } static gboolean -gtk_sheet_cell_isvisible (GtkSheet * sheet, +gtk_sheet_cell_isvisible (GtkSheet *sheet, gint row, gint column) { GtkSheetRange range; @@ -1899,10 +1684,10 @@ gtk_sheet_get_visible_range (GtkSheet *sheet, GtkSheetRange *range) g_return_if_fail (GTK_IS_SHEET (sheet)) ; g_return_if_fail (range != NULL); - range->row0 = MIN_VISIBLE_ROW (sheet); - range->col0 = MIN_VISIBLE_COLUMN (sheet); - range->rowi = MAX_VISIBLE_ROW (sheet); - range->coli = MAX_VISIBLE_COLUMN (sheet); + range->row0 = min_visible_row (sheet); + range->col0 = min_visible_column (sheet); + range->rowi = max_visible_row (sheet); + range->coli = max_visible_column (sheet); } @@ -1912,9 +1697,9 @@ gtk_sheet_set_scroll_adjustments (GtkSheet *sheet, GtkAdjustment *vadjustment) { if ( sheet->vadjustment != vadjustment ) -{ - if (sheet->vadjustment) - g_object_unref (sheet->vadjustment); + { + if (sheet->vadjustment) + g_object_unref (sheet->vadjustment); sheet->vadjustment = vadjustment; g_object_ref (vadjustment); @@ -1924,9 +1709,9 @@ gtk_sheet_set_scroll_adjustments (GtkSheet *sheet, } if ( sheet->hadjustment != hadjustment ) -{ - if (sheet->hadjustment) - g_object_unref (sheet->hadjustment); + { + if (sheet->hadjustment) + g_object_unref (sheet->hadjustment); sheet->hadjustment = hadjustment; g_object_ref (hadjustment); @@ -1937,7 +1722,7 @@ gtk_sheet_set_scroll_adjustments (GtkSheet *sheet, } static void -gtk_sheet_finalize (GObject * object) +gtk_sheet_finalize (GObject *object) { GtkSheet *sheet; @@ -2023,13 +1808,16 @@ gtk_sheet_style_set (GtkWidget *widget, } static void -gtk_sheet_realize (GtkWidget * widget) +gtk_sheet_realize (GtkWidget *widget) { GtkSheet *sheet; GdkWindowAttr attributes; - gint attributes_mask; + const gint attributes_mask = + GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_CURSOR; + GdkGCValues values, auxvalues; GdkColormap *colormap; + GdkDisplay *display; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_SHEET (widget)); @@ -2038,6 +1826,9 @@ gtk_sheet_realize (GtkWidget * widget) GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); + colormap = gtk_widget_get_colormap (widget); + display = gtk_widget_get_display (widget); + attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; @@ -2046,7 +1837,7 @@ gtk_sheet_realize (GtkWidget * widget) attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); - attributes.colormap = gtk_widget_get_colormap (widget); + attributes.colormap = colormap; attributes.event_mask = gtk_widget_get_events (widget); attributes.event_mask |= (GDK_EXPOSURE_MASK | @@ -2057,10 +1848,8 @@ gtk_sheet_realize (GtkWidget * widget) GDK_LEAVE_NOTIFY_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | - GDK_WA_CURSOR; - attributes.cursor = gdk_cursor_new (GDK_TOP_LEFT_ARROW); + attributes.cursor = gdk_cursor_new_for_display (display, GDK_TOP_LEFT_ARROW); /* main window */ widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); @@ -2071,11 +1860,11 @@ gtk_sheet_realize (GtkWidget * widget) gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); - gdk_color_parse ("white", &sheet->bg_color); - gdk_colormap_alloc_color (gdk_colormap_get_system (), &sheet->bg_color, FALSE, + gdk_color_parse ("white", &sheet->color[BG_COLOR]); + gdk_colormap_alloc_color (colormap, &sheet->color[BG_COLOR], FALSE, TRUE); - gdk_color_parse ("gray", &sheet->grid_color); - gdk_colormap_alloc_color (gdk_colormap_get_system (), &sheet->grid_color, FALSE, + gdk_color_parse ("gray", &sheet->color[GRID_COLOR]); + gdk_colormap_alloc_color (colormap, &sheet->color[GRID_COLOR], FALSE, TRUE); attributes.x = 0; @@ -2105,12 +1894,10 @@ gtk_sheet_realize (GtkWidget * widget) GTK_STATE_NORMAL); /* sheet - window */ - attributes.cursor = gdk_cursor_new (GDK_PLUS); + attributes.cursor = gdk_cursor_new_for_display (display, GDK_PLUS); attributes.x = 0; attributes.y = 0; - attributes.width = sheet->sheet_window_width; - attributes.height = sheet->sheet_window_height; sheet->sheet_window = gdk_window_new (widget->window, &attributes, attributes_mask); @@ -2121,15 +1908,10 @@ gtk_sheet_realize (GtkWidget * widget) gdk_window_set_background (sheet->sheet_window, &widget->style->white); gdk_window_show (sheet->sheet_window); - /* backing_pixmap */ - gtk_sheet_make_backing_pixmap (sheet); - /* GCs */ sheet->fg_gc = gdk_gc_new (widget->window); sheet->bg_gc = gdk_gc_new (widget->window); - colormap = gtk_widget_get_colormap (widget); - gdk_gc_get_values (sheet->fg_gc, &auxvalues); values.foreground = widget->style->white; @@ -2153,7 +1935,7 @@ gtk_sheet_realize (GtkWidget * widget) gtk_widget_set_parent (sheet->button, GTK_WIDGET (sheet)); - sheet->cursor_drag = gdk_cursor_new (GDK_PLUS); + sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_PLUS); if (sheet->column_titles_visible) gdk_window_show (sheet->column_title_window); @@ -2162,8 +1944,8 @@ gtk_sheet_realize (GtkWidget * widget) sheet->hover_window = create_hover_window (); - size_allocate_row_title_buttons (sheet); - size_allocate_column_title_buttons (sheet); + draw_row_title_buttons (sheet); + draw_column_title_buttons (sheet); gtk_sheet_update_primary_selection (sheet); } @@ -2203,15 +1985,13 @@ size_allocate_global_button (GtkSheet *sheet) static void global_button_clicked (GtkWidget *widget, gpointer data) { - gboolean veto; - - gtk_sheet_click_cell (GTK_SHEET (data), - 1, - 1, &veto); + gtk_sheet_click_cell (GTK_SHEET (data), -1, -1); gtk_widget_grab_focus (GTK_WIDGET (data)); } static void -gtk_sheet_unrealize (GtkWidget * widget) +gtk_sheet_unrealize (GtkWidget *widget) { GtkSheet *sheet; @@ -2223,11 +2003,8 @@ gtk_sheet_unrealize (GtkWidget * widget) gdk_cursor_unref (sheet->cursor_drag); sheet->cursor_drag = NULL; - gdk_colormap_free_colors (gdk_colormap_get_system (), - &sheet->bg_color, 1); - - gdk_colormap_free_colors (gdk_colormap_get_system (), - &sheet->grid_color, 1); + gdk_colormap_free_colors (gtk_widget_get_colormap (widget), + sheet->color, n_COLORS); g_object_unref (sheet->xor_gc); g_object_unref (sheet->fg_gc); @@ -2239,12 +2016,6 @@ gtk_sheet_unrealize (GtkWidget * widget) gdk_window_destroy (sheet->column_title_window); gdk_window_destroy (sheet->row_title_window); - if (sheet->pixmap) - { - g_object_unref (sheet->pixmap); - sheet->pixmap = NULL; - } - gtk_widget_unparent (sheet->entry_widget); if (sheet->button != NULL) gtk_widget_unparent (sheet->button); @@ -2254,7 +2025,7 @@ gtk_sheet_unrealize (GtkWidget * widget) } static void -gtk_sheet_map (GtkWidget * widget) +gtk_sheet_map (GtkWidget *widget) { GtkSheet *sheet = GTK_SHEET (widget); @@ -2270,12 +2041,12 @@ gtk_sheet_map (GtkWidget * widget) if (sheet->column_titles_visible) { - size_allocate_column_title_buttons (sheet); + draw_column_title_buttons (sheet); gdk_window_show (sheet->column_title_window); } if (sheet->row_titles_visible) { - size_allocate_row_title_buttons (sheet); + draw_row_title_buttons (sheet); gdk_window_show (sheet->row_title_window); } @@ -2307,46 +2078,54 @@ gtk_sheet_map (GtkWidget * widget) } static void -gtk_sheet_unmap (GtkWidget * widget) +gtk_sheet_unmap (GtkWidget *widget) { GtkSheet *sheet = GTK_SHEET (widget); if (!GTK_WIDGET_MAPPED (widget)) return; - GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED); + GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED); - gdk_window_hide (sheet->sheet_window); - if (sheet->column_titles_visible) - gdk_window_hide (sheet->column_title_window); - if (sheet->row_titles_visible) - gdk_window_hide (sheet->row_title_window); - gdk_window_hide (widget->window); + gdk_window_hide (sheet->sheet_window); + if (sheet->column_titles_visible) + gdk_window_hide (sheet->column_title_window); + if (sheet->row_titles_visible) + gdk_window_hide (sheet->row_title_window); + gdk_window_hide (widget->window); - if (GTK_WIDGET_MAPPED (sheet->entry_widget)) - gtk_widget_unmap (sheet->entry_widget); + if (GTK_WIDGET_MAPPED (sheet->entry_widget)) + gtk_widget_unmap (sheet->entry_widget); - if (GTK_WIDGET_MAPPED (sheet->button)) - gtk_widget_unmap (sheet->button); + if (GTK_WIDGET_MAPPED (sheet->button)) + gtk_widget_unmap (sheet->button); } static void -gtk_sheet_cell_draw_default (GtkSheet *sheet, gint row, gint col) +gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col) { - GdkGC *fg_gc, *bg_gc; + PangoLayout *layout; + PangoRectangle text; + gint font_height; + + gchar *label; + GtkSheetCellAttr attributes; GdkRectangle area; g_return_if_fail (sheet != NULL); - /* bail now if we arn't drawable yet */ + /* bail now if we aren't yet drawable */ if (!GTK_WIDGET_DRAWABLE (sheet)) return; - if (row < 0 || row >= g_sheet_row_get_row_count (sheet->row_geometry)) return; - if (col < 0 || col >= g_sheet_column_get_column_count (sheet->column_geometry)) return; - if (! g_sheet_column_get_visibility (sheet->column_geometry, col)) return; - if (! g_sheet_row_get_visibility (sheet->row_geometry, row)) return; + if (row < 0 || + row >= g_sheet_row_get_row_count (sheet->row_geometry)) + return; + + if (col < 0 || + col >= g_sheet_column_get_column_count (sheet->column_geometry)) + return; gtk_sheet_get_attributes (sheet, row, col, &attributes); @@ -2354,214 +2133,79 @@ gtk_sheet_cell_draw_default (GtkSheet *sheet, gint row, gint col) gdk_gc_set_foreground (sheet->fg_gc, &attributes.foreground); gdk_gc_set_foreground (sheet->bg_gc, &attributes.background); - fg_gc = sheet->fg_gc; - bg_gc = sheet->bg_gc; - - area.x = g_sheet_column_start_pixel (sheet->column_geometry, col); - area.x -= sheet->hadjustment->value; - - area.y = g_sheet_row_start_pixel (sheet->row_geometry, row); - area.y -= sheet->vadjustment->value; - - area.width= g_sheet_column_get_width (sheet->column_geometry, col); - area.height = g_sheet_row_get_height (sheet->row_geometry, row); + rectangle_from_cell (sheet, row, col, &area); gdk_gc_set_line_attributes (sheet->fg_gc, 1, 0, 0, 0); if (sheet->show_grid) { - gdk_gc_set_foreground (sheet->bg_gc, &sheet->grid_color); + gdk_gc_set_foreground (sheet->bg_gc, &sheet->color[GRID_COLOR]); - gdk_draw_rectangle (sheet->pixmap, + gdk_draw_rectangle (sheet->sheet_window, sheet->bg_gc, FALSE, area.x, area.y, area.width, area.height); } -} - - -static void -gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) -{ - GtkWidget *widget; - GdkRectangle area; - gint i; - gint text_width, text_height, y; - gint xoffset = 0; - gint size, sizel, sizer; - GdkGC *fg_gc, *bg_gc; - GtkSheetCellAttr attributes; - PangoLayout *layout; - PangoRectangle rect; - PangoRectangle logical_rect; - PangoLayoutLine *line; - PangoFontMetrics *metrics; - PangoContext *context = gtk_widget_get_pango_context (GTK_WIDGET (sheet)); - gint ascent, descent, y_pos; - gchar *label; - - g_return_if_fail (sheet != NULL); + // gtk_sheet_cell_draw_label (sheet, row, col); - /* bail now if we aren't drawable yet */ - if (!GTK_WIDGET_DRAWABLE (sheet)) - return; label = gtk_sheet_cell_get_text (sheet, row, col); - if (!label) + if (NULL == label) return; - if (row < 0 || row >= g_sheet_row_get_row_count (sheet->row_geometry)) return; - if (col < 0 || col >= g_sheet_column_get_column_count (sheet->column_geometry)) return; - if (! g_sheet_column_get_visibility (sheet->column_geometry, col)) return; - if (!g_sheet_row_get_visibility (sheet->row_geometry, row)) return; - - widget = GTK_WIDGET (sheet); - - gtk_sheet_get_attributes (sheet, row, col, &attributes); - - /* select GC for background rectangle */ - gdk_gc_set_foreground (sheet->fg_gc, &attributes.foreground); - gdk_gc_set_foreground (sheet->bg_gc, &attributes.background); - - fg_gc = sheet->fg_gc; - bg_gc = sheet->bg_gc; - - area.x = g_sheet_column_start_pixel (sheet->column_geometry, col); - area.x -= sheet->hadjustment->value; - - area.y = g_sheet_row_start_pixel (sheet->row_geometry, row); - area.y -= sheet->vadjustment->value; - - area.width = g_sheet_column_get_width (sheet->column_geometry, col); - area.height = g_sheet_row_get_height (sheet->row_geometry, row); - layout = gtk_widget_create_pango_layout (GTK_WIDGET (sheet), label); dispose_string (sheet, label); pango_layout_set_font_description (layout, attributes.font_desc); - pango_layout_get_pixel_extents (layout, NULL, &rect); - line = pango_layout_get_lines (layout)->data; - pango_layout_line_get_extents (line, NULL, &logical_rect); + pango_layout_get_pixel_extents (layout, NULL, &text); - metrics = pango_context_get_metrics (context, - attributes.font_desc, - pango_context_get_language (context)); + gdk_gc_set_clip_rectangle (sheet->fg_gc, &area); - ascent = pango_font_metrics_get_ascent (metrics) / PANGO_SCALE; - descent = pango_font_metrics_get_descent (metrics) / PANGO_SCALE; + font_height = pango_font_description_get_size (attributes.font_desc); + if ( !pango_font_description_get_size_is_absolute (attributes.font_desc)) + font_height /= PANGO_SCALE; - pango_font_metrics_unref (metrics); - - /* Align primarily for locale's ascent / descent */ - - logical_rect.height /= PANGO_SCALE; - logical_rect.y /= PANGO_SCALE; - y_pos = area.height - logical_rect.height; - - if (logical_rect.height > area.height) - y_pos = (logical_rect.height - area.height - 2 * COLUMN_TITLES_HEIGHT) / 2; - else if (y_pos < 0) - y_pos = 0; - else if (y_pos + logical_rect.height > area.height) - y_pos = area.height - logical_rect.height; - - text_width = rect.width; - text_height = rect.height; - y = area.y + y_pos - COLUMN_TITLES_HEIGHT; + /* Centre the text vertically */ + area.y += (area.height - font_height) / 2.0; switch (attributes.justification) { case GTK_JUSTIFY_RIGHT: - size = area.width; - area.x +=area.width; - { - for (i = col - 1; i >= MIN_VISIBLE_COLUMN (sheet); i--) - { - if ( !gtk_sheet_cell_empty (sheet, row, i)) break; - if (size >= text_width + COLUMN_TITLES_HEIGHT) break; - size += g_sheet_column_get_width (sheet->column_geometry, i); - g_sheet_column_set_right_text_column (sheet->column_geometry, i, - MAX (col, - g_sheet_column_get_right_text_column (sheet->column_geometry, i))); - } - area.width = size; - } - area.x -= size; - xoffset += area.width - text_width - 2 * COLUMN_TITLES_HEIGHT - - attributes.border.width / 2; + area.x += area.width - text.width; break; case GTK_JUSTIFY_CENTER: - sizel = area.width / 2; - sizer = area.width / 2; - area.x += area.width / 2; - { - 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 += g_sheet_column_get_width (sheet->column_geometry, i); - g_sheet_column_set_left_text_column (sheet->column_geometry, i, - MIN ( - col, - g_sheet_column_get_left_text_column (sheet->column_geometry, 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 += g_sheet_column_get_width (sheet->column_geometry, i); - g_sheet_column_set_right_text_column (sheet->column_geometry, i, - MAX (col, - g_sheet_column_get_right_text_column (sheet->column_geometry, i))); - } - size = MIN (sizel, sizer); - } - area.x -= sizel; - xoffset += sizel - text_width / 2 - COLUMN_TITLES_HEIGHT; - area.width = sizel + sizer; + area.x += (area.width - text.width) / 2.0; break; case GTK_JUSTIFY_LEFT: + /* Do nothing */ + break; default: - size = area.width; - { - for (i = col + 1; i <= MAX_VISIBLE_COLUMN (sheet); i++) - { - if (! gtk_sheet_cell_empty (sheet, row, i)) break; - if (size >= text_width + COLUMN_TITLES_HEIGHT) break; - size += g_sheet_column_get_width (sheet->column_geometry, i); - g_sheet_column_set_left_text_column (sheet->column_geometry, i, - MIN ( - col, - g_sheet_column_get_left_text_column (sheet->column_geometry, i))); - - } - area.width = size; - } - xoffset += attributes.border.width / 2; + g_critical ("Unhandled justification %d in column %d\n", + attributes.justification, col); break; } - gdk_gc_set_clip_rectangle (fg_gc, &area); - - - gdk_draw_layout (sheet->pixmap, fg_gc, - area.x + xoffset + COLUMN_TITLES_HEIGHT, + gdk_draw_layout (sheet->sheet_window, sheet->fg_gc, + area.x, area.y, layout); - gdk_gc_set_clip_rectangle (fg_gc, NULL); + gdk_gc_set_clip_rectangle (sheet->fg_gc, NULL); g_object_unref (layout); - } + + static void gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) { gint i, j; + + GdkRectangle area; GtkSheetRange drawing_range; g_return_if_fail (sheet != NULL); @@ -2571,43 +2215,40 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; if (!GTK_WIDGET_MAPPED (GTK_WIDGET (sheet))) return; - if (sheet->sheet_window_width <= 0) return; - if (sheet->sheet_window_height <=0) return; - - if (sheet->pixmap == NULL) return ; - if (range == NULL) { - drawing_range.row0 = MIN_VISIBLE_ROW (sheet); - drawing_range.col0 = MIN_VISIBLE_COLUMN (sheet); - drawing_range.rowi = MIN (MAX_VISIBLE_ROW (sheet), + drawing_range.row0 = min_visible_row (sheet); + drawing_range.col0 = min_visible_column (sheet); + drawing_range.rowi = MIN (max_visible_row (sheet), g_sheet_row_get_row_count (sheet->row_geometry) - 1); - drawing_range.coli = MAX_VISIBLE_COLUMN (sheet); - - gdk_draw_rectangle (sheet->pixmap, - GTK_WIDGET (sheet)->style->white_gc, - TRUE, - 0, 0, - sheet->sheet_window_width, - sheet->sheet_window_height); + drawing_range.coli = max_visible_column (sheet); + gdk_drawable_get_size (sheet->sheet_window, &area.width, &area.height); + area.x = area.y = 0; } else { - drawing_range.row0 = MAX (range->row0, MIN_VISIBLE_ROW (sheet)); - drawing_range.col0 = MAX (range->col0, MIN_VISIBLE_COLUMN (sheet)); - drawing_range.rowi = MIN (range->rowi, MAX_VISIBLE_ROW (sheet)); - drawing_range.coli = MIN (range->coli, MAX_VISIBLE_COLUMN (sheet)); + drawing_range.row0 = MAX (range->row0, min_visible_row (sheet)); + drawing_range.col0 = MAX (range->col0, min_visible_column (sheet)); + drawing_range.rowi = MIN (range->rowi, max_visible_row (sheet)); + drawing_range.coli = MIN (range->coli, max_visible_column (sheet)); + + + rectangle_from_range (sheet, &drawing_range, &area); } + + gdk_draw_rectangle (sheet->sheet_window, + GTK_WIDGET (sheet)->style->white_gc, + TRUE, + area.x, area.y, + area.width, area.height); + for (i = drawing_range.row0; i <= drawing_range.rowi; i++) for (j = drawing_range.col0; j <= drawing_range.coli; j++) { - gtk_sheet_cell_draw_default (sheet, i, j); - gtk_sheet_cell_draw_label (sheet, i, j); + gtk_sheet_cell_draw (sheet, i, j); } - gtk_sheet_draw_backing_pixmap (sheet, drawing_range); - if (sheet->state != GTK_SHEET_NORMAL && gtk_sheet_range_isvisible (sheet, sheet->range)) gtk_sheet_range_draw_selection (sheet, drawing_range); @@ -2641,34 +2282,18 @@ gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range) range.row0 = MAX (sheet->range.row0, range.row0); range.rowi = MIN (sheet->range.rowi, range.rowi); - range.col0 = MAX (range.col0, MIN_VISIBLE_COLUMN (sheet)); - range.coli = MIN (range.coli, MAX_VISIBLE_COLUMN (sheet)); - range.row0 = MAX (range.row0, MIN_VISIBLE_ROW (sheet)); - range.rowi = MIN (range.rowi, MAX_VISIBLE_ROW (sheet)); + range.col0 = MAX (range.col0, min_visible_column (sheet)); + range.coli = MIN (range.coli, max_visible_column (sheet)); + range.row0 = MAX (range.row0, min_visible_row (sheet)); + range.rowi = MIN (range.rowi, max_visible_row (sheet)); for (i = range.row0; i <= range.rowi; i++) { for (j = range.col0; j <= range.coli; j++) { - - if (gtk_sheet_cell_get_state (sheet, i, j) == GTK_STATE_SELECTED && - g_sheet_column_get_visibility (sheet->column_geometry, j) && g_sheet_row_get_visibility (sheet->row_geometry, i)) + if (gtk_sheet_cell_get_state (sheet, i, j) == GTK_STATE_SELECTED) { - area.x = COLUMN_LEFT_XPIXEL (sheet, j); - if ( sheet->row_titles_visible) - area.x += sheet->row_title_area.width; - - area.x -= sheet->hadjustment->value; - - area.y = g_sheet_row_start_pixel (sheet->row_geometry, i); - if ( sheet->column_titles_visible) - area.y += sheet->column_title_area.height; - - area.y -= sheet->vadjustment->value; - - - area.width= g_sheet_column_get_width (sheet->column_geometry, j); - area.height = g_sheet_row_get_height (sheet->row_geometry, i); + rectangle_from_cell (sheet, i, j, &area); if (i == sheet->range.row0) { @@ -2699,26 +2324,6 @@ gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range) gtk_sheet_draw_border (sheet, sheet->range); } -static void -gtk_sheet_draw_backing_pixmap (GtkSheet *sheet, GtkSheetRange range) -{ - gint width, height; - - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; - - if ( sheet->pixmap == NULL) return; - - gdk_drawable_get_size (sheet->pixmap, &width, &height); - - gdk_draw_drawable (sheet->sheet_window, - GTK_WIDGET (sheet)->style->fg_gc[GTK_STATE_NORMAL], - sheet->pixmap, - 0, 0, /* src */ - sheet->row_titles_visible ? sheet->row_title_area.width : 0, - sheet->column_titles_visible ? sheet->column_title_area.height : 0, - width, height); -} - static void gtk_sheet_set_cell (GtkSheet *sheet, gint row, gint col, GtkJustification justification, const gchar *text); @@ -2739,66 +2344,30 @@ gtk_sheet_set_cell (GtkSheet *sheet, gint row, gint col, const gchar *text) { GSheetModel *model ; - gboolean changed ; + gboolean changed = FALSE; gchar *old_text ; - GtkSheetRange range; - gint text_width; - GtkSheetCellAttr attributes; - 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) || row >= g_sheet_row_get_row_count (sheet->row_geometry)) return; - if (col < 0 || row < 0) return; - gtk_sheet_get_attributes (sheet, row, col, &attributes); + if (col >= g_sheet_column_get_column_count (sheet->column_geometry) + || row >= g_sheet_row_get_row_count (sheet->row_geometry)) + return; - attributes.justification = justification; + if (col < 0 || row < 0) return; model = gtk_sheet_get_model (sheet); old_text = g_sheet_model_get_string (model, row, col); - changed = FALSE; - 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 && attributes.is_visible) - { - gchar *s = gtk_sheet_cell_get_text (sheet, row, col); - text_width = 0; - if (s && strlen (s) > 0) - { - text_width = STRING_WIDTH (GTK_WIDGET (sheet), - attributes.font_desc, text); - } - dispose_string (sheet, s); - - range.row0 = row; - range.rowi = row; - range.col0 = MIN_VISIBLE_COLUMN (sheet); - range.coli = MAX_VISIBLE_COLUMN (sheet); - - if (gtk_sheet_autoresize (sheet) && - text_width > g_sheet_column_get_width (sheet->column_geometry, col) - - 2 * COLUMN_TITLES_HEIGHT- attributes.border.width) - { - gtk_sheet_set_column_width (sheet, col, text_width + 2 * COLUMN_TITLES_HEIGHT - + attributes.border.width); - GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_REDRAW_PENDING); - } - else - gtk_sheet_range_draw (sheet, &range); - } - if ( changed ) g_signal_emit (sheet, sheet_signals[CHANGED], 0, row, col); - } @@ -2816,13 +2385,13 @@ gtk_sheet_cell_clear (GtkSheet *sheet, gint row, gint column) range.row0 = row; range.rowi = row; - range.col0 = MIN_VISIBLE_COLUMN (sheet); - range.coli = MAX_VISIBLE_COLUMN (sheet); + range.col0 = min_visible_column (sheet); + range.coli = max_visible_column (sheet); gtk_sheet_real_cell_clear (sheet, row, column); - gtk_sheet_range_draw (sheet, &range); - } + gtk_sheet_range_draw (sheet, &range); +} static void gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column) @@ -2839,59 +2408,6 @@ gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column) dispose_string (sheet, old_text); } -void -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); -} - -static void -gtk_sheet_real_range_clear (GtkSheet *sheet, const GtkSheetRange *range) -{ - gint i, j; - GtkSheetRange clear; - - if (!range) - { - clear.row0 = 0; - clear.rowi = g_sheet_row_get_row_count (sheet->row_geometry) - 1; - clear.col0 = 0; - clear.coli = g_sheet_column_get_column_count (sheet->column_geometry) - 1; - } - else - clear=*range; - - clear.row0 = MAX (clear.row0, 0); - clear.col0 = MAX (clear.col0, 0); - clear.rowi = MIN (clear.rowi, g_sheet_row_get_row_count (sheet->row_geometry) - 1 ); - clear.coli = MIN (clear.coli, g_sheet_column_get_column_count (sheet->column_geometry) - 1 ); - - for (i = clear.row0; i <= clear.rowi; i++) - for (j = clear.col0; j <= clear.coli; j++) - { - gtk_sheet_real_cell_clear (sheet, i, j); - } - - gtk_sheet_range_draw (sheet, NULL); -} - - -static gboolean -gtk_sheet_cell_empty (const GtkSheet *sheet, gint row, gint col) -{ - gboolean empty; - char *text = gtk_sheet_cell_get_text (sheet, row, col); - empty = (text == NULL ); - - dispose_string (sheet, text); - - return empty; -} - - gchar * gtk_sheet_cell_get_text (const GtkSheet *sheet, gint row, gint col) { @@ -2912,7 +2428,7 @@ gtk_sheet_cell_get_text (const GtkSheet *sheet, gint row, gint col) } -GtkStateType +static GtkStateType gtk_sheet_cell_get_state (GtkSheet *sheet, gint row, gint col) { gint state; @@ -2978,28 +2494,42 @@ gtk_sheet_get_pixel_info (GtkSheet *sheet, y += sheet->vadjustment->value; - trow = yyy_row_ypixel_to_row (sheet, y); - if (trow > g_sheet_row_get_row_count (sheet->row_geometry)) + if ( y < 0 && sheet->column_titles_visible) + { + trow = -1; + } + else + { + trow = yyy_row_ypixel_to_row (sheet, y); + if (trow > g_sheet_row_get_row_count (sheet->row_geometry)) return FALSE; + } - *row = trow; + *row = trow; if ( sheet->row_titles_visible) x -= sheet->row_title_area.width; x += sheet->hadjustment->value; - tcol = COLUMN_FROM_XPIXEL (sheet, x); - if (tcol > g_sheet_column_get_column_count (sheet->column_geometry)) + if ( x < 0 && sheet->row_titles_visible) + { + tcol = -1; + } + else + { + tcol = column_from_xpixel (sheet, x); + if (tcol > g_sheet_column_get_column_count (sheet->column_geometry)) return FALSE; + } - *column = tcol; + *column = tcol; return TRUE; } gboolean -gtk_sheet_get_cell_area (GtkSheet * sheet, +gtk_sheet_get_cell_area (GtkSheet *sheet, gint row, gint column, GdkRectangle *area) @@ -3010,7 +2540,7 @@ gtk_sheet_get_cell_area (GtkSheet * sheet, if (row >= g_sheet_row_get_row_count (sheet->row_geometry) || column >= g_sheet_column_get_column_count (sheet->column_geometry)) return FALSE; - area->x = (column == -1) ? 0 : COLUMN_LEFT_XPIXEL (sheet, column); + area->x = (column == -1) ? 0 : g_sheet_column_start_pixel (sheet->column_geometry, column); area->y = (row == -1) ? 0 : g_sheet_row_start_pixel (sheet->row_geometry, row); area->width= (column == -1) ? sheet->row_title_area.width @@ -3022,34 +2552,35 @@ gtk_sheet_get_cell_area (GtkSheet * sheet, return TRUE; } -gboolean -gtk_sheet_set_active_cell (GtkSheet *sheet, gint row, gint column) +void +gtk_sheet_set_active_cell (GtkSheet *sheet, gint row, gint col) { - g_return_val_if_fail (sheet != NULL, 0); - g_return_val_if_fail (GTK_IS_SHEET (sheet), 0); + g_return_if_fail (sheet != NULL); + g_return_if_fail (GTK_IS_SHEET (sheet)); - if (row < - 1 || column < - 1) return FALSE; - if (row >= g_sheet_row_get_row_count (sheet->row_geometry) || column >= g_sheet_column_get_column_count (sheet->column_geometry)) - return FALSE; + if (row < -1 || col < -1) + return; - if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) - gtk_sheet_deactivate_cell (sheet); + if (row >= g_sheet_row_get_row_count (sheet->row_geometry) + || + col >= g_sheet_column_get_column_count (sheet->column_geometry)) + return; sheet->active_cell.row = row; - sheet->active_cell.col = column; + sheet->active_cell.col = col; + + if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) + return; - if ( row == -1 || column == -1) + gtk_sheet_deactivate_cell (sheet); + + if ( row == -1 || col == -1) { gtk_sheet_hide_active_cell (sheet); - return TRUE; + return; } - if (!gtk_sheet_activate_cell (sheet, row, column)) return FALSE; - - if (gtk_sheet_autoscroll (sheet)) - gtk_sheet_move_query (sheet, row, column); - - return TRUE; + gtk_sheet_activate_cell (sheet, row, col); } void @@ -3110,9 +2641,21 @@ gtk_sheet_deactivate_cell (GtkSheet *sheet) if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return ; if (sheet->state != GTK_SHEET_NORMAL) return ; + if ( sheet->active_cell.row == -1 || sheet->active_cell.col == -1 ) return ; + /* + g_print ("%s\n", __FUNCTION__); + + + GtkSheetRange r; + r.col0 = r.coli = sheet->active_cell.col; + r.row0 = r.rowi = sheet->active_cell.row; + gtk_sheet_range_draw (sheet, &r); + */ + + g_signal_emit (sheet, sheet_signals[DEACTIVATE], 0, sheet->active_cell.row, sheet->active_cell.col); @@ -3126,58 +2669,60 @@ gtk_sheet_deactivate_cell (GtkSheet *sheet) sheet->active_cell.row = -1; sheet->active_cell.col = -1; +#if 0 if (GTK_SHEET_REDRAW_PENDING (sheet)) { GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_REDRAW_PENDING); gtk_sheet_range_draw (sheet, NULL); } +#endif } + + static void gtk_sheet_hide_active_cell (GtkSheet *sheet) { - const char *text; - gint row, col; - GtkJustification justification; - GtkSheetCellAttr attributes; - - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; - - row = sheet->active_cell.row; - col = sheet->active_cell.col; - - if (row < 0 || col < 0) return; - - text = gtk_entry_get_text (GTK_ENTRY (gtk_sheet_get_entry (sheet))); + GdkRectangle area; - gtk_sheet_get_attributes (sheet, row, col, &attributes); - justification = attributes.justification; + if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) + return; - row = sheet->active_cell.row; - col = sheet->active_cell.col; + if (sheet->active_cell.row < 0 || + sheet->active_cell.col < 0) return; gtk_widget_hide (sheet->entry_widget); gtk_widget_unmap (sheet->entry_widget); - gtk_widget_grab_focus (GTK_WIDGET (sheet)); + rectangle_from_cell (sheet, + sheet->active_cell.row, sheet->active_cell.col, + &area); - GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (sheet->entry_widget), GTK_VISIBLE); + gdk_draw_rectangle (sheet->sheet_window, + GTK_WIDGET (sheet)->style->white_gc, + TRUE, + area.x, area.y, + area.width, area.height); + + gtk_sheet_cell_draw (sheet, sheet->active_cell.row, + sheet->active_cell.col); + + GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (sheet->entry_widget), GTK_VISIBLE); } -static gboolean +static void gtk_sheet_activate_cell (GtkSheet *sheet, gint row, gint col) { - 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 (row < 0 || col < 0) return FALSE; + 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)) - return FALSE; + if ( row > g_sheet_row_get_row_count (sheet->row_geometry) + || col > g_sheet_column_get_column_count (sheet->column_geometry)) + return; - if (!veto) return FALSE; if (sheet->state != GTK_SHEET_NORMAL) { sheet->state = GTK_SHEET_NORMAL; @@ -3195,8 +2740,6 @@ gtk_sheet_activate_cell (GtkSheet *sheet, gint row, gint col) GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); - - gtk_sheet_show_active_cell (sheet); g_signal_connect (gtk_sheet_get_entry (sheet), @@ -3204,9 +2747,7 @@ gtk_sheet_activate_cell (GtkSheet *sheet, gint row, gint col) G_CALLBACK (gtk_sheet_entry_changed), sheet); - _gtkextra_signal_emit (GTK_OBJECT (sheet), sheet_signals [ACTIVATE], row, col, &veto); - - return TRUE; + g_signal_emit (sheet, sheet_signals [ACTIVATE], 0, row, col); } static void @@ -3215,8 +2756,6 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) GtkEntry *sheet_entry; GtkSheetCellAttr attributes; gchar *text = NULL; - const gchar *old_text; - GtkJustification justification; gint row, col; g_return_if_fail (sheet != NULL); @@ -3239,10 +2778,6 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) gtk_sheet_get_attributes (sheet, row, col, &attributes); - justification = GTK_JUSTIFY_LEFT; - - if (gtk_sheet_justify_entry (sheet)) - justification = attributes.justification; text = gtk_sheet_cell_get_text (sheet, row, col); if ( ! text ) @@ -3251,17 +2786,27 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) gtk_entry_set_visibility (GTK_ENTRY (sheet_entry), attributes.is_visible); - /*** Added by John Gotts. Mar 25, 2005 *********/ - old_text = gtk_entry_get_text (GTK_ENTRY (sheet_entry)); - if (strcmp (old_text, text) != 0) + if ( GTK_IS_ENTRY (sheet_entry)) { - if (!GTK_IS_ITEM_ENTRY (sheet_entry)) + const gchar *old_text = gtk_entry_get_text (GTK_ENTRY (sheet_entry)); + if (strcmp (old_text, text) != 0) gtk_entry_set_text (GTK_ENTRY (sheet_entry), text); - else - gtk_item_entry_set_text (GTK_ITEM_ENTRY (sheet_entry), text, justification); + + switch (attributes.justification) + { + case GTK_JUSTIFY_RIGHT: + gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 1.0); + break; + case GTK_JUSTIFY_CENTER: + gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 0.5); + break; + case GTK_JUSTIFY_LEFT: + default: + gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 0.0); + break; + } } - gtk_sheet_entry_set_max_size (sheet); gtk_sheet_size_allocate_entry (sheet); gtk_widget_map (sheet->entry_widget); @@ -3285,7 +2830,8 @@ gtk_sheet_draw_active_cell (GtkSheet *sheet) if (row < 0 || col < 0) return; - if (!gtk_sheet_cell_isvisible (sheet, row, col)) return; + if (!gtk_sheet_cell_isvisible (sheet, row, col)) + return; range.col0 = range.coli = col; range.row0 = range.rowi = row; @@ -3295,46 +2841,6 @@ gtk_sheet_draw_active_cell (GtkSheet *sheet) -static void -gtk_sheet_make_backing_pixmap (GtkSheet *sheet) -{ - gint pixmap_width, pixmap_height; - gint width, height; - - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; - - width = sheet->sheet_window_width ; - height = sheet->sheet_window_height ; - - - if ( width <= 0) return; - if ( height <= 0) return; - - if (!sheet->pixmap) - { - /* allocate */ - sheet->pixmap = gdk_pixmap_new (sheet->sheet_window, - width, height, - - 1); - - gtk_sheet_range_draw (sheet, NULL); - } - else - { - /* reallocate if sizes don't match */ - gdk_drawable_get_size (sheet->pixmap, - &pixmap_width, &pixmap_height); - if ( (pixmap_width != width) || (pixmap_height != height)) - { - g_object_unref (sheet->pixmap); - sheet->pixmap = gdk_pixmap_new (sheet->sheet_window, - width, height, - - 1); - gtk_sheet_range_draw (sheet, NULL); - } - } -} - static void gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) { @@ -3354,15 +2860,15 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) range->col0 = MIN (range->col0, sheet->range.col0); range->coli = MAX (range->coli, sheet->range.coli); - range->row0 = MAX (range->row0, MIN_VISIBLE_ROW (sheet)); - range->rowi = MIN (range->rowi, MAX_VISIBLE_ROW (sheet)); - range->col0 = MAX (range->col0, MIN_VISIBLE_COLUMN (sheet)); - range->coli = MIN (range->coli, MAX_VISIBLE_COLUMN (sheet)); + range->row0 = MAX (range->row0, min_visible_row (sheet)); + range->rowi = MIN (range->rowi, max_visible_row (sheet)); + range->col0 = MAX (range->col0, min_visible_column (sheet)); + range->coli = MIN (range->coli, max_visible_column (sheet)); - aux_range.row0 = MAX (new_range.row0, MIN_VISIBLE_ROW (sheet)); - aux_range.rowi = MIN (new_range.rowi, MAX_VISIBLE_ROW (sheet)); - aux_range.col0 = MAX (new_range.col0, MIN_VISIBLE_COLUMN (sheet)); - aux_range.coli = MIN (new_range.coli, MAX_VISIBLE_COLUMN (sheet)); + aux_range.row0 = MAX (new_range.row0, min_visible_row (sheet)); + aux_range.rowi = MIN (new_range.rowi, max_visible_row (sheet)); + aux_range.col0 = MAX (new_range.col0, min_visible_column (sheet)); + aux_range.coli = MIN (new_range.coli, max_visible_column (sheet)); for (i = range->row0; i <= range->rowi; i++) { @@ -3374,7 +2880,6 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) j <= new_range.coli && j >= new_range.col0) ? TRUE : FALSE; if (state == GTK_STATE_SELECTED && selected && - g_sheet_column_get_visibility (sheet->column_geometry, j) && g_sheet_row_get_visibility (sheet->row_geometry, i) && (i == sheet->range.row0 || i == sheet->range.rowi || j == sheet->range.col0 || j == sheet->range.coli || i == new_range.row0 || i == new_range.rowi || @@ -3393,9 +2898,9 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) if (mask1 != mask2) { - x = COLUMN_LEFT_XPIXEL (sheet, j); + x = g_sheet_column_start_pixel (sheet->column_geometry, j); y = g_sheet_row_start_pixel (sheet->row_geometry, i); - width = COLUMN_LEFT_XPIXEL (sheet, j)- x+ + width = g_sheet_column_start_pixel (sheet->column_geometry, j)- x+ g_sheet_column_get_width (sheet->column_geometry, j); height = g_sheet_row_start_pixel (sheet->row_geometry, i) - y + g_sheet_row_get_height (sheet->row_geometry, i); @@ -3414,9 +2919,9 @@ 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 = g_sheet_column_start_pixel (sheet->column_geometry, j); y = g_sheet_row_start_pixel (sheet->row_geometry, i); - width = COLUMN_LEFT_XPIXEL (sheet, j)- x+ + width = g_sheet_column_start_pixel (sheet->column_geometry, j)- x+ g_sheet_column_get_width (sheet->column_geometry, j); height = g_sheet_row_start_pixel (sheet->row_geometry, i) - y + g_sheet_row_get_height (sheet->row_geometry, i); @@ -3454,13 +2959,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 && - g_sheet_column_get_visibility (sheet->column_geometry, j) && g_sheet_row_get_visibility (sheet->row_geometry, i)) + if (state == GTK_STATE_SELECTED && !selected) { - x = COLUMN_LEFT_XPIXEL (sheet, j); + x = g_sheet_column_start_pixel (sheet->column_geometry, j); y = g_sheet_row_start_pixel (sheet->row_geometry, i); - width = COLUMN_LEFT_XPIXEL (sheet, j) - x + g_sheet_column_get_width (sheet->column_geometry, j); + width = g_sheet_column_start_pixel (sheet->column_geometry, j) - x + g_sheet_column_get_width (sheet->column_geometry, 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) @@ -3490,13 +2994,12 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) j <= new_range.coli && j >= new_range.col0) ? TRUE : FALSE; if (state != GTK_STATE_SELECTED && selected && - g_sheet_column_get_visibility (sheet->column_geometry, j) && g_sheet_row_get_visibility (sheet->row_geometry, i) && (i != sheet->active_cell.row || j != sheet->active_cell.col)) { - x = COLUMN_LEFT_XPIXEL (sheet, j); + x = g_sheet_column_start_pixel (sheet->column_geometry, j); y = g_sheet_row_start_pixel (sheet->row_geometry, i); - width = COLUMN_LEFT_XPIXEL (sheet, j) - x + g_sheet_column_get_width (sheet->column_geometry, j); + width = g_sheet_column_start_pixel (sheet->column_geometry, j) - x + g_sheet_column_get_width (sheet->column_geometry, 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) @@ -3527,67 +3030,56 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) { for (j = aux_range.col0; j <= aux_range.coli; j++) { + state = gtk_sheet_cell_get_state (sheet, i, j); - if (g_sheet_column_get_visibility (sheet->column_geometry, j) && g_sheet_row_get_visibility (sheet->row_geometry, i)) - { - - state = gtk_sheet_cell_get_state (sheet, i, j); - - mask1 = i == sheet->range.row0 ? 1 : 0; - mask1 = i == sheet->range.rowi ? mask1 + 2 : mask1; - mask1 = j == sheet->range.col0 ? mask1 + 4 : mask1; - mask1 = j == sheet->range.coli ? mask1 + 8 : mask1; - - mask2 = i == new_range.row0 ? 1 : 0; - 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)) - { - x = COLUMN_LEFT_XPIXEL (sheet, j); - y = g_sheet_row_start_pixel (sheet->row_geometry, i); - width = g_sheet_column_get_width (sheet->column_geometry, j); - height = g_sheet_row_get_height (sheet->row_geometry, i); - if (mask2 & 1) - gdk_draw_rectangle (sheet->sheet_window, - sheet->xor_gc, - TRUE, - 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); - - if (mask2 & 4) - gdk_draw_rectangle (sheet->sheet_window, - sheet->xor_gc, - TRUE, - 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); - - - - } + mask1 = i == sheet->range.row0 ? 1 : 0; + mask1 = i == sheet->range.rowi ? mask1 + 2 : mask1; + mask1 = j == sheet->range.col0 ? mask1 + 4 : mask1; + mask1 = j == sheet->range.coli ? mask1 + 8 : mask1; + mask2 = i == new_range.row0 ? 1 : 0; + 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)) + { + x = g_sheet_column_start_pixel (sheet->column_geometry, j); + y = g_sheet_row_start_pixel (sheet->row_geometry, i); + width = g_sheet_column_get_width (sheet->column_geometry, j); + height = g_sheet_row_get_height (sheet->row_geometry, i); + if (mask2 & 1) + gdk_draw_rectangle (sheet->sheet_window, + sheet->xor_gc, + TRUE, + 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); + + if (mask2 & 4) + gdk_draw_rectangle (sheet->sheet_window, + sheet->xor_gc, + TRUE, + 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); } - } } - *range = new_range; } @@ -3595,63 +3087,22 @@ static void gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range) { GdkRectangle area; - gint width, height; - - gint x = COLUMN_LEFT_XPIXEL (sheet, new_range.col0); - gint y = g_sheet_row_start_pixel (sheet->row_geometry, new_range.row0); - if ( sheet->row_titles_visible) - x += sheet->row_title_area.width; - - x -= sheet->hadjustment->value; - - if ( sheet->column_titles_visible) - y += sheet->column_title_area.height; + rectangle_from_range (sheet, &new_range, &area); - y -= sheet->vadjustment->value; - - width = COLUMN_LEFT_XPIXEL (sheet, new_range.coli) - - COLUMN_LEFT_XPIXEL (sheet, new_range.col0) - + - g_sheet_column_get_width (sheet->column_geometry, new_range.coli); - - height = g_sheet_row_start_pixel (sheet->row_geometry, new_range.rowi) - - g_sheet_row_start_pixel (sheet->row_geometry, new_range.row0) - + - g_sheet_row_get_height (sheet->row_geometry, new_range.rowi); - - area.x = COLUMN_LEFT_XPIXEL (sheet, MIN_VISIBLE_COLUMN (sheet)); - if ( sheet->row_titles_visible) - area.x += sheet->row_title_area.width; - - area.x -= sheet->hadjustment->value; - - area.y = g_sheet_row_start_pixel (sheet->row_geometry, MIN_VISIBLE_ROW (sheet)); - if ( sheet->column_titles_visible) - area.y += sheet->column_title_area.height; - - area.y -= sheet->vadjustment->value; - - - area.width = sheet->sheet_window_width; - area.height = sheet->sheet_window_height; - - gdk_gc_set_clip_rectangle (sheet->xor_gc, &area); - - gdk_draw_rectangle (sheet->sheet_window, - sheet->xor_gc, + gdk_draw_rectangle (sheet->sheet_window, + sheet->xor_gc, FALSE, - x, y, - width - 2, - height - 2); - - gdk_gc_set_clip_rectangle (sheet->xor_gc, NULL); + area.x + 1, + area.y + 1, + area.width - 2, + area.height - 2); } static void -gtk_sheet_real_select_range (GtkSheet * sheet, - const GtkSheetRange * range) +gtk_sheet_real_select_range (GtkSheet *sheet, + const GtkSheetRange *range) { gint state; @@ -3666,6 +3117,7 @@ gtk_sheet_real_select_range (GtkSheet * sheet, state = sheet->state; +#if 0 if (range->coli != sheet->range.coli || range->col0 != sheet->range.col0 || range->rowi != sheet->range.rowi || range->row0 != sheet->range.row0) { @@ -3673,9 +3125,9 @@ gtk_sheet_real_select_range (GtkSheet * sheet, } else { - gtk_sheet_draw_backing_pixmap (sheet, sheet->range); gtk_sheet_range_draw_selection (sheet, sheet->range); } +#endif gtk_sheet_update_primary_selection (sheet); @@ -3692,7 +3144,7 @@ gtk_sheet_get_selected_range (GtkSheet *sheet, GtkSheetRange *range) void -gtk_sheet_select_range (GtkSheet * sheet, const GtkSheetRange *range) +gtk_sheet_select_range (GtkSheet *sheet, const GtkSheetRange *range) { g_return_if_fail (sheet != NULL); @@ -3721,7 +3173,7 @@ gtk_sheet_select_range (GtkSheet * sheet, const GtkSheetRange *range) } void -gtk_sheet_unselect_range (GtkSheet * sheet) +gtk_sheet_unselect_range (GtkSheet *sheet) { if (! GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; @@ -3735,7 +3187,7 @@ gtk_sheet_unselect_range (GtkSheet * sheet) static void -gtk_sheet_real_unselect_range (GtkSheet * sheet, +gtk_sheet_real_unselect_range (GtkSheet *sheet, const GtkSheetRange *range) { g_return_if_fail (sheet != NULL); @@ -3750,8 +3202,10 @@ gtk_sheet_real_unselect_range (GtkSheet * sheet, g_signal_emit (sheet, sheet_signals[SELECT_COLUMN], 0, -1); g_signal_emit (sheet, sheet_signals[SELECT_ROW], 0, -1); +#if 0 if (gtk_sheet_range_isvisible (sheet, *range)) gtk_sheet_draw_backing_pixmap (sheet, *range); +#endif sheet->range.row0 = -1; sheet->range.rowi = -1; @@ -3761,8 +3215,8 @@ gtk_sheet_real_unselect_range (GtkSheet * sheet, static gint -gtk_sheet_expose (GtkWidget * widget, - GdkEventExpose * event) +gtk_sheet_expose (GtkWidget *widget, + GdkEventExpose *event) { GtkSheet *sheet; GtkSheetRange range; @@ -3771,65 +3225,75 @@ gtk_sheet_expose (GtkWidget * widget, g_return_val_if_fail (GTK_IS_SHEET (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); - g_print ("%s %p\n", __FUNCTION__, widget); - sheet = GTK_SHEET (widget); - if (GTK_WIDGET_DRAWABLE (widget)) + if (!GTK_WIDGET_DRAWABLE (widget)) + return FALSE; + + /* exposure events on the sheet */ + if (event->window == sheet->row_title_window && + sheet->row_titles_visible) { - range.row0 = yyy_row_ypixel_to_row (sheet, event->area.y); - range.col0 = COLUMN_FROM_XPIXEL (sheet, event->area.x); - range.rowi = yyy_row_ypixel_to_row (sheet, - event->area.y + event->area.height); + gint i; + for (i = min_visible_row (sheet); i <= max_visible_row (sheet); i++) + gtk_sheet_row_title_button_draw (sheet, i); + } - range.coli = COLUMN_FROM_XPIXEL (sheet, - event->area.x + event->area.width); + if (event->window == sheet->column_title_window && + sheet->column_titles_visible) + { + gint i; + for (i = min_visible_column (sheet); + i <= max_visible_column (sheet); + ++i) + gtk_sheet_column_title_button_draw (sheet, i); + } - g_print ("Redrawing rows %d--%d, columns %d--%d\n", - range.row0, range.rowi, range.col0, range.coli); + range.row0 = + yyy_row_ypixel_to_row (sheet, + event->area.y + sheet->vadjustment->value); + range.row0--; - /* exposure events on the sheet */ - if (event->window == sheet->row_title_window && - sheet->row_titles_visible) - { - gint i; - for (i = MIN_VISIBLE_ROW (sheet); i <= MAX_VISIBLE_ROW (sheet); i++) - gtk_sheet_row_title_button_draw (sheet, i); - } + range.rowi = + yyy_row_ypixel_to_row (sheet, + event->area.y + + event->area.height + sheet->vadjustment->value); + range.rowi++; - if (event->window == sheet->column_title_window && - sheet->column_titles_visible) - { - gint i; - for (i = MIN_VISIBLE_COLUMN (sheet); - i <= MAX_VISIBLE_COLUMN (sheet); - ++i) - gtk_sheet_column_title_button_draw (sheet, i); - } + range.col0 = + column_from_xpixel (sheet, + event->area.x + sheet->hadjustment->value); + range.col0--; + + range.coli = + column_from_xpixel (sheet, + event->area.x + event->area.width + + sheet->hadjustment->value); + range.coli++; - if (event->window == sheet->sheet_window) + if (event->window == sheet->sheet_window) + { + gtk_sheet_range_draw (sheet, &range); + + if (sheet->state != GTK_SHEET_NORMAL) { - gtk_sheet_draw_backing_pixmap (sheet, range); + if (gtk_sheet_range_isvisible (sheet, sheet->range)) + gtk_sheet_range_draw (sheet, &sheet->range); - if (sheet->state != GTK_SHEET_NORMAL) - { - if (gtk_sheet_range_isvisible (sheet, sheet->range)) - gtk_sheet_draw_backing_pixmap (sheet, sheet->range); - if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet)) - gtk_sheet_draw_backing_pixmap (sheet, sheet->drag_range); - - if (gtk_sheet_range_isvisible (sheet, sheet->range)) - gtk_sheet_range_draw_selection (sheet, sheet->range); - if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet)) - draw_xor_rectangle (sheet, sheet->drag_range); - } + if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet)) + gtk_sheet_range_draw (sheet, &sheet->drag_range); - 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_range_isvisible (sheet, sheet->range)) + gtk_sheet_range_draw_selection (sheet, sheet->range); + if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet)) + draw_xor_rectangle (sheet, sheet->drag_range); + } + + if ((!GTK_SHEET_IN_XDRAG (sheet)) && (!GTK_SHEET_IN_YDRAG (sheet))) + { + if (sheet->state == GTK_SHEET_NORMAL) + gtk_sheet_draw_active_cell (sheet); } } @@ -3843,12 +3307,13 @@ gtk_sheet_expose (GtkWidget * widget, static gboolean -gtk_sheet_button_press (GtkWidget * widget, - GdkEventButton * event) +gtk_sheet_button_press (GtkWidget *widget, + GdkEventButton *event) { GtkSheet *sheet; GdkModifierType mods; - gint x, y, row, column; + gint x, y; + gint row, column; gboolean veto; g_return_val_if_fail (widget != NULL, FALSE); @@ -4029,7 +3494,7 @@ gtk_sheet_button_press (GtkWidget * widget, } else { - gtk_sheet_click_cell (sheet, row, column, &veto); + veto = gtk_sheet_click_cell (sheet, row, column); if (veto) GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); } } @@ -4042,11 +3507,11 @@ gtk_sheet_button_press (GtkWidget * widget, x += sheet->hadjustment->value; - column = COLUMN_FROM_XPIXEL (sheet, x); + column = column_from_xpixel (sheet, x); if (g_sheet_column_get_sensitivity (sheet->column_geometry, column)) { - gtk_sheet_click_cell (sheet, - 1, column, &veto); + veto = gtk_sheet_click_cell (sheet, -1, column); gtk_grab_add (GTK_WIDGET (sheet)); gtk_widget_grab_focus (GTK_WIDGET (sheet)); GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); @@ -4064,7 +3529,7 @@ gtk_sheet_button_press (GtkWidget * widget, row = yyy_row_ypixel_to_row (sheet, y); if (g_sheet_row_get_sensitivity (sheet->row_geometry, row)) { - gtk_sheet_click_cell (sheet, row, - 1, &veto); + veto = gtk_sheet_click_cell (sheet, row, -1); gtk_grab_add (GTK_WIDGET (sheet)); gtk_widget_grab_focus (GTK_WIDGET (sheet)); GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); @@ -4074,108 +3539,89 @@ gtk_sheet_button_press (GtkWidget * widget, return TRUE; } -static void -gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column, gboolean *veto) +static gboolean +gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column) { - *veto = TRUE; + gboolean forbid_move; - 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 >= g_sheet_column_get_column_count (sheet->column_geometry)) { - *veto = FALSE; - return; - } - - if (column >= 0 && row >= 0) - { - if (! g_sheet_column_get_visibility (sheet->column_geometry, column) - || !g_sheet_row_get_visibility (sheet->row_geometry, row)) - { - *veto = FALSE; - return; - } + return FALSE; } - _gtkextra_signal_emit (GTK_OBJECT (sheet), sheet_signals[TRAVERSE], - sheet->active_cell.row, sheet->active_cell.col, - &row, &column, veto); + g_signal_emit (sheet, sheet_signals[TRAVERSE], 0, + sheet->active_cell.row, sheet->active_cell.col, + &row, &column, &forbid_move); - if (!*veto) + if (forbid_move) { - if (sheet->state == GTK_STATE_NORMAL) return; + if (sheet->state == GTK_STATE_NORMAL) + return FALSE; row = sheet->active_cell.row; column = sheet->active_cell.col; gtk_sheet_activate_cell (sheet, row, column); - return; + return FALSE; } if (row == -1 && column >= 0) { - if (gtk_sheet_autoscroll (sheet)) - gtk_sheet_move_query (sheet, row, column); gtk_sheet_select_column (sheet, column); - return; + return TRUE; } + if (column == -1 && row >= 0) { - if (gtk_sheet_autoscroll (sheet)) - gtk_sheet_move_query (sheet, row, column); gtk_sheet_select_row (sheet, row); - return; + return TRUE; } - if (row == - 1 && column == - 1) + if (row == -1 && column == -1) { sheet->range.row0 = 0; sheet->range.col0 = 0; sheet->range.rowi = g_sheet_row_get_row_count (sheet->row_geometry) - 1; - sheet->range.coli = g_sheet_column_get_column_count (sheet->column_geometry) - 1; + sheet->range.coli = + g_sheet_column_get_column_count (sheet->column_geometry) - 1; sheet->active_cell.row = 0; sheet->active_cell.col = 0; gtk_sheet_select_range (sheet, NULL); - return; + return TRUE; } - if (row != -1 && column != -1) + if (sheet->state != GTK_SHEET_NORMAL) { - if (sheet->state != GTK_SHEET_NORMAL) - { - sheet->state = GTK_SHEET_NORMAL; - gtk_sheet_real_unselect_range (sheet, NULL); - } - else - { - gtk_sheet_deactivate_cell (sheet); - gtk_sheet_activate_cell (sheet, row, column); - } - - if (gtk_sheet_autoscroll (sheet)) - gtk_sheet_move_query (sheet, row, column); - sheet->active_cell.row = row; - sheet->active_cell.col = column; - sheet->selection_cell.row = row; - sheet->selection_cell.col = column; - sheet->range.row0 = row; - sheet->range.col0 = column; - sheet->range.rowi = row; - sheet->range.coli = column; sheet->state = GTK_SHEET_NORMAL; - GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); - gtk_sheet_draw_active_cell (sheet); - return; + gtk_sheet_real_unselect_range (sheet, NULL); + } + else + { + gtk_sheet_deactivate_cell (sheet); + gtk_sheet_activate_cell (sheet, row, column); } - g_assert_not_reached (); - gtk_sheet_activate_cell (sheet, sheet->active_cell.row, - sheet->active_cell.col); + sheet->active_cell.row = row; + sheet->active_cell.col = column; + sheet->selection_cell.row = row; + sheet->selection_cell.col = column; + sheet->range.row0 = row; + sheet->range.col0 = column; + sheet->range.rowi = row; + sheet->range.coli = column; + sheet->state = GTK_SHEET_NORMAL; + GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); + gtk_sheet_draw_active_cell (sheet); + return TRUE; } static gint -gtk_sheet_button_release (GtkWidget * widget, - GdkEventButton * event) +gtk_sheet_button_release (GtkWidget *widget, + GdkEventButton *event) { gint y; + GdkDisplay *display = gtk_widget_get_display (widget); GtkSheet *sheet = GTK_SHEET (widget); @@ -4187,7 +3633,7 @@ gtk_sheet_button_release (GtkWidget * widget, GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_XDRAG); GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); - gdk_pointer_ungrab (event->time); + gdk_display_pointer_ungrab (display, event->time); draw_xor_vline (sheet); width = new_column_width (sheet, sheet->drag_cell.col, &xpos); @@ -4201,7 +3647,7 @@ gtk_sheet_button_release (GtkWidget * widget, GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_YDRAG); GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); gtk_widget_get_pointer (widget, NULL, &y); - gdk_pointer_ungrab (event->time); + gdk_display_pointer_ungrab (display, event->time); draw_xor_hline (sheet); gtk_sheet_set_row_height (sheet, sheet->drag_cell.row, @@ -4216,7 +3662,7 @@ gtk_sheet_button_release (GtkWidget * widget, GtkSheetRange old_range; draw_xor_rectangle (sheet, sheet->drag_range); GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_DRAG); - gdk_pointer_ungrab (event->time); + gdk_display_pointer_ungrab (display, event->time); gtk_sheet_real_unselect_range (sheet, NULL); @@ -4241,7 +3687,7 @@ gtk_sheet_button_release (GtkWidget * widget, GtkSheetRange old_range; draw_xor_rectangle (sheet, sheet->drag_range); GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_RESIZE); - gdk_pointer_ungrab (event->time); + gdk_display_pointer_ungrab (display, event->time); gtk_sheet_real_unselect_range (sheet, NULL); @@ -4270,13 +3716,13 @@ gtk_sheet_button_release (GtkWidget * widget, if (sheet->state == GTK_SHEET_NORMAL && GTK_SHEET_IN_SELECTION (sheet)) { GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); - gdk_pointer_ungrab (event->time); + gdk_display_pointer_ungrab (display, event->time); gtk_sheet_activate_cell (sheet, sheet->active_cell.row, sheet->active_cell.col); } if (GTK_SHEET_IN_SELECTION) - gdk_pointer_ungrab (event->time); + gdk_display_pointer_ungrab (display, event->time); gtk_grab_remove (GTK_WIDGET (sheet)); GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); @@ -4287,6 +3733,7 @@ gtk_sheet_button_release (GtkWidget * widget, + /* Shamelessly lifted from gtktooltips */ static gboolean gtk_sheet_subtitle_paint_window (GtkWidget *tip_window) @@ -4424,7 +3871,7 @@ motion_timeout_callback (gpointer data) text = g_sheet_column_get_subtitle (col_geo, column); - show_subtitle (sheet, -1, column, text ); + show_subtitle (sheet, -1, column, text); g_free (text); } @@ -4441,6 +3888,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) GdkCursorType new_cursor; gint x, y; gint row, column; + GdkDisplay *display; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_SHEET (widget), FALSE); @@ -4448,6 +3896,8 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) sheet = GTK_SHEET (widget); + display = gtk_widget_get_display (widget); + /* selections on the sheet */ x = event->x; y = event->y; @@ -4467,7 +3917,8 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) if ( gtk_sheet_get_pixel_info (sheet, wx, wy, &row, &column) ) { - if ( row != sheet->hover_window->row || column != sheet->hover_window->column) + if ( row != sheet->hover_window->row || + column != sheet->hover_window->column) { gtk_widget_hide (sheet->hover_window->window); } @@ -4484,7 +3935,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) if (new_cursor != sheet->cursor_drag->type) { gdk_cursor_unref (sheet->cursor_drag); - sheet->cursor_drag = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW); + sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_SB_H_DOUBLE_ARROW); gdk_window_set_cursor (sheet->column_title_window, sheet->cursor_drag); } @@ -4496,7 +3947,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) new_cursor != sheet->cursor_drag->type) { gdk_cursor_unref (sheet->cursor_drag); - sheet->cursor_drag = gdk_cursor_new (GDK_TOP_LEFT_ARROW); + sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_TOP_LEFT_ARROW); gdk_window_set_cursor (sheet->column_title_window, sheet->cursor_drag); } @@ -4512,7 +3963,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) if (new_cursor != sheet->cursor_drag->type) { gdk_cursor_unref (sheet->cursor_drag); - sheet->cursor_drag = gdk_cursor_new (GDK_SB_V_DOUBLE_ARROW); + sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_SB_V_DOUBLE_ARROW); gdk_window_set_cursor (sheet->row_title_window, sheet->cursor_drag); } } @@ -4523,7 +3974,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) new_cursor != sheet->cursor_drag->type) { gdk_cursor_unref (sheet->cursor_drag); - sheet->cursor_drag = gdk_cursor_new (GDK_TOP_LEFT_ARROW); + sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_TOP_LEFT_ARROW); gdk_window_set_cursor (sheet->row_title_window, sheet->cursor_drag); } } @@ -4538,7 +3989,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) new_cursor != sheet->cursor_drag->type) { gdk_cursor_unref (sheet->cursor_drag); - sheet->cursor_drag = gdk_cursor_new (GDK_PLUS); + sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_PLUS); gdk_window_set_cursor (sheet->sheet_window, sheet->cursor_drag); } @@ -4551,7 +4002,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) new_cursor != sheet->cursor_drag->type) { gdk_cursor_unref (sheet->cursor_drag); - sheet->cursor_drag = gdk_cursor_new (GDK_TOP_LEFT_ARROW); + sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_TOP_LEFT_ARROW); gdk_window_set_cursor (sheet->sheet_window, sheet->cursor_drag); } @@ -4564,7 +4015,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) new_cursor != sheet->cursor_drag->type) { gdk_cursor_unref (sheet->cursor_drag); - sheet->cursor_drag = gdk_cursor_new (GDK_SIZING); + sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_SIZING); gdk_window_set_cursor (sheet->sheet_window, sheet->cursor_drag); } @@ -4574,7 +4025,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) if (GTK_SHEET_IN_XDRAG (sheet)) { - x = event->x; + x = event->x; new_column_width (sheet, sheet->drag_cell.col, &x); #if 0 @@ -4608,7 +4059,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) if (GTK_SHEET_IN_DRAG (sheet)) { GtkSheetRange aux; - column = COLUMN_FROM_XPIXEL (sheet, x)- sheet->drag_cell.col; + column = column_from_xpixel (sheet, x)- sheet->drag_cell.col; row = yyy_row_ypixel_to_row (sheet, y) - sheet->drag_cell.row; if (sheet->state == GTK_SHEET_COLUMN_SELECTED) row = 0; if (sheet->state == GTK_SHEET_ROW_SELECTED) column = 0; @@ -4638,17 +4089,17 @@ 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 - COLUMN_LEFT_XPIXEL (sheet, sheet->drag_cell.col)) > + if (abs (x - g_sheet_column_start_pixel (sheet->column_geometry, 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); + current_col = column_from_xpixel (sheet, x); current_row = yyy_row_ypixel_to_row (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) + + col_threshold = g_sheet_column_start_pixel (sheet->column_geometry, current_col) + g_sheet_column_get_width (sheet->column_geometry, current_col) / 2; if (column > 0) { @@ -4736,7 +4187,7 @@ gtk_sheet_crossing_notify (GtkWidget *widget, static gboolean gtk_sheet_move_query (GtkSheet *sheet, gint row, gint column) { - guint height, width; + gint height, width; gint new_row = row; gint new_col = column; @@ -4745,15 +4196,18 @@ gtk_sheet_move_query (GtkSheet *sheet, gint row, gint column) gfloat row_align = -1.0; gfloat col_align = -1.0; - height = sheet->sheet_window_height; - width = sheet->sheet_window_width; + 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) + 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 && + 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) { @@ -4761,25 +4215,26 @@ 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 (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) && - COLUMN_LEFT_XPIXEL (sheet, g_sheet_column_get_column_count (sheet->column_geometry) - 1) + + 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) + if (column < min_visible_column (sheet) && sheet->state != GTK_SHEET_ROW_SELECTED) { col_align = 0.0; column_move = TRUE; @@ -4857,266 +4312,178 @@ gtk_sheet_entry_key_press (GtkWidget *widget, return focus; } -static gint -gtk_sheet_key_press (GtkWidget *widget, - GdkEventKey *key) + +/* Number of rows in a step-increment */ +#define ROWS_PER_STEP 1 + + +static void +page_vertical (GtkSheet *sheet, GtkScrollType dir) { - GtkSheet *sheet; - gint row, col; - gint state; - gboolean extend_selection = FALSE; - gboolean force_move = FALSE; - gboolean in_selection = FALSE; - gboolean veto = TRUE; - gint scroll = 1; + gint old_row = sheet->active_cell.row ; + glong vpixel = g_sheet_row_start_pixel (sheet->row_geometry, old_row); - sheet = GTK_SHEET (widget); + gint new_row; - if (key->state & GDK_CONTROL_MASK || key->keyval == GDK_Control_L || - key->keyval == GDK_Control_R) return FALSE; + vpixel -= g_sheet_row_start_pixel (sheet->row_geometry, + min_visible_row (sheet)); - extend_selection = (key->state & GDK_SHIFT_MASK) || key->keyval == GDK_Shift_L - || key->keyval == GDK_Shift_R; + switch ( dir) + { + case GTK_SCROLL_PAGE_DOWN: + gtk_adjustment_set_value (sheet->vadjustment, + sheet->vadjustment->value + + sheet->vadjustment->page_increment); + break; + case GTK_SCROLL_PAGE_UP: + gtk_adjustment_set_value (sheet->vadjustment, + sheet->vadjustment->value - + sheet->vadjustment->page_increment); + + break; + default: + g_assert_not_reached (); + break; + } + + + vpixel += g_sheet_row_start_pixel (sheet->row_geometry, + min_visible_row (sheet)); + + new_row = yyy_row_ypixel_to_row (sheet, vpixel); + + gtk_sheet_activate_cell (sheet, new_row, + sheet->active_cell.col); +} + + +static void +step_horizontal (GtkSheet *sheet, GtkScrollType dir) +{ + switch ( dir) + { + case GTK_SCROLL_STEP_RIGHT: + + gtk_sheet_activate_cell (sheet, + sheet->active_cell.row, + sheet->active_cell.col + 1); + break; + case GTK_SCROLL_STEP_LEFT: + + gtk_sheet_activate_cell (sheet, + sheet->active_cell.row, + sheet->active_cell.col - 1); + break; + + default: + g_assert_not_reached (); + break; + } + + if ( sheet->active_cell.col >= max_visible_column (sheet)) + { + glong hpos = + g_sheet_column_start_pixel (sheet->column_geometry, + sheet->active_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)) + { + glong hpos = + g_sheet_column_start_pixel (sheet->column_geometry, + sheet->active_cell.col); + + gtk_adjustment_set_value (sheet->hadjustment, + hpos); + } +} + +static gboolean +gtk_sheet_key_press (GtkWidget *widget, + GdkEventKey *key) +{ + GtkSheet *sheet = GTK_SHEET (widget); - state = sheet->state; - in_selection = GTK_SHEET_IN_SELECTION (sheet); GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); switch (key->keyval) { - case GDK_Return: case GDK_KP_Enter: - if (sheet->state == GTK_SHEET_NORMAL && - !GTK_SHEET_IN_SELECTION (sheet)) - 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) - row = MIN_VISIBLE_ROW (sheet)- 1; - if (sheet->state == GTK_SHEET_ROW_SELECTED) - col = MIN_VISIBLE_COLUMN (sheet); - if (row < g_sheet_row_get_row_count (sheet->row_geometry) - 1) - { - row = row + scroll; - while (!g_sheet_row_get_visibility (sheet->row_geometry, row) && row < g_sheet_row_get_row_count (sheet->row_geometry) - 1) - row++; - } - gtk_sheet_click_cell (sheet, row, col, &veto); - extend_selection = FALSE; + case GDK_Tab: + case GDK_Right: + step_horizontal (sheet, GTK_SCROLL_STEP_RIGHT); break; case GDK_ISO_Left_Tab: - row = sheet->active_cell.row; - col = sheet->active_cell.col; - if (sheet->state == GTK_SHEET_ROW_SELECTED) - col = MIN_VISIBLE_COLUMN (sheet)- 1; - if (sheet->state == GTK_SHEET_COLUMN_SELECTED) - row = MIN_VISIBLE_ROW (sheet); - if (col > 0) - { - col = col - scroll; - while (! g_sheet_column_get_visibility (sheet->column_geometry, col) && col > 0) col--; - col = MAX (0, col); - } - gtk_sheet_click_cell (sheet, row, col, &veto); - extend_selection = FALSE; + case GDK_Left: + step_horizontal (sheet, GTK_SCROLL_STEP_LEFT); break; - case GDK_Tab: - row = sheet->active_cell.row; - col = sheet->active_cell.col; - if (sheet->state == GTK_SHEET_ROW_SELECTED) - col = MIN_VISIBLE_COLUMN (sheet)- 1; - if (sheet->state == GTK_SHEET_COLUMN_SELECTED) - row = MIN_VISIBLE_ROW (sheet); - if (col < g_sheet_column_get_column_count (sheet->column_geometry) - 1) - { - col = col + scroll; - while (! g_sheet_column_get_visibility (sheet->column_geometry, col) && - col < g_sheet_column_get_column_count (sheet->column_geometry) - 1) - col++; - } - gtk_sheet_click_cell (sheet, row, col, &veto); - extend_selection = FALSE; + + case GDK_Return: + case GDK_Down: + gtk_sheet_activate_cell (sheet, + sheet->active_cell.row + ROWS_PER_STEP, + sheet->active_cell.col); + + if ( sheet->active_cell.row >= max_visible_row (sheet)) + gtk_adjustment_set_value (sheet->vadjustment, + sheet->vadjustment->value + + sheet->vadjustment->step_increment); break; - case GDK_Page_Up: - scroll = MAX_VISIBLE_ROW (sheet)- MIN_VISIBLE_ROW (sheet)+1; case GDK_Up: - if (extend_selection) - { - if (state == GTK_STATE_NORMAL) - { - row = sheet->active_cell.row; - col = sheet->active_cell.col; - gtk_sheet_click_cell (sheet, row, col, &veto); - if (!veto) break; - } - if (sheet->selection_cell.row > 0) - { - row = sheet->selection_cell.row - scroll; - while (!g_sheet_row_get_visibility (sheet->row_geometry, row) && row > 0) row--; - row = MAX (0, row); - gtk_sheet_extend_selection (sheet, row, sheet->selection_cell.col); - } - return TRUE; - } - col = sheet->active_cell.col; - row = sheet->active_cell.row; - if (state == GTK_SHEET_COLUMN_SELECTED) - row = MIN_VISIBLE_ROW (sheet); - if (state == GTK_SHEET_ROW_SELECTED) - col = MIN_VISIBLE_COLUMN (sheet); - row = row - scroll; - while (!g_sheet_row_get_visibility (sheet->row_geometry, row) && row > 0) row--; - row = MAX (0, row); - gtk_sheet_click_cell (sheet, row, col, &veto); - extend_selection = FALSE; + gtk_sheet_activate_cell (sheet, + sheet->active_cell.row - ROWS_PER_STEP, + sheet->active_cell.col); + + if ( sheet->active_cell.row < min_visible_row (sheet)) + gtk_adjustment_set_value (sheet->vadjustment, + sheet->vadjustment->value - + sheet->vadjustment->step_increment); break; + case GDK_Page_Down: - scroll = MAX_VISIBLE_ROW (sheet)- MIN_VISIBLE_ROW (sheet)+1; - case GDK_Down: - if (extend_selection) - { - if (state == GTK_STATE_NORMAL) - { - row = sheet->active_cell.row; - col = sheet->active_cell.col; - gtk_sheet_click_cell (sheet, row, col, &veto); - if (!veto) break; - } - if (sheet->selection_cell.row < g_sheet_row_get_row_count (sheet->row_geometry) - 1) - { - row = sheet->selection_cell.row + scroll; - while (!g_sheet_row_get_visibility (sheet->row_geometry, row) && row < g_sheet_row_get_row_count (sheet->row_geometry) - 1) row++; - row = MIN (g_sheet_row_get_row_count (sheet->row_geometry) - 1, row); - gtk_sheet_extend_selection (sheet, row, sheet->selection_cell.col); - } - return TRUE; - } - col = sheet->active_cell.col; - row = sheet->active_cell.row; - if (sheet->active_cell.row < g_sheet_row_get_row_count (sheet->row_geometry) - 1) - { - if (state == GTK_SHEET_COLUMN_SELECTED) - row = MIN_VISIBLE_ROW (sheet)- 1; - if (state == GTK_SHEET_ROW_SELECTED) - col = MIN_VISIBLE_COLUMN (sheet); - row = row + scroll; - while (!g_sheet_row_get_visibility (sheet->row_geometry, row) && row < g_sheet_row_get_row_count (sheet->row_geometry) - 1) row++; - row = MIN (g_sheet_row_get_row_count (sheet->row_geometry) - 1, row); - } - gtk_sheet_click_cell (sheet, row, col, &veto); - extend_selection = FALSE; - break; - case GDK_Right: - if (extend_selection) - { - if (state == GTK_STATE_NORMAL) - { - row = sheet->active_cell.row; - col = sheet->active_cell.col; - gtk_sheet_click_cell (sheet, row, col, &veto); - if (!veto) break; - } - if (sheet->selection_cell.col < g_sheet_column_get_column_count (sheet->column_geometry) - 1) - { - col = sheet->selection_cell.col + 1; - while (! g_sheet_column_get_visibility (sheet->column_geometry, col) && col < g_sheet_column_get_column_count (sheet->column_geometry) - 1) - col++; - gtk_sheet_extend_selection (sheet, sheet->selection_cell.row, col); - } - return TRUE; - } - col = sheet->active_cell.col; - row = sheet->active_cell.row; - if (sheet->active_cell.col < g_sheet_column_get_column_count (sheet->column_geometry) - 1) - { - col ++; - if (state == GTK_SHEET_ROW_SELECTED) - col = MIN_VISIBLE_COLUMN (sheet)- 1; - if (state == GTK_SHEET_COLUMN_SELECTED) - row = MIN_VISIBLE_ROW (sheet); - while (! g_sheet_column_get_visibility (sheet->column_geometry, col) && col < g_sheet_column_get_column_count (sheet->column_geometry) - 1) col++; - if (strlen (gtk_entry_get_text (GTK_ENTRY (gtk_sheet_get_entry (sheet)))) == 0 - || force_move) - { - gtk_sheet_click_cell (sheet, row, col, &veto); - } - else - return FALSE; - } - extend_selection = FALSE; + page_vertical (sheet, GTK_SCROLL_PAGE_DOWN); break; - case GDK_Left: - if (extend_selection) - { - if (state == GTK_STATE_NORMAL) - { - row = sheet->active_cell.row; - col = sheet->active_cell.col; - gtk_sheet_click_cell (sheet, row, col, &veto); - if (!veto) break; - } - if (sheet->selection_cell.col > 0) - { - col = sheet->selection_cell.col - 1; - while (! g_sheet_column_get_visibility (sheet->column_geometry, col) && col > 0) col--; - gtk_sheet_extend_selection (sheet, sheet->selection_cell.row, col); - } - return TRUE; - } - col = sheet->active_cell.col - 1; - row = sheet->active_cell.row; - if (state == GTK_SHEET_ROW_SELECTED) - col = MIN_VISIBLE_COLUMN (sheet)- 1; - if (state == GTK_SHEET_COLUMN_SELECTED) - row = MIN_VISIBLE_ROW (sheet); - while (! g_sheet_column_get_visibility (sheet->column_geometry, col) && col > 0) col--; - col = MAX (0, col); - - if (strlen (gtk_entry_get_text (GTK_ENTRY (gtk_sheet_get_entry (sheet)))) == 0 - || force_move) - { - gtk_sheet_click_cell (sheet, row, col, &veto); - } - else - return FALSE; - extend_selection = FALSE; + case GDK_Page_Up: + page_vertical (sheet, GTK_SCROLL_PAGE_UP); break; + case GDK_Home: - row = 0; - while (!g_sheet_row_get_visibility (sheet->row_geometry, row) && row < g_sheet_row_get_row_count (sheet->row_geometry) - 1) row++; - gtk_sheet_click_cell (sheet, row, sheet->active_cell.col, &veto); - extend_selection = FALSE; + gtk_adjustment_set_value (sheet->vadjustment, + sheet->vadjustment->lower); + + gtk_sheet_activate_cell (sheet, 0, + sheet->active_cell.col); + break; + case GDK_End: - row = g_sheet_row_get_row_count (sheet->row_geometry) - 1; - while (!g_sheet_row_get_visibility (sheet->row_geometry, row) && row > 0) row--; - gtk_sheet_click_cell (sheet, row, sheet->active_cell.col, &veto); - extend_selection = FALSE; + gtk_adjustment_set_value (sheet->vadjustment, + sheet->vadjustment->upper - + sheet->vadjustment->page_size - + sheet->vadjustment->page_increment); + + /* + gtk_sheet_activate_cell (sheet, + g_sheet_row_get_row_count (sheet->row_geometry) - 1, + sheet->active_cell.col); + */ + break; + case GDK_Delete: + gtk_sheet_real_cell_clear (sheet, sheet->active_cell.row, sheet->active_cell.col); break; default: - if (in_selection) - { - GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); - if (extend_selection) return TRUE; - } - if (state == GTK_SHEET_ROW_SELECTED) - sheet->active_cell.col = MIN_VISIBLE_COLUMN (sheet); - if (state == GTK_SHEET_COLUMN_SELECTED) - sheet->active_cell.row = MIN_VISIBLE_ROW (sheet); return FALSE; + break; } - if (extend_selection) return TRUE; - - gtk_sheet_activate_cell (sheet, sheet->active_cell.row, - sheet->active_cell.col); - return TRUE; } static void -gtk_sheet_size_request (GtkWidget * widget, - GtkRequisition * requisition) +gtk_sheet_size_request (GtkWidget *widget, + GtkRequisition *requisition) { GtkSheet *sheet; @@ -5126,8 +4493,8 @@ gtk_sheet_size_request (GtkWidget * widget, sheet = GTK_SHEET (widget); - requisition->width = 3*DEFAULT_COLUMN_WIDTH; - requisition->height = 3*DEFAULT_ROW_HEIGHT (widget); + requisition->width = 3 * DEFAULT_COLUMN_WIDTH; + requisition->height = 3 * default_row_height (sheet); /* compute the size of the column title area */ if (sheet->column_titles_visible) @@ -5140,8 +4507,8 @@ gtk_sheet_size_request (GtkWidget * widget, static void -gtk_sheet_size_allocate (GtkWidget * widget, - GtkAllocation * allocation) +gtk_sheet_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) { GtkSheet *sheet; GtkAllocation sheet_allocation; @@ -5175,9 +4542,6 @@ gtk_sheet_size_allocate (GtkWidget * widget, sheet_allocation.width = allocation->width - 2 * border_width; sheet_allocation.height = allocation->height - 2 * border_width; - sheet->sheet_window_width = sheet_allocation.width; - sheet->sheet_window_height = sheet_allocation.height; - if (GTK_WIDGET_REALIZED (widget)) gdk_window_move_resize (sheet->sheet_window, sheet_allocation.x, @@ -5191,8 +4555,7 @@ gtk_sheet_size_allocate (GtkWidget * widget, if (sheet->row_titles_visible) { - sheet->column_title_area.x = sheet->row_title_area.width; - sheet->sheet_window_width -= sheet->row_title_area.width; + sheet->column_title_area.x = sheet->row_title_area.width; } sheet->column_title_area.width = sheet_allocation.width ; @@ -5207,15 +4570,14 @@ gtk_sheet_size_allocate (GtkWidget * widget, /* column button allocation */ - size_allocate_column_title_buttons (sheet); + draw_column_title_buttons (sheet); /* position the window which holds the row title buttons */ sheet->row_title_area.x = 0; sheet->row_title_area.y = 0; if (sheet->column_titles_visible) { - sheet->row_title_area.y = sheet->column_title_area.height; - sheet->sheet_window_height -= sheet->column_title_area.height; + sheet->row_title_area.y = sheet->column_title_area.height; } sheet->row_title_area.height = sheet_allocation.height - @@ -5230,18 +4592,15 @@ gtk_sheet_size_allocate (GtkWidget * widget, /* row button allocation */ - size_allocate_row_title_buttons (sheet); - size_allocate_column_title_buttons (sheet); - - /* re - scale backing pixmap */ - gtk_sheet_make_backing_pixmap (sheet); + draw_row_title_buttons (sheet); + draw_column_title_buttons (sheet); /* set the scrollbars adjustments */ adjust_scrollbars (sheet); } static void -size_allocate_column_title_buttons (GtkSheet * sheet) +draw_column_title_buttons (GtkSheet *sheet) { gint i; gint x, width; @@ -5250,8 +4609,7 @@ size_allocate_column_title_buttons (GtkSheet * sheet) if (!GTK_WIDGET_REALIZED (sheet)) return; - - width = sheet->sheet_window_width; + gdk_drawable_get_size (sheet->sheet_window, &width, NULL); x = 0; if (sheet->row_titles_visible) @@ -5270,7 +4628,8 @@ size_allocate_column_title_buttons (GtkSheet * sheet) sheet->column_title_area.height); } - if (MAX_VISIBLE_COLUMN (sheet) == g_sheet_column_get_column_count (sheet->column_geometry) - 1) + if (max_visible_column (sheet) == + g_sheet_column_get_column_count (sheet->column_geometry) - 1) gdk_window_clear_area (sheet->column_title_window, 0, 0, sheet->column_title_area.width, @@ -5280,22 +4639,22 @@ size_allocate_column_title_buttons (GtkSheet * sheet) size_allocate_global_button (sheet); - for (i = MIN_VISIBLE_COLUMN (sheet); i <= MAX_VISIBLE_COLUMN (sheet); i++) + for (i = min_visible_column (sheet); i <= max_visible_column (sheet); i++) gtk_sheet_column_title_button_draw (sheet, i); } static void -size_allocate_row_title_buttons (GtkSheet * sheet) +draw_row_title_buttons (GtkSheet *sheet) { gint i; - gint y, height; + gint y = 0; + gint height; if (!sheet->row_titles_visible) return; if (!GTK_WIDGET_REALIZED (sheet)) return; - height = sheet->sheet_window_height; - y = 0; + gdk_drawable_get_size (sheet->sheet_window, NULL, &height); if (sheet->column_titles_visible) { @@ -5312,7 +4671,8 @@ size_allocate_row_title_buttons (GtkSheet * sheet) sheet->row_title_area.width, sheet->row_title_area.height); } - if (MAX_VISIBLE_ROW (sheet) == g_sheet_row_get_row_count (sheet->row_geometry) - 1) + + if (max_visible_row (sheet) == g_sheet_row_get_row_count (sheet->row_geometry) - 1) gdk_window_clear_area (sheet->row_title_window, 0, 0, sheet->row_title_area.width, @@ -5322,7 +4682,7 @@ size_allocate_row_title_buttons (GtkSheet * sheet) size_allocate_global_button (sheet); - for (i = MIN_VISIBLE_ROW (sheet); i <= MAX_VISIBLE_ROW (sheet); i++) + for (i = min_visible_row (sheet); i <= max_visible_row (sheet); i++) { if ( i >= g_sheet_row_get_row_count (sheet->row_geometry)) break; @@ -5334,13 +4694,10 @@ size_allocate_row_title_buttons (GtkSheet * sheet) static void gtk_sheet_size_allocate_entry (GtkSheet *sheet) { - GtkAllocation shentry_allocation; + GtkAllocation entry_alloc; GtkSheetCellAttr attributes = { 0 }; GtkEntry *sheet_entry; - GtkStyle *style = NULL, *previous_style = NULL; - gint row, col; - gint size, max_size, text_size, column_width; - const gchar *text; + if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; if (!GTK_WIDGET_MAPPED (GTK_WIDGET (sheet))) return; @@ -5352,14 +4709,12 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) &attributes) ) return ; + gtk_widget_ensure_style (GTK_WIDGET (sheet_entry)); + if ( GTK_WIDGET_REALIZED (sheet->entry_widget) ) { - if (!GTK_WIDGET (sheet_entry)->style) - gtk_widget_ensure_style (GTK_WIDGET (sheet_entry)); + GtkStyle *style = GTK_WIDGET (sheet_entry)->style; - previous_style = GTK_WIDGET (sheet_entry)->style; - - style = gtk_style_copy (previous_style); style->bg[GTK_STATE_NORMAL] = attributes.background; style->fg[GTK_STATE_NORMAL] = attributes.foreground; style->text[GTK_STATE_NORMAL] = attributes.foreground; @@ -5370,157 +4725,14 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) pango_font_description_free (style->font_desc); g_assert (attributes.font_desc); style->font_desc = pango_font_description_copy (attributes.font_desc); - - GTK_WIDGET (sheet_entry)->style = style; - 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->entry_widget)) - { - style->bg[GTK_STATE_NORMAL] = previous_style->bg[GTK_STATE_NORMAL]; - style->fg[GTK_STATE_NORMAL] = previous_style->fg[GTK_STATE_NORMAL]; - style->bg[GTK_STATE_ACTIVE] = previous_style->bg[GTK_STATE_ACTIVE]; - style->fg[GTK_STATE_ACTIVE] = previous_style->fg[GTK_STATE_ACTIVE]; - } - gtk_widget_set_style (GTK_WIDGET (sheet_entry), style); - g_object_unref (style); - } - } - - if (GTK_IS_ITEM_ENTRY (sheet_entry)) - max_size = GTK_ITEM_ENTRY (sheet_entry)->text_max_size; - else - max_size = 0; - - text_size = 0; - text = gtk_entry_get_text (GTK_ENTRY (sheet_entry)); - if (text && strlen (text) > 0) - text_size = STRING_WIDTH (GTK_WIDGET (sheet), attributes.font_desc, text); - - column_width = g_sheet_column_get_width (sheet->column_geometry, sheet->active_cell.col); - - size = MIN (text_size, max_size); - size = MAX (size, column_width - 2 * COLUMN_TITLES_HEIGHT); - - row = sheet->active_cell.row; - col = sheet->active_cell.col; - - shentry_allocation.x = COLUMN_LEFT_XPIXEL (sheet, sheet->active_cell.col); - shentry_allocation.y = g_sheet_row_start_pixel (sheet->row_geometry, sheet->active_cell.row); - if ( sheet->column_titles_visible) - shentry_allocation.y += sheet->column_title_area.height; - - shentry_allocation.y -= sheet->vadjustment->value; - - if ( sheet->row_titles_visible) - shentry_allocation.x += sheet->row_title_area.width; - - shentry_allocation.x -= sheet->hadjustment->value; - - shentry_allocation.width = column_width; - shentry_allocation.height = g_sheet_row_get_height (sheet->row_geometry, sheet->active_cell.row); - - if (GTK_IS_ITEM_ENTRY (sheet->entry_widget)) - { - shentry_allocation.height -= 2 * COLUMN_TITLES_HEIGHT; - shentry_allocation.y += COLUMN_TITLES_HEIGHT; - shentry_allocation.width = size; - - switch (GTK_ITEM_ENTRY (sheet_entry)->justification) - { - case GTK_JUSTIFY_CENTER: - shentry_allocation.x += column_width / 2 - size / 2; - break; - case GTK_JUSTIFY_RIGHT: - shentry_allocation.x += column_width - size - COLUMN_TITLES_HEIGHT; - break; - case GTK_JUSTIFY_LEFT: - case GTK_JUSTIFY_FILL: - shentry_allocation.x += COLUMN_TITLES_HEIGHT; - break; - } - } - - if (!GTK_IS_ITEM_ENTRY (sheet->entry_widget)) - { - shentry_allocation.x += 2; - shentry_allocation.y += 2; - shentry_allocation.width -= MIN (shentry_allocation.width, 3); - shentry_allocation.height -= MIN (shentry_allocation.height, 3); } - gtk_widget_size_allocate (sheet->entry_widget, &shentry_allocation); + rectangle_from_cell (sheet, sheet->active_cell.row, + sheet->active_cell.col, &entry_alloc); - if (previous_style == style) g_object_unref (previous_style); -} - -static void -gtk_sheet_entry_set_max_size (GtkSheet *sheet) -{ - gint i; - gint size = 0; - gint sizel = 0, sizer = 0; - gint row, col; - GtkJustification justification; - gchar *s = NULL; - - row = sheet->active_cell.row; - col = sheet->active_cell.col; - - if ( ! GTK_IS_ITEM_ENTRY (sheet->entry_widget) ) - return; - - justification = GTK_ITEM_ENTRY (sheet->entry_widget)->justification; - - switch (justification) - { - case GTK_JUSTIFY_FILL: - case GTK_JUSTIFY_LEFT: - for (i = col + 1; i <= MAX_VISIBLE_COLUMN (sheet); i++) - { - if ((s = gtk_sheet_cell_get_text (sheet, row, i))) - { - g_free (s); - break; - } - size +=g_sheet_column_get_width (sheet->column_geometry, i); - } - size = MIN (size, sheet->sheet_window_width - COLUMN_LEFT_XPIXEL (sheet, col)); - break; - case GTK_JUSTIFY_RIGHT: - for (i = col - 1; i >= MIN_VISIBLE_COLUMN (sheet); i--) - { - if ((s = gtk_sheet_cell_get_text (sheet, row, i))) - { - g_free (s); - break; - } - size +=g_sheet_column_get_width (sheet->column_geometry, i); - } - break; - case GTK_JUSTIFY_CENTER: - for (i = col + 1; i <= MAX_VISIBLE_COLUMN (sheet); i++) - { - sizer += g_sheet_column_get_width (sheet->column_geometry, i); - } - for (i = col - 1; i >= MIN_VISIBLE_COLUMN (sheet); i--) - { - if ((s = gtk_sheet_cell_get_text (sheet, row, i))) - { - g_free (s); - break; - } - sizel +=g_sheet_column_get_width (sheet->column_geometry, i); - } - size = 2 * MIN (sizel, sizer); - break; - } - - if (size != 0) - size += g_sheet_column_get_width (sheet->column_geometry, col); - GTK_ITEM_ENTRY (sheet->entry_widget)->text_max_size = size; + gtk_widget_set_size_request (sheet->entry_widget, entry_alloc.width, + entry_alloc.height); + gtk_widget_size_allocate (sheet->entry_widget, &entry_alloc); } @@ -5543,7 +4755,7 @@ create_sheet_entry (GtkSheet *sheet) 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 (); + sheet->entry_widget = sheet->entry_container = gtk_entry_new (); } else { @@ -5552,7 +4764,7 @@ create_sheet_entry (GtkSheet *sheet) } else { - sheet->entry_widget = sheet->entry_container = gtk_item_entry_new (); + sheet->entry_widget = sheet->entry_container = gtk_entry_new (); g_object_ref_sink (sheet->entry_container); } @@ -5675,7 +4887,7 @@ gtk_sheet_button_draw (GtkSheet *sheet, GdkWindow *window, if (button->label_visible) { - text_height = DEFAULT_ROW_HEIGHT (GTK_WIDGET (sheet)) - + text_height = default_row_height (sheet) - 2 * COLUMN_TITLES_HEIGHT; gdk_gc_set_clip_rectangle (GTK_WIDGET (sheet)->style->fg_gc[button->state], @@ -5768,14 +4980,13 @@ gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column) if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; if (!sheet->column_titles_visible) return; - if (!g_sheet_column_get_visibility (sheet->column_geometry, column)) return; - if (column < MIN_VISIBLE_COLUMN (sheet)) return; - if (column > MAX_VISIBLE_COLUMN (sheet)) return; + if (column < min_visible_column (sheet)) return; + if (column > max_visible_column (sheet)) return; button = g_sheet_column_get_button (sheet->column_geometry, column); allocation.y = 0; - allocation.x = COLUMN_LEFT_XPIXEL (sheet, column) + CELL_SPACING; + allocation.x = g_sheet_column_start_pixel (sheet->column_geometry, column) + CELL_SPACING; allocation.x -= sheet->hadjustment->value; allocation.height = sheet->column_title_area.height; @@ -5784,7 +4995,7 @@ gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column) gtk_sheet_button_draw (sheet, sheet->column_title_window, button, is_sensitive, allocation); - } +} static void @@ -5798,10 +5009,9 @@ gtk_sheet_row_title_button_draw (GtkSheet *sheet, gint row) if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; if (!sheet->row_titles_visible) return; - if (!g_sheet_row_get_visibility (sheet->row_geometry, row)) return; - if (row < MIN_VISIBLE_ROW (sheet)) return; - if (row > MAX_VISIBLE_ROW (sheet)) return; + if (row < min_visible_row (sheet)) return; + if (row > max_visible_row (sheet)) return; button = g_sheet_row_get_button (sheet->row_geometry, row); allocation.x = 0; @@ -5824,22 +5034,41 @@ gtk_sheet_row_title_button_draw (GtkSheet *sheet, gint row) * hadjustment_value_changed */ static void -adjust_scrollbars (GtkSheet * sheet) +adjust_scrollbars (GtkSheet *sheet) { + gint width, height; + + if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) + return; + + gdk_drawable_get_size (sheet->sheet_window, &width, &height); + if (sheet->vadjustment) { + glong last_row = g_sheet_row_get_row_count (sheet->row_geometry) - 1; + sheet->vadjustment->step_increment = - 1 ; // DEFAULT_ROW_HEIGHT (GTK_WIDGET (sheet)); + ROWS_PER_STEP * + g_sheet_row_get_height (sheet->row_geometry, last_row); sheet->vadjustment->page_increment = - sheet->sheet_window_height - DEFAULT_ROW_HEIGHT (GTK_WIDGET (sheet)); + height - + sheet->column_title_area.height - + g_sheet_row_get_height (sheet->row_geometry, last_row); - sheet->vadjustment->upper = DEFAULT_ROW_HEIGHT (GTK_WIDGET (sheet)) - * g_sheet_row_get_row_count (sheet->row_geometry); + sheet->vadjustment->upper = + g_sheet_row_start_pixel (sheet->row_geometry, last_row) + + + 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 = sheet->sheet_window_height; + sheet->vadjustment->page_size = height; g_signal_emit_by_name (sheet->vadjustment, "changed"); } @@ -5847,9 +5076,9 @@ adjust_scrollbars (GtkSheet * sheet) if (sheet->hadjustment) { gint last_col; - sheet->hadjustment->step_increment = 1 ; //DEFAULT_COLUMN_WIDTH; + sheet->hadjustment->step_increment = 1; - sheet->hadjustment->page_increment = sheet->sheet_window_width ; + sheet->hadjustment->page_increment = width; last_col = g_sheet_column_get_column_count (sheet->column_geometry) - 1; @@ -5859,34 +5088,49 @@ adjust_scrollbars (GtkSheet * sheet) g_sheet_column_get_width (sheet->column_geometry, last_col) ; + if (sheet->row_titles_visible) + sheet->hadjustment->upper += sheet->row_title_area.width; + sheet->hadjustment->lower = 0; - sheet->hadjustment->page_size = sheet->sheet_window_width; + sheet->hadjustment->page_size = width; g_signal_emit_by_name (sheet->hadjustment, "changed"); } } static void -vadjustment_value_changed (GtkAdjustment * adjustment, +vadjustment_value_changed (GtkAdjustment *adjustment, gpointer data) { + GdkRegion *region; GtkSheet *sheet = GTK_SHEET (data); g_return_if_fail (adjustment != NULL); if ( ! GTK_WIDGET_REALIZED (sheet)) return; + gtk_widget_hide (sheet->entry_widget); + + region = + gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->sheet_window)); + + gdk_window_begin_paint_region (sheet->sheet_window, region); + + gtk_sheet_range_draw (sheet, NULL); - size_allocate_row_title_buttons (sheet); + draw_row_title_buttons (sheet); // size_allocate_global_button (sheet); + + gdk_window_end_paint (sheet->sheet_window); } static void -hadjustment_value_changed (GtkAdjustment * adjustment, +hadjustment_value_changed (GtkAdjustment *adjustment, gpointer data) { + GdkRegion *region; GtkSheet *sheet = GTK_SHEET (data); g_return_if_fail (adjustment != NULL); @@ -5894,17 +5138,30 @@ hadjustment_value_changed (GtkAdjustment * adjustment, if ( ! GTK_WIDGET_REALIZED (sheet)) return; gtk_widget_hide (sheet->entry_widget); + + + region = + gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->sheet_window)); + + gdk_window_begin_paint_region (sheet->sheet_window, region); + gtk_sheet_range_draw (sheet, NULL); - size_allocate_column_title_buttons (sheet); + draw_column_title_buttons (sheet); // size_allocate_global_button (sheet); + + gdk_window_end_paint (sheet->sheet_window); } /* COLUMN RESIZING */ static void -draw_xor_vline (GtkSheet * sheet) +draw_xor_vline (GtkSheet *sheet) { + gint height; gint xpos = sheet->x_drag; + gdk_drawable_get_size (sheet->sheet_window, + NULL, &height); + if (sheet->row_titles_visible) xpos += sheet->row_title_area.width; @@ -5913,23 +5170,28 @@ draw_xor_vline (GtkSheet * sheet) xpos, sheet->column_title_area.height, xpos, - sheet->sheet_window_height + CELL_SPACING); + height + CELL_SPACING); } /* ROW RESIZING */ static void -draw_xor_hline (GtkSheet * sheet) +draw_xor_hline (GtkSheet *sheet) { + gint width; gint ypos = sheet->y_drag; + gdk_drawable_get_size (sheet->sheet_window, + &width, NULL); + + if (sheet->column_titles_visible) ypos += sheet->column_title_area.height; gdk_draw_line (GTK_WIDGET (sheet)->window, sheet->xor_gc, sheet->row_title_area.width, ypos, - sheet->sheet_window_width + CELL_SPACING, + width + CELL_SPACING, ypos); } @@ -5941,17 +5203,18 @@ draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range) GdkRectangle clip_area, area; GdkGCValues values; - area.x = COLUMN_LEFT_XPIXEL (sheet, range.col0); + area.x = g_sheet_column_start_pixel (sheet->column_geometry, range.col0); area.y = g_sheet_row_start_pixel (sheet->row_geometry, range.row0); - area.width = COLUMN_LEFT_XPIXEL (sheet, range.coli)- area.x+ + 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.height = g_sheet_row_start_pixel (sheet->row_geometry, range.rowi)- area.y + g_sheet_row_get_height (sheet->row_geometry, range.rowi); clip_area.x = sheet->row_title_area.width; clip_area.y = sheet->column_title_area.height; - clip_area.width = sheet->sheet_window_width; - clip_area.height = sheet->sheet_window_height; + + gdk_drawable_get_size (sheet->sheet_window, + &clip_area.width, &clip_area.height); if (!sheet->row_titles_visible) clip_area.x = 0; if (!sheet->column_titles_visible) clip_area.y = 0; @@ -5978,11 +5241,11 @@ draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range) gdk_gc_set_clip_rectangle (sheet->xor_gc, &clip_area); - gdk_draw_rectangle (sheet->sheet_window, - sheet->xor_gc, - FALSE, - area.x + i, area.y + i, - area.width - 2 * i, area.height - 2 * i); + gdk_draw_rectangle (sheet->sheet_window, + sheet->xor_gc, + FALSE, + area.x + i, area.y + i, + area.width - 2 * i, area.height - 2 * i); gdk_gc_set_clip_rectangle (sheet->xor_gc, NULL); @@ -5998,7 +5261,7 @@ draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range) static guint new_column_width (GtkSheet *sheet, gint column, gint *x) { - gint left_pos = COLUMN_LEFT_XPIXEL (sheet, column) + gint left_pos = g_sheet_column_start_pixel (sheet->column_geometry, column) - sheet->hadjustment->value; gint width = *x - left_pos; @@ -6011,7 +5274,7 @@ new_column_width (GtkSheet *sheet, gint column, gint *x) g_sheet_column_set_width (sheet->column_geometry, column, width); - size_allocate_column_title_buttons (sheet); + draw_column_title_buttons (sheet); return width; } @@ -6042,13 +5305,13 @@ new_row_height (GtkSheet *sheet, gint row, gint *y) height = min_height; g_sheet_row_set_height (sheet->row_geometry, row, height); - size_allocate_row_title_buttons (sheet); + draw_row_title_buttons (sheet); return height; } static void -gtk_sheet_set_column_width (GtkSheet * sheet, +gtk_sheet_set_column_width (GtkSheet *sheet, gint column, guint width) { @@ -6067,7 +5330,7 @@ gtk_sheet_set_column_width (GtkSheet * sheet, if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) { - size_allocate_column_title_buttons (sheet); + draw_column_title_buttons (sheet); adjust_scrollbars (sheet); gtk_sheet_size_allocate_entry (sheet); gtk_sheet_range_draw (sheet, NULL); @@ -6078,8 +5341,8 @@ gtk_sheet_set_column_width (GtkSheet * sheet, -void -gtk_sheet_set_row_height (GtkSheet * sheet, +static void +gtk_sheet_set_row_height (GtkSheet *sheet, gint row, guint height) { @@ -6098,7 +5361,7 @@ gtk_sheet_set_row_height (GtkSheet * sheet, if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)) ) { - size_allocate_row_title_buttons (sheet); + draw_row_title_buttons (sheet); adjust_scrollbars (sheet); gtk_sheet_size_allocate_entry (sheet); gtk_sheet_range_draw (sheet, NULL); @@ -6106,105 +5369,70 @@ gtk_sheet_set_row_height (GtkSheet * sheet, g_signal_emit (sheet, sheet_signals[CHANGED], 0, row, - 1); } + gboolean gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col, - GtkSheetCellAttr *attributes) + GtkSheetCellAttr *attr) { - const GdkColor *fg, *bg; + GdkColor *fg, *bg; const GtkJustification *j ; const PangoFontDescription *font_desc ; const GtkSheetCellBorder *border ; + GdkColormap *colormap; g_return_val_if_fail (sheet != NULL, FALSE); g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); if (row < 0 || col < 0) return FALSE; - init_attributes (sheet, col, attributes); - if ( !sheet->model) - return FALSE; + attr->foreground = GTK_WIDGET (sheet)->style->black; + attr->background = sheet->color[BG_COLOR]; + + attr->border.width = 0; + attr->border.line_style = GDK_LINE_SOLID; + attr->border.cap_style = GDK_CAP_NOT_LAST; + attr->border.join_style = GDK_JOIN_MITER; + attr->border.mask = 0; + attr->border.color = GTK_WIDGET (sheet)->style->black; + attr->font_desc = GTK_WIDGET (sheet)->style->font_desc; - attributes->is_editable = g_sheet_model_is_editable (sheet->model, row, col); - attributes->is_visible = g_sheet_model_is_visible (sheet->model, row, col); + attr->is_editable = g_sheet_model_is_editable (sheet->model, row, col); + attr->is_visible = g_sheet_model_is_visible (sheet->model, row, col); + + colormap = gtk_widget_get_colormap (GTK_WIDGET (sheet)); fg = g_sheet_model_get_foreground (sheet->model, row, col); if ( fg ) - attributes->foreground = *fg; + { + gdk_colormap_alloc_color (colormap, fg, TRUE, TRUE); + attr->foreground = *fg; + } bg = g_sheet_model_get_background (sheet->model, row, col); if ( bg ) - attributes->background = *bg; + { + gdk_colormap_alloc_color (colormap, bg, TRUE, TRUE); + attr->background = *bg; + } + + attr->justification = + g_sheet_column_get_justification (sheet->column_geometry, col); j = g_sheet_model_get_justification (sheet->model, row, col); - if (j) attributes->justification = *j; + if (j) + attr->justification = *j; font_desc = g_sheet_model_get_font_desc (sheet->model, row, col); - if ( font_desc ) attributes->font_desc = font_desc; + if ( font_desc ) attr->font_desc = font_desc; border = g_sheet_model_get_cell_border (sheet->model, row, col); - if ( border ) attributes->border = *border; + if ( border ) attr->border = *border; return TRUE; } -static void -init_attributes (const GtkSheet *sheet, gint col, GtkSheetCellAttr *attributes) -{ - /* DEFAULT VALUES */ - attributes->foreground = GTK_WIDGET (sheet)->style->black; - attributes->background = sheet->bg_color; - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) - { - GdkColormap *colormap; - colormap = gdk_colormap_get_system (); - attributes->background = sheet->bg_color; - } - attributes->justification = g_sheet_column_get_justification (sheet->column_geometry, col); - attributes->border.width = 0; - attributes->border.line_style = GDK_LINE_SOLID; - attributes->border.cap_style = GDK_CAP_NOT_LAST; - attributes->border.join_style = GDK_JOIN_MITER; - attributes->border.mask = 0; - attributes->border.color = GTK_WIDGET (sheet)->style->black; - attributes->is_editable = TRUE; - attributes->is_visible = TRUE; - attributes->font_desc = GTK_WIDGET (sheet)->style->font_desc; -} - -static void -label_size_request (GtkSheet *sheet, gchar *label, GtkRequisition *req) -{ - gchar *words; - gchar word[1000]; - gint n = 0; - gint row_height = DEFAULT_ROW_HEIGHT (GTK_WIDGET (sheet)) - 2 * COLUMN_TITLES_HEIGHT + 2; - - req->height = 0; - req->width = 0; - words = label; - - while (words && *words != '\0') - { - if (*words == '\n' || * (words + 1) == '\0') - { - req->height += row_height; - - word[n] = '\0'; - req->width = MAX (req->width, STRING_WIDTH (GTK_WIDGET (sheet), GTK_WIDGET (sheet)->style->font_desc, word)); - n = 0; - } - else - { - word[n++] = *words; - } - words++; - } - - if (n > 0) req->height -= 2; -} - static void gtk_sheet_button_size_request (GtkSheet *sheet, const GtkSheetButton *button, @@ -6213,20 +5441,11 @@ gtk_sheet_button_size_request (GtkSheet *sheet, GtkRequisition requisition; GtkRequisition label_requisition; - if (gtk_sheet_autoresize (sheet) && button->label && strlen (button->label) > 0) - { - label_size_request (sheet, button->label, &label_requisition); - label_requisition.width += 2 * COLUMN_TITLES_HEIGHT; - label_requisition.height += 2 * COLUMN_TITLES_HEIGHT; - } - else - { - label_requisition.height = DEFAULT_ROW_HEIGHT (GTK_WIDGET (sheet)); - label_requisition.width = COLUMN_MIN_WIDTH; - } + label_requisition.height = default_row_height (sheet); + label_requisition.width = COLUMN_MIN_WIDTH; - requisition.height = DEFAULT_ROW_HEIGHT (GTK_WIDGET (sheet)); - requisition.width = COLUMN_MIN_WIDTH; + requisition.height = default_row_height (sheet); + requisition.width = COLUMN_MIN_WIDTH; *button_requisition = requisition; @@ -6248,7 +5467,7 @@ gtk_sheet_row_size_request (GtkSheet *sheet, *requisition = button_requisition.height; - sheet->row_requisition = * requisition; + sheet->row_requisition = *requisition; } static void