-/* psppire-data-store.c
-
- PSPPIRE --- A Graphical User Interface for PSPP
+/* 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/casefile.h>
-#include <data/case.h>
+#include <data/datasheet.h>
#include <data/data-out.h>
#include <data/variable.h>
#include <data/value-labels.h>
#include <data/data-in.h>
-#include <data/file-handle-def.h>
-#include <data/sys-file-writer.h>
-
-
static void psppire_data_store_init (PsppireDataStore *data_store);
static void psppire_data_store_class_init (PsppireDataStoreClass *class);
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 gboolean psppire_data_store_clear_datum (GSheetModel *model,
gint row, gint column);
enum {FONT_CHANGED,
n_SIGNALS};
-static guint signal[n_SIGNALS];
+static guint signals [n_SIGNALS];
inline GType
object_class->finalize = psppire_data_store_finalize;
- signal[FONT_CHANGED] =
+ signals [FONT_CHANGED] =
g_signal_new ("font_changed",
- G_TYPE_FROM_CLASS(class),
+ G_TYPE_FROM_CLASS (class),
G_SIGNAL_RUN_FIRST,
0,
NULL, NULL,
static gint
psppire_data_store_get_var_count (const GSheetModel *model)
{
- const PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
+ const PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
return psppire_dict_get_var_cnt (store->dict);
}
+casenumber
+psppire_data_store_get_case_count (PsppireDataStore *store)
+{
+ return psppire_case_file_get_case_count (store->case_file);
+}
+
static gint
-psppire_data_store_get_case_count (const GSheetModel *model)
+psppire_data_store_get_case_count_from_model (const GSheetModel *model)
{
- const PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
+ const PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
return psppire_case_file_get_case_count (store->case_file);
}
+
+
static void
psppire_data_store_init (PsppireDataStore *data_store)
{
psppire_data_store_get_font_desc (const GSheetModel *model,
gint row, gint column)
{
- PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
+ PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
return store->font_desc;
}
+static inline gchar *
+psppire_data_store_get_string_wrapper (const GSheetModel *model, gint row,
+ gint 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,
+ gint row, gint column)
+{
+ return psppire_data_store_set_string (PSPPIRE_DATA_STORE (model), text,
+ row, column);
+}
+
+
+
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_from_model;
}
static
g_return_if_fail (data);
- store = PSPPIRE_DATA_STORE(data);
+ store = PSPPIRE_DATA_STORE (data);
g_assert (first >= 0);
- g_sheet_model_rows_deleted (G_SHEET_MODEL(store), first, n_cases);
+ g_sheet_model_rows_deleted (G_SHEET_MODEL (store), first, n_cases);
}
g_return_if_fail (data);
- store = PSPPIRE_DATA_STORE(data);
+ store = PSPPIRE_DATA_STORE (data);
- g_sheet_model_range_changed (G_SHEET_MODEL(store),
+ g_sheet_model_range_changed (G_SHEET_MODEL (store),
casenum, -1,
psppire_case_file_get_case_count (store->case_file),
-1);
- g_sheet_model_rows_inserted (G_SHEET_MODEL(store), casenum, 1);
+ g_sheet_model_rows_inserted (G_SHEET_MODEL (store), casenum, 1);
}
PsppireDataStore *store ;
g_return_if_fail (data);
- store = PSPPIRE_DATA_STORE(data);
+ store = PSPPIRE_DATA_STORE (data);
- g_sheet_model_range_changed (G_SHEET_MODEL(store),
+ g_sheet_model_range_changed (G_SHEET_MODEL (store),
casenum, -1,
casenum, -1);
}
g_return_if_fail (data);
- store = PSPPIRE_DATA_STORE(data);
+ store = PSPPIRE_DATA_STORE (data);
- g_sheet_model_columns_deleted (G_SHEET_MODEL(store), var_num, n_vars);
+ g_sheet_model_columns_deleted (G_SHEET_MODEL (store), var_num, n_vars);
- g_sheet_column_columns_changed (G_SHEET_COLUMN(store),
+ g_sheet_column_columns_changed (G_SHEET_COLUMN (store),
var_num, -1);
}
+
+static void
+variable_changed_callback (GObject *obj, gint var_num, gpointer data)
+{
+ PsppireDataStore *store;
+
+ g_return_if_fail (data);
+
+ store = PSPPIRE_DATA_STORE (data);
+
+ 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);
+}
+
static void
insert_variable_callback (GObject *obj, gint var_num, gpointer data)
{
g_return_if_fail (data);
- store = PSPPIRE_DATA_STORE(data);
+ store = PSPPIRE_DATA_STORE (data);
if ( var_num > 0 )
{
- struct variable *variable;
- variable = psppire_dict_get_variable (store->dict, var_num);
+ struct variable *variable =
+ psppire_dict_get_variable (store->dict, var_num);
+
+ g_assert (variable != NULL);
posn = var_get_case_index (variable);
}
psppire_case_file_insert_values (store->case_file, 1, posn);
- g_sheet_column_columns_changed (G_SHEET_COLUMN(store),
+ g_sheet_column_columns_changed (G_SHEET_COLUMN (store),
var_num, 1);
- g_sheet_model_columns_inserted (G_SHEET_MODEL(store), var_num, 1);
+ g_sheet_model_columns_inserted (G_SHEET_MODEL (store), var_num, 1);
}
g_return_if_fail (data);
- store = PSPPIRE_DATA_STORE(data);
+ store = PSPPIRE_DATA_STORE (data);
psppire_case_file_insert_values (store->case_file, adjustment, posn);
}
psppire_data_store_set_dictionary (retval, dict);
-
return retval;
}
-
-/**
- * psppire_data_store_replace_set_dictionary:
- * @data_store: The variable store
- * @dict: The dictionary to set
- *
- * If a dictionary is already associated with the data-store, then it will be
- * destroyed.
- **/
void
-psppire_data_store_set_dictionary (PsppireDataStore *data_store, PsppireDict *dict)
+psppire_data_store_set_case_file (PsppireDataStore *data_store,
+ PsppireCaseFile *cf)
{
- gint var_cnt = psppire_dict_get_next_value_idx (dict);
-
- data_store->dict = dict;
-
if ( data_store->case_file)
{
g_object_unref (data_store->case_file);
- data_store->case_file = 0;
}
- data_store->case_file = psppire_case_file_new (var_cnt);
+ data_store->case_file = cf;
g_signal_connect (data_store->case_file, "cases-deleted",
- G_CALLBACK(delete_cases_callback),
+ G_CALLBACK (delete_cases_callback),
data_store);
g_signal_connect (data_store->case_file, "case-inserted",
- G_CALLBACK(insert_case_callback),
+ G_CALLBACK (insert_case_callback),
data_store);
g_signal_connect (data_store->case_file, "case-changed",
- G_CALLBACK(changed_case_callback),
+ G_CALLBACK (changed_case_callback),
data_store);
+}
+
+
+
+/**
+ * psppire_data_store_replace_set_dictionary:
+ * @data_store: The variable store
+ * @dict: The dictionary to set
+ *
+ * If a dictionary is already associated with the data-store, then it will be
+ * destroyed.
+ **/
+void
+psppire_data_store_set_dictionary (PsppireDataStore *data_store, PsppireDict *dict)
+{
+ data_store->dict = dict;
g_signal_connect (dict, "variable-inserted",
- G_CALLBACK(insert_variable_callback),
+ G_CALLBACK (insert_variable_callback),
data_store);
g_signal_connect (dict, "variables-deleted",
- G_CALLBACK(delete_variables_callback),
+ G_CALLBACK (delete_variables_callback),
data_store);
+ g_signal_connect (dict, "variable-changed",
+ G_CALLBACK (variable_changed_callback),
+ data_store);
+
+
g_signal_connect (dict, "dict-size-changed",
- G_CALLBACK(dict_size_change_callback),
+ G_CALLBACK (dict_size_change_callback),
data_store);
/* The entire model has changed */
- g_sheet_model_range_changed (G_SHEET_MODEL(data_store), -1, -1, -1, -1);
+ g_sheet_model_range_changed (G_SHEET_MODEL (data_store), -1, -1, -1, -1);
- g_sheet_column_columns_changed (G_SHEET_COLUMN(data_store), 0, -1);
+ g_sheet_column_columns_changed (G_SHEET_COLUMN (data_store), 0, -1);
}
static void
/* Opportunity for optimisation exists here when creating a blank case */
- val_cnt = casefile_get_value_cnt (ds->case_file->flexifile) ;
+ val_cnt = datasheet_get_column_cnt (ds->case_file->datasheet) ;
case_create (&cc, val_cnt);
}
-static gchar *
-psppire_data_store_get_string (const GSheetModel *model, gint row, gint column)
+gchar *
+psppire_data_store_get_string (PsppireDataStore *store, gint row, gint column)
{
gint idx;
char *text;
const struct fmt_spec *fp ;
const struct variable *pv ;
- const union value *v ;
+ 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);
pv = psppire_dict_get_variable (store->dict, column);
+ g_assert (pv);
+
idx = var_get_case_index (pv);
- v = psppire_case_file_get_value (store->case_file, row, idx);
+ g_assert (idx >= 0);
+
+ v = psppire_case_file_get_value (store->case_file, row, idx, NULL,
+ var_get_width (pv));
g_return_val_if_fail (v, NULL);
if ( store->show_labels)
{
- const struct val_labs * vl = var_get_value_labels (pv);
-
- const gchar *label;
- if ( (label = val_labs_find (vl, *v)) )
- {
+ const gchar *label = var_lookup_value_label (pv, v);
+ if (label)
+ {
+ free (v);
return pspp_locale_to_utf8 (label, -1, 0);
- }
+ }
}
fp = var_get_write_format (pv);
g_strchomp (text);
+ free (v);
return text;
}
gint row, gint col)
{
- PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
+ PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
union value v;
const struct variable *pv = psppire_dict_get_variable (store->dict, col);
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, gint row, gint col)
{
- PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
-
const struct variable *pv = psppire_dict_get_variable (store->dict, col);
g_return_val_if_fail (pv, FALSE);
#if 0
store->width_of_m = calc_m_width (fd);
#endif
- g_signal_emit (store, signal[FONT_CHANGED], 0);
+ g_signal_emit (store, signals [FONT_CHANGED], 0);
- g_sheet_model_range_changed (G_SHEET_MODEL(store),
+ g_sheet_model_range_changed (G_SHEET_MODEL (store),
-1, -1, -1, -1);
}
store->show_labels = show_labels;
- g_sheet_model_range_changed (G_SHEET_MODEL(store),
+ g_sheet_model_range_changed (G_SHEET_MODEL (store),
-1, -1, -1, -1);
}
-
-/* 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 sfm_writer *writer ;
-
- g_assert (handle);
-
- writer = sfm_open_writer (handle, store->dict->dict, wo);
-
- if ( ! writer)
- return;
-
-
- 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 )
- {
- struct ccase c;
-
- case_create (&c, var_cnt);
- psppire_case_file_get_case (store->case_file, i, &c);
- sfm_write_case (writer, &c);
-
- case_destroy (&c);
- }
+ psppire_case_file_clear (data_store->case_file);
- sfm_close_writer (writer);
+ psppire_dict_clear (data_store->dict);
}
-void
-psppire_data_store_clear (PsppireDataStore *data_store)
+/* Return a casereader made from this datastore */
+struct casereader *
+psppire_data_store_get_reader (PsppireDataStore *ds)
{
- psppire_case_file_clear (data_store->case_file);
+ struct casereader *reader ;
- psppire_dict_clear (data_store->dict);
-}
+ reader = psppire_case_file_make_reader (ds->case_file);
+ return reader;
+}
static gint
geometry_get_column_count (const GSheetColumn *geom)
{
- PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
- return MAX(MIN_COLUMNS, psppire_dict_get_var_cnt (ds->dict));
+ return MAX (MIN_COLUMNS, psppire_dict_get_var_cnt (ds->dict));
}
geometry_get_width (const GSheetColumn *geom, gint unit)
{
const struct variable *pv ;
- PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
if ( unit >= psppire_dict_get_var_cnt (ds->dict) )
return ds->width_of_m * 8 ;
static void
geometry_set_width (GSheetColumn *geom, gint unit, gint width)
{
- PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
struct variable *pv = psppire_dict_get_variable (ds->dict, unit);
static GtkJustification
geometry_get_justification (const GSheetColumn *geom, gint unit)
{
- PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
const struct variable *pv ;
{
gchar *text;
struct variable *pv ;
- PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
if ( unit >= psppire_dict_get_var_cnt (ds->dict) )
return g_locale_to_utf8 (null_var_name, -1, 0, 0, 0);
}
+static gchar *
+geometry_get_column_subtitle (const GSheetColumn *geom, gint unit)
+{
+ gchar *text;
+ const struct variable *v ;
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
+
+ if ( unit >= psppire_dict_get_var_cnt (ds->dict) )
+ return NULL;
+
+ v = psppire_dict_get_variable (ds->dict, unit);
+
+ if ( ! var_has_label (v))
+ return NULL;
+
+ text = pspp_locale_to_utf8 (var_get_label (v), -1, 0);
+
+ return text;
+}
+
+
static gboolean
geometry_get_sensitivity (const GSheetColumn *geom, gint unit)
{
- PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
return (unit < psppire_dict_get_var_cnt (ds->dict));
}
iface->get_sensitivity = geometry_get_sensitivity;
iface->get_justification = geometry_get_justification;
iface->get_button_label = geometry_get_column_button_label;
+ iface->get_subtitle = geometry_get_column_subtitle;
}
static gint
geometry_get_row_count (const GSheetRow *geom, gpointer data)
{
- PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
return TRAILING_ROWS + psppire_case_file_get_case_count (ds->case_file);
}
static gboolean
geometry_get_row_sensitivity (const GSheetRow *geom, gint unit, gpointer data)
{
- PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
return (unit < psppire_case_file_get_case_count (ds->case_file));
{
gchar *text;
gchar *s;
- PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+ 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);
+ s = g_strdup_printf (_("%d"), unit + FIRST_CASE_NUMBER);
text = pspp_locale_to_utf8 (s, -1, 0);
iface->get_button_label = geometry_get_row_button_label;
}
+
+
+