24178b8a35c4b52fac0b78e2b8b29e1d7e62e34c
[pspp] / src / ui / gui / psppire-means-layer.c
1 /* PSPPIRE - a graphical user interface for PSPP.
2    Copyright (C) 2012  Free Software Foundation
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #include <config.h>
18
19 #include "psppire-means-layer.h"
20 #include "psppire-selector.h"
21 #include "psppire-var-view.h"
22
23 #include <gtk/gtk.h>
24
25 #include "gettext.h"
26 #define _(msgid) gettext (msgid)
27 #define N_(msgid) msgid
28
29
30 static void psppire_means_layer_class_init    (PsppireMeansLayerClass *class);
31 static void psppire_means_layer_init          (PsppireMeansLayer      *window);
32
33 G_DEFINE_TYPE (PsppireMeansLayer, psppire_means_layer, GTK_TYPE_VBOX);
34
35
36 static void 
37 psppire_means_layer_class_init    (PsppireMeansLayerClass *class)
38 {
39   //  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
40 }
41
42 static void
43 update (PsppireMeansLayer *ml)
44 {
45   gchar *l = g_strdup_printf (_("Layer %d of %d"),
46                               ml->current_layer + 1, ml->n_layers);
47   
48   gtk_label_set_text (GTK_LABEL (ml->label), l);
49   g_free (l);
50
51   psppire_var_view_set_current_model (PSPPIRE_VAR_VIEW (ml->var_view),
52                                       ml->current_layer);
53
54   gtk_widget_set_sensitive (ml->back, ml->current_layer > 0);
55   gtk_widget_set_sensitive (ml->forward,
56                             psppire_var_view_get_iter_first (PSPPIRE_VAR_VIEW (ml->var_view), NULL));
57 }
58
59 static void
60 on_forward (PsppireMeansLayer *ml)
61 {
62   ml->current_layer++;
63   if (ml->current_layer >= ml->n_layers)
64     {
65       ml->n_layers = ml->current_layer + 1;
66       psppire_var_view_push_model (PSPPIRE_VAR_VIEW (ml->var_view));
67     }
68
69   update (ml);
70 }
71
72 static void
73 on_back (PsppireMeansLayer *ml)
74 {
75   g_return_if_fail (ml->current_layer > 0);
76   ml->current_layer--;
77
78   update (ml);
79 }
80
81
82 static void 
83 psppire_means_layer_init  (PsppireMeansLayer      *ml)
84 {
85   GtkWidget *hbox_upper = gtk_hbox_new (FALSE, 5);
86   GtkWidget *hbox_lower = gtk_hbox_new (FALSE, 5);
87   GtkWidget *alignment = gtk_alignment_new (0, 0.5, 0, 0);
88   GtkWidget *sw = gtk_scrolled_window_new (NULL, NULL);
89
90   ml->forward = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
91   ml->back = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
92   ml->var_view = psppire_var_view_new ();
93   ml->selector = psppire_selector_new ();
94   ml->label = gtk_label_new ("");
95
96   g_signal_connect_swapped (ml->forward, "clicked", G_CALLBACK (on_forward),
97                             ml);
98
99   g_signal_connect_swapped (ml->back, "clicked", G_CALLBACK (on_back), ml);
100
101   g_signal_connect_swapped (ml->selector, "selected", G_CALLBACK (update), ml);
102   g_signal_connect_swapped (ml->selector, "de-selected", G_CALLBACK (update),
103                             ml);
104
105   g_object_set (ml->var_view, "headers-visible", FALSE, NULL);
106   g_object_set (sw,
107                 "shadow-type", GTK_SHADOW_ETCHED_IN,
108                 "hscrollbar-policy", GTK_POLICY_AUTOMATIC,
109                 NULL);
110
111   g_object_set (ml->selector, "dest-widget", ml->var_view, NULL);
112
113   gtk_box_pack_start (GTK_BOX (hbox_upper), ml->back, FALSE, FALSE, 5);
114   gtk_box_pack_start (GTK_BOX (hbox_upper), ml->label, TRUE, FALSE, 5);
115   gtk_box_pack_start (GTK_BOX (hbox_upper), ml->forward, FALSE, FALSE, 5);
116
117   gtk_box_pack_start (GTK_BOX (hbox_lower), alignment, FALSE, FALSE, 5);
118   gtk_container_add (GTK_CONTAINER (alignment), ml->selector);
119   gtk_box_pack_start (GTK_BOX (hbox_lower), sw, TRUE, TRUE, 5);
120   gtk_container_add (GTK_CONTAINER (sw), ml->var_view);
121
122   gtk_box_pack_start (GTK_BOX (ml), hbox_upper, FALSE, FALSE, 5);
123   gtk_box_pack_start (GTK_BOX (ml), hbox_lower, TRUE, TRUE, 5);
124
125   ml->n_layers = 1;
126   ml->current_layer = 0;
127   update (ml);
128
129   gtk_widget_show_all (hbox_upper);
130   gtk_widget_show_all (hbox_lower);
131 }
132
133 GtkWidget *
134 psppire_means_layer_new (void)
135 {
136   return GTK_WIDGET (g_object_new (psppire_means_layer_get_type (), NULL));
137 }
138
139
140 void
141 psppire_means_layer_set_source (PsppireMeansLayer *ml, GtkWidget *w)
142 {
143   g_object_set (ml->selector, "source-widget", w, NULL);
144 }
145
146
147 void
148 psppire_means_layer_clear (PsppireMeansLayer *ml)
149 {
150   psppire_var_view_clear (PSPPIRE_VAR_VIEW (ml->var_view));
151   ml->n_layers = 1;
152   ml->current_layer = 0;
153   update (ml);
154 }