src/ui/gui/psppire-value-entry.h \
src/ui/gui/psppire-var-ptr.c \
src/ui/gui/psppire-var-ptr.h \
- src/ui/gui/psppire-var-sheet.c \
src/ui/gui/psppire-var-sheet.h \
+ src/ui/gui/psppire-var-sheet-header.h \
+ src/ui/gui/psppire-var-sheet-header.c \
src/ui/gui/psppire-vbuttonbox.h \
src/ui/gui/psppire-window.c \
src/ui/gui/psppire-window.h \
#include "ui/gui/psppire-value-entry.h"
#include "ui/gui/psppire-var-sheet.h"
#include "ui/gui/psppire-conf.h"
+#include "ui/gui/psppire-var-sheet-header.h"
#include "ui/gui/efficient-sheet/jmd-sheet.h"
static void
psppire_data_editor_refresh_model (PsppireDataEditor *de)
{
- PsppireVarSheet *var_sheet = PSPPIRE_VAR_SHEET (de->var_sheet);
- int i;
-
- psppire_var_sheet_set_dictionary (var_sheet, de->dict);
}
static void
{
PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (object);
- int i;
-
switch (prop_id)
{
case PROP_SPLIT_WINDOW:
g_object_ref (de->dict);
g_object_set (de->data_sheet, "hmodel", de->dict, NULL);
+ g_object_set (de->var_sheet, "data-model", de->dict, NULL);
- psppire_var_sheet_set_dictionary (PSPPIRE_VAR_SHEET (de->var_sheet),
- de->dict);
break;
case PROP_VALUE_LABELS:
break;
ui_manager_spec);
}
-static gboolean
-on_data_sheet_var_double_clicked (GtkWidget *data_sheet,
- gint dict_index,
- PsppireDataEditor *de)
-{
- gtk_notebook_set_current_page (GTK_NOTEBOOK (de),
- PSPPIRE_DATA_EDITOR_VARIABLE_VIEW);
-
- psppire_var_sheet_goto_variable (PSPPIRE_VAR_SHEET (de->var_sheet),
- dict_index);
-
- return TRUE;
-}
static gboolean
on_var_sheet_var_double_clicked (PsppireVarSheet *var_sheet, gint dict_index,
{
}
-static void
-on_data_sheet_selection_changed (PsppSheetSelection *selection,
- PsppireDataEditor *de)
-{
- /* In a split view, ensure that only a single data sheet has a nonempty
- selection. */
- if (de->split
- && pspp_sheet_selection_count_selected_rows (selection)
- && pspp_sheet_selection_count_selected_columns (selection))
- {
- }
-
- refresh_entry (de);
-}
-
static void
disconnect_data_sheets (PsppireDataEditor *de)
{
- int i;
-
}
static void
psppire_data_editor_init (PsppireDataEditor *de)
{
- GtkWidget *var_sheet_scroller;
GtkWidget *hbox;
gchar *fontname = NULL;
gtk_box_pack_start (GTK_BOX (hbox), de->datum_entry, TRUE, TRUE, 0);
de->split = FALSE;
- de->data_sheet = g_object_new (JMD_TYPE_SHEET,
- NULL);
- GtkWidget *button = jmd_sheet_get_button (JMD_SHEET (de->data_sheet));
- gtk_button_set_label (GTK_BUTTON (button), _("Case"));
+ de->data_sheet = g_object_new (JMD_TYPE_SHEET, NULL);
+ GtkWidget *data_button = jmd_sheet_get_button (JMD_SHEET (de->data_sheet));
+ gtk_button_set_label (GTK_BUTTON (data_button), _("Case"));
de->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start (GTK_BOX (de->vbox), hbox, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (de->vbox), de->data_sheet, TRUE, TRUE, 0);
gtk_widget_show_all (de->vbox);
- de->var_sheet = GTK_WIDGET (psppire_var_sheet_new ());
+ de->var_sheet = g_object_new (JMD_TYPE_SHEET, NULL);
- pspp_sheet_view_set_grid_lines (PSPP_SHEET_VIEW (de->var_sheet),
- GTK_TREE_VIEW_GRID_LINES_BOTH);
- var_sheet_scroller = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (var_sheet_scroller),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (var_sheet_scroller), de->var_sheet);
- gtk_widget_show_all (var_sheet_scroller);
+ PsppireVarSheetHeader *vsh = g_object_new (PSPPIRE_TYPE_VAR_SHEET_HEADER, NULL);
+
+ g_object_set (de->var_sheet, "hmodel", vsh, NULL);
- gtk_notebook_append_page (GTK_NOTEBOOK (de), var_sheet_scroller,
+
+ GtkWidget *var_button = jmd_sheet_get_button (JMD_SHEET (de->var_sheet));
+ gtk_button_set_label (GTK_BUTTON (var_button), _("Variable"));
+
+ gtk_notebook_append_page (GTK_NOTEBOOK (de), de->var_sheet,
gtk_label_new_with_mnemonic (_("Variable View")));
+ gtk_widget_show_all (de->var_sheet);
+
g_signal_connect (de->var_sheet, "var-double-clicked",
G_CALLBACK (on_var_sheet_var_double_clicked), de);
psppire_data_editor_show_grid (PsppireDataEditor *de, gboolean grid_visible)
{
GtkTreeViewGridLines grid;
- int i;
grid = (grid_visible
? GTK_TREE_VIEW_GRID_LINES_BOTH
void
psppire_data_editor_split_window (PsppireDataEditor *de, gboolean split)
{
- GtkTreeViewGridLines grid_lines;
- gboolean labels;
-
if (split == de->split)
return;
-
-
disconnect_data_sheets (de);
psppire_data_editor_refresh_model (de);
void
psppire_data_editor_goto_variable (PsppireDataEditor *de, gint dict_index)
{
-
- switch (gtk_notebook_get_current_page (GTK_NOTEBOOK (de)))
- {
-
- case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW:
- psppire_var_sheet_goto_variable (PSPPIRE_VAR_SHEET (de->var_sheet),
- dict_index);
- break;
- }
}
break;
case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW:
- ui_manager = psppire_var_sheet_get_ui_manager (
- PSPPIRE_VAR_SHEET (de->var_sheet));
break;
default:
return path;
}
+const struct fmt_spec *var_get_write_format (const struct variable *);
static void
tree_model_get_value (GtkTreeModel *model, GtkTreeIter *iter,
g_return_if_fail (iter->stamp == dict->stamp);
- var = iter->user_data;
+ var = iter->user_data;
+ const struct fmt_spec *fs = var_get_write_format (var);
+
switch (column)
{
case DICT_TVM_COL_NAME:
- {
- g_value_init (value, G_TYPE_STRING);
- g_value_set_string (value, var_get_name (var));
- }
+ g_value_init (value, G_TYPE_STRING);
+ g_value_set_string (value, var_get_name (var));
+ break;
+ case DICT_TVM_COL_WIDTH:
+ g_value_init (value, G_TYPE_INT);
+ g_value_set_int (value, fs->w);
+ break;
+ case DICT_TVM_COL_DECIMAL:
+ g_value_init (value, G_TYPE_INT);
+ g_value_set_int (value, fs->d);
+ break;
+ case DICT_TVM_COL_LABEL:
+ g_value_init (value, G_TYPE_STRING);
+ g_value_set_string (value, var_get_label (var));
+ break;
+ case DICT_TVM_COL_COLUMNS:
+ g_value_init (value, G_TYPE_INT);
+ g_value_set_int (value, var_get_display_width (var));
+ break;
+ case DICT_TVM_COL_ALIGNMENT:
+ g_value_init (value, G_TYPE_INT);
+ g_value_set_int (value, var_get_alignment (var));
+ break;
+ case DICT_TVM_COL_MEASURE:
+ g_value_init (value, G_TYPE_INT);
+ g_value_set_int (value, var_get_measure (var));
+ break;
+ case DICT_TVM_COL_ROLE:
+ g_value_init (value, G_TYPE_INT);
+ g_value_set_int (value, var_get_role (var));
break;
case DICT_TVM_COL_VAR:
g_value_init (value, PSPPIRE_VAR_PTR_TYPE);
g_value_set_boxed (value, var);
break;
default:
- g_return_if_reached ();
+ g_value_init (value, G_TYPE_STRING);
+ g_value_set_string (value, "????");
break;
}
}
typedef struct _PsppireDict PsppireDict;
typedef struct _PsppireDictClass PsppireDictClass;
-enum {DICT_TVM_COL_NAME=0, DICT_TVM_COL_VAR, DICT_TVM_COL_LABEL, n_DICT_COLS} ;
+enum {DICT_TVM_COL_NAME=0,
+ DICT_TVM_COL_TYPE,
+ DICT_TVM_COL_WIDTH,
+ DICT_TVM_COL_DECIMAL,
+ DICT_TVM_COL_LABEL,
+ DICT_TVM_COL_VALUE_LABELS,
+ DICT_TVM_COL_MISSING_VALUES,
+ DICT_TVM_COL_COLUMNS,
+ DICT_TVM_COL_ALIGNMENT,
+ DICT_TVM_COL_MEASURE,
+ DICT_TVM_COL_ROLE,
+ DICT_TVM_COL_VAR,
+ n_DICT_COLS} ;
struct _PsppireDict
{
static void
prepare_formats_page (PsppireImportAssistant *ia)
{
- PsppireDict *psppire_dict = NULL;
- PsppireVarSheet *var_sheet;
- GtkBin *vars_scroller;
- GtkWidget *old_var_sheet;
-
-
- push_watch_cursor (ia);
-
- if (ia->spreadsheet == NULL)
- {
- struct fmt_guesser *fg;
- unsigned long int number = 0;
- size_t column_idx;
-
-
- ia->dict = dict_create (get_default_encoding ());
- fg = fmt_guesser_create ();
- for (column_idx = 0; column_idx < ia->column_cnt; column_idx++)
- {
- struct variable *modified_var =
- (column_idx < ia->modified_var_cnt ? ia->modified_vars[column_idx] : NULL);
-
- if (modified_var == NULL)
- {
- struct column *column = &ia->columns[column_idx];
- struct variable *var;
- struct fmt_spec format;
- char *name;
- size_t row;
-
- /* Choose variable name. */
- name = dict_make_unique_var_name (ia->dict, column->name, &number);
-
- /* Choose variable format. */
- fmt_guesser_clear (fg);
- for (row = ia->skip_lines; row < ia->line_cnt; row++)
- fmt_guesser_add (fg, column->contents[row]);
- fmt_guesser_guess (fg, &format);
- fmt_fix_input (&format);
-
- /* Create variable. */
- var = dict_create_var_assert (ia->dict, name, fmt_var_width (&format));
- var_set_both_formats (var, &format);
-
- free (name);
- }
- else
- {
- char *name;
-
- name = dict_make_unique_var_name (ia->dict, var_get_name (modified_var),
- &number);
- dict_clone_var_as_assert (ia->dict, modified_var, name);
- free (name);
- }
- }
- fmt_guesser_destroy (fg);
- }
- else
- {
- int row_start = -1;
- int row_stop = -1;
- int col_start = -1;
- int col_stop = -1;
-
- GtkBuilder *builder = ia->builder;
-
- struct casereader *reader = NULL;
-
- GtkWidget *readnames_checkbox = get_widget_assert (builder, "readnames-checkbox");
- GtkWidget *range_entry = get_widget_assert (builder, "cell-range-entry");
- const gchar *range = gtk_entry_get_text (GTK_ENTRY (range_entry));
- GtkWidget *combo_box = get_widget_assert (builder, "sheet-entry");
-
- gint num = gtk_combo_box_get_active (GTK_COMBO_BOX (combo_box));
-
- struct spreadsheet_read_options sro;
-
- sro.sheet_name = NULL;
- sro.cell_range = NULL;
- sro.sheet_index = num + 1;
-
- if ( convert_cell_ref (range, &col_start, &row_start, &col_stop, &row_stop))
- {
- sro.cell_range = g_strdup (range);
- }
-
- sro.read_names = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (readnames_checkbox));
- sro.asw = -1;
-
- switch (ia->spreadsheet->type)
- {
- case SPREADSHEET_ODS:
- case SPREADSHEET_GNUMERIC:
- {
- reader = spreadsheet_make_reader (ia->spreadsheet, &sro);
- ia->dict = dict_clone (ia->spreadsheet->dict);
- }
- break;
- default:
- g_assert_not_reached ();
- break;
- }
- g_free (sro.cell_range);
-
- if (reader && ia->dict)
- {
- struct ccase *c;
- int col;
-
- ia->column_cnt = dict_get_var_cnt (ia->dict);
- ia->columns = xcalloc (ia->column_cnt, sizeof (*ia->columns));
- for (col = 0; col < ia->column_cnt ; ++col)
- {
- const struct variable *var = dict_get_var (ia->dict, col);
- ia->columns[col].name = xstrdup (var_get_name (var));
- ia->columns[col].contents = NULL;
- }
-
- casenumber rows = 0;
- for (; (c = casereader_read (reader)) != NULL; case_unref (c))
- {
- rows++;
- for (col = 0; col < ia->column_cnt ; ++col)
- {
- char *ss;
- const struct variable *var = dict_get_var (ia->dict, col);
-
- ia->columns[col].contents = xrealloc (ia->columns[col].contents,
- sizeof (struct substring) * rows);
-
- ss = data_out (case_data (c, var), dict_get_encoding (ia->dict),
- var_get_print_format (var));
-
- ia->columns[col].contents[rows - 1] = ss_cstr (ss);
- }
-
- if (rows > MAX_PREVIEW_LINES)
- {
- case_unref (c);
- break;
- }
- }
- casereader_destroy (reader);
- ia->line_cnt = rows;
- }
- else
- {
- GtkWidget * dialog = gtk_message_dialog_new (NULL,
- GTK_DIALOG_MODAL,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_CLOSE,
- _("An error occurred reading the spreadsheet file."));
-
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- }
- }
-
- psppire_dict = psppire_dict_new_from_dict (ia->dict);
- g_signal_connect (psppire_dict, "variable-changed",
- G_CALLBACK (on_variable_change), ia);
- ia->psppire_dict = psppire_dict;
-
-
- /* XXX: PsppireVarStore doesn't hold a reference to
- psppire_dict for now, but it should. After it does, we
- should g_object_ref the psppire_dict here, since we also
- hold a reference via ia->formats->dict. */
- var_sheet = PSPPIRE_VAR_SHEET (psppire_var_sheet_new ());
- g_object_set (var_sheet,
- "dictionary", psppire_dict,
- "may-create-vars", FALSE,
- "may-delete-vars", FALSE,
- "format-use", FMT_FOR_INPUT,
- "enable-grid-lines", PSPP_SHEET_VIEW_GRID_LINES_BOTH,
- (void *) NULL);
-
- vars_scroller = GTK_BIN (get_widget_assert (ia->builder, "vars-scroller"));
- old_var_sheet = gtk_bin_get_child (GTK_BIN (vars_scroller));
- if (old_var_sheet != NULL)
- gtk_container_remove (GTK_CONTAINER (vars_scroller), old_var_sheet);
- gtk_container_add (GTK_CONTAINER (vars_scroller), GTK_WIDGET (var_sheet));
- gtk_widget_show (GTK_WIDGET (var_sheet));
-
- ia->data_tree_view =
- GTK_WIDGET (create_data_tree_view (
- FALSE,
- GTK_CONTAINER (get_widget_assert (ia->builder, "data-scroller")),
- ia));
-
- gtk_widget_show (ia->paste_button);
-
- pop_watch_cursor (ia);
}
static void
--- /dev/null
+/*
+ A candidate replacement for Pspp's sheet
+ Copyright (C) 2016 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
+ 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,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+#include <gtk/gtk.h>
+
+#include "psppire-var-sheet-header.h"
+
+#include "efficient-sheet/jmd-axis-model.h"
+#include "efficient-sheet/jmd-datum.h"
+
+
+static guint
+gni (GListModel *list)
+{
+ return 11;
+}
+
+static GType
+git (GListModel *list)
+{
+ return JMD_TYPE_DATUM;
+}
+
+static gpointer
+gi (GListModel *list, guint position)
+{
+ JmdDatum *gd = JMD_DATUM (g_object_new (JMD_TYPE_DATUM, NULL));
+
+ switch (position)
+ {
+ case 0:
+ gd->text = g_strdup ("Name");
+ break;
+ case 1:
+ gd->text = g_strdup ("Type");
+ break;
+ case 2:
+ gd->text = g_strdup ("Width");
+ break;
+ case 3:
+ gd->text = g_strdup ("Decimal");
+ break;
+ case 4:
+ gd->text = g_strdup ("Label");
+ break;
+ case 5:
+ gd->text = g_strdup ("Value Labels");
+ break;
+ case 6:
+ gd->text = g_strdup ("Missing Values");
+ break;
+ case 7:
+ gd->text = g_strdup ("Columns");
+ break;
+ case 8:
+ gd->text = g_strdup ("Align");
+ break;
+ case 9:
+ gd->text = g_strdup ("Measure");
+ break;
+ case 10:
+ gd->text = g_strdup ("Role");
+ break;
+ default:
+ // g_assert_not_reached ();
+ g_print ("Bug: Request for item %d", position);
+ break;
+ }
+
+ return gd;
+}
+
+
+static void
+psppire_init_iface (GListModelInterface *iface)
+{
+ iface->get_n_items = gni;
+ iface->get_item = gi;
+ iface->get_item_type = git;
+}
+
+
+G_DEFINE_TYPE_WITH_CODE (PsppireVarSheetHeader, psppire_var_sheet_header,
+ G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, psppire_init_iface));
+
+static void
+psppire_var_sheet_header_init (PsppireVarSheetHeader *d)
+{
+}
+
+
+
+static void
+psppire_var_sheet_header_class_init (PsppireVarSheetHeaderClass *dc)
+{
+}
+
--- /dev/null
+/*
+ A candidate replacement for Pspp's sheet
+ Copyright (C) 2016 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
+ 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,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _PSPPIRE_VAR_SHEET_HEADER_H
+#define _PSPPIRE_VAR_SHEET_HEADER_H
+
+
+G_DECLARE_FINAL_TYPE (PsppireVarSheetHeader, psppire_var_sheet_header, PSPPIRE, VAR_SHEET_HEADER, GObject)
+
+
+struct _PsppireVarSheetHeader
+{
+ GObject parent_instance;
+};
+
+struct _PsppireVarSheetHeaderClass
+{
+ GObjectClass parent_instance;
+};
+
+
+
+#define PSPPIRE_TYPE_VAR_SHEET_HEADER psppire_var_sheet_header_get_type ()
+
+#endif
#include <config.h>
+#error "Do not do this"
+
#include "ui/gui/psppire-var-sheet.h"
#include "data/format.h"