-/*
- PSPPIRE --- A Graphical User Interface for PSPP
- Copyright (C) 2004, 2005, 2006 Free Software Foundation
+/* PSPPIRE - a graphical user interface for PSPP.
+ Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation
- This program is free software; you can redistribute it and/or modify
+ 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
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* This module creates the Variable Sheet used for inputing the
#include <stdlib.h>
#include <string.h>
-#include <langinfo.h>
#include <data/value.h>
#include <gtksheet/gsheet-hetero-column.h>
#include <gtksheet/gsheet-uniform-row.h>
+#include "localcharset.h"
+#include "xalloc.h"
#include "psppire-var-store.h"
#include "helper.h"
#include "psppire-dict.h"
const gchar *const alignments[n_ALIGNMENTS + 1]={
N_("Left"),
N_("Right"),
- N_("Centre"),
+ N_("Center"),
0
};
0
};
+G_DEFINE_TYPE (PsppireVarSheet, psppire_var_sheet, GTK_TYPE_SHEET);
+
+static void
+psppire_var_sheet_class_init (PsppireVarSheetClass *class)
+{
+}
+
static GtkListStore *
-create_label_list (const gchar **labels)
+create_label_list (const gchar *const *labels)
{
const gchar *s;
gint i = 0;
gint *new_row, gint *new_column
)
{
- PsppireVarStore *var_store = PSPPIRE_VAR_STORE(gtk_sheet_get_model (sheet));
+ PsppireVarSheet *var_sheet = PSPPIRE_VAR_SHEET (sheet);
+ PsppireVarStore *var_store = PSPPIRE_VAR_STORE (gtk_sheet_get_model (sheet));
gint n_vars = psppire_var_store_get_var_cnt (var_store);
+ if (*new_row >= n_vars && !var_sheet->may_create_vars)
+ return FALSE;
+
if ( row == n_vars && *new_row >= n_vars)
{
- GtkEntry *entry = GTK_ENTRY(gtk_sheet_get_entry (sheet));
+ GtkEntry *entry = GTK_ENTRY (gtk_sheet_get_entry (sheet));
const gchar *name = gtk_entry_get_text (entry);
{
GtkSheetCellAttr attributes;
PsppireVarStore *var_store ;
- struct variable *pv ;
+ struct variable *var ;
GladeXML *xml;
if ( row >= psppire_var_store_get_var_cnt (var_store))
return TRUE;
- xml = glade_xml_new (PKGDATADIR "/data-editor.glade", NULL, NULL);
+ xml = XML_NEW ("data-editor.glade");
gtk_sheet_get_attributes (sheet, row, column, &attributes);
- pv = psppire_var_store_get_var (var_store, row);
+ var = psppire_var_store_get_var (var_store, row);
switch (column)
{
case COL_ALIGN:
{
- static GtkListStore *list_store = 0;
+ static GtkListStore *list_store = NULL;
GtkComboBoxEntry *cbe;
gtk_sheet_change_entry (sheet, GTK_TYPE_COMBO_BOX_ENTRY);
cbe =
- GTK_COMBO_BOX_ENTRY(gtk_sheet_get_entry (sheet)->parent);
+ GTK_COMBO_BOX_ENTRY (gtk_sheet_get_entry (sheet)->parent);
if ( ! list_store) list_store = create_label_list (alignments);
- gtk_combo_box_set_model (GTK_COMBO_BOX(cbe),
- GTK_TREE_MODEL(list_store));
+ 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_alignment), pv);
+ g_signal_connect (G_OBJECT (cbe),"changed",
+ G_CALLBACK (change_alignment), var);
}
break;
+
case COL_MEASURE:
{
static GtkListStore *list_store = 0;
GtkComboBoxEntry *cbe;
gtk_sheet_change_entry (sheet, GTK_TYPE_COMBO_BOX_ENTRY);
cbe =
- GTK_COMBO_BOX_ENTRY(gtk_sheet_get_entry (sheet)->parent);
+ GTK_COMBO_BOX_ENTRY (gtk_sheet_get_entry (sheet)->parent);
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_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), var);
}
break;
case COL_VALUES:
{
- static struct val_labs_dialog *val_labs_dialog = 0;
+ static struct val_labs_dialog *val_labs_dialog = NULL;
PsppireCustomEntry *customEntry;
gtk_sheet_change_entry (sheet, PSPPIRE_CUSTOM_ENTRY_TYPE);
customEntry =
- PSPPIRE_CUSTOM_ENTRY(gtk_sheet_get_entry (sheet));
+ PSPPIRE_CUSTOM_ENTRY (gtk_sheet_get_entry (sheet));
+ if ( var_is_long_string (var))
+ g_object_set (customEntry,
+ "editable", FALSE,
+ NULL);
if (!val_labs_dialog )
val_labs_dialog = val_labs_dialog_create (xml);
- val_labs_dialog->pv = pv;
+ val_labs_dialog_set_target_variable (val_labs_dialog, var);
- g_signal_connect_swapped (GTK_OBJECT(customEntry),
+ g_signal_connect_swapped (GTK_OBJECT (customEntry),
"clicked",
- GTK_SIGNAL_FUNC(val_labs_dialog_show),
+ GTK_SIGNAL_FUNC (val_labs_dialog_show),
val_labs_dialog);
}
break;
+
case COL_MISSING:
{
static struct missing_val_dialog *missing_val_dialog = 0;
gtk_sheet_change_entry (sheet, PSPPIRE_CUSTOM_ENTRY_TYPE);
customEntry =
- PSPPIRE_CUSTOM_ENTRY(gtk_sheet_get_entry (sheet));
+ PSPPIRE_CUSTOM_ENTRY (gtk_sheet_get_entry (sheet));
+
+ if ( var_is_long_string (var))
+ g_object_set (customEntry,
+ "editable", FALSE,
+ NULL);
if (!missing_val_dialog )
missing_val_dialog = missing_val_dialog_create (xml);
missing_val_dialog->pv = psppire_var_store_get_var (var_store, row);
- g_signal_connect_swapped (GTK_OBJECT(customEntry),
+ g_signal_connect_swapped (GTK_OBJECT (customEntry),
"clicked",
- GTK_SIGNAL_FUNC(missing_val_dialog_show),
+ GTK_SIGNAL_FUNC (missing_val_dialog_show),
missing_val_dialog);
}
break;
gtk_sheet_change_entry (sheet, PSPPIRE_CUSTOM_ENTRY_TYPE);
customEntry =
- PSPPIRE_CUSTOM_ENTRY(gtk_sheet_get_entry (sheet));
+ PSPPIRE_CUSTOM_ENTRY (gtk_sheet_get_entry (sheet));
/* Popup the Variable Type dialog box */
var_type_dialog = var_type_dialog_create (xml);
- var_type_dialog->pv = pv;
+ var_type_dialog->pv = var;
- g_signal_connect_swapped (GTK_OBJECT(customEntry),
+ g_signal_connect_swapped (GTK_OBJECT (customEntry),
"clicked",
- GTK_SIGNAL_FUNC(var_type_dialog_show),
+ GTK_SIGNAL_FUNC (var_type_dialog_show),
var_type_dialog);
}
break;
+
case COL_WIDTH:
case COL_DECIMALS:
case COL_COLUMNS:
const gint current_value = atoi (s);
GtkObject *adj ;
- const struct fmt_spec *fmt = var_get_write_format (pv);
+ const struct fmt_spec *fmt = var_get_write_format (var);
switch (column)
{
case COL_WIDTH:
gtk_sheet_change_entry (sheet, GTK_TYPE_SPIN_BUTTON);
spinButton =
- GTK_SPIN_BUTTON(gtk_sheet_get_entry (sheet));
+ GTK_SPIN_BUTTON (gtk_sheet_get_entry (sheet));
- gtk_spin_button_set_adjustment (spinButton, GTK_ADJUSTMENT(adj));
+ gtk_spin_button_set_adjustment (spinButton, GTK_ADJUSTMENT (adj));
gtk_spin_button_set_digits (spinButton, 0);
}
}
return TRUE;
}
+static void
+psppire_var_sheet_init (PsppireVarSheet *self)
+{
+ self->may_create_vars = true;
-extern PsppireVarStore *the_var_store;
+ g_signal_connect (self, "activate",
+ GTK_SIGNAL_FUNC (var_sheet_cell_entry_enter),
+ 0);
+ g_signal_connect (self, "deactivate",
+ GTK_SIGNAL_FUNC (var_sheet_cell_entry_leave),
+ 0);
-/* Create the var sheet */
-GtkWidget*
-psppire_variable_sheet_create (gchar *widget_name,
- gchar *string1,
- gchar *string2,
- gint int1, gint int2)
+ g_signal_connect (self, "traverse",
+ GTK_SIGNAL_FUNC (traverse_cell_callback), 0);
+}
+
+GtkWidget *
+psppire_var_sheet_new_with_var_store (PsppireVarStore *var_store)
{
- gchar *codeset;
- gint i;
GtkWidget *sheet;
+ gint i;
+
GObject *geo = g_sheet_hetero_column_new (75, n_COLS);
+ g_assert (var_store);
- g_assert (the_var_store);
+ sheet = g_object_new (PSPPIRE_TYPE_VAR_SHEET,
+ "row-geometry", var_store,
+ "column-geometry", geo,
+ NULL);
- sheet = gtk_sheet_new (G_SHEET_ROW(the_var_store),
- G_SHEET_COLUMN(geo),
- "variable sheet", 0);
+ gtk_sheet_set_model (GTK_SHEET (sheet), G_SHEET_MODEL (var_store));
- g_signal_connect (GTK_OBJECT (sheet), "activate",
- GTK_SIGNAL_FUNC (var_sheet_cell_entry_enter),
- 0);
+ for (i = 0 ; i < n_COLS ; ++i )
+ {
+ g_sheet_hetero_column_set_button_label (G_SHEET_HETERO_COLUMN (geo), i,
+ gettext (column_def[i].label));
- g_signal_connect (GTK_OBJECT (sheet), "deactivate",
- GTK_SIGNAL_FUNC (var_sheet_cell_entry_leave),
- 0);
+ g_sheet_hetero_column_set_width (G_SHEET_HETERO_COLUMN (geo), i,
+ column_def[i].width);
+ }
- g_signal_connect (GTK_OBJECT (sheet), "traverse",
- GTK_SIGNAL_FUNC (traverse_cell_callback), 0);
- gtk_sheet_set_model (sheet, G_SHEET_MODEL(the_var_store));
+ return sheet;
+}
+/* Create the var sheet */
+G_MODULE_EXPORT GtkWidget*
+psppire_variable_sheet_create (gchar *widget_name,
+ gchar *string1,
+ gchar *string2,
+ gint int1, gint int2)
+{
+ gchar *codeset;
+ GtkWidget *sheet;
+ extern PsppireVarStore *the_var_store;
/* 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,
- gettext (column_def[i].label));
+ codeset = xstrdup (bind_textdomain_codeset (PACKAGE, 0));
+ bind_textdomain_codeset (PACKAGE, locale_charset ());
+
+
+ sheet = psppire_var_sheet_new_with_var_store (the_var_store);
- g_sheet_hetero_column_set_width (G_SHEET_HETERO_COLUMN(geo), i,
- column_def[i].width);
- }
bind_textdomain_codeset (PACKAGE, codeset);
+ free (codeset);
gtk_widget_show (sheet);
}
+
+void
+psppire_var_sheet_set_may_create_vars (PsppireVarSheet *sheet,
+ gboolean may_create_vars)
+{
+ sheet->may_create_vars = may_create_vars;
+}