/* 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, 2016 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);
#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);
-
- gint n_rows = gtk_tree_model_iter_n_children (model, NULL);
-
- if ( n_rows == 0 )
- return FALSE;
+ GtkTreeSelection *selection = gtk_tree_view_get_selection (tv);
- return TRUE;
+ return gtk_tree_selection_count_selected_rows (selection) >= 1;
}
static gchar *
-generate_syntax (PsppireDialogAction *act)
-
+generate_syntax__ (const PsppireDialogAction *act, const char *prefix)
{
- const struct variable *var =
- psppire_dict_view_get_selected_variable (PSPPIRE_DICT_VIEW (act->source));
+ 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);
+
+ 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;
+ }
- if ( NULL == var)
- return g_strdup ("");
+ g_free (vars);
- return g_strdup (var_get_name (var));
+ str = s->str;
+ g_string_free (s, FALSE);
+ return str;
}
+static gchar *
+generate_syntax (const 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");
-
+ psppire_dict_view_get_selected_variables (PSPPIRE_DICT_VIEW (treeview),
+ &vars, &n_vars);
- 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);
-
- 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;
+ PsppireDataWindow *dw;
- g_string_append (gstring, "\n");
- g_string_append (gstring, _("Value Labels:\n"));
+ g_object_get (act, "top-level", &dw, NULL);
- 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);
+ psppire_output_view_clear (act->output);
- g_string_append_printf (gstring, _("%s %s\n"),
- vstr, val_lab_get_escaped_label (vl));
-
- 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);
}
{
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)
+psppire_dialog_action_var_info_activate (PsppireDialogAction *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");
-
- 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,
- NULL);
-
- g_signal_connect (pda->source, "cursor-changed", G_CALLBACK (populate_text),
- textview);
+ 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);
+
+ pda->dialog = get_widget_assert (xml, "variable-info-dialog");
+ pda->source = get_widget_assert (xml, "treeview2");
- g_signal_connect (pda->dialog, "response", G_CALLBACK (jump_to),
- pda);
+ g_object_set (pda->source,
+ "selection-mode", GTK_SELECTION_MULTIPLE,
+ NULL);
- psppire_dialog_action_set_valid_predicate (pda,
- treeview_item_selected);
+ g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (pda->source)),
+ "changed", G_CALLBACK (populate_output),
+ act);
- g_object_unref (xml);
+ g_signal_connect (pda->dialog, "response", G_CALLBACK (jump_to),
+ pda);
- 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);
+ psppire_dialog_action_set_valid_predicate (pda,
+ treeview_item_selected);
+ }
}
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;
}