2 PSPPIRE --- A Graphical User Interface for PSPP
3 Copyright (C) 2004, 2005, 2006 Free Software Foundation
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 /* This module creates the Variable Sheet used for inputing the
22 variables in the dictonary */
26 #define _(msgid) gettext (msgid)
27 #define N_(msgid) msgid
29 #include <data/value-labels.h>
31 #include <glade/glade.h>
40 #include <data/value.h>
42 #include <gtksheet/gtksheet.h>
43 #include <gtksheet/gsheet-hetero-column.h>
44 #include <gtksheet/gsheet-uniform-row.h>
46 #include "psppire-var-store.h"
48 #include "psppire-dict.h"
49 #include "var-type-dialog.h"
50 #include "var-sheet.h"
51 #include "customentry.h"
53 #include "val-labs-dialog.h"
54 #include "missing-val-dialog.h"
58 static const gint n_initial_rows = 40;
62 struct column_parameters
68 static const struct column_parameters column_def[] = {
83 const gchar *const alignments[n_ALIGNMENTS + 1]={
90 const gchar *const measures[n_MEASURES + 1]={
98 create_label_list (const gchar *const *labels)
104 GtkListStore *list_store;
105 list_store = gtk_list_store_new (1, G_TYPE_STRING);
108 while ( (s = labels[i++]))
110 gtk_list_store_append (list_store, &iter);
111 gtk_list_store_set (list_store, &iter,
119 /* Callback for when the alignment combo box
122 change_alignment (GtkComboBox *cb,
125 struct variable *pv = user_data;
126 gint active_item = gtk_combo_box_get_active (cb);
128 if ( active_item < 0 ) return ;
130 var_set_alignment (pv, active_item);
135 /* Callback for when the measure combo box
138 change_measure (GtkComboBox *cb,
141 struct variable *pv = user_data;
142 gint active_item = gtk_combo_box_get_active (cb);
144 if ( active_item < 0 ) return ;
146 var_set_measure (pv, active_item);
152 traverse_cell_callback (GtkSheet * sheet,
153 gint row, gint column,
154 gint *new_row, gint *new_column
157 PsppireVarStore *var_store = PSPPIRE_VAR_STORE (gtk_sheet_get_model (sheet));
159 gint n_vars = psppire_var_store_get_var_cnt (var_store);
161 if ( row == n_vars && *new_row >= n_vars)
163 GtkEntry *entry = GTK_ENTRY (gtk_sheet_get_entry (sheet));
165 const gchar *name = gtk_entry_get_text (entry);
167 if (! psppire_dict_check_name (var_store->dict, name, TRUE))
170 psppire_dict_insert_variable (var_store->dict, row, name);
175 /* If the destination cell is outside the current variables, then
176 automatically create variables for the new rows.
178 if ( (*new_row > n_vars) ||
179 (*new_row == n_vars && *new_column != COL_NAME) )
182 for ( i = n_vars ; i <= *new_row; ++i )
183 psppire_dict_insert_variable (var_store->dict, i, NULL);
193 Callback whenever the cell on the var sheet is left
196 var_sheet_cell_entry_leave (GtkSheet * sheet, gint row, gint column,
199 gtk_sheet_change_entry (sheet, GTK_TYPE_ENTRY);
206 Callback whenever the cell on the var sheet is entered.
209 var_sheet_cell_entry_enter (GtkSheet * sheet, gint row, gint column,
212 GtkSheetCellAttr attributes;
213 PsppireVarStore *var_store ;
214 struct variable *pv ;
218 g_return_val_if_fail (sheet != NULL, FALSE);
220 var_store = PSPPIRE_VAR_STORE (gtk_sheet_get_model (sheet));
222 g_assert (var_store);
224 if ( row >= psppire_var_store_get_var_cnt (var_store))
227 xml = glade_xml_new (PKGDATADIR "/data-editor.glade", NULL, NULL);
229 gtk_sheet_get_attributes (sheet, row, column, &attributes);
231 pv = psppire_var_store_get_var (var_store, row);
237 static GtkListStore *list_store = 0;
238 GtkComboBoxEntry *cbe;
239 gtk_sheet_change_entry (sheet, GTK_TYPE_COMBO_BOX_ENTRY);
241 GTK_COMBO_BOX_ENTRY (gtk_sheet_get_entry (sheet)->parent);
244 if ( ! list_store) list_store = create_label_list (alignments);
246 gtk_combo_box_set_model (GTK_COMBO_BOX (cbe),
247 GTK_TREE_MODEL (list_store));
249 gtk_combo_box_entry_set_text_column (cbe, 0);
252 g_signal_connect (G_OBJECT (cbe),"changed",
253 G_CALLBACK (change_alignment), pv);
258 static GtkListStore *list_store = 0;
259 GtkComboBoxEntry *cbe;
260 gtk_sheet_change_entry (sheet, GTK_TYPE_COMBO_BOX_ENTRY);
262 GTK_COMBO_BOX_ENTRY (gtk_sheet_get_entry (sheet)->parent);
265 if ( ! list_store) list_store = create_label_list (measures);
267 gtk_combo_box_set_model (GTK_COMBO_BOX (cbe),
268 GTK_TREE_MODEL (list_store));
270 gtk_combo_box_entry_set_text_column (cbe, 0);
272 g_signal_connect (G_OBJECT (cbe),"changed",
273 G_CALLBACK (change_measure), pv);
279 static struct val_labs_dialog *val_labs_dialog = 0;
281 PsppireCustomEntry *customEntry;
283 gtk_sheet_change_entry (sheet, PSPPIRE_CUSTOM_ENTRY_TYPE);
286 PSPPIRE_CUSTOM_ENTRY (gtk_sheet_get_entry (sheet));
289 if (!val_labs_dialog )
290 val_labs_dialog = val_labs_dialog_create (xml);
292 val_labs_dialog_set_target_variable (val_labs_dialog, pv);
294 g_signal_connect_swapped (GTK_OBJECT (customEntry),
296 GTK_SIGNAL_FUNC (val_labs_dialog_show),
302 static struct missing_val_dialog *missing_val_dialog = 0;
303 PsppireCustomEntry *customEntry;
305 gtk_sheet_change_entry (sheet, PSPPIRE_CUSTOM_ENTRY_TYPE);
308 PSPPIRE_CUSTOM_ENTRY (gtk_sheet_get_entry (sheet));
310 if (!missing_val_dialog )
311 missing_val_dialog = missing_val_dialog_create (xml);
313 missing_val_dialog->pv = psppire_var_store_get_var (var_store, row);
315 g_signal_connect_swapped (GTK_OBJECT (customEntry),
317 GTK_SIGNAL_FUNC (missing_val_dialog_show),
324 static struct var_type_dialog *var_type_dialog = 0;
326 PsppireCustomEntry *customEntry;
328 gtk_sheet_change_entry (sheet, PSPPIRE_CUSTOM_ENTRY_TYPE);
331 PSPPIRE_CUSTOM_ENTRY (gtk_sheet_get_entry (sheet));
334 /* Popup the Variable Type dialog box */
335 if (!var_type_dialog )
336 var_type_dialog = var_type_dialog_create (xml);
339 var_type_dialog->pv = pv;
341 g_signal_connect_swapped (GTK_OBJECT (customEntry),
343 GTK_SIGNAL_FUNC (var_type_dialog_show),
351 if ( attributes.is_editable)
355 const gchar *s = gtk_sheet_cell_get_text (sheet, row, column);
359 GtkSpinButton *spinButton ;
360 const gint current_value = atoi (s);
363 const struct fmt_spec *fmt = var_get_write_format (pv);
367 r_min = MAX (fmt->d + 1, fmt_min_output_width (fmt->type));
368 r_max = fmt_max_output_width (fmt->type);
372 r_max = fmt_max_output_decimals (fmt->type, fmt->w);
376 r_max = 255 ; /* Is this a sensible value ? */
379 g_assert_not_reached ();
382 adj = gtk_adjustment_new (current_value,
384 1.0, 1.0, 1.0 /* steps */
387 gtk_sheet_change_entry (sheet, GTK_TYPE_SPIN_BUTTON);
390 GTK_SPIN_BUTTON (gtk_sheet_get_entry (sheet));
392 gtk_spin_button_set_adjustment (spinButton, GTK_ADJUSTMENT (adj));
393 gtk_spin_button_set_digits (spinButton, 0);
400 gtk_sheet_change_entry (sheet, GTK_TYPE_ENTRY);
405 g_object_unref (xml);
411 extern PsppireVarStore *the_var_store;
414 /* Create the var sheet */
415 G_MODULE_EXPORT GtkWidget*
416 psppire_variable_sheet_create (gchar *widget_name,
419 gint int1, gint int2)
425 GObject *geo = g_sheet_hetero_column_new (75, n_COLS);
427 g_assert (the_var_store);
429 sheet = gtk_sheet_new (G_SHEET_ROW (the_var_store),
430 G_SHEET_COLUMN (geo),
431 "variable sheet", 0);
434 g_signal_connect (GTK_OBJECT (sheet), "activate",
435 GTK_SIGNAL_FUNC (var_sheet_cell_entry_enter),
438 g_signal_connect (GTK_OBJECT (sheet), "deactivate",
439 GTK_SIGNAL_FUNC (var_sheet_cell_entry_leave),
442 g_signal_connect (GTK_OBJECT (sheet), "traverse",
443 GTK_SIGNAL_FUNC (traverse_cell_callback), 0);
446 gtk_sheet_set_model (GTK_SHEET (sheet), G_SHEET_MODEL (the_var_store));
450 /* Since this happens inside glade_xml_new, we must prevent strings from
451 * being re-encoded twice */
452 codeset = bind_textdomain_codeset (PACKAGE, 0);
453 bind_textdomain_codeset (PACKAGE, nl_langinfo (CODESET));
455 for (i = 0 ; i < n_COLS ; ++i )
457 g_sheet_hetero_column_set_button_label (G_SHEET_HETERO_COLUMN (geo), i,
458 gettext (column_def[i].label));
460 g_sheet_hetero_column_set_width (G_SHEET_HETERO_COLUMN (geo), i,
461 column_def[i].width);
464 bind_textdomain_codeset (PACKAGE, codeset);
467 gtk_widget_show (sheet);