X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fvar-sheet.c;h=b65c6e89ddf8cd0482091d97444588ff56132928;hb=687adf53eae434e88a47bb3409f946f3a26115a4;hp=8a2ba9855c6206a7494c8b893f90e8b845fa9986;hpb=dcf9b154cbcaa35c3d8459a201b77eec8bcb30bd;p=pspp diff --git a/src/ui/gui/var-sheet.c b/src/ui/gui/var-sheet.c index 8a2ba9855c..b65c6e89dd 100644 --- a/src/ui/gui/var-sheet.c +++ b/src/ui/gui/var-sheet.c @@ -1,7 +1,6 @@ /* PSPPIRE --- A Graphical User Interface for PSPP Copyright (C) 2004, 2005, 2006 Free Software Foundation - Written by John Darrington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,25 +21,30 @@ /* This module creates the Variable Sheet used for inputing the variables in the dictonary */ -#include +#include +#include +#define _(msgid) gettext (msgid) +#define N_(msgid) msgid + +#include #include #include #include #include +#include -#define min(A,B) ((A < B)?A:B) +#include -#include "gtksheet.h" -#include "gsheet-hetero-column.h" -#include "gsheet-uniform-row.h" -#include "psppire-var-store.h" +#include +#include +#include +#include "psppire-var-store.h" #include "helper.h" #include "menu-actions.h" #include "psppire-dict.h" -#include "psppire-variable.h" #include "var-type-dialog.h" #include "var-sheet.h" #include "customentry.h" @@ -48,8 +52,6 @@ #include "val-labs-dialog.h" #include "missing-val-dialog.h" -#define _(A) A -#define N_(A) A static const gint n_initial_rows = 40; @@ -64,16 +66,16 @@ struct column_parameters }; static const struct column_parameters column_def[] = { - {N_("Name"), 80}, - {N_("Type"), 100}, - {N_("Width"), 57}, - {N_("Decimals"),91}, - {N_("Label"), 95}, - {N_("Values"), 103}, - {N_("Missing"), 95}, - {N_("Columns"), 80}, - {N_("Align"), 69}, - {N_("Measure"), 99}, + { N_("Name"), 80}, + { N_("Type"), 100}, + { N_("Width"), 57}, + { N_("Decimals"),91}, + { N_("Label"), 95}, + { N_("Values"), 103}, + { N_("Missing"), 95}, + { N_("Columns"), 80}, + { N_("Align"), 69}, + { N_("Measure"), 99}, }; @@ -81,9 +83,9 @@ static gboolean click2row(GtkWidget *w, gint row, gpointer data) { gint current_row, current_column; + GtkWidget *data_sheet = get_widget_assert(xml, "data_sheet"); select_sheet(PAGE_DATA_SHEET); - GtkWidget *data_sheet = get_widget_assert(xml, "data_sheet"); gtk_sheet_get_active_cell(GTK_SHEET(data_sheet), ¤t_row, ¤t_column); @@ -95,35 +97,36 @@ click2row(GtkWidget *w, gint row, gpointer data) -const gchar *alignments[]={ - _("Left"), - _("Right"), - _("Centre"), +const gchar *alignments[n_ALIGNMENTS + 1]={ + N_("Left"), + N_("Right"), + N_("Centre"), 0 }; -const gchar *measures[]={ - _("Nominal"), - _("Ordinal"), - _("Scale"), +const gchar *measures[n_MEASURES + 1]={ + N_("Nominal"), + N_("Ordinal"), + N_("Scale"), 0 }; static GtkListStore * create_label_list(const gchar **labels) { + const gchar *s; gint i = 0; GtkTreeIter iter; GtkListStore *list_store; list_store = gtk_list_store_new (1, G_TYPE_STRING); - const gchar *s; + while ( (s = labels[i++])) { gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, - 0, s, + 0, gettext(s), -1); } @@ -136,28 +139,28 @@ static void change_alignment(GtkComboBox *cb, gpointer user_data) { - struct PsppireVariable *pv = user_data; + struct variable *pv = user_data; gint active_item = gtk_combo_box_get_active(cb); if ( active_item < 0 ) return ; - psppire_variable_set_alignment(pv, active_item); + var_set_alignment (pv, active_item); } /* Callback for when the measure combo box item is selected */ -static void +static void change_measure(GtkComboBox *cb, gpointer user_data) { - struct PsppireVariable *pv = user_data; + struct variable *pv = user_data; gint active_item = gtk_combo_box_get_active(cb); if ( active_item < 0 ) return ; - psppire_variable_set_measure(pv, active_item); + var_set_measure (pv, active_item); } @@ -187,13 +190,15 @@ traverse_cell_callback (GtkSheet * sheet, } /* If the destination cell is outside the current variables, then - accept the destination only as the name column of the first blank row + automatically create variables for the new rows. */ - if ( *new_row > n_vars) - return FALSE; - - if ( *new_row >= n_vars && *new_column != COL_NAME) - return FALSE; + if ( (*new_row > n_vars) || + (*new_row == n_vars && *new_column != COL_NAME) ) + { + gint i; + for ( i = n_vars ; i <= *new_row; ++i ) + psppire_dict_insert_variable(var_store->dict, i, NULL); + } return TRUE; } @@ -206,9 +211,13 @@ static gboolean var_sheet_cell_change_entry (GtkSheet * sheet, gint row, gint column, gpointer leaving) { + GtkSheetCellAttr attributes; + PsppireVarStore *var_store ; + struct variable *pv ; + g_return_val_if_fail(sheet != NULL, FALSE); - PsppireVarStore *var_store = PSPPIRE_VAR_STORE(gtk_sheet_get_model(sheet)); + var_store = PSPPIRE_VAR_STORE(gtk_sheet_get_model(sheet)); if ( row >= psppire_var_store_get_var_cnt(var_store)) return TRUE; @@ -219,10 +228,10 @@ var_sheet_cell_change_entry (GtkSheet * sheet, gint row, gint column, return TRUE; } - GtkSheetCellAttr attributes; + gtk_sheet_get_attributes(sheet, row, column, &attributes); - struct PsppireVariable *pv = psppire_var_store_get_variable(var_store, row); + pv = psppire_var_store_get_var (var_store, row); switch (column) { @@ -256,15 +265,15 @@ var_sheet_cell_change_entry (GtkSheet * sheet, gint row, gint column, GTK_COMBO_BOX_ENTRY(gtk_sheet_get_entry(sheet)->parent); - if ( ! list_store) list_store = create_label_list(measures); + if ( ! list_store) list_store = create_label_list (measures); gtk_combo_box_set_model(GTK_COMBO_BOX(cbe), GTK_TREE_MODEL(list_store)); gtk_combo_box_entry_set_text_column (cbe, 0); - g_signal_connect(G_OBJECT(cbe),"changed", - G_CALLBACK(change_measure), pv); + g_signal_connect (G_OBJECT(cbe),"changed", + G_CALLBACK (change_measure), pv); } break; @@ -304,7 +313,7 @@ var_sheet_cell_change_entry (GtkSheet * sheet, gint row, gint column, if (!missing_val_dialog ) missing_val_dialog = missing_val_dialog_create(xml); - missing_val_dialog->pv = psppire_var_store_get_variable(var_store, row); + missing_val_dialog->pv = psppire_var_store_get_var (var_store, row); g_signal_connect_swapped(GTK_OBJECT(customEntry), "clicked", @@ -351,40 +360,43 @@ var_sheet_cell_change_entry (GtkSheet * sheet, gint row, gint column, if (!s) return FALSE; - const gint current_value = atoi(s); - - const struct fmt_spec *fmt = psppire_variable_get_write_spec(pv); - switch (column) - { - case COL_WIDTH: - r_min = fmt->d + 1; - r_max = (psppire_variable_get_type(pv) == ALPHA) ? 255 : 40; - break; - case COL_DECIMALS: - r_min = 0 ; - r_max = min(fmt->w - 1, 16); - break; - case COL_COLUMNS: - r_min = 1; - r_max = 255 ; /* Is this a sensible value ? */ - break; - default: - g_assert_not_reached(); - } - - GtkObject *adj = - gtk_adjustment_new(current_value, - r_min, r_max, - 1.0, 1.0, 1.0 /* steps */ - ); - - gtk_sheet_change_entry(sheet, GTK_TYPE_SPIN_BUTTON); - - GtkSpinButton *spinButton = - GTK_SPIN_BUTTON(gtk_sheet_get_entry(sheet)); - - gtk_spin_button_set_adjustment(spinButton, GTK_ADJUSTMENT(adj)); - gtk_spin_button_set_digits(spinButton, 0); + { + GtkSpinButton *spinButton ; + const gint current_value = atoi(s); + GtkObject *adj ; + + const struct fmt_spec *fmt = var_get_write_format (pv); + switch (column) + { + case COL_WIDTH: + r_min = MAX (fmt->d + 1, fmt_min_output_width (fmt->type)); + r_max = fmt_max_output_width (fmt->type); + break; + case COL_DECIMALS: + r_min = 0 ; + r_max = fmt_max_output_decimals (fmt->type, fmt->w); + break; + case COL_COLUMNS: + r_min = 1; + r_max = 255 ; /* Is this a sensible value ? */ + break; + default: + g_assert_not_reached(); + } + + adj = gtk_adjustment_new(current_value, + r_min, r_max, + 1.0, 1.0, 1.0 /* steps */ + ); + + gtk_sheet_change_entry(sheet, GTK_TYPE_SPIN_BUTTON); + + spinButton = + GTK_SPIN_BUTTON(gtk_sheet_get_entry(sheet)); + + gtk_spin_button_set_adjustment(spinButton, GTK_ADJUSTMENT(adj)); + gtk_spin_button_set_digits(spinButton, 0); + } } } break; @@ -398,6 +410,8 @@ var_sheet_cell_change_entry (GtkSheet * sheet, gint row, gint column, } +extern PsppireVarStore *var_store; + /* Create the var sheet */ GtkWidget* @@ -406,15 +420,13 @@ psppire_variable_sheet_create (gchar *widget_name, gchar *string2, gint int1, gint int2) { + gchar *codeset; gint i; GtkWidget *sheet; GObject *geo = g_sheet_hetero_column_new(75, n_COLS); - GObject *row_geometry = g_sheet_uniform_row_new(25, n_initial_rows); - - - sheet = gtk_sheet_new(G_SHEET_ROW(row_geometry), + sheet = gtk_sheet_new(G_SHEET_ROW(var_store), G_SHEET_COLUMN(geo), "variable sheet", 0); @@ -434,14 +446,19 @@ psppire_variable_sheet_create (gchar *widget_name, GTK_SIGNAL_FUNC (click2row), sheet); + /* Since this happens inside glade_xml_new, we must prevent strings from + * being re-encoded twice */ + codeset = bind_textdomain_codeset(PACKAGE, 0); + bind_textdomain_codeset(PACKAGE, nl_langinfo(CODESET)); for (i = 0 ; i < n_COLS ; ++i ) { g_sheet_hetero_column_set_button_label(G_SHEET_HETERO_COLUMN(geo), i, - column_def[i].label); - + gettext(column_def[i].label)); + g_sheet_hetero_column_set_width(G_SHEET_HETERO_COLUMN(geo), i, column_def[i].width); } + bind_textdomain_codeset(PACKAGE, codeset); gtk_widget_show(sheet);