X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtksheet%2Fgtksheet.c;h=e8ca1658c24ae26c835bdb29c81d873c2a472f8b;hb=775941da1289c0c3de3895e61cc6e787c6591686;hp=71c656a2b8e589458d52c66305554ba528f9705d;hpb=5016e3c7d6888600553543e1a1fd6892f5328519;p=pspp-builds.git diff --git a/lib/gtksheet/gtksheet.c b/lib/gtksheet/gtksheet.c index 71c656a2..e8ca1658 100644 --- a/lib/gtksheet/gtksheet.c +++ b/lib/gtksheet/gtksheet.c @@ -86,6 +86,8 @@ enum #define DEFAULT_COLUMN_WIDTH 80 #define DEFAULT_ROW_HEIGHT 25 +static void set_entry_widget_font (GtkSheet *sheet); + static void gtk_sheet_update_primary_selection (GtkSheet *sheet); 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); @@ -152,9 +154,7 @@ min_fully_visible_row (const GtkSheet *sheet) static inline glong max_visible_row (const GtkSheet *sheet) { - return row_from_ypixel (sheet, - sheet->vadjustment->value + - sheet->vadjustment->page_size); + return row_from_ypixel (sheet, sheet->vadjustment->value + sheet->vadjustment->page_size); } @@ -198,9 +198,7 @@ min_fully_visible_column (const GtkSheet *sheet) static inline glong max_visible_column (const GtkSheet *sheet) { - return column_from_xpixel (sheet, - sheet->hadjustment->value + - sheet->hadjustment->page_size); + return column_from_xpixel (sheet, sheet->hadjustment->value + sheet->hadjustment->page_size); } static inline glong @@ -392,6 +390,7 @@ 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, @@ -421,7 +420,7 @@ static void gtk_sheet_size_allocate (GtkWidget *widget, /* Sheet queries */ static gboolean gtk_sheet_range_isvisible (const GtkSheet *sheet, - GtkSheetRange range); + const GtkSheetRange *range); static gboolean gtk_sheet_cell_isvisible (GtkSheet *sheet, gint row, gint column); /* Drawing Routines */ @@ -1537,32 +1536,32 @@ gtk_sheet_select_column (GtkSheet *sheet, gint column) static gboolean gtk_sheet_range_isvisible (const GtkSheet *sheet, - GtkSheetRange range) + const GtkSheetRange *range) { g_return_val_if_fail (sheet != NULL, FALSE); - if (range.row0 < 0 || range.row0 >= psppire_axis_unit_count (sheet->vaxis)) + if (range->row0 < 0 || range->row0 >= psppire_axis_unit_count (sheet->vaxis)) return FALSE; - if (range.rowi < 0 || range.rowi >= psppire_axis_unit_count (sheet->vaxis)) + if (range->rowi < 0 || range->rowi >= psppire_axis_unit_count (sheet->vaxis)) return FALSE; - if (range.col0 < 0 || range.col0 >= psppire_axis_unit_count (sheet->haxis)) + if (range->col0 < 0 || range->col0 >= psppire_axis_unit_count (sheet->haxis)) return FALSE; - if (range.coli < 0 || range.coli >= psppire_axis_unit_count (sheet->haxis)) + if (range->coli < 0 || range->coli >= psppire_axis_unit_count (sheet->haxis)) 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; @@ -1579,7 +1578,7 @@ gtk_sheet_cell_isvisible (GtkSheet *sheet, range.rowi = row; range.coli = column; - return gtk_sheet_range_isvisible (sheet, range); + return gtk_sheet_range_isvisible (sheet, &range); } void @@ -1707,9 +1706,10 @@ gtk_sheet_style_set (GtkWidget *widget, gtk_style_set_background (widget->style, widget->window, widget->state); } + set_entry_widget_font (sheet); } -#define BORDER_WIDTH 4 +#define BORDER_WIDTH 2 static void gtk_sheet_realize (GtkWidget *widget) @@ -2009,6 +2009,7 @@ gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col) { PangoLayout *layout; PangoRectangle text; + PangoFontDescription *font_desc = GTK_WIDGET (sheet)->style->font_desc; gint font_height; gchar *label; @@ -2058,15 +2059,16 @@ gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col) 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_set_font_description (layout, font_desc); + pango_layout_get_pixel_extents (layout, NULL, &text); gdk_gc_set_clip_rectangle (sheet->fg_gc, &area); - font_height = pango_font_description_get_size (attributes.font_desc); - if ( !pango_font_description_get_size_is_absolute (attributes.font_desc)) + font_height = pango_font_description_get_size (font_desc); + if ( !pango_font_description_get_size_is_absolute (font_desc)) font_height /= PANGO_SCALE; /* Centre the text vertically */ @@ -2132,16 +2134,13 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) 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); } + g_return_if_fail (drawing_range.rowi >= drawing_range.row0); + g_return_if_fail (drawing_range.coli >= drawing_range.col0); - gdk_draw_rectangle (sheet->sheet_window, - GTK_WIDGET (sheet)->style->white_gc, - TRUE, - area.x, area.y, - area.width, area.height); + 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++) @@ -2150,7 +2149,7 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) } if (sheet->state != GTK_SHEET_NORMAL && - gtk_sheet_range_isvisible (sheet, sheet->range)) + gtk_sheet_range_isvisible (sheet, &sheet->range)) gtk_sheet_range_draw_selection (sheet, drawing_range); if (sheet->state == GTK_STATE_NORMAL && @@ -2159,6 +2158,8 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) 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 @@ -2172,7 +2173,7 @@ gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range) range.row0 > sheet->range.rowi || range.rowi < sheet->range.row0) return; - if (!gtk_sheet_range_isvisible (sheet, range)) return; + if (!gtk_sheet_range_isvisible (sheet, &range)) return; if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; aux = range; @@ -2524,8 +2525,6 @@ gtk_sheet_entry_changed (GtkWidget *widget, gpointer data) static void gtk_sheet_hide_entry_widget (GtkSheet *sheet) { - GdkRectangle area; - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; @@ -2572,9 +2571,16 @@ change_active_cell (GtkSheet *sheet, gint row, gint col) r.coli = old_col + 1; r.row0 = old_row - 1; r.rowi = old_row + 1; - gtk_sheet_range_draw (sheet, &r); - } + 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); + } sheet->range.row0 = row; sheet->range.col0 = col; @@ -2943,10 +2949,10 @@ gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, FALSE, - area.x - BORDER_WIDTH / 2, - area.y - BORDER_WIDTH / 2, - area.width + BORDER_WIDTH, - area.height + BORDER_WIDTH); + area.x, + area.y, + area.width + 1, + area.height + 1); } @@ -3050,11 +3056,6 @@ 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; sheet->range.col0 = -1; @@ -3096,28 +3097,27 @@ gtk_sheet_expose (GtkWidget *widget, } - range.row0 = - row_from_ypixel (sheet, - event->area.y + sheet->vadjustment->value); - range.row0--; + { + 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.rowi = - row_from_ypixel (sheet, - event->area.y + - event->area.height + sheet->vadjustment->value); - range.rowi++; + range.row0 = row_from_ypixel (sheet, y); - range.col0 = - column_from_xpixel (sheet, - event->area.x + sheet->hadjustment->value); - range.col0--; + range.rowi = row_from_ypixel (sheet, y + event->area.height); - range.coli = - column_from_xpixel (sheet, - event->area.x + event->area.width + - sheet->hadjustment->value); - range.coli++; + range.col0 = column_from_xpixel (sheet, x); + range.coli = column_from_xpixel (sheet, x + event->area.width); + } if (event->window == sheet->sheet_window) { @@ -3125,13 +3125,13 @@ gtk_sheet_expose (GtkWidget *widget, if (sheet->state != GTK_SHEET_NORMAL) { - if (gtk_sheet_range_isvisible (sheet, sheet->range)) + if (gtk_sheet_range_isvisible (sheet, &sheet->range)) gtk_sheet_range_draw (sheet, &sheet->range); if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet)) gtk_sheet_range_draw (sheet, &sheet->drag_range); - if (gtk_sheet_range_isvisible (sheet, sheet->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); @@ -4534,12 +4534,32 @@ 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; + + gtk_widget_set_size_request (sheet->entry_widget, entry_alloc.width, entry_alloc.height); gtk_widget_size_allocate (sheet->entry_widget, &entry_alloc); } +/* Copy the sheet's font to the entry widget */ +static void +set_entry_widget_font (GtkSheet *sheet) +{ + GtkRcStyle *style = gtk_widget_get_modifier_style (sheet->entry_widget); + + pango_font_description_free (style->font_desc); + style->font_desc = pango_font_description_copy (GTK_WIDGET (sheet)->style->font_desc); + + gtk_widget_modify_style (sheet->entry_widget, style); +} + + + static void create_sheet_entry (GtkSheet *sheet) { @@ -4553,6 +4573,13 @@ create_sheet_entry (GtkSheet *sheet) gtk_widget_size_request (sheet->entry_widget, NULL); + if ( GTK_IS_ENTRY (sheet->entry_widget)) + { + g_object_set (sheet->entry_widget, + "has-frame", FALSE, + NULL); + } + if (GTK_WIDGET_REALIZED (sheet)) { gtk_widget_set_parent_window (sheet->entry_widget, sheet->sheet_window); @@ -4570,6 +4597,8 @@ create_sheet_entry (GtkSheet *sheet) G_CALLBACK (gtk_sheet_entry_changed), sheet); + set_entry_widget_font (sheet); + gtk_widget_show (sheet->entry_widget); } @@ -4728,7 +4757,7 @@ draw_button (GtkSheet *sheet, GdkWindow *window, static void draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last) { - GdkRegion *region; + GdkRectangle rect; gint col; if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; @@ -4737,10 +4766,18 @@ draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last) g_return_if_fail (first >= min_visible_column (sheet)); g_return_if_fail (last <= max_visible_column (sheet)); - region = - gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->column_title_window)); + 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 + + psppire_axis_unit_size (sheet->haxis, last); + + rect.x -= sheet->hadjustment->value; - gdk_window_begin_paint_region (sheet->column_title_window, region); + minimize_int (&rect.width, sheet->column_title_area.width); + maximize_int (&rect.x, 0); + + gdk_window_begin_paint_rect (sheet->column_title_window, &rect); for (col = first ; col <= last ; ++col) { @@ -4769,7 +4806,7 @@ draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last) static void draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint last) { - GdkRegion *region; + GdkRectangle rect; gint row; if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; @@ -4778,13 +4815,18 @@ draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint last) g_return_if_fail (first >= min_visible_row (sheet)); g_return_if_fail (last <= max_visible_row (sheet)); + 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 + + psppire_axis_unit_size (sheet->vaxis, last); - region = - gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->row_title_window)); - - gdk_window_begin_paint_region (sheet->row_title_window, region); + rect.y -= sheet->vadjustment->value; + minimize_int (&rect.height, sheet->row_title_area.height); + maximize_int (&rect.y, 0); + gdk_window_begin_paint_rect (sheet->row_title_window, &rect); for (row = first; row <= last; ++row) { GdkRectangle allocation; @@ -4904,6 +4946,7 @@ vadjustment_value_changed (GtkAdjustment *adjustment, 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); } @@ -4932,6 +4975,8 @@ hadjustment_value_changed (GtkAdjustment *adjustment, draw_column_title_buttons (sheet); // size_allocate_global_button (sheet); + gtk_sheet_draw_active_cell (sheet); + gdk_window_end_paint (sheet->sheet_window); } @@ -5163,7 +5208,6 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col, { GdkColor *fg, *bg; const GtkJustification *j ; - const PangoFontDescription *font_desc ; const GtkSheetCellBorder *border ; GdkColormap *colormap; @@ -5181,7 +5225,6 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col, 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; attr->is_editable = g_sheet_model_is_editable (sheet->model, row, col); @@ -5207,9 +5250,6 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col, if (j) attr->justification = *j; - font_desc = g_sheet_model_get_font_desc (sheet->model, row, col); - if ( font_desc ) attr->font_desc = font_desc; - border = g_sheet_model_get_cell_border (sheet->model, row, col); if ( border ) attr->border = *border; @@ -5344,7 +5384,7 @@ range_to_text (const GtkSheet *sheet) gint r, c; GString *string; - if ( !gtk_sheet_range_isvisible (sheet, sheet->range)) + if ( !gtk_sheet_range_isvisible (sheet, &sheet->range)) return NULL; string = g_string_sized_new (80); @@ -5370,7 +5410,7 @@ range_to_html (const GtkSheet *sheet) gint r, c; GString *string; - if ( !gtk_sheet_range_isvisible (sheet, sheet->range)) + if ( !gtk_sheet_range_isvisible (sheet, &sheet->range)) return NULL; string = g_string_sized_new (480); @@ -5461,7 +5501,7 @@ gtk_sheet_update_primary_selection (GtkSheet *sheet) clipboard = gtk_widget_get_clipboard (GTK_WIDGET (sheet), GDK_SELECTION_PRIMARY); - if (gtk_sheet_range_isvisible (sheet, sheet->range)) + if (gtk_sheet_range_isvisible (sheet, &sheet->range)) { if (!gtk_clipboard_set_with_owner (clipboard, targets, G_N_ELEMENTS (targets),