/* PSPPIRE - a graphical user interface for PSPP.
- Copyright (C) 2015 Free Software Foundation
+ Copyright (C) 2015, 2016 Free Software Foundation
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
// clear_fields (ia);
destroy_columns (ia);
-
+
ds_destroy (&ia->separators);
ds_destroy (&ia->quotes);
gint pn = gtk_assistant_get_current_page (GTK_ASSISTANT (ia));
{
GtkWidget *page = gtk_assistant_get_nth_page (GTK_ASSISTANT (ia), pn);
-
+
page_func *on_reset = g_object_get_data (G_OBJECT (page), "on-reset");
if (on_reset)
if (on_entering)
on_entering (ia, new_page);
}
-
-#if GTK3_TRANSITION
- if (gtk_assistant_get_page_type (assistant, page)
- == GTK_ASSISTANT_PAGE_CONFIRM)
- gtk_widget_grab_focus (assistant->apply);
- else
- gtk_widget_grab_focus (assistant->forward);
-#endif
-
ia->current_page = pn;
}
ia->file_name);
return FALSE;
}
-
+
ds_init_empty (&input);
for (ia->line_cnt = 0; ia->line_cnt < MAX_PREVIEW_LINES; ia->line_cnt++)
{
destroy_file (ia);
return FALSE;
}
-
+
/* Estimate the number of lines in the file. */
if (ia->line_cnt < MAX_PREVIEW_LINES)
{
static void
-set_model_on_treeview (const PsppireImportAssistant *ia, GtkWidget *tree_view, size_t first_line)
+set_model_on_treeview (PsppireImportAssistant *ia, GtkWidget *tree_view, size_t first_line)
{
GtkTreeModel *model = GTK_TREE_MODEL (psppire_empty_list_store_new (ia->line_cnt - first_line));
g_object_set_data (G_OBJECT (model), "lines", &ia->lines + first_line);
g_object_set_data (G_OBJECT (model), "first-line", GINT_TO_POINTER (first_line));
-
+
pspp_sheet_view_set_model (PSPP_SHEET_VIEW (tree_view), model);
-
+
g_object_unref (model);
}
GtkWidget *page, GtkAssistantPageType type, const gchar *);
-static void
+static void
on_sheet_combo_changed (GtkComboBox *cb, PsppireImportAssistant *ia)
{
GtkTreeIter iter;
GtkWidget *sheet_entry = get_widget_assert (builder, "sheet-entry");
GtkWidget *readnames_checkbox = get_widget_assert (builder, "readnames-checkbox");
- gtk_combo_box_set_model (GTK_COMBO_BOX (sheet_entry),
+ gtk_combo_box_set_model (GTK_COMBO_BOX (sheet_entry),
psppire_spreadsheet_model_new (ia->spreadsheet));
gtk_combo_box_set_active (GTK_COMBO_BOX (sheet_entry), 0);
{
GtkBuilder *builder = ia->builder;
GtkWidget *page = get_widget_assert (builder, "Spreadsheet-Importer");
-
+
GtkWidget *combo_box = get_widget_assert (builder, "sheet-entry");
GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
gtk_cell_layout_clear (GTK_CELL_LAYOUT (combo_box));
}
-static void
+static void
on_chosen (PsppireImportAssistant *ia, GtkWidget *page)
{
GtkFileChooser *fc = GTK_FILE_CHOOSER (page);
if (f && !g_file_test (f, G_FILE_TEST_IS_DIR))
{
gtk_assistant_set_page_complete (GTK_ASSISTANT(ia), GTK_WIDGET (fc), TRUE);
-
+
if (ia->spreadsheet)
spreadsheet_unref (ia->spreadsheet);
-
+
ia->spreadsheet = gnumeric_probe (f, FALSE);
if (!ia->spreadsheet)
{
sheet_spec_page_create (ia);
}
-
+
formats_page_create (ia);
}
- g_free (f);
+ g_free (f);
}
/* This has to be done on a map signal callback,
because GtkFileChooserWidget resets everything when it is mapped. */
-static void
+static void
on_map (PsppireImportAssistant *ia, GtkWidget *page)
{
GtkFileChooser *fc = GTK_FILE_CHOOSER (page);
gtk_file_filter_set_name (ia->default_filter, _("All Files"));
gtk_file_filter_add_pattern (ia->default_filter, "*");
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), ia->default_filter);
-
+
filter = gtk_file_filter_new ();
gtk_file_filter_set_name (filter, _("Text Files"));
gtk_file_filter_add_mime_type (filter, "text/*");
{
ia->builder = builder_new ("text-data-import.ui");
- ia->current_page = -1 ;
+ ia->current_page = -1 ;
ia->column_cnt = 0;
ia->columns = NULL;
ia->encoding = NULL;
ia->spreadsheet = NULL;
ia->watch_cursor = 0;
-
+
ia->prop_renderer = gtk_cell_renderer_text_new ();
g_object_ref_sink (ia->prop_renderer);
ia->fixed_renderer = gtk_cell_renderer_text_new ();
g_signal_connect (ia, "prepare", G_CALLBACK (on_prepare), ia);
g_signal_connect (ia, "cancel", G_CALLBACK (on_cancel), ia);
g_signal_connect (ia, "close", G_CALLBACK (on_close), ia);
-
+
ia->paste_button = gtk_button_new_with_label (_("Paste"));
ia->reset_button = gtk_button_new_with_label (_("Reset"));
-
+
gtk_assistant_add_action_widget (GTK_ASSISTANT(ia), ia->paste_button);
g_signal_connect (ia->paste_button, "clicked", G_CALLBACK (on_paste), ia);
gtk_window_set_title (GTK_WINDOW (ia),
_("Importing Delimited Text Data"));
-
+
gtk_window_set_icon_name (GTK_WINDOW (ia), "pspp");
chooser_page_create (ia);
gtk_assistant_set_forward_page_func (GTK_ASSISTANT (ia), next_page_func, NULL, NULL);
+
+ gtk_window_maximize (GTK_WINDOW (ia));
}
{
gint row = empty_list_store_iter_to_row (iter);
struct string *lines;
-
+
lines = g_object_get_data (G_OBJECT (tree_model), "lines");
g_return_if_fail (lines != NULL);
{
GtkTreePath *path = gtk_tree_path_new_from_indices (ia->skip_lines, -1);
-
+
set_model_on_treeview (ia, ia->tree_view, 0);
pspp_sheet_view_set_cursor (PSPP_SHEET_VIEW (ia->tree_view),
PsppSheetViewColumn *column =
pspp_sheet_view_column_new_with_attributes (title,
ia->fixed_renderer, (void *) NULL);
-
+
pspp_sheet_view_column_set_cell_data_func (column, ia->fixed_renderer,
render_line, NULL, NULL);
pspp_sheet_view_column_set_resizable (column, TRUE);
GtkWidget *oldtv = gtk_bin_get_child (GTK_BIN (parent));
if (oldtv)
gtk_container_remove (parent, oldtv);
-
+
gtk_container_add (parent, tree_view);
gtk_widget_show (tree_view);
GtkWidget *w = get_widget_assert (ia->builder, "FirstLine");
g_object_set_data (G_OBJECT (w), "on-entering", set_first_line);
-
+
add_page_to_assistant (ia, w,
GTK_ASSISTANT_PAGE_CONTENT, _("Select the First Line"));
if (ia->line_cnt > MAX_PREVIEW_LINES)
ia->line_cnt = MAX_PREVIEW_LINES;
-
+
ds_init_empty (&s);
ds_put_cstr (&s, _("This assistant will guide you through the process of "
"importing data into PSPP from a text file with one line "
if (w)
gtk_container_remove (GTK_CONTAINER (table), w);
-
+
GtkWidget *hbox_n_cases = psppire_scanf_new (_("Only the first %4d cases"), &ia->n_cases_spin);
GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (ia->n_cases_spin));
free (col->name);
free (col->contents);
}
-
+
free (ia->columns);
}
GtkListStore *list = gtk_list_store_new (1, G_TYPE_STRING);
GtkTreeIter iter;
gint i;
- const gchar *seperator[3] = {"'\"", "\'", "\""};
+ const gchar *separator[3] = {"'\"", "\'", "\""};
for (i = 0; i < 3; i++)
{
- const gchar *s = seperator[i];
+ const gchar *s = separator[i];
/* Add a new row to the model */
gtk_list_store_append (list, &iter);
{
struct variable *var = NULL;
struct column *column = NULL;
- size_t char_cnt;
+ size_t char_cnt = 0;
gint content_width, header_width;
PsppSheetViewColumn *tree_column;
- char *name;
+ char *name = NULL;
if (input)
- column = &ia->columns[dict_idx];
+ {
+ column = &ia->columns[dict_idx];
+ name = escape_underscores (column->name);
+ char_cnt = column->width;
+ }
else
- var = dict_get_var (ia->dict, dict_idx);
+ {
+ var = dict_get_var (ia->dict, dict_idx);
+ name = escape_underscores (var_get_name (var));
+ char_cnt = var_get_print_format (var)->w;
+ }
- name = escape_underscores (input ? column->name : var_get_name (var));
- char_cnt = input ? column->width : var_get_print_format (var)->w;
content_width = get_monospace_width (tree_view, ia->fixed_renderer,
char_cnt);
header_width = get_string_width (tree_view, ia->prop_renderer,
GtkWidget *tree_view = make_tree_view (ia);
set_model_on_treeview (ia, tree_view, ia->skip_lines);
-
+
pspp_sheet_selection_set_mode (pspp_sheet_view_get_selection (PSPP_SHEET_VIEW (tree_view)),
PSPP_SHEET_SELECTION_NONE);
g_object_set_data (G_OBJECT (w), "on-entering", prepare_separators_page);
g_object_set_data (G_OBJECT (w), "on-reset", prepare_separators_page);
-
+
add_page_to_assistant (ia, w, GTK_ASSISTANT_PAGE_CONTENT, _("Choose Separators"));
ia->quote_cb = get_widget_assert (builder, "quote-cb");
set_quote_list (GTK_COMBO_BOX (ia->quote_combo));
- ia->fields_tree_view = NULL;
+ ia->fields_tree_view = NULL;
g_signal_connect (ia->quote_combo, "changed",
G_CALLBACK (on_quote_combo_change), ia);
GtkBin *vars_scroller;
GtkWidget *old_var_sheet;
-
+
push_watch_cursor (ia);
if (ia->spreadsheet == NULL)
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 =
+ struct variable *modified_var =
(column_idx < ia->modified_var_cnt ? ia->modified_vars[column_idx] : NULL);
if (modified_var == NULL)
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;
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 = ia->spreadsheet->dict;
+ ia->dict = dict_clone (ia->spreadsheet->dict);
}
break;
default:
{
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),
+
+ 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);
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
GtkWidget *w = get_widget_assert (builder, "Formats");
g_object_set_data (G_OBJECT (w), "on-entering", prepare_formats_page);
g_object_set_data (G_OBJECT (w), "on-reset", reset_formats_page);
-
+
add_page_to_assistant (ia, w,
GTK_ASSISTANT_PAGE_CONFIRM, _("Adjust Variable Formats"));
\f
-static void
+static void
separators_append_syntax (const PsppireImportAssistant *ia, struct string *s)
{
int i;
int var_cnt;
g_return_if_fail (ia->dict);
-
+
ds_put_cstr (s, " /VARIABLES=\n");
-
+
var_cnt = dict_get_var_cnt (ia->dict);
for (i = 0; i < var_cnt; i++)
{
intro_append_syntax (const PsppireImportAssistant *ia, struct string *s)
{
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ia->n_cases_button)))
- ds_put_format (s, " /IMPORTCASE=FIRST %d\n",
+ ds_put_format (s, "N OF CASES %d.\n",
gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (ia->n_cases_spin)));
else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ia->percent_button)))
- ds_put_format (s, " /IMPORTCASE=PERCENT %d\n",
- gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (ia->percent_spin)));
- else
- ds_put_cstr (s, " /IMPORTCASE=ALL\n");
+ ds_put_format (s, "SAMPLE %.4g.\n",
+ gtk_spin_button_get_value (GTK_SPIN_BUTTON (ia->percent_spin)) / 100.0);
}
"\n /SHEET=index %d"
"\n /READNAMES=%ss",
(ia->spreadsheet->type == SPREADSHEET_GNUMERIC) ? "GNM" : "ODS",
- ia->file_name,
+ ia->file_name,
sheet_index,
read_names ? "ON" : "OFF");
syntax_gen_pspp (&s, ".");
-
+
return ds_cstr (&s);
}
if (ia->encoding && strcmp (ia->encoding, "Auto"))
syntax_gen_pspp (&s, " /ENCODING=%sq\n", ia->encoding);
- intro_append_syntax (ia, &s);
-
-
ds_put_cstr (&s,
" /ARRANGEMENT=DELIMITED\n"
" /DELCASE=LINE\n");
formats_append_syntax (ia, &s);
apply_dict (ia->dict, &s);
+ intro_append_syntax (ia, &s);
}
else
{
return sheet_spec_gen_syntax (ia);
}
-
+
return ds_cstr (&s);
}