X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-dialog-action-var-info.c;h=31580dd9f97e347f923447cd0f1d4db26e3340d7;hb=ed208cf009043f0bf319a4e919c279d5b1401f36;hp=0c17222fa378b75f58a41512efa0792f23550a1d;hpb=f481fd69631024bcdc7dc2369bbc1592d7a43ac7;p=pspp diff --git a/src/ui/gui/psppire-dialog-action-var-info.c b/src/ui/gui/psppire-dialog-action-var-info.c index 0c17222fa3..31580dd9f9 100644 --- a/src/ui/gui/psppire-dialog-action-var-info.c +++ b/src/ui/gui/psppire-dialog-action-var-info.c @@ -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 @@ -26,11 +26,14 @@ #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, ""); +} + 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; }