-/* psppire-data-store.c
+/* PSPPIRE - a graphical user interface for PSPP.
+ Copyright (C) 2006, 2008 Free Software Foundation
- PSPPIRE --- A Graphical User Interface for PSPP
- Copyright (C) 2006 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/>. */
#include <config.h>
#include <string.h>
#define _(msgid) gettext (msgid)
#define N_(msgid) msgid
-#include <data/casewriter.h>
#include <data/datasheet.h>
#include <data/data-out.h>
#include <data/variable.h>
-#include <gtksheet/gtksheet.h>
#include <gtksheet/gsheetmodel.h>
-#include <gtksheet/gsheet-column-iface.h>
#include <pango/pango-context.h>
#include <data/missing-values.h>
#include <data/value-labels.h>
#include <data/data-in.h>
-
-#include <data/file-handle-def.h>
-#include <data/sys-file-writer.h>
-
+#include <data/format.h>
static void psppire_data_store_init (PsppireDataStore *data_store);
static void psppire_data_store_class_init (PsppireDataStoreClass *class);
static void psppire_data_store_sheet_model_init (GSheetModelIface *iface);
-static void psppire_data_store_sheet_column_init (GSheetColumnIface *iface);
-static void psppire_data_store_sheet_row_init (GSheetRowIface *iface);
static void psppire_data_store_finalize (GObject *object);
-
-static gchar *psppire_data_store_get_string (const GSheetModel *sheet_model, gint row, gint column);
-
-static gboolean psppire_data_store_set_string (GSheetModel *model,
- const gchar *text, gint row, gint column);
+static void psppire_data_store_dispose (GObject *object);
static gboolean psppire_data_store_clear_datum (GSheetModel *model,
- gint row, gint column);
-
+ glong row, glong column);
-#define MIN_COLUMNS 10
-
-#define TRAILING_ROWS 10
static GObjectClass *parent_class = NULL;
enum {FONT_CHANGED,
+ BACKEND_CHANGED,
n_SIGNALS};
static guint signals [n_SIGNALS];
-inline GType
+GType
psppire_data_store_get_type (void)
{
static GType data_store_type = 0;
NULL
};
- static const GInterfaceInfo sheet_column_info =
- {
- (GInterfaceInitFunc) psppire_data_store_sheet_column_init,
- NULL,
- NULL
- };
-
- static const GInterfaceInfo sheet_row_info =
- {
- (GInterfaceInitFunc) psppire_data_store_sheet_row_init,
- NULL,
- NULL
- };
-
data_store_type = g_type_register_static (G_TYPE_OBJECT, "PsppireDataStore",
&data_store_info, 0);
G_TYPE_SHEET_MODEL,
&sheet_model_info);
- g_type_add_interface_static (data_store_type,
- G_TYPE_SHEET_COLUMN,
- &sheet_column_info);
-
- g_type_add_interface_static (data_store_type,
- G_TYPE_SHEET_ROW,
- &sheet_row_info);
}
return data_store_type;
object_class = (GObjectClass*) class;
object_class->finalize = psppire_data_store_finalize;
+ object_class->dispose = psppire_data_store_dispose;
signals [FONT_CHANGED] =
g_signal_new ("font_changed",
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE,
0);
+
+
+ signals [BACKEND_CHANGED] =
+ g_signal_new ("backend-changed",
+ G_TYPE_FROM_CLASS (class),
+ G_SIGNAL_RUN_FIRST,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
}
-static gint
+static glong
psppire_data_store_get_var_count (const GSheetModel *model)
{
const PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
return psppire_dict_get_var_cnt (store->dict);
}
-static gint
-psppire_data_store_get_case_count (const GSheetModel *model)
+casenumber
+psppire_data_store_get_case_count (const PsppireDataStore *store)
{
- const PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
-
return psppire_case_file_get_case_count (store->case_file);
}
+size_t
+psppire_data_store_get_value_count (const PsppireDataStore *store)
+{
+ return psppire_dict_get_value_cnt (store->dict);
+}
+
+casenumber
+psppire_data_store_get_case_count_wrapper (const GSheetModel *model)
+{
+ const PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
+ return psppire_data_store_get_case_count (store);
+}
static void
psppire_data_store_init (PsppireDataStore *data_store)
{
data_store->dict = 0;
- data_store->case_file = 0;
+ data_store->case_file = NULL;
data_store->width_of_m = 10;
+ data_store->dispose_has_run = FALSE;
}
const PangoFontDescription *
psppire_data_store_get_font_desc (const GSheetModel *model,
- gint row, gint column)
+ glong row, glong column)
{
PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
return store->font_desc;
}
+static inline gchar *
+psppire_data_store_get_string_wrapper (const GSheetModel *model, glong row,
+ glong column)
+{
+ return psppire_data_store_get_string (PSPPIRE_DATA_STORE (model), row, column);
+}
+
+
+static inline gboolean
+psppire_data_store_set_string_wrapper (GSheetModel *model,
+ const gchar *text,
+ glong row, glong column)
+{
+ return psppire_data_store_set_string (PSPPIRE_DATA_STORE (model), text,
+ row, column);
+}
+
+
+
+static gchar * get_column_subtitle (const GSheetModel *model, gint col);
+static gchar * get_column_button_label (const GSheetModel *model, gint col);
+static gboolean get_column_sensitivity (const GSheetModel *model, gint col);
+static GtkJustification get_column_justification (const GSheetModel *model, gint col);
+
+static gchar * get_row_button_label (const GSheetModel *model, gint row);
+static gboolean get_row_sensitivity (const GSheetModel *model, gint row);
+
static void
psppire_data_store_sheet_model_init (GSheetModelIface *iface)
{
iface->free_strings = TRUE;
- iface->get_string = psppire_data_store_get_string;
- iface->set_string = psppire_data_store_set_string;
+ iface->get_string = psppire_data_store_get_string_wrapper;
+ iface->set_string = psppire_data_store_set_string_wrapper;
iface->clear_datum = psppire_data_store_clear_datum;
iface->is_editable = NULL;
iface->is_visible = NULL;
iface->get_font_desc = psppire_data_store_get_font_desc;
iface->get_cell_border = NULL;
iface->get_column_count = psppire_data_store_get_var_count;
- iface->get_row_count = psppire_data_store_get_case_count;
-}
+ iface->get_row_count = psppire_data_store_get_case_count_wrapper;
-static
-gboolean always_true ()
-{
- return TRUE;
-}
+ iface->get_column_subtitle = get_column_subtitle;
+ iface->get_column_title = get_column_button_label;
+ iface->get_column_sensitivity = get_column_sensitivity;
+ iface->get_column_justification = get_column_justification;
+ iface->get_row_title = get_row_button_label;
+ iface->get_row_sensitivity = get_row_sensitivity;
+}
static void
-delete_cases_callback (GtkWidget *w, gint first, gint n_cases, gpointer data)
+delete_cases_callback (GtkWidget *w,
+ casenumber first, casenumber n_cases, gpointer data)
{
PsppireDataStore *store ;
static void
-insert_case_callback (GtkWidget *w, gint casenum, gpointer data)
+insert_case_callback (GtkWidget *w, casenumber casenum, gpointer data)
{
- PsppireDataStore *store ;
+ PsppireDataStore *store = PSPPIRE_DATA_STORE (data);
g_return_if_fail (data);
- store = PSPPIRE_DATA_STORE (data);
+ g_print ("%s\n", __FUNCTION__);
g_sheet_model_range_changed (G_SHEET_MODEL (store),
casenum, -1,
}
+/*
+ A callback which occurs after a variable has been deleted.
+ */
static void
-delete_variables_callback (GObject *obj, gint var_num, gint n_vars, gpointer data)
+delete_variable_callback (GObject *obj, gint dict_index,
+ gint case_index, gint val_cnt,
+ gpointer data)
{
- PsppireDataStore *store ;
+ PsppireDataStore *store = PSPPIRE_DATA_STORE (data);
- g_return_if_fail (data);
-
- store = PSPPIRE_DATA_STORE (data);
-
- g_sheet_model_columns_deleted (G_SHEET_MODEL (store), var_num, n_vars);
+#if AXIS_TRANSITION
+ g_sheet_model_columns_deleted (G_SHEET_MODEL (store), dict_index, 1);
g_sheet_column_columns_changed (G_SHEET_COLUMN (store),
- var_num, -1);
+ dict_index, -1);
+#endif
}
static void
variable_changed_callback (GObject *obj, gint var_num, gpointer data)
{
- PsppireDataStore *store;
-
- g_return_if_fail (data);
-
- store = PSPPIRE_DATA_STORE (data);
+ PsppireDataStore *store = PSPPIRE_DATA_STORE (data);
+#if AXIS_TRANSITION
g_sheet_column_columns_changed (G_SHEET_COLUMN (store),
var_num, 1);
g_sheet_model_range_changed (G_SHEET_MODEL (store),
-1, var_num,
-1, var_num);
+#endif
}
static void
psppire_case_file_insert_values (store->case_file, 1, posn);
+#if AXIS_TRANSITION
g_sheet_column_columns_changed (G_SHEET_COLUMN (store),
var_num, 1);
+#endif
g_sheet_model_columns_inserted (G_SHEET_MODEL (store), var_num, 1);
}
dict_size_change_callback (GObject *obj,
gint posn, gint adjustment, gpointer data)
{
- PsppireDataStore *store ;
+ PsppireDataStore *store = PSPPIRE_DATA_STORE (data);
- g_return_if_fail (data);
+ const struct variable *v = psppire_dict_get_variable (store->dict, posn);
- store = PSPPIRE_DATA_STORE (data);
+ const gint new_val_width = value_cnt_from_width (var_get_width (v));
- psppire_case_file_insert_values (store->case_file, adjustment, posn);
+ if ( adjustment > 0 )
+ psppire_case_file_insert_values (store->case_file, adjustment,
+ new_val_width - adjustment +
+ var_get_case_index(v));
}
}
+void
+psppire_data_store_set_case_file (PsppireDataStore *ds,
+ PsppireCaseFile *cf)
+{
+ gint i;
+ if ( ds->case_file) g_object_unref (ds->case_file);
+ ds->case_file = cf;
+
+ g_sheet_model_range_changed (G_SHEET_MODEL (ds),
+ -1, -1, -1, -1);
+
+ for (i = 0 ; i < n_cf_signals ; ++i )
+ {
+ if ( ds->cf_handler_id [i] > 0 )
+ g_signal_handler_disconnect (ds->case_file,
+ ds->cf_handler_id[i]);
+ }
+
+
+ if ( ds->dict )
+ for (i = 0 ; i < n_dict_signals; ++i )
+ {
+ if ( ds->dict_handler_id [i] > 0)
+ {
+ g_signal_handler_unblock (ds->dict,
+ ds->dict_handler_id[i]);
+ }
+ }
+
+ ds->cf_handler_id [CASES_DELETED] =
+ g_signal_connect (ds->case_file, "cases-deleted",
+ G_CALLBACK (delete_cases_callback),
+ ds);
+
+ ds->cf_handler_id [CASE_INSERTED] =
+ g_signal_connect (ds->case_file, "case-inserted",
+ G_CALLBACK (insert_case_callback),
+ ds);
+
+ ds->cf_handler_id [CASE_CHANGED] =
+ g_signal_connect (ds->case_file, "case-changed",
+ G_CALLBACK (changed_case_callback),
+ ds);
+
+ g_signal_emit (ds, signals[BACKEND_CHANGED], 0);
+}
+
/**
* psppire_data_store_replace_set_dictionary:
void
psppire_data_store_set_dictionary (PsppireDataStore *data_store, PsppireDict *dict)
{
+ int i;
+
+ /* Disconnect any existing handlers */
+ if ( data_store->dict )
+ for (i = 0 ; i < n_dict_signals; ++i )
+ {
+ g_signal_handler_disconnect (data_store->dict,
+ data_store->dict_handler_id[i]);
+ }
+
data_store->dict = dict;
- if ( data_store->case_file)
+ if ( dict != NULL)
{
- g_object_unref (data_store->case_file);
- data_store->case_file = 0;
- }
- data_store->case_file = psppire_case_file_new ();
+ data_store->dict_handler_id [VARIABLE_INSERTED] =
+ g_signal_connect (dict, "variable-inserted",
+ G_CALLBACK (insert_variable_callback),
+ data_store);
+
+ data_store->dict_handler_id [VARIABLE_DELETED] =
+ g_signal_connect (dict, "variable-deleted",
+ G_CALLBACK (delete_variable_callback),
+ data_store);
+
+ data_store->dict_handler_id [VARIABLE_CHANGED] =
+ g_signal_connect (dict, "variable-changed",
+ G_CALLBACK (variable_changed_callback),
+ data_store);
+
+ data_store->dict_handler_id [SIZE_CHANGED] =
+ g_signal_connect (dict, "dict-size-changed",
+ G_CALLBACK (dict_size_change_callback),
+ data_store);
+ }
- g_signal_connect (data_store->case_file, "cases-deleted",
- G_CALLBACK (delete_cases_callback),
- data_store);
+ /* The entire model has changed */
+ g_sheet_model_range_changed (G_SHEET_MODEL (data_store), -1, -1, -1, -1);
- g_signal_connect (data_store->case_file, "case-inserted",
- G_CALLBACK (insert_case_callback),
- data_store);
+#if AXIS_TRANSITION
+ g_sheet_column_columns_changed (G_SHEET_COLUMN (data_store), 0, -1);
+#endif
+ if ( data_store->dict )
+ for (i = 0 ; i < n_dict_signals; ++i )
+ {
+ if ( data_store->dict_handler_id [i] > 0)
+ {
+ g_signal_handler_block (data_store->dict,
+ data_store->dict_handler_id[i]);
+ }
+ }
+}
- g_signal_connect (data_store->case_file, "case-changed",
- G_CALLBACK (changed_case_callback),
- data_store);
+static void
+psppire_data_store_finalize (GObject *object)
+{
- g_signal_connect (dict, "variable-inserted",
- G_CALLBACK (insert_variable_callback),
- data_store);
+ /* must chain up */
+ (* parent_class->finalize) (object);
+}
- g_signal_connect (dict, "variables-deleted",
- G_CALLBACK (delete_variables_callback),
- data_store);
- g_signal_connect (dict, "variable-changed",
- G_CALLBACK (variable_changed_callback),
- data_store);
+static void
+psppire_data_store_dispose (GObject *object)
+{
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (object);
+ if (ds->dispose_has_run)
+ return;
- g_signal_connect (dict, "dict-size-changed",
- G_CALLBACK (dict_size_change_callback),
- data_store);
+ if (ds->case_file) g_object_unref (ds->case_file);
- /* The entire model has changed */
- g_sheet_model_range_changed (G_SHEET_MODEL (data_store), -1, -1, -1, -1);
+ /* must chain up */
+ (* parent_class->dispose) (object);
- g_sheet_column_columns_changed (G_SHEET_COLUMN (data_store), 0, -1);
+ ds->dispose_has_run = TRUE;
}
-static void
-psppire_data_store_finalize (GObject *object)
+
+gboolean
+psppire_data_store_delete_cases (PsppireDataStore *ds,
+ casenumber first, casenumber count)
{
+ g_return_val_if_fail (ds, FALSE);
- /* must chain up */
- (* parent_class->finalize) (object);
+ return psppire_case_file_delete_cases (ds->case_file, count, first);
}
/* Insert a blank case before POSN */
gboolean
-psppire_data_store_insert_new_case (PsppireDataStore *ds, gint posn)
+psppire_data_store_insert_new_case (PsppireDataStore *ds, casenumber posn)
{
gboolean result;
gint val_cnt, v;
struct ccase cc;
g_return_val_if_fail (ds, FALSE);
-
- /* Opportunity for optimisation exists here when creating a blank case */
val_cnt = datasheet_get_column_cnt (ds->case_file->datasheet) ;
+ g_return_val_if_fail (val_cnt > 0, FALSE);
+
+ g_return_val_if_fail (posn <= psppire_data_store_get_case_count (ds), FALSE);
+
case_create (&cc, val_cnt);
memset ( case_data_rw_idx (&cc, 0), 0, val_cnt * MAX_SHORT_STRING);
}
-static gchar *
-psppire_data_store_get_string (const GSheetModel *model, gint row, gint column)
+gchar *
+psppire_data_store_get_string (PsppireDataStore *store, glong row, glong column)
{
gint idx;
char *text;
const struct variable *pv ;
union value *v ;
GString *s;
- PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
g_return_val_if_fail (store->dict, NULL);
g_return_val_if_fail (store->case_file, NULL);
static gboolean
psppire_data_store_clear_datum (GSheetModel *model,
- gint row, gint col)
-
+ glong row, glong col)
{
PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
to ROW, COL with the value TEXT.
Returns true if anything was updated, false otherwise.
*/
-static gboolean
-psppire_data_store_set_string (GSheetModel *model,
- const gchar *text, gint row, gint col)
+gboolean
+psppire_data_store_set_string (PsppireDataStore *store,
+ const gchar *text, glong row, glong col)
{
- PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
-
+ glong n_cases;
const struct variable *pv = psppire_dict_get_variable (store->dict, col);
g_return_val_if_fail (pv, FALSE);
-#if 0
- /* Allow the user to insert a lot of blank cases, simply by skipping rows */
- for (r = psppire_case_file_get_case_count (store->case_file); r <= row ; ++r)
- {
-
- gint c;
-
- psppire_case_array_insert_case (store->cases, r, 0, 0);
+ n_cases = psppire_data_store_get_case_count (store);
+ if ( row > n_cases)
+ return FALSE;
- for (c = 0 ; c < psppire_dict_get_var_cnt (store->dict); ++c )
- psppire_data_store_clear_datum (model, r, c);
- }
-#endif
+ if (row == n_cases)
+ psppire_data_store_insert_new_case (store, row);
psppire_case_file_data_in (store->case_file, row,
var_get_case_index (pv), ss_cstr (text),
}
-
-/* FIXME: There's no reason to actually have this function.
- It should be done by a procedure */
void
-psppire_data_store_create_system_file (PsppireDataStore *store,
- struct file_handle *handle)
+psppire_data_store_clear (PsppireDataStore *data_store)
{
- gint i, var_cnt;
- const struct sfm_write_options wo = {
- true, /* writeable */
- false, /* dont compress */
- 3 /* version */
- };
-
- struct casewriter *writer;
+ psppire_case_file_clear (data_store->case_file);
- g_assert (handle);
+ psppire_dict_clear (data_store->dict);
+}
- writer = sfm_open_writer (handle, store->dict->dict, wo);
- if ( ! writer)
- return;
+/* Return a casereader made from this datastore */
+struct casereader *
+psppire_data_store_get_reader (PsppireDataStore *ds)
+{
+ int i;
+ struct casereader *reader ;
- var_cnt = psppire_data_store_get_var_count (G_SHEET_MODEL (store));
-
- for (i = 0 ; i < psppire_case_file_get_case_count (store->case_file); ++i )
+ for (i = 0 ; i < n_cf_signals ; ++i )
{
- struct ccase c;
- psppire_case_file_get_case (store->case_file, i, &c);
- casewriter_write (writer, &c);
+ g_signal_handler_disconnect (ds->case_file, ds->cf_handler_id[i]);
+ ds->cf_handler_id[i] = 0 ;
}
- casewriter_destroy (writer);
-}
+ if ( ds->dict )
+ for (i = 0 ; i < n_dict_signals; ++i )
+ {
+ g_signal_handler_block (ds->dict,
+ ds->dict_handler_id[i]);
+ }
+ reader = psppire_case_file_make_reader (ds->case_file);
-void
-psppire_data_store_clear (PsppireDataStore *data_store)
-{
- psppire_case_file_clear (data_store->case_file);
-
- psppire_dict_clear (data_store->dict);
+ return reader;
}
-
/* Column related funcs */
-static gint
-geometry_get_column_count (const GSheetColumn *geom)
-{
- PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
- return MAX (MIN_COLUMNS, psppire_dict_get_var_cnt (ds->dict));
-}
+static const gchar null_var_name[]=N_("var");
+\f
+/* Row related funcs */
-static gint
-geometry_get_width (const GSheetColumn *geom, gint unit)
+static gchar *
+get_row_button_label (const GSheetModel *model, gint unit)
{
- const struct variable *pv ;
- PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
+ gchar *text;
+ gchar *s;
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (model);
- if ( unit >= psppire_dict_get_var_cnt (ds->dict) )
- return ds->width_of_m * 8 ;
+ s = g_strdup_printf (_("%d"), unit + 1);
- pv = psppire_dict_get_variable (ds->dict, unit);
+ text = pspp_locale_to_utf8 (s, -1, 0);
- if ( pv == NULL )
- return ds->width_of_m * 8 ;
+ g_free (s);
- return ds->width_of_m * var_get_display_width (pv);
+ return text;
}
-static void
-geometry_set_width (GSheetColumn *geom, gint unit, gint width)
-{
- PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
- struct variable *pv = psppire_dict_get_variable (ds->dict, unit);
+static gboolean
+get_row_sensitivity (const GSheetModel *model, gint unit)
+{
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (model);
- var_set_display_width (pv, width / ds->width_of_m );
+ return (unit < psppire_case_file_get_case_count (ds->case_file));
}
+\f
-static GtkJustification
-geometry_get_justification (const GSheetColumn *geom, gint unit)
-{
- PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
- const struct variable *pv ;
+/* Column related stuff */
+static gchar *
+get_column_subtitle (const GSheetModel *model, gint col)
+{
+ gchar *text;
+ const struct variable *v ;
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (model);
- if ( unit >= psppire_dict_get_var_cnt (ds->dict) )
- return GTK_JUSTIFY_LEFT;
+ if ( col >= psppire_dict_get_var_cnt (ds->dict) )
+ return NULL;
- pv = psppire_dict_get_variable (ds->dict, unit);
+ v = psppire_dict_get_variable (ds->dict, col);
- return (var_get_alignment (pv) == ALIGN_LEFT ? GTK_JUSTIFY_LEFT
- : var_get_alignment (pv) == ALIGN_RIGHT ? GTK_JUSTIFY_RIGHT
- : GTK_JUSTIFY_CENTER);
-}
+ if ( ! var_has_label (v))
+ return NULL;
+ text = pspp_locale_to_utf8 (var_get_label (v), -1, 0);
-static const gchar null_var_name[]=N_("var");
+ return text;
+}
static gchar *
-geometry_get_column_button_label (const GSheetColumn *geom, gint unit)
+get_column_button_label (const GSheetModel *model, gint col)
{
gchar *text;
struct variable *pv ;
- PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (model);
- if ( unit >= psppire_dict_get_var_cnt (ds->dict) )
+ if ( col >= psppire_dict_get_var_cnt (ds->dict) )
return g_locale_to_utf8 (null_var_name, -1, 0, 0, 0);
- pv = psppire_dict_get_variable (ds->dict, unit);
+ pv = psppire_dict_get_variable (ds->dict, col);
text = pspp_locale_to_utf8 (var_get_name (pv), -1, 0);
return text;
}
-
static gboolean
-geometry_get_sensitivity (const GSheetColumn *geom, gint unit)
-{
- PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
-
- return (unit < psppire_dict_get_var_cnt (ds->dict));
-}
-
-
-static void
-psppire_data_store_sheet_column_init (GSheetColumnIface *iface)
-{
- iface->get_column_count = geometry_get_column_count;
- iface->get_width = geometry_get_width;
- iface->set_width = geometry_set_width;
- iface->get_visibility = always_true;
- iface->get_sensitivity = geometry_get_sensitivity;
- iface->get_justification = geometry_get_justification;
- iface->get_button_label = geometry_get_column_button_label;
-}
-
-
-/* Row related funcs */
-
-static gint
-geometry_get_row_count (const GSheetRow *geom, gpointer data)
+get_column_sensitivity (const GSheetModel *model, gint col)
{
- PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
-
- return TRAILING_ROWS + psppire_case_file_get_case_count (ds->case_file);
-}
-
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (model);
-static gint
-geometry_get_height (const GSheetRow *geom, gint unit, gpointer data)
-{
- return 25;
+ return (col < psppire_dict_get_var_cnt (ds->dict));
}
-static gboolean
-geometry_get_row_sensitivity (const GSheetRow *geom, gint unit, gpointer data)
-{
- PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
-
-
- return (unit < psppire_case_file_get_case_count (ds->case_file));
-}
-
-static gchar *
-geometry_get_row_button_label (const GSheetRow *geom, gint unit, gpointer data)
+static GtkJustification
+get_column_justification (const GSheetModel *model, gint col)
{
- gchar *text;
- gchar *s;
- PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
-
- if ( unit >
- TRAILING_ROWS + psppire_case_file_get_case_count (ds->case_file))
- return 0;
-
- s = g_strdup_printf (_("%d"), unit);
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (model);
+ const struct variable *pv ;
- text = pspp_locale_to_utf8 (s, -1, 0);
+ if ( col >= psppire_dict_get_var_cnt (ds->dict) )
+ return GTK_JUSTIFY_LEFT;
- g_free (s);
+ pv = psppire_dict_get_variable (ds->dict, col);
- return text;
+ return (var_get_alignment (pv) == ALIGN_LEFT ? GTK_JUSTIFY_LEFT
+ : var_get_alignment (pv) == ALIGN_RIGHT ? GTK_JUSTIFY_RIGHT
+ : GTK_JUSTIFY_CENTER);
}
-static void
-psppire_data_store_sheet_row_init (GSheetRowIface *iface)
-{
- iface->get_row_count = geometry_get_row_count;
-
- iface->get_height = geometry_get_height;
- iface->set_height = 0;
- iface->get_visibility = always_true;
- iface->get_sensitivity = geometry_get_row_sensitivity;
-
- iface->get_button_label = geometry_get_row_button_label;
-}
-