work on docs
[pspp] / src / ui / gui / psppire-means-layer.c
index a9b1139f18c6be631c82e73996c0baa0ffbdb747..255dc6dfe701a456d680a8ace20add12db2b019c 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>
 static void psppire_means_layer_class_init    (PsppireMeansLayerClass *class);
 static void psppire_means_layer_init          (PsppireMeansLayer      *window);
 
-G_DEFINE_TYPE (PsppireMeansLayer, psppire_means_layer, GTK_TYPE_VBOX);
+G_DEFINE_TYPE (PsppireMeansLayer, psppire_means_layer, GTK_TYPE_BOX);
 
 static GObjectClass *parent_class = NULL;
 
 static void
 psppire_means_layer_dispose (GObject *obj)
 {
-  PsppireMeansLayer *w = (PsppireMeansLayer *)obj;
+  PsppireMeansLayer *w = PSPPIRE_MEANS_LAYER (obj);
 
   if (w->dispose_has_run)
     return;
@@ -52,7 +51,7 @@ psppire_means_layer_dispose (GObject *obj)
 }
 
 
-static void 
+static void
 psppire_means_layer_class_init    (PsppireMeansLayerClass *class)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (class);
@@ -62,8 +61,31 @@ psppire_means_layer_class_init    (PsppireMeansLayerClass *class)
   object_class->dispose = psppire_means_layer_dispose;
 }
 
+
 static void
-update (PsppireMeansLayer *ml)
+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
+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;
 
@@ -72,34 +94,39 @@ update (PsppireMeansLayer *ml)
 
   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);
 
   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)
     {
-      GtkTreeModel *tm;
       psppire_var_view_clear (PSPPIRE_VAR_VIEW (ml->var_view));
-      tm = gtk_tree_view_get_model (GTK_TREE_VIEW (ml->var_view));
-      g_ptr_array_add (ml->layer, tm);
-      g_object_ref (tm);
-      ml->n_layers = ml->current_layer + 1;      
+      add_new_layer (ml);
+      ml->n_layers = ml->current_layer + 2;
     }
   else
     {
-      GtkTreeModel *tm = g_ptr_array_index (ml->layer, ml->current_layer);
+      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
@@ -111,22 +138,37 @@ on_back (PsppireMeansLayer *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 
+static void
 psppire_means_layer_init  (PsppireMeansLayer      *ml)
 {
-  GtkWidget *hbox_upper = gtk_hbox_new (FALSE, 5);
-  GtkWidget *hbox_lower = gtk_hbox_new (FALSE, 5);
-  GtkWidget *alignment = gtk_alignment_new (0, 0.5, 0, 0);
+  GtkWidget *hbox_upper = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
+  GtkWidget *hbox_lower = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
   GtkWidget *sw = gtk_scrolled_window_new (NULL, NULL);
 
+  gtk_orientable_set_orientation (GTK_ORIENTABLE (ml), GTK_ORIENTATION_VERTICAL);
+
   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->forward = gtk_button_new_with_label (_("Forward"));
+  ml->back = gtk_button_new_with_label (_("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),
@@ -134,9 +176,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,
@@ -144,32 +183,19 @@ 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 (update), ml);
+  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;
-  ml->layer = g_ptr_array_new_full (3, g_object_unref);
-
-  /* Add a model and take a reference to it */
-  g_ptr_array_add (ml->layer, gtk_tree_view_get_model (GTK_TREE_VIEW (ml->var_view)));
-  g_object_ref (g_ptr_array_index (ml->layer, ml->current_layer));
-
-  update (ml);
+  psppire_means_layer_clear (ml);
 
   gtk_widget_show_all (hbox_upper);
   gtk_widget_show_all (hbox_lower);
@@ -182,24 +208,18 @@ psppire_means_layer_new (void)
 }
 
 
-void
-psppire_means_layer_set_source (PsppireMeansLayer *ml, GtkWidget *w)
-{
-  g_object_set (ml->selector, "source-widget", w, NULL);
-}
 
 
-void
-psppire_means_layer_clear (PsppireMeansLayer *ml)
+GtkTreeModel *
+psppire_means_layer_get_model_n (PsppireMeansLayer *ml, gint n)
 {
-  ml->n_layers = 1;
-  ml->current_layer = 0;
-  psppire_var_view_clear (PSPPIRE_VAR_VIEW (ml->var_view));
+  return g_ptr_array_index (ml->layer, n);
 }
 
 
 GtkTreeModel *
-psppire_means_layer_get_model_n (PsppireMeansLayer *ml, gint n)
+psppire_means_layer_get_model (PsppireMeansLayer *ml)
 {
-  return g_ptr_array_index (ml->layer, n);
+  return g_ptr_array_index (ml->layer, ml->current_layer);
 }
+