psppire-output-window: Factor out output view as psppire-output-view.
[pspp] / src / ui / gui / psppire-data-sheet.c
index 01afb5ed8772e50a9bd136241de385429a0d646e..f991d79ffd2d8b8bcfb588965251ed82dbbced0d 100644 (file)
@@ -124,6 +124,7 @@ on_query_tooltip (GtkWidget *widget, gint wx, gint wy,
   int width;
 
   g_return_val_if_fail (data_store != NULL, FALSE);
+  g_return_val_if_fail (data_store->datasheet != NULL, FALSE);
 
   if (!get_tooltip_location (widget, tooltip, wx, wy, &row, &column))
     return FALSE;
@@ -176,9 +177,9 @@ render_row_number_cell (PsppSheetViewColumn *tree_column,
 {
   PsppireDataStore *store = store_;
   GValue gvalue = { 0, };
-  gint row;
+  gint row = GPOINTER_TO_INT (iter->user_data);
 
-  row = GPOINTER_TO_INT (iter->user_data);
+  g_return_if_fail (store->datasheet);
 
   g_value_init (&gvalue, G_TYPE_INT);
   g_value_set_int (&gvalue, row + 1);
@@ -337,13 +338,15 @@ on_data_column_editing_started (GtkCellRenderer *cell,
   if (var_has_value_labels (var) && GTK_IS_COMBO_BOX (editable))
     {
       const struct val_labs *labels = var_get_value_labels (var);
-      const struct val_lab *vl;
+      const struct val_lab **vls = val_labs_sorted (labels);
+      size_t n_vls = val_labs_count (labels);
       GtkListStore *list_store;
+      int i;
 
       list_store = gtk_list_store_new (1, G_TYPE_STRING);
-      for (vl = val_labs_first (labels); vl != NULL;
-           vl = val_labs_next (labels, vl))
+      for (i = 0; i < n_vls; ++i)
         {
+          const struct val_lab *vl = vls[i];
           GtkTreeIter iter;
 
           gtk_list_store_append (list_store, &iter);
@@ -351,6 +354,7 @@ on_data_column_editing_started (GtkCellRenderer *cell,
                               0, val_lab_get_label (vl),
                               -1);
         }
+      free (vls);
 
       gtk_combo_box_set_model (GTK_COMBO_BOX (editable),
                                GTK_TREE_MODEL (list_store));
@@ -671,7 +675,7 @@ add_data_column_cell_renderer (PsppireDataSheet *data_sheet,
   var = g_object_get_data (G_OBJECT (column), "variable");
   g_return_if_fail (var != NULL);
 
-  if (var_has_value_labels (var))
+  if (data_sheet->show_value_labels && var_has_value_labels (var))
     {
       cell = gtk_cell_renderer_combo_new ();
       g_object_set (G_OBJECT (cell),
@@ -940,10 +944,11 @@ psppire_data_sheet_set_value_labels (PsppireDataSheet *ds,
     {
       ds->show_value_labels = show_value_labels;
       g_object_notify (G_OBJECT (ds), "value-labels");
-      gtk_widget_queue_draw (GTK_WIDGET (ds));
 
-      /* Make the cell being edited refresh too. */
-      pspp_sheet_view_stop_editing (PSPP_SHEET_VIEW (ds), TRUE);
+      /* Pretend the model changed, to force the columns to be rebuilt.
+         Otherwise cell renderers won't get changed from combo boxes to text
+         entries or vice versa. */
+      g_object_notify (G_OBJECT (ds), "model");
     }
 }
 
@@ -1906,6 +1911,7 @@ on_variable_display_width_changed (PsppireDict *dict, int dict_index,
 
 static void
 on_variable_changed (PsppireDict *dict, int dict_index,
+                    guint what, const struct variable *oldvar,
                      PsppireDataSheet *data_sheet)
 {
   PsppireDataStore *data_store = psppire_data_sheet_get_data_store (data_sheet);
@@ -1918,11 +1924,16 @@ on_variable_changed (PsppireDict *dict, int dict_index,
   g_return_if_fail (data_sheet->data_store != NULL);
   g_return_if_fail (dict == data_sheet->data_store->dict);
 
+
+  if (what & VAR_TRAIT_DISPLAY_WIDTH)
+    on_variable_display_width_changed (dict, dict_index, data_sheet);
+
   column = psppire_data_sheet_find_column_for_variable (data_sheet,
                                                         dict_index);
   if (column == NULL)
     return;
 
+
   var = psppire_dict_get_variable (data_store->dict, dict_index);
   g_return_if_fail (var != NULL);
 
@@ -2042,9 +2053,6 @@ psppire_data_sheet_set_data_store (PsppireDataSheet *data_sheet,
       g_signal_connect (data_store->dict, "variable-changed",
                         G_CALLBACK (on_variable_changed),
                         data_sheet);
-      g_signal_connect (data_store->dict, "variable-display-width-changed",
-                        G_CALLBACK (on_variable_display_width_changed),
-                        data_sheet);
       g_signal_connect (data_store->dict, "variable-inserted",
                         G_CALLBACK (on_variable_inserted), data_sheet);
       g_signal_connect (data_store->dict, "variable-deleted",