X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtksheet%2Fgtksheet.c;h=dd7d4190f0e4972f93d58df61c3d154667648bb6;hb=c21a0f82e238fe80b61d8ab00e21ec32c753ca2f;hp=fbaa73c21c50a26bfe196d11e96f1aa8626b8ca6;hpb=573068f2bdcd3f8796e9646668fed910a90f890b;p=pspp-builds.git diff --git a/lib/gtksheet/gtksheet.c b/lib/gtksheet/gtksheet.c index fbaa73c2..dd7d4190 100644 --- a/lib/gtksheet/gtksheet.c +++ b/lib/gtksheet/gtksheet.c @@ -1,4 +1,4 @@ -/* This version of GtkSheet has been heavily modified, for the specific +/* This version of GtkSheet has been *heavily* modified, for the specific requirements of PSPPIRE. */ /* GtkSheet widget for Gtk+. @@ -101,8 +101,19 @@ enum #define DEFAULT_COLUMN_WIDTH 80 +static gboolean gtk_sheet_cell_empty (const GtkSheet *sheet, gint row, gint col); +static inline +void dispose_string (const GtkSheet *sheet, gchar *text) +{ + GSheetModel *model = gtk_sheet_get_model(sheet); + + if ( ! model ) + return; + if (g_sheet_model_free_strings(model)) + g_free(text); +} static inline guint DEFAULT_ROW_HEIGHT(GtkWidget *widget) @@ -1123,14 +1134,18 @@ gtk_sheet_init (GtkSheet *sheet) } +/* Callback which occurs whenever rows are inserted/deleted in the model */ static void -rows_deleted_callback (GSheetModel *m, gint first_row, gint n_rows, +rows_inserted_deleted_callback (GSheetModel *m, gint first_row, gint n_rows, gpointer data) { GtkSheet *sheet = GTK_SHEET(data); GtkSheetRange range; + /* Need to update all the rows starting from the first row and onwards. + * Previous rows are unchanged, so don't need to be updated. + */ range.row0 = first_row; range.col0 = 0; range.rowi = yyy_row_count(sheet) - 1; @@ -1230,8 +1245,11 @@ gtk_sheet_set_model(GtkSheet *sheet, GSheetModel *model) g_signal_connect(model, "range_changed", G_CALLBACK(range_update_callback), sheet); + g_signal_connect(model, "rows_inserted", + G_CALLBACK(rows_inserted_deleted_callback), sheet); + g_signal_connect(model, "rows_deleted", - G_CALLBACK(rows_deleted_callback), sheet); + G_CALLBACK(rows_inserted_deleted_callback), sheet); } @@ -1481,22 +1499,23 @@ gtk_sheet_autoresize_column (GtkSheet *sheet, gint column) g_return_if_fail (GTK_IS_SHEET (sheet)); if (column >= xxx_column_count(sheet) || column < 0) return; - g_print("%s:%d Iterating rows\n",__FILE__, __LINE__); - for (row = 0; row < yyy_row_count(sheet); row++){ - const gchar *text = gtk_sheet_cell_get_text(sheet, row, column); - if (text && strlen(text) > 0){ - GtkSheetCellAttr attributes; - - gtk_sheet_get_attributes(sheet, row, column, &attributes); - if(attributes.is_visible){ - gint width = STRING_WIDTH(GTK_WIDGET(sheet), - attributes.font_desc, - text) - + 2*CELLOFFSET + attributes.border.width; - text_width = MAX (text_width, width); + for (row = 0; row < yyy_row_count(sheet); row++) + { + gchar *text = gtk_sheet_cell_get_text(sheet, row, column); + if (text && strlen(text) > 0){ + GtkSheetCellAttr attributes; + + gtk_sheet_get_attributes(sheet, row, column, &attributes); + if(attributes.is_visible){ + gint width = STRING_WIDTH(GTK_WIDGET(sheet), + attributes.font_desc, + text) + + 2*CELLOFFSET + attributes.border.width; + text_width = MAX (text_width, width); + } } + dispose_string(sheet, text); } - } if(text_width > xxx_column_width(sheet, column) ) { @@ -2776,7 +2795,7 @@ gtk_sheet_unrealize (GtkWidget * widget) gdk_window_destroy (sheet->row_title_window); if (sheet->pixmap){ - g_free (sheet->pixmap); + g_object_unref(sheet->pixmap); sheet->pixmap = NULL; } @@ -3048,7 +3067,7 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) PangoContext *context = gtk_widget_get_pango_context(GTK_WIDGET(sheet)); gint ascent, descent, y_pos; - const gchar *label; + gchar *label; g_return_if_fail (sheet != NULL); @@ -3085,6 +3104,7 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) clip_area = area; 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); @@ -3124,7 +3144,7 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) area.x+=area.width; if(!gtk_sheet_clip_text(sheet)){ for(i=col-1; i>=MIN_VISIBLE_COLUMN(sheet); i--){ - if(gtk_sheet_cell_get_text(sheet, row, i)) break; + if( !gtk_sheet_cell_empty(sheet, row, i)) break; if(size>=text_width+CELLOFFSET) break; size+=xxx_column_width(sheet, i); xxx_column_set_right_column(sheet, i, @@ -3143,7 +3163,7 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) area.x+=area.width/2; if(!gtk_sheet_clip_text(sheet)){ for(i=col+1; i<=MAX_VISIBLE_COLUMN(sheet); i++){ - if(gtk_sheet_cell_get_text(sheet, row, i)) break; + if( ! gtk_sheet_cell_empty(sheet, row, i)) break; if(sizer>=text_width/2) break; sizer+= xxx_column_width(sheet, i); xxx_column_set_left_column(sheet, i, @@ -3152,7 +3172,7 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) xxx_column_left_column(sheet, i))); } for(i=col-1; i>=MIN_VISIBLE_COLUMN(sheet); i--){ - if(gtk_sheet_cell_get_text(sheet, row, i)) break; + if( ! gtk_sheet_cell_empty(sheet, row, i)) break; if(sizel>=text_width/2) break; sizel+=xxx_column_width(sheet, i); xxx_column_set_right_column(sheet, i, @@ -3170,7 +3190,7 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) size=area.width; if(!gtk_sheet_clip_text(sheet)){ for(i=col+1; i<=MAX_VISIBLE_COLUMN(sheet); i++){ - if(gtk_sheet_cell_get_text(sheet, row, i)) break; + if(! gtk_sheet_cell_empty(sheet, row, i)) break; if(size>=text_width+CELLOFFSET) break; size+=xxx_column_width(sheet, i); xxx_column_set_left_column(sheet, i, @@ -3500,7 +3520,7 @@ gtk_sheet_set_cell(GtkSheet *sheet, gint row, gint col, { GSheetModel *model ; gboolean changed ; - const gchar *old_text ; + gchar *old_text ; GtkSheetRange range; gint text_width; @@ -3524,14 +3544,19 @@ gtk_sheet_set_cell(GtkSheet *sheet, gint row, gint col, if (0 != safe_strcmp(old_text, text)) changed = g_sheet_model_set_string(model, text, row, col); + if ( g_sheet_model_free_strings(model)) + g_free(old_text); + + if(changed && attributes.is_visible) { - const gchar *s = gtk_sheet_cell_get_text(sheet, row, col); + 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; @@ -3603,7 +3628,7 @@ gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column, gboolean dele { GSheetModel *model = gtk_sheet_get_model(sheet); - const gchar *old_text = gtk_sheet_cell_get_text(sheet, row, column); + gchar *old_text = gtk_sheet_cell_get_text(sheet, row, column); if (old_text && strlen(old_text) > 0 ) { @@ -3614,6 +3639,7 @@ gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column, gboolean dele row, column); } + dispose_string (sheet, old_text); } void @@ -3664,8 +3690,21 @@ gtk_sheet_real_range_clear (GtkSheet *sheet, const GtkSheetRange *range, } -const gchar * -gtk_sheet_cell_get_text (GtkSheet *sheet, gint row, gint col) +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) { GSheetModel *model; g_return_val_if_fail (sheet != NULL, NULL); @@ -4045,9 +4084,9 @@ gtk_sheet_show_active_cell(GtkSheet *sheet) if(gtk_sheet_justify_entry(sheet)) justification = attributes.justification; - text = g_strdup(gtk_sheet_cell_get_text(sheet, row, col)); - - if(!text) text = g_strdup(""); + text = gtk_sheet_cell_get_text(sheet, row, col); + if ( ! text ) + text = g_strdup(""); gtk_entry_set_visibility(GTK_ENTRY(sheet_entry), attributes.is_visible); @@ -4075,7 +4114,7 @@ gtk_sheet_show_active_cell(GtkSheet *sheet) gtk_widget_grab_focus(GTK_WIDGET(sheet_entry)); - g_free(text); + dispose_string(sheet, text); } static void @@ -4098,7 +4137,6 @@ gtk_sheet_draw_active_cell(GtkSheet *sheet) #endif gtk_sheet_draw_backing_pixmap(sheet, sheet->range); gtk_sheet_draw_border(sheet, sheet->range); - } @@ -4129,7 +4167,7 @@ gtk_sheet_make_backing_pixmap (GtkSheet *sheet, guint width, guint height) &pixmap_width, &pixmap_height); if ((pixmap_width != width) || (pixmap_height != height)) { - g_free(sheet->pixmap); + g_object_unref(sheet->pixmap); sheet->pixmap = gdk_pixmap_new (sheet->sheet_window, width, height, -1); @@ -6426,10 +6464,10 @@ gtk_sheet_button_draw (GtkSheet *sheet, gint row, gint column) shadow_type = GTK_SHADOW_OUT; if(state != GTK_STATE_NORMAL && state != GTK_STATE_INSENSITIVE) - gtk_paint_box (sheet->button->style, window, - button->state, shadow_type, - &allocation, GTK_WIDGET(sheet->button), - "button", x, y, width, height); + gtk_paint_box (sheet->button->style, window, + button->state, shadow_type, + &allocation, GTK_WIDGET(sheet->button), + "button", x, y, width, height); if(button->label_visible){ @@ -6499,40 +6537,6 @@ gtk_sheet_button_draw (GtkSheet *sheet, gint row, gint column) } g_free(line); } - if(button->label && strlen(button->label) > 0){ - PangoLayout *layout = NULL; - gint real_x = x, real_y = y; - - text_width = STRING_WIDTH(GTK_WIDGET(sheet), GTK_WIDGET(sheet)->style->font_desc, button->label); - - layout = gtk_widget_create_pango_layout (GTK_WIDGET(sheet), button->label); - switch(button->justification){ - case GTK_JUSTIFY_LEFT: - real_x = x + CELLOFFSET; - align = rtl ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT; - break; - case GTK_JUSTIFY_RIGHT: - real_x = x + width - text_width - CELLOFFSET; - align = rtl ? PANGO_ALIGN_LEFT : PANGO_ALIGN_RIGHT; - break; - case GTK_JUSTIFY_CENTER: - default: - real_x = x + (width - text_width)/2; - align = rtl ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT; - pango_layout_set_justify (layout, TRUE); - } - pango_layout_set_alignment (layout, align); - gtk_paint_layout (GTK_WIDGET(sheet)->style, - window, - state, - FALSE, - &allocation, - GTK_WIDGET(sheet), - "label", - real_x, real_y, - layout); - g_object_unref(G_OBJECT(layout)); - } gdk_gc_set_clip_rectangle(GTK_WIDGET(sheet)->style->fg_gc[button->state], NULL);