Merge 'master' into 'psppsheet'.
[pspp] / src / ui / gui / compute-dialog.c
index 89a64563630dbde933d166a02f75ec15580ec51f..46f9fbe07837b15f0c08fc367d792ee9881b6868 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007, 2010  Free Software Foundation
+   Copyright (C) 2007, 2010, 2011, 2012  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
 #include <config.h>
 #include <gtk/gtk.h>
 #include "compute-dialog.h"
-#include "helper.h"
+#include "builder-wrapper.h"
 #include "psppire-dialog.h"
 #include "psppire-keypad.h"
 #include "psppire-data-window.h"
-#include "psppire-var-store.h"
 #include "psppire-selector.h"
 #include "dialog-common.h"
 #include <libpspp/i18n.h>
 
+
 #include <language/expressions/public.h>
 #include "executor.h"
+#include "helper.h"
+
 
 static void function_list_populate (GtkTreeView *tv);
 
@@ -302,6 +304,24 @@ run_type_label_dialog (GtkButton *b, gpointer data)
     cd->use_type = TRUE;
 }
 
+static void
+on_type_toggled (GtkToggleButton *button, gpointer data)
+{
+  struct compute_dialog *cd = data;
+
+  GtkWidget *entry =
+    get_widget_assert (cd->xml, "type-and-label-width");
+
+  if ( gtk_toggle_button_get_active (button))
+    {
+      gtk_widget_set_sensitive (entry, TRUE);
+      gtk_widget_grab_focus (entry);
+    }
+  else
+    {
+      gtk_widget_set_sensitive (entry, FALSE);
+    }
+}
 
 static void
 on_expression_toggle (GtkToggleButton *button, gpointer data)
@@ -318,7 +338,6 @@ on_expression_toggle (GtkToggleButton *button, gpointer data)
     }
   else
     {
-      const char *label;
       struct variable *target_var;
       const gchar *target_name = gtk_entry_get_text
        (GTK_ENTRY (get_widget_assert (cd->xml, "compute-entry1")));
@@ -326,7 +345,7 @@ on_expression_toggle (GtkToggleButton *button, gpointer data)
       target_var = psppire_dict_lookup_var (cd->dict, target_name);
       if ( target_var )
        {
-         label = var_get_label (target_var);
+         const char *label = var_get_label (target_var);
 
          if ( label )
            gtk_entry_set_text (GTK_ENTRY (entry), label);
@@ -335,6 +354,7 @@ on_expression_toggle (GtkToggleButton *button, gpointer data)
        gtk_entry_set_text (GTK_ENTRY (entry), "");
 
       gtk_widget_set_sensitive (entry, TRUE);
+      gtk_widget_grab_focus (entry);
     }
 }
 
@@ -366,7 +386,6 @@ compute_dialog (PsppireDataWindow *de)
 {
   gint response;
 
-  PsppireVarStore *vs = NULL;
   struct compute_dialog scd;
 
   GtkBuilder *xml = builder_new ("compute.ui");
@@ -384,14 +403,19 @@ compute_dialog (PsppireDataWindow *de)
   GtkWidget *expression =
        get_widget_assert (xml, "radio-button-expression-label");
 
+  GtkWidget *str_btn =
+       get_widget_assert (xml, "radio-button-string");
 
-  g_object_get (de->data_editor, "var-store", &vs, NULL);
-  g_object_get (vs, "dictionary", &scd.dict, NULL);
+
+  g_object_get (de->data_editor, "dictionary", &scd.dict, NULL);
   scd.use_type = FALSE;
 
   g_signal_connect (expression, "toggled",
                    G_CALLBACK(on_expression_toggle), &scd);
 
+  g_signal_connect (str_btn, "toggled",
+                   G_CALLBACK(on_type_toggled), &scd);
+
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
   
@@ -434,7 +458,7 @@ compute_dialog (PsppireDataWindow *de)
   switch (response)
     {
     case GTK_RESPONSE_OK:
-      g_free (execute_syntax_string (generate_syntax (&scd)));
+      g_free (execute_syntax_string (de, generate_syntax (&scd)));
       break;
     case PSPPIRE_RESPONSE_PASTE:
       g_free (paste_syntax_to_window (generate_syntax (&scd)));
@@ -499,6 +523,7 @@ function_list_populate (GtkTreeView *tv)
   }
 
   gtk_tree_view_set_model (tv, GTK_TREE_MODEL (liststore));
+  g_object_unref (liststore);
 }