X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtksheet%2Fgtksheet.c;h=8e5e49c9d950b52f39ee6a5d677a66f25a5683e0;hb=6351e3631c90fe46d70a8801a7a32f289cbba08f;hp=9b8a00c168c52cc3a3451fc0f5952dd388080188;hpb=f61a5ad9d56db538d507aa95ff29b413ed0cf776;p=pspp diff --git a/lib/gtksheet/gtksheet.c b/lib/gtksheet/gtksheet.c index 9b8a00c168..8e5e49c9d9 100644 --- a/lib/gtksheet/gtksheet.c +++ b/lib/gtksheet/gtksheet.c @@ -548,12 +548,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_cell_clear (GtkSheet *sheet, gint row, @@ -2220,17 +2214,10 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) { GtkWidget *widget; GdkRectangle area; - gint i; - gint text_width, text_height; - gint size, sizel, sizer; 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; + PangoRectangle text; + gint font_height; gchar *label; @@ -2264,106 +2251,35 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) 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); - metrics = pango_context_get_metrics (context, - attributes.font_desc, - pango_context_get_language (context)); + pango_layout_get_pixel_extents (layout, NULL, &text); - ascent = pango_font_metrics_get_ascent (metrics) / PANGO_SCALE; - descent = pango_font_metrics_get_descent (metrics) / 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; + gdk_gc_set_clip_rectangle (sheet->fg_gc, &area); - 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; + 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; - text_width = rect.width; - text_height = rect.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; + 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; - 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; - } + g_critical ("Unhandled justification %d in column %d\n", + attributes.justification, col); break; } - gdk_gc_set_clip_rectangle (sheet->fg_gc, &area); - gdk_draw_layout (sheet->sheet_window, sheet->fg_gc, area.x, area.y, @@ -5672,72 +5588,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; + + attr->is_editable = g_sheet_model_is_editable (sheet->model, row, col); + attr->is_visible = g_sheet_model_is_visible (sheet->model, row, col); - attributes->is_editable = g_sheet_model_is_editable (sheet->model, row, col); - attributes->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->color[BG_COLOR]; - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) - { - attributes->background = sheet->color[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 gtk_sheet_button_size_request (GtkSheet *sheet, const GtkSheetButton *button,