Rename psppire_dialog_action_get_pointer -> psppire_dialog_action_get_hash_table
[pspp] / src / ui / gui / psppire-dialog-action-var-info.c
index 0c17222fa378b75f58a41512efa0792f23550a1d..31580dd9f97e347f923447cd0f1d4db26e3340d7 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007, 2009, 2010, 2011, 2012  Free Software Foundation
+   Copyright (C) 2007, 2009, 2010, 2011, 2012, 2013, 2014  Free Software Foundation
 
 
    This program is free software: you can redistribute it and/or modify
 #include "data/value-labels.h"
 #include "data/variable.h"
 #include "libpspp/i18n.h"
+#include "output/driver.h"
 #include "ui/gui/builder-wrapper.h"
+#include "ui/gui/executor.h"
 #include "ui/gui/helper.h"
 #include "ui/gui/psppire-data-window.h"
 #include "ui/gui/psppire-dialog.h"
 #include "ui/gui/psppire-dictview.h"
+#include "ui/gui/psppire-output-view.h"
 #include "ui/gui/var-display.h"
 
 static void psppire_dialog_action_var_info_init            (PsppireDialogActionVarInfo      *act);
@@ -42,121 +45,98 @@ G_DEFINE_TYPE (PsppireDialogActionVarInfo, psppire_dialog_action_var_info, PSPPI
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
 
-
-static const gchar none[] = N_("None");
-
-
-static const gchar *
-label_to_string (const struct variable *var)
-{
-  const char *label = var_get_label (var);
-
-  if (NULL == label) return g_strdup (none);
-
-  return label;
-}
-
-
 static gboolean
 treeview_item_selected (gpointer data)
 {
   PsppireDialogAction *pda = data;
   GtkTreeView *tv = GTK_TREE_VIEW (pda->source);
-  GtkTreeModel *model = gtk_tree_view_get_model (tv);
+  GtkTreeSelection *selection = gtk_tree_view_get_selection (tv);
 
-  gint n_rows = gtk_tree_model_iter_n_children  (model, NULL);
-
-  if ( n_rows == 0 )
-    return FALSE;
-
-  return TRUE;
+  return gtk_tree_selection_count_selected_rows (selection) == 1;
 }
 
 static gchar *
-generate_syntax (PsppireDialogAction *act)
-
+generate_syntax__ (PsppireDialogAction *act, const char *prefix)
 {
-  const struct variable *var =
-    psppire_dict_view_get_selected_variable (PSPPIRE_DICT_VIEW (act->source));
-
-  if ( NULL == var)
-    return g_strdup ("");
+  struct variable **vars;
+  size_t n_vars;
+  size_t line_len;
+  GString *s;
+  char *str;
+  size_t i;
+
+  psppire_dict_view_get_selected_variables (PSPPIRE_DICT_VIEW (act->source),
+                                            &vars, &n_vars);
+
+  s = g_string_new (prefix);
+  line_len = 0;
+  for (i = 0; i < n_vars; i++)
+    {
+      const char *name = var_get_name (vars[i]);
+      size_t name_len = strlen (name);
 
-  return g_strdup (var_get_name (var));
-}
+      if (line_len > 0)
+        {
+          if (line_len + 1 + name_len > 69)
+            {
+              g_string_append_c (s, '\n');
+              line_len = 0;
+            }
+          else
+            {
+              g_string_append_c (s, ' ');
+              line_len++;
+            }
+        }
+
+      g_string_append (s, name);
+      line_len += name_len;
+    }
 
+  g_free (vars);
 
+  str = s->str;
+  g_string_free (s, FALSE);
+  return str;
+}
 
+static gchar *
+generate_syntax (PsppireDialogAction *act)
+{
+  return generate_syntax__ (act, "");
+}
+\f
 static void
-populate_text (PsppireDictView *treeview, gpointer data)
+populate_output (GtkTreeSelection *selection, gpointer data)
 {
-  gchar *text = NULL;
-  GString *gstring;
+  PsppireDialogActionVarInfo *act = data;
+  GtkTreeView *treeview = gtk_tree_selection_get_tree_view (selection);
   PsppireDict *dict;
+  size_t n_vars;
 
-  GtkTextBuffer *textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (data));
-  const struct variable *var =
-    psppire_dict_view_get_selected_variable (treeview);
-
-  if ( var == NULL)
-    return;
+  struct variable **vars;
 
   g_object_get (treeview, "model", &dict,
                NULL);
 
-  gstring = g_string_sized_new (200);
-  g_string_assign (gstring, var_get_name (var));
-  g_string_append (gstring, "\n");
-
-
-  g_string_append_printf (gstring, _("Label: %s\n"), label_to_string (var));
-  {
-    const struct fmt_spec *fmt = var_get_print_format (var);
-    char buffer[FMT_STRING_LEN_MAX + 1];
-
-    fmt_to_string (fmt, buffer);
-    /* No conversion necessary.  buffer will always be ascii */
-    g_string_append_printf (gstring, _("Type: %s\n"), buffer);
-  }
-
-  text = missing_values_to_string (dict, var, NULL);
-  g_string_append_printf (gstring, _("Missing Values: %s\n"),
-                         text);
-  g_free (text);
+  psppire_dict_view_get_selected_variables (PSPPIRE_DICT_VIEW (treeview),
+                                            &vars, &n_vars);
 
-  g_string_append_printf (gstring, _("Measurement Level: %s\n"),
-                         measure_to_string (var_get_measure (var)));
-
-
-  /* Value Labels */
-  if ( var_has_value_labels (var))
+  if (n_vars > 0)
     {
-      const struct val_labs *vls = var_get_value_labels (var);
-      const struct val_lab **labels;
-      size_t n_labels;
-      size_t i;
-
-      g_string_append (gstring, "\n");
-      g_string_append (gstring, _("Value Labels:\n"));
+      PsppireDataWindow *dw;
 
-      labels = val_labs_sorted (vls);
-      n_labels = val_labs_count (vls);
-      for (i = 0; i < n_labels; i++)
-        {
-          const struct val_lab *vl = labels[i];
-         gchar *const vstr  = value_to_text (vl->value,  var);
+      g_object_get (act, "top-level", &dw, NULL);
 
-         g_string_append_printf (gstring, _("%s %s\n"),
-                                  vstr, val_lab_get_escaped_label (vl));
+      psppire_output_view_clear (act->output);
 
-         g_free (vstr);
-       }
-      free (labels);
+      output_engine_push ();
+      psppire_output_view_register_driver (act->output);
+      g_free (execute_syntax_string (
+                dw, generate_syntax__ (&act->parent,
+                                       "DISPLAY DICTIONARY /VARIABLES=")));
+      output_engine_pop ();
     }
-
-  gtk_text_buffer_set_text (textbuffer, gstring->str, gstring->len);
-
-  g_string_free (gstring, TRUE);
 }
 
 
@@ -165,40 +145,51 @@ jump_to (PsppireDialog *d, gint response, gpointer data)
 {
   PsppireDataWindow *dw;
   PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (data);
-  const struct variable *var;
+  struct variable **vars;
+  size_t n_vars;
 
   if (response !=  PSPPIRE_RESPONSE_GOTO)
     return;
 
-  var = psppire_dict_view_get_selected_variable (PSPPIRE_DICT_VIEW (pda->source));
-
-  if ( NULL == var)
-    return;
-
-  g_object_get (pda, "top-level", &dw, NULL);
+  psppire_dict_view_get_selected_variables (PSPPIRE_DICT_VIEW (pda->source),
+                                            &vars, &n_vars);
+  if (n_vars > 0)
+    {
+      g_object_get (pda, "top-level", &dw, NULL);
 
-  psppire_data_editor_goto_variable (dw->data_editor,
-                                     var_get_dict_index (var));
+      psppire_data_editor_goto_variable (dw->data_editor,
+                                         var_get_dict_index (vars[0]));
+    }
+  g_free (vars);
 }
 
 static void
 psppire_dialog_action_var_info_activate (GtkAction *a)
 {
   PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a);
+  PsppireDialogActionVarInfo *act = PSPPIRE_DIALOG_ACTION_VAR_INFO (pda);
 
-  GtkBuilder *xml = builder_new ("variable-info.ui");
-  GtkWidget *textview = get_widget_assert (xml, "textview1");  
+  GHashTable *thing = psppire_dialog_action_get_hash_table (pda);
+  GtkBuilder *xml = g_hash_table_lookup (thing, a);
+  if (!xml)
+    {
+      xml = builder_new ("variable-info.ui");
+      g_hash_table_insert (thing, a, xml);
+    }
+
+  act->output = psppire_output_view_new (
+    GTK_LAYOUT (get_widget_assert (xml, "layout1")), NULL, NULL, NULL);
 
   pda->dialog = get_widget_assert (xml, "variable-info-dialog");
   pda->source = get_widget_assert (xml, "treeview2");
 
   g_object_set (pda->source,
-               "selection-mode", GTK_SELECTION_SINGLE,
+               "selection-mode", GTK_SELECTION_MULTIPLE,
                NULL);
 
-  g_signal_connect (pda->source, "cursor-changed", G_CALLBACK (populate_text),
-                   textview);
-
+  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (pda->source)),
+                    "changed", G_CALLBACK (populate_output),
+                   act);
 
   g_signal_connect (pda->dialog, "response", G_CALLBACK (jump_to),
                    pda);
@@ -206,8 +197,6 @@ psppire_dialog_action_var_info_activate (GtkAction *a)
   psppire_dialog_action_set_valid_predicate (pda,
                                             treeview_item_selected);
 
-  g_object_unref (xml);
-
   if (PSPPIRE_DIALOG_ACTION_CLASS (psppire_dialog_action_var_info_parent_class)->activate)
     PSPPIRE_DIALOG_ACTION_CLASS (psppire_dialog_action_var_info_parent_class)->activate (pda);
 }
@@ -215,9 +204,7 @@ psppire_dialog_action_var_info_activate (GtkAction *a)
 static void
 psppire_dialog_action_var_info_class_init (PsppireDialogActionVarInfoClass *class)
 {
-  GtkActionClass *action_class = GTK_ACTION_CLASS (class);
-
-  action_class->activate = psppire_dialog_action_var_info_activate;
+  psppire_dialog_action_set_activation (class, psppire_dialog_action_var_info_activate);
   PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax;
 }