1d5c551007cd8755066b6c5a018788c931982daf
[pspp-builds.git] / src / ui / gui / sort-cases-dialog.c
1 #include <gtk/gtk.h>
2 #include "sort-cases-dialog.h"
3 #include "helper.h"
4 #include "psppire-dialog.h"
5 #include "data-editor.h"
6 #include <gtksheet/gtksheet.h>
7 #include "psppire-var-store.h"
8 #include "dialog-common.h"
9 #include "dict-display.h"
10
11 #include <language/syntax-string-source.h>
12 #include "syntax-editor.h"
13
14 static void
15 refresh (PsppireDialog *dialog, GtkTreeView *dest)
16 {
17   GtkTreeModel *liststore = gtk_tree_view_get_model (dest);
18
19
20   gtk_list_store_clear (GTK_LIST_STORE (liststore));
21 }
22
23
24 struct sort_cases_dialog
25 {
26   GtkTreeView *tv;
27   PsppireDict *dict;
28   GtkToggleButton *ascending;
29 };
30
31 static char *
32 generate_syntax (const struct sort_cases_dialog *scd)
33 {
34   gchar *text;
35   GString *string = g_string_new ("SORT CASES BY ");
36   gint n_vars = append_variable_names (string,
37                                        scd->dict, GTK_TREE_VIEW (scd->tv));
38
39   if ( n_vars == 0 )
40     g_string_assign (string, "");
41   else
42     {
43       const char up_down =
44         gtk_toggle_button_get_active (scd->ascending) ? 'A' : 'D';
45       g_string_append_printf (string, "(%c)", up_down);
46       g_string_append (string, ".");
47     }
48
49
50   text = string->str;
51
52   g_string_free (string, FALSE);
53
54   return text;
55 }
56
57
58 /* Pops up the Sort Cases dialog box */
59 void
60 sort_cases_dialog (GObject *o, gpointer data)
61 {
62   gint response;
63   struct data_editor *de = data;
64
65   struct sort_cases_dialog scd;
66
67   GladeXML *xml = XML_NEW ("psppire.glade");
68
69   GtkWidget *dialog = get_widget_assert   (xml, "sort-cases-dialog");
70
71
72   GtkWidget *source = get_widget_assert   (xml, "sort-cases-treeview1");
73   GtkWidget *selector = get_widget_assert (xml, "sort-cases-selector");
74   GtkWidget *dest =   get_widget_assert   (xml, "sort-cases-treeview2");
75
76   GtkSheet *var_sheet =
77     GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
78
79   PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
80
81   gtk_window_set_transient_for (GTK_WINDOW (dialog), de->parent.window);
82
83   attach_dictionary_to_treeview (GTK_TREE_VIEW (source),
84                                  vs->dict,
85                                  GTK_SELECTION_MULTIPLE, NULL);
86
87   set_dest_model (GTK_TREE_VIEW (dest), vs->dict);
88
89   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
90                                  source,
91                                  dest,
92                                  insert_source_row_into_tree_view,
93                                  NULL);
94
95   g_signal_connect (dialog, "refresh", G_CALLBACK (refresh),  dest);
96
97   scd.tv = GTK_TREE_VIEW (dest);
98   scd.dict = vs->dict;
99   scd.ascending =
100     GTK_TOGGLE_BUTTON (get_widget_assert (xml, "sort-cases-radiobutton0"));
101
102   response = psppire_dialog_run (PSPPIRE_DIALOG (dialog));
103
104
105   switch (response)
106     {
107     case GTK_RESPONSE_OK:
108       {
109         gchar *syntax = generate_syntax (&scd);
110         struct getl_interface *sss = create_syntax_string_source (syntax);
111         execute_syntax (sss);
112
113         g_free (syntax);
114       }
115       break;
116     case PSPPIRE_RESPONSE_PASTE:
117       {
118         gchar *syntax = generate_syntax (&scd);
119
120         struct syntax_editor *se =
121           (struct syntax_editor *) window_create (WINDOW_SYNTAX, NULL);
122
123         gtk_text_buffer_insert_at_cursor (se->buffer, syntax, -1);
124
125         g_free (syntax);
126       }
127       break;
128     default:
129       break;
130     }
131
132   g_object_unref (xml);
133 }
134