From 0cba607fab2e2b3bcad0aca96da27254cb260f50 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Sat, 13 Feb 2016 17:52:52 +0100 Subject: [PATCH] Use new sheet in var-sheet --- src/ui/gui/automake.mk | 3 +- src/ui/gui/psppire-data-editor.c | 85 +++-------- src/ui/gui/psppire-dict.c | 42 +++++- src/ui/gui/psppire-dict.h | 14 +- src/ui/gui/psppire-import-assistant.c | 194 -------------------------- src/ui/gui/psppire-var-sheet-header.c | 114 +++++++++++++++ src/ui/gui/psppire-var-sheet-header.h | 40 ++++++ src/ui/gui/psppire-var-sheet.c | 2 + 8 files changed, 223 insertions(+), 271 deletions(-) create mode 100644 src/ui/gui/psppire-var-sheet-header.c create mode 100644 src/ui/gui/psppire-var-sheet-header.h diff --git a/src/ui/gui/automake.mk b/src/ui/gui/automake.mk index 4d0e6ff4a3..fb4c2d65ce 100644 --- a/src/ui/gui/automake.mk +++ b/src/ui/gui/automake.mk @@ -302,8 +302,9 @@ src_ui_gui_psppire_SOURCES = \ 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 \ diff --git a/src/ui/gui/psppire-data-editor.c b/src/ui/gui/psppire-data-editor.c index 9c8f3aa93f..14f2076f35 100644 --- a/src/ui/gui/psppire-data-editor.c +++ b/src/ui/gui/psppire-data-editor.c @@ -31,6 +31,7 @@ #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" @@ -122,10 +123,6 @@ enum 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 @@ -136,8 +133,6 @@ psppire_data_editor_set_property (GObject *object, { PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (object); - int i; - switch (prop_id) { case PROP_SPLIT_WINDOW: @@ -170,9 +165,8 @@ psppire_data_editor_set_property (GObject *object, 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; @@ -306,19 +300,6 @@ psppire_data_editor_class_init (PsppireDataEditorClass *klass) 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, @@ -344,27 +325,10 @@ on_datum_entry_activate (PsppireValueEntry *entry, PsppireDataEditor *de) { } -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; - } @@ -373,7 +337,6 @@ static void set_font_recursively (GtkWidget *w, gpointer data); static void psppire_data_editor_init (PsppireDataEditor *de) { - GtkWidget *var_sheet_scroller; GtkWidget *hbox; gchar *fontname = NULL; @@ -396,10 +359,9 @@ psppire_data_editor_init (PsppireDataEditor *de) 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); @@ -409,19 +371,21 @@ psppire_data_editor_init (PsppireDataEditor *de) 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); @@ -455,7 +419,6 @@ void psppire_data_editor_show_grid (PsppireDataEditor *de, gboolean grid_visible) { GtkTreeViewGridLines grid; - int i; grid = (grid_visible ? GTK_TREE_VIEW_GRID_LINES_BOTH @@ -499,14 +462,9 @@ psppire_data_editor_set_font (PsppireDataEditor *de, PangoFontDescription *font_ 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); @@ -526,15 +484,6 @@ psppire_data_editor_split_window (PsppireDataEditor *de, gboolean split) 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; - } } @@ -564,8 +513,6 @@ psppire_data_editor_update_ui_manager (PsppireDataEditor *de) break; case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW: - ui_manager = psppire_var_sheet_get_ui_manager ( - PSPPIRE_VAR_SHEET (de->var_sheet)); break; default: diff --git a/src/ui/gui/psppire-dict.c b/src/ui/gui/psppire-dict.c index cedb742583..9d7afcc5a7 100644 --- a/src/ui/gui/psppire-dict.c +++ b/src/ui/gui/psppire-dict.c @@ -781,6 +781,7 @@ tree_model_get_path (GtkTreeModel *model, GtkTreeIter *iter) return path; } +const struct fmt_spec *var_get_write_format (const struct variable *); static void tree_model_get_value (GtkTreeModel *model, GtkTreeIter *iter, @@ -791,22 +792,51 @@ 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; } } diff --git a/src/ui/gui/psppire-dict.h b/src/ui/gui/psppire-dict.h index ecd5de063f..4d78807cba 100644 --- a/src/ui/gui/psppire-dict.h +++ b/src/ui/gui/psppire-dict.h @@ -42,7 +42,19 @@ G_BEGIN_DECLS 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 { diff --git a/src/ui/gui/psppire-import-assistant.c b/src/ui/gui/psppire-import-assistant.c index 1b6cf570af..d3131a3a2c 100644 --- a/src/ui/gui/psppire-import-assistant.c +++ b/src/ui/gui/psppire-import-assistant.c @@ -1951,200 +1951,6 @@ on_variable_change (PsppireDict *dict, int dict_idx, 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 diff --git a/src/ui/gui/psppire-var-sheet-header.c b/src/ui/gui/psppire-var-sheet-header.c new file mode 100644 index 0000000000..5032c38979 --- /dev/null +++ b/src/ui/gui/psppire-var-sheet-header.c @@ -0,0 +1,114 @@ +/* + 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 . +*/ + +#include +#include + +#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) +{ +} + diff --git a/src/ui/gui/psppire-var-sheet-header.h b/src/ui/gui/psppire-var-sheet-header.h new file mode 100644 index 0000000000..476faaf0c8 --- /dev/null +++ b/src/ui/gui/psppire-var-sheet-header.h @@ -0,0 +1,40 @@ +/* + 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 . +*/ + +#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 diff --git a/src/ui/gui/psppire-var-sheet.c b/src/ui/gui/psppire-var-sheet.c index 66a95deeed..b75d9017a3 100644 --- a/src/ui/gui/psppire-var-sheet.c +++ b/src/ui/gui/psppire-var-sheet.c @@ -16,6 +16,8 @@ #include +#error "Do not do this" + #include "ui/gui/psppire-var-sheet.h" #include "data/format.h" -- 2.30.2