Converted strings to utf8 before passing to gtksheet. Should work properly now with
[pspp-builds.git] / lib / gtksheet / gtksheet.c
index 7f5acedf4cfe3f0905cc063148fb3b048a7d0419..2e9e416dc54cf7967085aab65a77bfcac4aed4d9 100644 (file)
@@ -1123,14 +1123,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 +1234,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,7 +1488,6 @@ 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){
@@ -2776,7 +2782,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;
   }
 
@@ -3498,52 +3504,58 @@ gtk_sheet_set_cell(GtkSheet *sheet, gint row, gint col,
                    GtkJustification justification,
                    const gchar *text)
 {
GtkSheetRange range;
gint text_width;
- GtkSheetCellAttr attributes;
 GSheetModel *model ;
 gboolean changed ;
+  const gchar *old_text ; 
 
- g_return_if_fail (sheet != NULL);
- g_return_if_fail (GTK_IS_SHEET (sheet));
- if (col >= xxx_column_count(sheet) || row >= yyy_row_count(sheet)) return;
- if (col < 0 || row < 0) return;
+  GtkSheetRange range;
+  gint text_width;
+  GtkSheetCellAttr attributes;
 
- gtk_sheet_get_attributes(sheet, row, col, &attributes);
+  g_return_if_fail (sheet != NULL);
+  g_return_if_fail (GTK_IS_SHEET (sheet));
+  if (col >= xxx_column_count(sheet) || row >= yyy_row_count(sheet)) return;
+  if (col < 0 || row < 0) return;
 
attributes.justification = justification;
 gtk_sheet_get_attributes(sheet, row, col, &attributes);
 
GSheetModel *model =  gtk_sheet_get_model(sheet);
 attributes.justification = justification;
 
const gchar *old_text = g_sheet_model_get_string(model, row, col);
 model =  gtk_sheet_get_model(sheet);
 
gboolean changed = FALSE;
 old_text = g_sheet_model_get_string(model, row, col);
 
- if (0 != safe_strcmp(old_text, text))
-   changed = g_sheet_model_set_string(model, text, row, col);
+  changed = FALSE;
 
- if(changed && attributes.is_visible){
-   const 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);
-   }
+  if (0 != safe_strcmp(old_text, text))
+    changed = g_sheet_model_set_string(model, text, row, col);
 
-   range.row0 = row;
-   range.rowi = row;
-   range.col0 = sheet->view.col0;
-   range.coli = sheet->view.coli;
+  if(changed && attributes.is_visible)
+    {
+      const 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);
+      }
 
-   if(gtk_sheet_autoresize(sheet) &&
-      text_width > xxx_column_width(sheet, col) - 2*CELLOFFSET-attributes.border.width){
+    range.row0 = row;
+    range.rowi = row;
+    range.col0 = sheet->view.col0;
+    range.coli = sheet->view.coli;
+
+    if(gtk_sheet_autoresize(sheet) &&
+       text_width > xxx_column_width(sheet, col) - 2*CELLOFFSET-attributes.border.width){
       gtk_sheet_set_column_width(sheet, col, text_width+2*CELLOFFSET+attributes.border.width);
       GTK_SHEET_SET_FLAGS(sheet, GTK_SHEET_REDRAW_PENDING);
-   }
-   else
-     if(!GTK_SHEET_IS_FROZEN(sheet))
-       gtk_sheet_range_draw(sheet, &range);
- }
+    }
+    else
+      if(!GTK_SHEET_IS_FROZEN(sheet))
+       gtk_sheet_range_draw(sheet, &range);
 }
 
- if ( changed ) 
-   gtk_signal_emit(GTK_OBJECT(sheet),sheet_signals[CHANGED], row, col);
 if ( changed ) 
+    gtk_signal_emit(GTK_OBJECT(sheet),sheet_signals[CHANGED], row, col);
 
 }
 
@@ -3595,12 +3607,10 @@ gtk_sheet_cell_delete (GtkSheet *sheet, gint row, gint column)
 static void
 gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column, gboolean delete)
 {
-  const gchar *old_text;
-
-  old_text = gtk_sheet_cell_get_text(sheet, row, column); 
   GSheetModel *model =  gtk_sheet_get_model(sheet);
 
+  const gchar *old_text = gtk_sheet_cell_get_text(sheet, row, column); 
   if (old_text && strlen(old_text) > 0 )
     {
       g_sheet_model_datum_clear(model, row, column);
@@ -4094,7 +4104,6 @@ gtk_sheet_draw_active_cell(GtkSheet *sheet)
 #endif
     gtk_sheet_draw_backing_pixmap(sheet, sheet->range);
     gtk_sheet_draw_border(sheet, sheet->range);
-
 }
 
 
@@ -4125,7 +4134,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);
@@ -6665,7 +6674,6 @@ vadjustment_value_changed (GtkAdjustment * adjustment,
 {
   GtkSheet *sheet;
   gint diff, value, old_value;
-  gint i;
   gint row, new_row;
   gint y=0;
 
@@ -6689,7 +6697,7 @@ vadjustment_value_changed (GtkAdjustment * adjustment,
   y = g_sheet_row_start_pixel(sheet->row_geometry, new_row, sheet);
 
   if (adjustment->value > sheet->old_vadjustment && sheet->old_vadjustment > 0. &&
-      yyy_row_height(sheet, i) > sheet->vadjustment->step_increment){
+      yyy_row_height(sheet, row) > sheet->vadjustment->step_increment){
 /* This avoids embarrassing twitching */
           if(row == new_row && row != yyy_row_count(sheet) - 1 &&
              adjustment->value - sheet->old_vadjustment >= 
@@ -7111,6 +7119,11 @@ gtk_sheet_set_row_height (GtkSheet * sheet,
 gboolean
 gtk_sheet_get_attributes(GtkSheet *sheet, gint row, gint col, GtkSheetCellAttr *attributes)
 {
+ const GdkColor *fg, *bg; 
+ const GtkJustification *j ; 
+ const PangoFontDescription *font_desc ;
+ const GtkSheetCellBorder *border ;
+
  g_return_val_if_fail (sheet != NULL, FALSE);
  g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE);
 
@@ -7124,26 +7137,23 @@ gtk_sheet_get_attributes(GtkSheet *sheet, gint row, gint col, GtkSheetCellAttr *
  attributes->is_editable = g_sheet_model_is_editable(sheet->model, row, col);
  attributes->is_visible = g_sheet_model_is_visible(sheet->model, row, col);
 
const GdkColor *fg = g_sheet_model_get_foreground(sheet->model, row, col);
+ fg = g_sheet_model_get_foreground(sheet->model, row, col);
  if ( fg ) 
    attributes->foreground =  *fg;
 
const GdkColor *bg = g_sheet_model_get_background(sheet->model, row, col);
+ bg = g_sheet_model_get_background(sheet->model, row, col);
  if ( bg ) 
    attributes->background =  *bg;
 
- const GtkJustification *j = g_sheet_model_get_justification(sheet->model,
-                                                              row, col);
+ j = g_sheet_model_get_justification(sheet->model, row, col);
  if (j)   attributes->justification = *j;
 
- const PangoFontDescription *font_desc = 
-   g_sheet_model_get_font_desc(sheet->model, row, col);
+ font_desc = g_sheet_model_get_font_desc(sheet->model, row, col);
  if ( font_desc )  attributes->font_desc = font_desc;
 
- const GtkSheetCellBorder *border = 
-  g_sheet_model_get_cell_border(sheet->model, row, col);
+ border = g_sheet_model_get_cell_border(sheet->model, row, col);
 
- if ( border )    attributes->border = *border;
+ if ( border ) attributes->border = *border;
 
  return TRUE;
 }
@@ -7344,7 +7354,7 @@ gtk_sheet_button_attach           (GtkSheet *sheet,
                                 GtkWidget *widget, 
                                 gint row, gint col)
 {
-  GtkSheetButton *button;
+  GtkSheetButton *button = 0;
   GtkSheetChild *child;
   GtkRequisition button_requisition;