X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtksheet%2Fgtksheet.c;h=fd60dbd186f2f1fdfff4298cb504c0fbb94e7dfc;hb=c29e05c50e21d5be8365ffdd990d558b95725d71;hp=a60882bf2dd2fb512ac84cb5e5f877ec1b176ce0;hpb=eb2fbc841a0424b22ca44e6734b30cb67cd47cfb;p=pspp-builds.git diff --git a/lib/gtksheet/gtksheet.c b/lib/gtksheet/gtksheet.c index a60882bf..fd60dbd1 100644 --- a/lib/gtksheet/gtksheet.c +++ b/lib/gtksheet/gtksheet.c @@ -93,9 +93,9 @@ static void draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint n static void draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint n); -static void gtk_sheet_set_row_height (GtkSheet *sheet, - gint row, - guint height); +static void set_row_height (GtkSheet *sheet, + gint row, + gint height); static void destroy_hover_window (GtkSheetHoverTitle *); static GtkSheetHoverTitle *create_hover_window (void); @@ -122,13 +122,13 @@ dispose_string (const GtkSheet *sheet, gchar *text) static inline gint column_from_xpixel (const GtkSheet *sheet, gint pixel) { - return psppire_axis_get_unit_at_pixel (sheet->haxis, pixel); + return psppire_axis_unit_at_pixel (sheet->haxis, pixel); } static inline gint row_from_ypixel (const GtkSheet *sheet, gint pixel) { - return psppire_axis_get_unit_at_pixel (sheet->vaxis, pixel); + return psppire_axis_unit_at_pixel (sheet->vaxis, pixel); } @@ -145,7 +145,7 @@ min_fully_visible_row (const GtkSheet *sheet) { glong row = min_visible_row (sheet); - if ( psppire_axis_pixel_start (sheet->vaxis, row) < sheet->vadjustment->value) + if ( psppire_axis_start_pixel (sheet->vaxis, row) < sheet->vadjustment->value) row++; return row; @@ -163,7 +163,7 @@ max_fully_visible_row (const GtkSheet *sheet) { glong row = max_visible_row (sheet); - if ( psppire_axis_pixel_start (sheet->vaxis, row) + if ( psppire_axis_start_pixel (sheet->vaxis, row) + psppire_axis_unit_size (sheet->vaxis, row) > sheet->vadjustment->value) @@ -186,7 +186,7 @@ min_fully_visible_column (const GtkSheet *sheet) { glong col = min_visible_column (sheet); - if ( psppire_axis_pixel_start (sheet->haxis, col) < sheet->hadjustment->value) + if ( psppire_axis_start_pixel (sheet->haxis, col) < sheet->hadjustment->value) col++; return col; @@ -206,8 +206,8 @@ max_fully_visible_column (const GtkSheet *sheet) { glong col = max_visible_column (sheet); - if ( psppire_axis_pixel_start (sheet->haxis, col) - + + if ( psppire_axis_start_pixel (sheet->haxis, col) + + psppire_axis_unit_size (sheet->haxis, col) > sheet->hadjustment->value) col--; @@ -245,6 +245,31 @@ on_column_boundary (const GtkSheet *sheet, gint x, gint *column) return FALSE; } +static gboolean +on_row_boundary (const GtkSheet *sheet, gint y, gint *row) +{ + gint r; + + y += sheet->vadjustment->value; + + r = row_from_ypixel (sheet, y); + + if ( row_from_ypixel (sheet, y - DRAG_WIDTH / 2) < r ) + { + *row = r - 1; + return TRUE; + } + + if ( row_from_ypixel (sheet, y + DRAG_WIDTH / 2) > r ) + { + *row = r; + return TRUE; + } + + return FALSE; +} + + static inline gboolean POSSIBLE_DRAG (const GtkSheet *sheet, gint x, gint y, gint *drag_row, gint *drag_column) @@ -259,17 +284,17 @@ POSSIBLE_DRAG (const GtkSheet *sheet, gint x, gint y, *drag_column = column_from_xpixel (sheet, x); *drag_row = row_from_ypixel (sheet, y); - if (x >= psppire_axis_pixel_start (sheet->haxis, sheet->range.col0) - DRAG_WIDTH / 2 && - x <= psppire_axis_pixel_start (sheet->haxis, sheet->range.coli) + + if (x >= psppire_axis_start_pixel (sheet->haxis, sheet->range.col0) - DRAG_WIDTH / 2 && + x <= psppire_axis_start_pixel (sheet->haxis, sheet->range.coli) + psppire_axis_unit_size (sheet->haxis, sheet->range.coli) + DRAG_WIDTH / 2) { - ydrag = psppire_axis_pixel_start (sheet->vaxis, sheet->range.row0); + ydrag = psppire_axis_start_pixel (sheet->vaxis, sheet->range.row0); if (y >= ydrag - DRAG_WIDTH / 2 && y <= ydrag + DRAG_WIDTH / 2) { *drag_row = sheet->range.row0; return TRUE; } - ydrag = psppire_axis_pixel_start (sheet->vaxis, sheet->range.rowi) + + ydrag = psppire_axis_start_pixel (sheet->vaxis, sheet->range.rowi) + psppire_axis_unit_size (sheet->vaxis, sheet->range.rowi); if (y >= ydrag - DRAG_WIDTH / 2 && y <= ydrag + DRAG_WIDTH / 2) { @@ -278,17 +303,17 @@ POSSIBLE_DRAG (const GtkSheet *sheet, gint x, gint y, } } - if (y >= psppire_axis_pixel_start (sheet->vaxis, sheet->range.row0) - DRAG_WIDTH / 2 && - y <= psppire_axis_pixel_start (sheet->vaxis, sheet->range.rowi) + + if (y >= psppire_axis_start_pixel (sheet->vaxis, sheet->range.row0) - DRAG_WIDTH / 2 && + y <= psppire_axis_start_pixel (sheet->vaxis, sheet->range.rowi) + psppire_axis_unit_size (sheet->vaxis, sheet->range.rowi) + DRAG_WIDTH / 2) { - xdrag = psppire_axis_pixel_start (sheet->haxis, sheet->range.col0); + xdrag = psppire_axis_start_pixel (sheet->haxis, sheet->range.col0); if (x >= xdrag - DRAG_WIDTH / 2 && x <= xdrag + DRAG_WIDTH / 2) { *drag_column = sheet->range.col0; return TRUE; } - xdrag = psppire_axis_pixel_start (sheet->haxis, sheet->range.coli) + + xdrag = psppire_axis_start_pixel (sheet->haxis, sheet->range.coli) + psppire_axis_unit_size (sheet->haxis, sheet->range.coli); if (x >= xdrag - DRAG_WIDTH / 2 && x <= xdrag + DRAG_WIDTH / 2) { @@ -311,17 +336,17 @@ POSSIBLE_RESIZE (const GtkSheet *sheet, gint x, gint y, sheet->range.col0 < 0 || sheet->range.coli < 0 ) return FALSE; - xdrag = psppire_axis_pixel_start (sheet->haxis, sheet->range.coli)+ + xdrag = psppire_axis_start_pixel (sheet->haxis, sheet->range.coli)+ psppire_axis_unit_size (sheet->haxis, sheet->range.coli); - ydrag = psppire_axis_pixel_start (sheet->vaxis, sheet->range.rowi) + + ydrag = psppire_axis_start_pixel (sheet->vaxis, sheet->range.rowi) + psppire_axis_unit_size (sheet->vaxis, sheet->range.rowi); if (sheet->state == GTK_SHEET_COLUMN_SELECTED) - ydrag = psppire_axis_pixel_start (sheet->vaxis, min_visible_row (sheet)); + ydrag = psppire_axis_start_pixel (sheet->vaxis, min_visible_row (sheet)); if (sheet->state == GTK_SHEET_ROW_SELECTED) - xdrag = psppire_axis_pixel_start (sheet->haxis, min_visible_column (sheet)); + xdrag = psppire_axis_start_pixel (sheet->haxis, min_visible_column (sheet)); *drag_column = column_from_xpixel (sheet, x); *drag_row = row_from_ypixel (sheet, y); @@ -339,25 +364,25 @@ rectangle_from_range (GtkSheet *sheet, const GtkSheetRange *range, { g_return_val_if_fail (range, FALSE); - r->x = psppire_axis_pixel_start (sheet->haxis, range->col0); + r->x = psppire_axis_start_pixel (sheet->haxis, range->col0); r->x -= round (sheet->hadjustment->value); if ( sheet->row_titles_visible) r->x += sheet->row_title_area.width; - r->y = psppire_axis_pixel_start (sheet->vaxis, range->row0); + r->y = psppire_axis_start_pixel (sheet->vaxis, range->row0); r->y -= round (sheet->vadjustment->value); if ( sheet->column_titles_visible) r->y += sheet->column_title_area.height; - r->width = psppire_axis_pixel_start (sheet->haxis, range->coli) - - psppire_axis_pixel_start (sheet->haxis, range->col0) + + r->width = psppire_axis_start_pixel (sheet->haxis, range->coli) - + psppire_axis_start_pixel (sheet->haxis, range->col0) + psppire_axis_unit_size (sheet->haxis, range->coli); - r->height = psppire_axis_pixel_start (sheet->vaxis, range->rowi) - - psppire_axis_pixel_start (sheet->vaxis, range->row0) + + r->height = psppire_axis_start_pixel (sheet->vaxis, range->rowi) - + psppire_axis_start_pixel (sheet->vaxis, range->row0) + psppire_axis_unit_size (sheet->vaxis, range->rowi); return TRUE; @@ -429,9 +454,9 @@ static gboolean gtk_sheet_cell_isvisible (GtkSheet *sheet, static void gtk_sheet_cell_draw (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); +/* draw visible part of range. */ +static void draw_sheet_region (GtkSheet *sheet, GdkRegion *region); + /* highlight the visible part of the selected range */ static void gtk_sheet_range_draw_selection (GtkSheet *sheet, @@ -478,12 +503,6 @@ static void draw_xor_hline (GtkSheet *sheet); static void draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range); -static guint new_column_width (GtkSheet *sheet, - gint column, - gint *x); -static guint new_row_height (GtkSheet *sheet, - gint row, - gint *y); /* Sheet Button */ static void create_global_button (GtkSheet *sheet); @@ -510,9 +529,6 @@ static void gtk_sheet_real_cell_clear (GtkSheet *sheet, gint column); -static void gtk_sheet_column_size_request (GtkSheet *sheet, - gint col, - guint *requisition); static void gtk_sheet_row_size_request (GtkSheet *sheet, gint row, guint *requisition); @@ -1045,7 +1061,6 @@ gtk_sheet_init (GtkSheet *sheet) sheet->sheet_window = NULL; sheet->entry_widget = NULL; - sheet->entry_handler_id = 0; sheet->button = NULL; sheet->hadjustment = NULL; @@ -1077,6 +1092,29 @@ gtk_sheet_init (GtkSheet *sheet) } +/* Cause RANGE to be redrawn. If RANGE is null, then the + entire visible range will be redrawn. + */ +static void +redraw_range (GtkSheet *sheet, GtkSheetRange *range) +{ + GdkRectangle rect; + + if ( ! GTK_WIDGET_REALIZED (sheet)) + return; + + if ( NULL != range ) + rectangle_from_range (sheet, range, &rect); + else + { + GdkRegion *r = gdk_drawable_get_visible_region (sheet->sheet_window); + gdk_region_get_clipbox (r, &rect); + } + + gdk_window_invalidate_rect (sheet->sheet_window, &rect, FALSE); +} + + /* Callback which occurs whenever columns are inserted / deleted in the model */ static void columns_inserted_deleted_callback (GSheetModel *model, gint first_column, @@ -1105,10 +1143,13 @@ columns_inserted_deleted_callback (GSheetModel *model, gint first_column, draw_column_title_buttons_range (sheet, first_column, max_visible_column (sheet)); - gtk_sheet_range_draw (sheet, &range); + + redraw_range (sheet, &range); } + + /* Callback which occurs whenever rows are inserted / deleted in the model */ static void rows_inserted_deleted_callback (GSheetModel *model, gint first_row, @@ -1135,7 +1176,7 @@ rows_inserted_deleted_callback (GSheetModel *model, gint first_row, draw_row_title_buttons_range (sheet, first_row, max_visible_row (sheet)); - gtk_sheet_range_draw (sheet, &range); + redraw_range (sheet, &range); } /* @@ -1160,7 +1201,7 @@ range_update_callback (GSheetModel *m, gint row0, gint col0, if ( ( row0 < 0 && col0 < 0 ) || ( rowi < 0 && coli < 0 ) ) { - gtk_sheet_range_draw (sheet, NULL); + redraw_range (sheet, NULL); adjust_scrollbars (sheet); draw_row_title_buttons_range (sheet, min_visible_row (sheet), @@ -1182,7 +1223,7 @@ range_update_callback (GSheetModel *m, gint row0, gint col0, range.coli = max_visible_column (sheet); } - gtk_sheet_range_draw (sheet, &range); + redraw_range (sheet, &range); } @@ -1280,7 +1321,7 @@ gtk_sheet_show_grid (GtkSheet *sheet, gboolean show) sheet->show_grid = show; - gtk_sheet_range_draw (sheet, NULL); + redraw_range (sheet, NULL); } gboolean @@ -1301,10 +1342,9 @@ gtk_sheet_get_columns_count (GtkSheet *sheet) return psppire_axis_unit_count (sheet->haxis); } -static void -gtk_sheet_set_column_width (GtkSheet *sheet, - gint column, - guint width); +static void set_column_width (GtkSheet *sheet, + gint column, + gint width); void @@ -1437,7 +1477,7 @@ gtk_sheet_moveto (GtkSheet *sheet, if (row >= 0) { - gint y = psppire_axis_pixel_start (sheet->vaxis, row); + gint y = psppire_axis_start_pixel (sheet->vaxis, row); gtk_adjustment_set_value (sheet->vadjustment, y - height * row_align); } @@ -1445,7 +1485,7 @@ gtk_sheet_moveto (GtkSheet *sheet, if (col >= 0) { - gint x = psppire_axis_pixel_start (sheet->haxis, col); + gint x = psppire_axis_start_pixel (sheet->haxis, col); gtk_adjustment_set_value (sheet->hadjustment, x - width * col_align); } @@ -1679,7 +1719,7 @@ gtk_sheet_style_set (GtkWidget *widget, set_entry_widget_font (sheet); } -#define BORDER_WIDTH 2 +#define BORDER_WIDTH 3 static void gtk_sheet_realize (GtkWidget *widget) @@ -1786,8 +1826,8 @@ gtk_sheet_realize (GtkWidget *widget) sheet->fg_gc = gdk_gc_new (widget->window); sheet->bg_gc = gdk_gc_new (widget->window); - values.foreground = widget->style->black; - values.function = GDK_COPY; + values.foreground = widget->style->white; + values.function = GDK_INVERT; values.subwindow_mode = GDK_INCLUDE_INFERIORS; values.line_width = BORDER_WIDTH; @@ -1941,7 +1981,7 @@ gtk_sheet_map (GtkWidget *widget) !GTK_WIDGET_MAPPED (GTK_BIN (sheet->button)->child)) gtk_widget_map (GTK_BIN (sheet->button)->child); - gtk_sheet_range_draw (sheet, NULL); + redraw_range (sheet, NULL); change_active_cell (sheet, sheet->active_cell.row, sheet->active_cell.col); @@ -2070,15 +2110,36 @@ gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col) } - static void -gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) +draw_sheet_region (GtkSheet *sheet, GdkRegion *region) { + GtkSheetRange range; + GdkRectangle area; + gint y, x; gint i, j; - GdkRectangle area; GtkSheetRange drawing_range; + gdk_region_get_clipbox (region, &area); + + y = area.y + sheet->vadjustment->value; + x = area.x + sheet->hadjustment->value; + + if ( sheet->column_titles_visible) + y -= sheet->column_title_area.height; + + if ( sheet->row_titles_visible) + x -= sheet->row_title_area.width; + + maximize_int (&x, 0); + maximize_int (&y, 0); + + range.row0 = row_from_ypixel (sheet, y); + range.rowi = row_from_ypixel (sheet, y + area.height); + + range.col0 = column_from_xpixel (sheet, x); + range.coli = column_from_xpixel (sheet, x + area.width); + g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_SHEET (sheet)); @@ -2086,51 +2147,35 @@ 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 (range == NULL) - { - drawing_range.row0 = min_visible_row (sheet); - drawing_range.col0 = min_visible_column (sheet); - drawing_range.rowi = MIN (max_visible_row (sheet), - psppire_axis_unit_count (sheet->vaxis) - 1); - 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)); - rectangle_from_range (sheet, &drawing_range, &area); - } + 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)); g_return_if_fail (drawing_range.rowi >= drawing_range.row0); g_return_if_fail (drawing_range.coli >= drawing_range.col0); - gdk_window_begin_paint_rect (sheet->sheet_window, &area); - for (i = drawing_range.row0; i <= drawing_range.rowi; i++) - for (j = drawing_range.col0; j <= drawing_range.coli; j++) - { + { + for (j = drawing_range.col0; j <= drawing_range.coli; j++) gtk_sheet_cell_draw (sheet, i, j); - } + } if (sheet->state != GTK_SHEET_NORMAL && gtk_sheet_range_isvisible (sheet, &sheet->range)) gtk_sheet_range_draw_selection (sheet, drawing_range); + if (sheet->state == GTK_STATE_NORMAL && sheet->active_cell.row >= drawing_range.row0 && sheet->active_cell.row <= drawing_range.rowi && sheet->active_cell.col >= drawing_range.col0 && sheet->active_cell.col <= drawing_range.coli) gtk_sheet_show_entry_widget (sheet); - - gdk_window_end_paint (sheet->sheet_window); } + static void gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range) { @@ -2251,7 +2296,7 @@ gtk_sheet_cell_clear (GtkSheet *sheet, gint row, gint column) gtk_sheet_real_cell_clear (sheet, row, column); - gtk_sheet_range_draw (sheet, &range); + redraw_range (sheet, &range); } static void @@ -2401,8 +2446,8 @@ gtk_sheet_get_cell_area (GtkSheet *sheet, if (row >= psppire_axis_unit_count (sheet->vaxis) || column >= psppire_axis_unit_count (sheet->haxis)) return FALSE; - area->x = (column == -1) ? 0 : psppire_axis_pixel_start (sheet->haxis, column); - area->y = (row == -1) ? 0 : psppire_axis_pixel_start (sheet->vaxis, row); + area->x = (column == -1) ? 0 : psppire_axis_start_pixel (sheet->haxis, column); + area->y = (row == -1) ? 0 : psppire_axis_start_pixel (sheet->vaxis, row); area->width= (column == -1) ? sheet->row_title_area.width : psppire_axis_unit_size (sheet->haxis, column); @@ -2455,16 +2500,12 @@ gtk_sheet_get_active_cell (GtkSheet *sheet, gint *row, gint *column) static void gtk_sheet_entry_changed (GtkWidget *widget, gpointer data) { - GtkSheet *sheet; + GtkSheet *sheet = GTK_SHEET (data); gint row, col; const char *text; GtkJustification justification; GtkSheetCellAttr attributes; - g_return_if_fail (data != NULL); - g_return_if_fail (GTK_IS_SHEET (data)); - - sheet = GTK_SHEET (data); if (!GTK_WIDGET_VISIBLE (widget)) return; if (sheet->state != GTK_STATE_NORMAL) return; @@ -2510,7 +2551,6 @@ static void change_active_cell (GtkSheet *sheet, gint row, gint col) { gint old_row, old_col; - glong old_handler_id = sheet->entry_handler_id; g_return_if_fail (GTK_IS_SHEET (sheet)); @@ -2527,29 +2567,11 @@ change_active_cell (GtkSheet *sheet, gint row, gint col) gtk_sheet_real_unselect_range (sheet, NULL); } - - g_signal_handler_block (sheet->entry_widget, sheet->entry_handler_id); - old_row = sheet->active_cell.row; old_col = sheet->active_cell.col; - { - /* Redraw the neighbourhood of the old active cell */ - GtkSheetRange r; - r.col0 = old_col - 1; - r.coli = old_col + 1; - r.row0 = old_row - 1; - r.rowi = old_row + 1; - - maximize_int (&r.row0, 0); - maximize_int (&r.col0, 0); - minimize_int (&r.rowi, psppire_axis_unit_count (sheet->vaxis) - 1); - minimize_int (&r.coli, psppire_axis_unit_count (sheet->haxis) - 1); - - - if ( gtk_sheet_range_isvisible (sheet, &r)) - gtk_sheet_range_draw (sheet, &r); - } + /* Erase the old cell */ + gtk_sheet_draw_active_cell (sheet); sheet->range.row0 = row; sheet->range.col0 = col; @@ -2562,15 +2584,15 @@ change_active_cell (GtkSheet *sheet, gint row, gint col) GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); + GTK_WIDGET_UNSET_FLAGS (sheet->entry_widget, GTK_HAS_FOCUS); + gtk_sheet_draw_active_cell (sheet); gtk_sheet_show_entry_widget (sheet); - + GTK_WIDGET_SET_FLAGS (sheet->entry_widget, GTK_HAS_FOCUS); g_signal_emit (sheet, sheet_signals [ACTIVATE], 0, row, col, old_row, old_col); - if ( old_handler_id == sheet->entry_handler_id) - g_signal_handler_unblock (sheet->entry_widget, sheet->entry_handler_id); } static void @@ -2578,10 +2600,9 @@ gtk_sheet_show_entry_widget (GtkSheet *sheet) { GtkEntry *sheet_entry; GtkSheetCellAttr attributes; - gchar *text = NULL; + gint row, col; - g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_IS_SHEET (sheet)); row = sheet->active_cell.row; @@ -2601,14 +2622,14 @@ gtk_sheet_show_entry_widget (GtkSheet *sheet) gtk_sheet_get_attributes (sheet, row, col, &attributes); - - text = gtk_sheet_cell_get_text (sheet, row, col); - if ( ! text ) - text = g_strdup (""); - - if ( GTK_IS_ENTRY (sheet_entry)) + if (GTK_IS_ENTRY (sheet_entry) && !GTK_WIDGET_HAS_FOCUS (sheet_entry)) { + gchar *text = gtk_sheet_cell_get_text (sheet, row, col); const gchar *old_text = gtk_entry_get_text (GTK_ENTRY (sheet_entry)); + + if ( ! text ) + text = g_strdup (""); + if (strcmp (old_text, text) != 0) gtk_entry_set_text (sheet_entry, text); @@ -2625,6 +2646,7 @@ gtk_sheet_show_entry_widget (GtkSheet *sheet) gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 0.0); break; } + dispose_string (sheet, text); } gtk_sheet_size_allocate_entry (sheet); @@ -2633,8 +2655,6 @@ gtk_sheet_show_entry_widget (GtkSheet *sheet) g_sheet_model_is_editable (sheet->model, row, col)); gtk_widget_map (sheet->entry_widget); - - dispose_string (sheet, text); } static gboolean @@ -2646,10 +2666,10 @@ gtk_sheet_draw_active_cell (GtkSheet *sheet) row = sheet->active_cell.row; col = sheet->active_cell.col; - if (row < 0 || col < 0) return; + if (row < 0 || col < 0) return FALSE; if (!gtk_sheet_cell_isvisible (sheet, row, col)) - return; + return FALSE; range.col0 = range.coli = col; range.row0 = range.rowi = row; @@ -2718,11 +2738,11 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) if (mask1 != mask2) { - x = psppire_axis_pixel_start (sheet->haxis, j); - y = psppire_axis_pixel_start (sheet->vaxis, i); - width = psppire_axis_pixel_start (sheet->haxis, j)- x+ + x = psppire_axis_start_pixel (sheet->haxis, j); + y = psppire_axis_start_pixel (sheet->vaxis, i); + width = psppire_axis_start_pixel (sheet->haxis, j)- x+ psppire_axis_unit_size (sheet->haxis, j); - height = psppire_axis_pixel_start (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i); + height = psppire_axis_start_pixel (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i); if (i == sheet->range.row0) { @@ -2739,12 +2759,12 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) if (i != sheet->active_cell.row || j != sheet->active_cell.col) { - x = psppire_axis_pixel_start (sheet->haxis, j); - y = psppire_axis_pixel_start (sheet->vaxis, i); - width = psppire_axis_pixel_start (sheet->haxis, j)- x+ + x = psppire_axis_start_pixel (sheet->haxis, j); + y = psppire_axis_start_pixel (sheet->vaxis, i); + width = psppire_axis_start_pixel (sheet->haxis, j)- x+ psppire_axis_unit_size (sheet->haxis, j); - height = psppire_axis_pixel_start (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i); + height = psppire_axis_start_pixel (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i); if (i == new_range.row0) { @@ -2782,10 +2802,10 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) if (state == GTK_STATE_SELECTED && !selected) { - x = psppire_axis_pixel_start (sheet->haxis, j); - y = psppire_axis_pixel_start (sheet->vaxis, i); - width = psppire_axis_pixel_start (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j); - height = psppire_axis_pixel_start (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i); + x = psppire_axis_start_pixel (sheet->haxis, j); + y = psppire_axis_start_pixel (sheet->vaxis, i); + width = psppire_axis_start_pixel (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j); + height = psppire_axis_start_pixel (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i); if (i == sheet->range.row0) { @@ -2817,10 +2837,10 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) (i != sheet->active_cell.row || j != sheet->active_cell.col)) { - x = psppire_axis_pixel_start (sheet->haxis, j); - y = psppire_axis_pixel_start (sheet->vaxis, i); - width = psppire_axis_pixel_start (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j); - height = psppire_axis_pixel_start (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i); + x = psppire_axis_start_pixel (sheet->haxis, j); + y = psppire_axis_start_pixel (sheet->vaxis, i); + width = psppire_axis_start_pixel (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j); + height = psppire_axis_start_pixel (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i); if (i == new_range.row0) { @@ -2863,8 +2883,8 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) mask2 = j == new_range.coli ? mask2 + 8 : mask2; if (mask2 != mask1 || (mask2 == mask1 && state != GTK_STATE_SELECTED)) { - x = psppire_axis_pixel_start (sheet->haxis, j); - y = psppire_axis_pixel_start (sheet->vaxis, i); + x = psppire_axis_start_pixel (sheet->haxis, j); + y = psppire_axis_start_pixel (sheet->vaxis, i); width = psppire_axis_unit_size (sheet->haxis, j); height = psppire_axis_unit_size (sheet->vaxis, i); if (mask2 & 1) @@ -2915,10 +2935,8 @@ gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, FALSE, - area.x, - area.y, - area.width + 1, - area.height + 1); + area.x, area.y, + area.width, area.height); } @@ -3033,15 +3051,10 @@ static gint gtk_sheet_expose (GtkWidget *widget, GdkEventExpose *event) { - GtkSheet *sheet; - GtkSheetRange range; + GtkSheet *sheet = GTK_SHEET (widget); - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); - sheet = GTK_SHEET (widget); - if (!GTK_WIDGET_DRAWABLE (widget)) return FALSE; @@ -3062,33 +3075,11 @@ gtk_sheet_expose (GtkWidget *widget, max_visible_column (sheet)); } - - { - gint y = event->area.y + sheet->vadjustment->value; - gint x = event->area.x + sheet->hadjustment->value; - - if ( sheet->column_titles_visible) - y -= sheet->column_title_area.height; - - if ( sheet->row_titles_visible) - x -= sheet->row_title_area.width; - - maximize_int (&x, 0); - maximize_int (&y, 0); - - range.row0 = row_from_ypixel (sheet, y); - - range.rowi = row_from_ypixel (sheet, y + event->area.height); - - range.col0 = column_from_xpixel (sheet, x); - - range.coli = column_from_xpixel (sheet, x + event->area.width); - } - if (event->window == sheet->sheet_window) { - gtk_sheet_range_draw (sheet, &range); + draw_sheet_region (sheet, event->region); +#if 0 if (sheet->state != GTK_SHEET_NORMAL) { if (gtk_sheet_range_isvisible (sheet, &sheet->range)) @@ -3102,12 +3093,24 @@ gtk_sheet_expose (GtkWidget *widget, if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet)) draw_xor_rectangle (sheet, sheet->drag_range); } +#endif if ((!GTK_SHEET_IN_XDRAG (sheet)) && (!GTK_SHEET_IN_YDRAG (sheet))) { - if (sheet->state == GTK_SHEET_NORMAL) - g_idle_add (gtk_sheet_draw_active_cell, sheet); + GdkRectangle rect; + GtkSheetRange range; + range.row0 = range.rowi = sheet->active_cell.row; + range.col0 = range.coli = sheet->active_cell.col; + + rectangle_from_range (sheet, &range, &rect); + + if (GDK_OVERLAP_RECTANGLE_OUT != + gdk_region_rect_in (event->region, &rect)) + { + gtk_sheet_draw_active_cell (sheet); + } } + } (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event); @@ -3145,6 +3148,7 @@ gtk_sheet_button_press (GtkWidget *widget, if (event->window == sheet->column_title_window) { + sheet->x_drag = event->x; g_signal_emit (sheet, sheet_signals[BUTTON_EVENT_COLUMN], 0, column, event); @@ -3178,18 +3182,10 @@ gtk_sheet_button_press (GtkWidget *widget, /* press on resize windows */ if (event->window == sheet->column_title_window) { -#if 0 - gtk_widget_get_pointer (widget, &sheet->x_drag, NULL); - if ( sheet->row_titles_visible) - sheet->x_drag -= sheet->row_title_area.width; -#endif - sheet->x_drag = event->x; if (on_column_boundary (sheet, sheet->x_drag, &sheet->drag_cell.col)) { - guint req; - gtk_sheet_column_size_request (sheet, sheet->drag_cell.col, &req); GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_XDRAG); gdk_pointer_grab (sheet->column_title_window, FALSE, GDK_POINTER_MOTION_HINT_MASK | @@ -3204,13 +3200,10 @@ gtk_sheet_button_press (GtkWidget *widget, if (event->window == sheet->row_title_window) { - gtk_widget_get_pointer (widget, NULL, &sheet->y_drag); + sheet->y_drag = event->y; -#if AXIS_TRANSITION - if (POSSIBLE_YDRAG (sheet, sheet->y_drag, &sheet->drag_cell.row)) + if (on_row_boundary (sheet, sheet->y_drag, &sheet->drag_cell.row)) { - guint req; - gtk_sheet_row_size_request (sheet, sheet->drag_cell.row, &req); GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_YDRAG); gdk_pointer_grab (sheet->row_title_window, FALSE, GDK_POINTER_MOTION_HINT_MASK | @@ -3221,7 +3214,6 @@ gtk_sheet_button_press (GtkWidget *widget, draw_xor_hline (sheet); return TRUE; } -#endif } /* the sheet itself does not handle other than single click events */ @@ -3416,8 +3408,6 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column) sheet->state = GTK_SHEET_NORMAL; GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); - gtk_sheet_draw_active_cell (sheet); - gtk_widget_grab_focus (GTK_WIDGET (sheet->entry_widget)); return TRUE; @@ -3427,7 +3417,6 @@ static gint gtk_sheet_button_release (GtkWidget *widget, GdkEventButton *event) { - gint y; GdkDisplay *display = gtk_widget_get_display (widget); GtkSheet *sheet = GTK_SHEET (widget); @@ -3435,7 +3424,6 @@ gtk_sheet_button_release (GtkWidget *widget, /* release on resize windows */ if (GTK_SHEET_IN_XDRAG (sheet)) { - gint xpos = event->x; gint width; GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_XDRAG); GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); @@ -3443,27 +3431,33 @@ gtk_sheet_button_release (GtkWidget *widget, gdk_display_pointer_ungrab (display, event->time); draw_xor_vline (sheet); - width = new_column_width (sheet, sheet->drag_cell.col, &xpos); + width = event->x - + psppire_axis_start_pixel (sheet->haxis, sheet->drag_cell.col) + + sheet->hadjustment->value; + + set_column_width (sheet, sheet->drag_cell.col, width); - gtk_sheet_set_column_width (sheet, sheet->drag_cell.col, width); return TRUE; } if (GTK_SHEET_IN_YDRAG (sheet)) { + gint height; GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_YDRAG); GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); - gtk_widget_get_pointer (widget, NULL, &y); + gdk_display_pointer_ungrab (display, event->time); draw_xor_hline (sheet); - gtk_sheet_set_row_height (sheet, sheet->drag_cell.row, - new_row_height (sheet, sheet->drag_cell.row, &y)); - g_signal_emit_by_name (sheet->vadjustment, "value_changed"); + height = event->y - + psppire_axis_start_pixel (sheet->vaxis, sheet->drag_cell.row) + + sheet->vadjustment->value; + + set_row_height (sheet, sheet->drag_cell.row, height); + return TRUE; } - if (GTK_SHEET_IN_DRAG (sheet)) { GtkSheetRange old_range; @@ -3685,19 +3679,15 @@ motion_timeout_callback (gpointer data) static gboolean gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) { - GtkSheet *sheet; + GtkSheet *sheet = GTK_SHEET (widget); GdkModifierType mods; 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); g_return_val_if_fail (event != NULL, FALSE); - sheet = GTK_SHEET (widget); - display = gtk_widget_get_display (widget); /* selections on the sheet */ @@ -3736,7 +3726,9 @@ 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_for_display (display, GDK_SB_H_DOUBLE_ARROW); + sheet->cursor_drag = + gdk_cursor_new_for_display (display, new_cursor); + gdk_window_set_cursor (sheet->column_title_window, sheet->cursor_drag); } @@ -3748,36 +3740,39 @@ 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_for_display (display, GDK_TOP_LEFT_ARROW); + sheet->cursor_drag = + gdk_cursor_new_for_display (display, new_cursor); gdk_window_set_cursor (sheet->column_title_window, sheet->cursor_drag); } } } - - if (event->window == sheet->row_title_window) + else if (event->window == sheet->row_title_window) { -#if AXIS_TRANSITION - if (!GTK_SHEET_IN_SELECTION (sheet) && POSSIBLE_YDRAG (sheet, y, &column)) + if (!GTK_SHEET_IN_SELECTION (sheet) && + on_row_boundary (sheet, y, &row)) { new_cursor = GDK_SB_V_DOUBLE_ARROW; if (new_cursor != sheet->cursor_drag->type) { gdk_cursor_unref (sheet->cursor_drag); - 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); + sheet->cursor_drag = + gdk_cursor_new_for_display (display, new_cursor); + gdk_window_set_cursor (sheet->row_title_window, + sheet->cursor_drag); } } else -#endif { new_cursor = GDK_TOP_LEFT_ARROW; if (!GTK_SHEET_IN_YDRAG (sheet) && new_cursor != sheet->cursor_drag->type) { gdk_cursor_unref (sheet->cursor_drag); - sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_TOP_LEFT_ARROW); - gdk_window_set_cursor (sheet->row_title_window, sheet->cursor_drag); + sheet->cursor_drag = + gdk_cursor_new_for_display (display, new_cursor); + gdk_window_set_cursor (sheet->row_title_window, + sheet->cursor_drag); } } } @@ -3827,34 +3822,25 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) if (GTK_SHEET_IN_XDRAG (sheet)) { - x = event->x; - - new_column_width (sheet, sheet->drag_cell.col, &x); -#if 0 - if (x != sheet->x_drag) + if (event->x != sheet->x_drag) { draw_xor_vline (sheet); - sheet->x_drag = x; + sheet->x_drag = event->x; draw_xor_vline (sheet); } -#endif + return TRUE; } if (GTK_SHEET_IN_YDRAG (sheet)) { - if (event->is_hint || event->window != widget->window) - gtk_widget_get_pointer (widget, NULL, &y); - else - y = event->y; - - new_row_height (sheet, sheet->drag_cell.row, &y); - if (y != sheet->y_drag) + if (event->y != sheet->y_drag) { draw_xor_hline (sheet); - sheet->y_drag = y; + sheet->y_drag = event->y; draw_xor_hline (sheet); } + return TRUE; } @@ -3891,8 +3877,8 @@ 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 - psppire_axis_pixel_start (sheet->haxis, sheet->drag_cell.col)) > - abs (y - psppire_axis_pixel_start (sheet->vaxis, sheet->drag_cell.row))) v_h = 2; + if (abs (x - psppire_axis_start_pixel (sheet->haxis, sheet->drag_cell.col)) > + abs (y - psppire_axis_start_pixel (sheet->vaxis, sheet->drag_cell.row))) v_h = 2; current_col = column_from_xpixel (sheet, x); current_row = row_from_ypixel (sheet, y); @@ -3901,7 +3887,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) /*use half of column width resp. row height as threshold to expand selection*/ - col_threshold = psppire_axis_pixel_start (sheet->haxis, current_col) + + col_threshold = psppire_axis_start_pixel (sheet->haxis, current_col) + psppire_axis_unit_size (sheet->haxis, current_col) / 2; if (column > 0) { @@ -3913,7 +3899,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) if (x > col_threshold) column +=1; } - row_threshold = psppire_axis_pixel_start (sheet->vaxis, current_row) + + row_threshold = psppire_axis_start_pixel (sheet->vaxis, current_row) + psppire_axis_unit_size (sheet->vaxis, current_row)/2; if (row > 0) { @@ -4057,11 +4043,11 @@ static void page_vertical (GtkSheet *sheet, GtkScrollType dir) { gint old_row = sheet->active_cell.row ; - glong vpixel = psppire_axis_pixel_start (sheet->vaxis, old_row); + glong vpixel = psppire_axis_start_pixel (sheet->vaxis, old_row); gint new_row; - vpixel -= psppire_axis_pixel_start (sheet->vaxis, + vpixel -= psppire_axis_start_pixel (sheet->vaxis, min_visible_row (sheet)); switch ( dir) @@ -4083,7 +4069,7 @@ page_vertical (GtkSheet *sheet, GtkScrollType dir) } - vpixel += psppire_axis_pixel_start (sheet->vaxis, + vpixel += psppire_axis_start_pixel (sheet->vaxis, min_visible_row (sheet)); new_row = row_from_ypixel (sheet, vpixel); @@ -4148,7 +4134,7 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir) if ( new_cell.col > max_fully_visible_column (sheet)) { glong hpos = - psppire_axis_pixel_start (sheet->haxis, + psppire_axis_start_pixel (sheet->haxis, new_cell.col + 1); hpos -= sheet->hadjustment->page_size; @@ -4158,7 +4144,7 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir) else if ( new_cell.col < min_fully_visible_column (sheet)) { glong hpos = - psppire_axis_pixel_start (sheet->haxis, + psppire_axis_start_pixel (sheet->haxis, new_cell.col); gtk_adjustment_set_value (sheet->hadjustment, @@ -4169,7 +4155,7 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir) if ( new_cell.row > max_fully_visible_row (sheet)) { glong vpos = - psppire_axis_pixel_start (sheet->vaxis, + psppire_axis_start_pixel (sheet->vaxis, new_cell.row + 1); vpos -= sheet->vadjustment->page_size; @@ -4179,7 +4165,7 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir) else if ( new_cell.row < min_fully_visible_row (sheet)) { glong vpos = - psppire_axis_pixel_start (sheet->vaxis, + psppire_axis_start_pixel (sheet->vaxis, new_cell.row); gtk_adjustment_set_value (sheet->vadjustment, @@ -4497,10 +4483,10 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) rectangle_from_cell (sheet, sheet->active_cell.row, sheet->active_cell.col, &entry_alloc); - entry_alloc.width -= BORDER_WIDTH; - entry_alloc.height -= BORDER_WIDTH; - entry_alloc.x += BORDER_WIDTH / 2; - entry_alloc.y += BORDER_WIDTH / 2; + entry_alloc.width -= BORDER_WIDTH ; + entry_alloc.height -= BORDER_WIDTH ; + entry_alloc.x += DIV_RND_UP (BORDER_WIDTH, 2); + entry_alloc.y += DIV_RND_UP (BORDER_WIDTH, 2); gtk_widget_set_size_request (sheet->entry_widget, entry_alloc.width, @@ -4554,8 +4540,7 @@ create_sheet_entry (GtkSheet *sheet) G_CALLBACK (gtk_sheet_entry_key_press), sheet); - sheet->entry_handler_id = - g_signal_connect (sheet->entry_widget, + g_signal_connect (sheet->entry_widget, "changed", G_CALLBACK (gtk_sheet_entry_changed), sheet); @@ -4731,8 +4716,8 @@ draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last) rect.y = 0; rect.height = sheet->column_title_area.height; - rect.x = psppire_axis_pixel_start (sheet->haxis, first) + CELL_SPACING; - rect.width = psppire_axis_pixel_start (sheet->haxis, last) + CELL_SPACING + rect.x = psppire_axis_start_pixel (sheet->haxis, first) + CELL_SPACING; + rect.width = psppire_axis_start_pixel (sheet->haxis, last) + CELL_SPACING + psppire_axis_unit_size (sheet->haxis, last); rect.x -= sheet->hadjustment->value; @@ -4750,7 +4735,7 @@ draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last) GtkSheetButton * button = g_sheet_model_get_column_button (sheet->model, col); allocation.y = 0; - allocation.x = psppire_axis_pixel_start (sheet->haxis, col) + allocation.x = psppire_axis_start_pixel (sheet->haxis, col) + CELL_SPACING; allocation.x -= sheet->hadjustment->value; @@ -4780,8 +4765,8 @@ draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint last) rect.x = 0; rect.width = sheet->row_title_area.width; - rect.y = psppire_axis_pixel_start (sheet->vaxis, first) + CELL_SPACING; - rect.height = psppire_axis_pixel_start (sheet->vaxis, last) + CELL_SPACING + rect.y = psppire_axis_start_pixel (sheet->vaxis, first) + CELL_SPACING; + rect.height = psppire_axis_start_pixel (sheet->vaxis, last) + CELL_SPACING + psppire_axis_unit_size (sheet->vaxis, last); rect.y -= sheet->vadjustment->value; @@ -4799,7 +4784,7 @@ draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint last) GtkSheetButton *button = g_sheet_model_get_row_button (sheet->model, row); allocation.x = 0; - allocation.y = psppire_axis_pixel_start (sheet->vaxis, row) + allocation.y = psppire_axis_start_pixel (sheet->vaxis, row) + CELL_SPACING; allocation.y -= sheet->vadjustment->value; @@ -4836,7 +4821,7 @@ update_adjustment (GtkAdjustment *adj, PsppireAxis *axis, gint page_size) position = 0; adj->upper = - psppire_axis_pixel_start (axis, last_item) + psppire_axis_start_pixel (axis, last_item) + psppire_axis_unit_size (axis, last_item) ; @@ -4895,7 +4880,7 @@ adjust_scrollbars (GtkSheet *sheet) sheet->hadjustment->page_increment = width; sheet->hadjustment->upper = - psppire_axis_pixel_start (sheet->haxis, last_col) + psppire_axis_start_pixel (sheet->haxis, last_col) + psppire_axis_unit_size (sheet->haxis, last_col) ; @@ -4915,7 +4900,6 @@ vadjustment_value_changed (GtkAdjustment *adjustment, if ( ! GTK_WIDGET_REALIZED (sheet)) return; - gtk_widget_hide (sheet->entry_widget); region = @@ -4923,13 +4907,14 @@ vadjustment_value_changed (GtkAdjustment *adjustment, gdk_window_begin_paint_region (sheet->sheet_window, region); + draw_sheet_region (sheet, region); - gtk_sheet_range_draw (sheet, NULL); draw_row_title_buttons (sheet); // size_allocate_global_button (sheet); gtk_sheet_draw_active_cell (sheet); gdk_window_end_paint (sheet->sheet_window); + gdk_region_destroy (region); } @@ -4952,13 +4937,16 @@ hadjustment_value_changed (GtkAdjustment *adjustment, gdk_window_begin_paint_region (sheet->sheet_window, region); - gtk_sheet_range_draw (sheet, NULL); + draw_sheet_region (sheet, region); + draw_column_title_buttons (sheet); // size_allocate_global_button (sheet); gtk_sheet_draw_active_cell (sheet); gdk_window_end_paint (sheet->sheet_window); + + gdk_region_destroy (region); } @@ -4971,7 +4959,6 @@ draw_xor_vline (GtkSheet *sheet) gdk_drawable_get_size (sheet->sheet_window, NULL, &height); - if (sheet->row_titles_visible) xpos += sheet->row_title_area.width; @@ -5012,11 +4999,11 @@ draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range) GdkRectangle clip_area, area; GdkGCValues values; - area.x = psppire_axis_pixel_start (sheet->haxis, range.col0); - area.y = psppire_axis_pixel_start (sheet->vaxis, range.row0); - area.width = psppire_axis_pixel_start (sheet->haxis, range.coli)- area.x+ + area.x = psppire_axis_start_pixel (sheet->haxis, range.col0); + area.y = psppire_axis_start_pixel (sheet->vaxis, range.row0); + area.width = psppire_axis_start_pixel (sheet->haxis, range.coli)- area.x+ psppire_axis_unit_size (sheet->haxis, range.coli); - area.height = psppire_axis_pixel_start (sheet->vaxis, range.rowi)- area.y + + area.height = psppire_axis_start_pixel (sheet->vaxis, range.rowi)- area.y + psppire_axis_unit_size (sheet->vaxis, range.rowi); clip_area.x = sheet->row_title_area.width; @@ -5063,123 +5050,47 @@ draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range) } -/* this function returns the new width of the column being resized given - * the COLUMN and X position of the cursor; the x cursor position is passed - * in as a pointer and automaticaly corrected if it's outside the acceptable - * range */ -static guint -new_column_width (GtkSheet *sheet, gint column, gint *x) -{ - gint left_pos = psppire_axis_pixel_start (sheet->haxis, column) - - sheet->hadjustment->value; - - gint width = *x - left_pos; - - if ( width < sheet->column_requisition) - { - width = sheet->column_requisition; - *x = left_pos + width; - } - -#if AXIS_TRANSITION - g_sheet_column_set_width (sheet->column_geometry, column, width); -#endif - - draw_column_title_buttons (sheet); - - return width; -} - -/* this function returns the new height of the row being resized given - * the row and y position of the cursor; the y cursor position is passed - * in as a pointer and automaticaly corrected if it's beyond min / max limits */ -static guint -new_row_height (GtkSheet *sheet, gint row, gint *y) -{ - gint height; - guint min_height; - - gint cy = *y; - min_height = sheet->row_requisition; - - /* you can't shrink a row to less than its minimum height */ - if (cy < psppire_axis_pixel_start (sheet->vaxis, row) + min_height) - - { - *y = cy = psppire_axis_pixel_start (sheet->vaxis, row) + min_height; - } - - /* calculate new row height making sure it doesn't end up - * less than the minimum height */ - height = (cy - psppire_axis_pixel_start (sheet->vaxis, row)); - if (height < min_height) - height = min_height; - -#if AXIS_TRANSITION - g_sheet_row_set_height (sheet->row_geometry, row, height); -#endif - draw_row_title_buttons (sheet); - - return height; -} - static void -gtk_sheet_set_column_width (GtkSheet *sheet, - gint column, - guint width) +set_column_width (GtkSheet *sheet, + gint column, + gint width) { - guint min_width; - g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_IS_SHEET (sheet)); if (column < 0 || column >= psppire_axis_unit_count (sheet->haxis)) return; - gtk_sheet_column_size_request (sheet, column, &min_width); - if (width < min_width) return; - -#if AXIS_TRANSITION - g_sheet_column_set_width (sheet->column_geometry, column, width); -#endif + psppire_axis_resize (sheet->haxis, column, width); if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) { draw_column_title_buttons (sheet); adjust_scrollbars (sheet); gtk_sheet_size_allocate_entry (sheet); - gtk_sheet_range_draw (sheet, NULL); + redraw_range (sheet, NULL); } } - - static void -gtk_sheet_set_row_height (GtkSheet *sheet, - gint row, - guint height) +set_row_height (GtkSheet *sheet, + gint row, + gint height) { - guint min_height; - g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_IS_SHEET (sheet)); if (row < 0 || row >= psppire_axis_unit_count (sheet->vaxis)) return; - gtk_sheet_row_size_request (sheet, row, &min_height); - if (height < min_height) return; - -#if AXIS_TRANSITION - g_sheet_row_set_height (sheet->row_geometry, row, height); -#endif + psppire_axis_resize (sheet->vaxis, row, height); if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)) ) { draw_row_title_buttons (sheet); adjust_scrollbars (sheet); gtk_sheet_size_allocate_entry (sheet); - gtk_sheet_range_draw (sheet, NULL); + redraw_range (sheet, NULL); } } @@ -5254,43 +5165,6 @@ gtk_sheet_button_size_request (GtkSheet *sheet, } -static void -gtk_sheet_row_size_request (GtkSheet *sheet, - gint row, - guint *requisition) -{ - GtkRequisition button_requisition; - - gtk_sheet_button_size_request (sheet, - g_sheet_model_get_row_button (sheet->model, row), - &button_requisition); - - *requisition = button_requisition.height; - - sheet->row_requisition = *requisition; -} - -static void -gtk_sheet_column_size_request (GtkSheet *sheet, - gint col, - guint *requisition) -{ - GtkRequisition button_requisition; - - GtkSheetButton *button = g_sheet_model_get_column_button (sheet->model, col); - - gtk_sheet_button_size_request (sheet, - button, - &button_requisition); - - gtk_sheet_button_free (button); - - *requisition = button_requisition.width; - - sheet->column_requisition = *requisition; -} - - static void gtk_sheet_forall (GtkContainer *container, gboolean include_internals,