Means Dialog: Fix issue where the wrong syntax was generated.
[pspp] / src / ui / gui / psppire-means-layer.c
index 24178b8a35c4b52fac0b78e2b8b29e1d7e62e34c..8046b00765e2a42d6371fa1a96f71bf462c80820 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2012  Free Software Foundation
+   Copyright (C) 2012, 2014  Free Software Foundation
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -17,7 +17,6 @@
 #include <config.h>
 
 #include "psppire-means-layer.h"
-#include "psppire-selector.h"
 #include "psppire-var-view.h"
 
 #include <gtk/gtk.h>
@@ -32,52 +31,130 @@ static void psppire_means_layer_init          (PsppireMeansLayer      *window);
 
 G_DEFINE_TYPE (PsppireMeansLayer, psppire_means_layer, GTK_TYPE_VBOX);
 
+static GObjectClass *parent_class = NULL;
+
+static void
+psppire_means_layer_dispose (GObject *obj)
+{
+  PsppireMeansLayer *w = (PsppireMeansLayer *)obj;
+
+  if (w->dispose_has_run)
+    return;
+
+  /* Make sure dispose does not run twice. */
+  w->dispose_has_run = TRUE;
+
+  g_ptr_array_unref (w->layer);
+
+  /* Chain up to the parent class */
+  G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
 
 static void 
 psppire_means_layer_class_init    (PsppireMeansLayerClass *class)
 {
-  //  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
+  GObjectClass *object_class = G_OBJECT_CLASS (class);
+  parent_class = g_type_class_peek_parent (class);
+
+
+  object_class->dispose = psppire_means_layer_dispose;
+}
+
+
+static void
+refresh_view (PsppireMeansLayer *ml)
+{
+  GtkTreeModel *tm;
+  g_return_if_fail (ml->current_layer >= 0);
+  tm = g_ptr_array_index (ml->layer, ml->current_layer);
+  gtk_tree_view_set_model (GTK_TREE_VIEW (ml->var_view), tm);
 }
 
+
 static void
-update (PsppireMeansLayer *ml)
+add_new_layer (PsppireMeansLayer *ml)
+{
+  /* Add a model and take a reference to it */
+  GtkTreeModel *tm = gtk_tree_view_get_model (GTK_TREE_VIEW (ml->var_view));
+  g_ptr_array_add (ml->layer, tm);
+  g_signal_connect_swapped (tm, "row-inserted", G_CALLBACK (refresh_view), ml);
+  
+  g_object_ref (tm);
+}
+
+
+void
+psppire_means_layer_update (PsppireMeansLayer *ml)
 {
-  gchar *l = g_strdup_printf (_("Layer %d of %d"),
+  gchar *l;
+
+  if (!gtk_widget_get_realized (GTK_WIDGET (ml)))
+    return;
+
+  l = g_strdup_printf (_("Layer %d of %d"),
                              ml->current_layer + 1, ml->n_layers);
   
   gtk_label_set_text (GTK_LABEL (ml->label), l);
   g_free (l);
 
-  psppire_var_view_set_current_model (PSPPIRE_VAR_VIEW (ml->var_view),
-                                     ml->current_layer);
-
   gtk_widget_set_sensitive (ml->back, ml->current_layer > 0);
-  gtk_widget_set_sensitive (ml->forward,
-                           psppire_var_view_get_iter_first (PSPPIRE_VAR_VIEW (ml->var_view), NULL));
+
+  {
+    GtkTreeIter dummy;
+    GtkTreeModel *tm = g_ptr_array_index (ml->layer, ml->current_layer);
+
+    g_return_if_fail (GTK_IS_TREE_MODEL (tm));
+    
+    gtk_widget_set_sensitive (ml->forward,
+                             gtk_tree_model_get_iter_first (tm, &dummy));
+  }
 }
 
 static void
 on_forward (PsppireMeansLayer *ml)
 {
-  ml->current_layer++;
-  if (ml->current_layer >= ml->n_layers)
+  if (ml->current_layer + 1 >= ml->n_layers)
     {
-      ml->n_layers = ml->current_layer + 1;
-      psppire_var_view_push_model (PSPPIRE_VAR_VIEW (ml->var_view));
+      psppire_var_view_clear (PSPPIRE_VAR_VIEW (ml->var_view));
+      add_new_layer (ml);
+      ml->n_layers = ml->current_layer + 2;
     }
-
-  update (ml);
+  else
+    {
+      GtkTreeModel *tm = g_ptr_array_index (ml->layer, ml->current_layer + 1);
+      gtk_tree_view_set_model (GTK_TREE_VIEW (ml->var_view), tm);
+    }
+  ml->current_layer++;
+  psppire_means_layer_update (ml);
 }
 
 static void
 on_back (PsppireMeansLayer *ml)
 {
+  GtkTreeModel *tm;
   g_return_if_fail (ml->current_layer > 0);
   ml->current_layer--;
 
-  update (ml);
+  tm = g_ptr_array_index (ml->layer, ml->current_layer);
+  gtk_tree_view_set_model (GTK_TREE_VIEW (ml->var_view), tm);
+
+  psppire_means_layer_update (ml);
 }
 
+void
+psppire_means_layer_clear (PsppireMeansLayer *ml)
+{
+  psppire_var_view_clear (PSPPIRE_VAR_VIEW (ml->var_view));
+
+  ml->n_layers = 1;
+  ml->current_layer = 0;
+  ml->layer = g_ptr_array_new_full (3, g_object_unref);
+
+  add_new_layer (ml);
+
+  psppire_means_layer_update (ml);
+}
 
 static void 
 psppire_means_layer_init  (PsppireMeansLayer      *ml)
@@ -87,10 +164,10 @@ psppire_means_layer_init  (PsppireMeansLayer      *ml)
   GtkWidget *alignment = gtk_alignment_new (0, 0.5, 0, 0);
   GtkWidget *sw = gtk_scrolled_window_new (NULL, NULL);
 
+  ml->dispose_has_run = FALSE;
   ml->forward = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
   ml->back = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
   ml->var_view = psppire_var_view_new ();
-  ml->selector = psppire_selector_new ();
   ml->label = gtk_label_new ("");
 
   g_signal_connect_swapped (ml->forward, "clicked", G_CALLBACK (on_forward),
@@ -98,9 +175,6 @@ psppire_means_layer_init  (PsppireMeansLayer      *ml)
 
   g_signal_connect_swapped (ml->back, "clicked", G_CALLBACK (on_back), ml);
 
-  g_signal_connect_swapped (ml->selector, "selected", G_CALLBACK (update), ml);
-  g_signal_connect_swapped (ml->selector, "de-selected", G_CALLBACK (update),
-                           ml);
 
   g_object_set (ml->var_view, "headers-visible", FALSE, NULL);
   g_object_set (sw,
@@ -108,23 +182,20 @@ psppire_means_layer_init  (PsppireMeansLayer      *ml)
                "hscrollbar-policy", GTK_POLICY_AUTOMATIC,
                NULL);
 
-  g_object_set (ml->selector, "dest-widget", ml->var_view, NULL);
+  g_signal_connect_swapped (ml->var_view, "notify::model", G_CALLBACK (psppire_means_layer_update), ml);
 
   gtk_box_pack_start (GTK_BOX (hbox_upper), ml->back, FALSE, FALSE, 5);
   gtk_box_pack_start (GTK_BOX (hbox_upper), ml->label, TRUE, FALSE, 5);
   gtk_box_pack_start (GTK_BOX (hbox_upper), ml->forward, FALSE, FALSE, 5);
 
   gtk_box_pack_start (GTK_BOX (hbox_lower), alignment, FALSE, FALSE, 5);
-  gtk_container_add (GTK_CONTAINER (alignment), ml->selector);
   gtk_box_pack_start (GTK_BOX (hbox_lower), sw, TRUE, TRUE, 5);
   gtk_container_add (GTK_CONTAINER (sw), ml->var_view);
 
   gtk_box_pack_start (GTK_BOX (ml), hbox_upper, FALSE, FALSE, 5);
   gtk_box_pack_start (GTK_BOX (ml), hbox_lower, TRUE, TRUE, 5);
 
-  ml->n_layers = 1;
-  ml->current_layer = 0;
-  update (ml);
+  psppire_means_layer_clear (ml);
 
   gtk_widget_show_all (hbox_upper);
   gtk_widget_show_all (hbox_lower);
@@ -137,18 +208,18 @@ psppire_means_layer_new (void)
 }
 
 
-void
-psppire_means_layer_set_source (PsppireMeansLayer *ml, GtkWidget *w)
+
+
+GtkTreeModel *
+psppire_means_layer_get_model_n (PsppireMeansLayer *ml, gint n)
 {
-  g_object_set (ml->selector, "source-widget", w, NULL);
+  return g_ptr_array_index (ml->layer, n);
 }
 
 
-void
-psppire_means_layer_clear (PsppireMeansLayer *ml)
+GtkTreeModel *
+psppire_means_layer_get_model (PsppireMeansLayer *ml)
 {
-  psppire_var_view_clear (PSPPIRE_VAR_VIEW (ml->var_view));
-  ml->n_layers = 1;
-  ml->current_layer = 0;
-  update (ml);
+  return g_ptr_array_index (ml->layer, ml->current_layer);
 }
+