X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fui%2Fgui%2Ftext-data-import-dialog.c;h=4f9e5d6bbc702edcc2bde73a3b6c410ffa436abc;hb=e279280f1e3450fcc01ea81fc2381cf0bc310efe;hp=8eb4f3c7972d714f42e96d6991c91aa378277be7;hpb=0c5217288cb57d0994d4c99997f5341e2c3a6871;p=pspp diff --git a/src/ui/gui/text-data-import-dialog.c b/src/ui/gui/text-data-import-dialog.c index 8eb4f3c797..4f9e5d6bbc 100644 --- a/src/ui/gui/text-data-import-dialog.c +++ b/src/ui/gui/text-data-import-dialog.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2008, 2009, 2010 Free Software Foundation + Copyright (C) 2008, 2009, 2010, 2011, 2012 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 @@ -32,17 +32,18 @@ #include "language/data-io/data-parser.h" #include "language/lexer/lexer.h" #include "libpspp/assertion.h" +#include "libpspp/i18n.h" #include "libpspp/message.h" #include "ui/gui/checkbox-treeview.h" -#include "ui/gui/descriptives-dialog.h" #include "ui/gui/dialog-common.h" #include "ui/gui/executor.h" #include "ui/gui/helper.h" +#include "ui/gui/builder-wrapper.h" #include "ui/gui/psppire-data-window.h" #include "ui/gui/psppire-dialog.h" #include "ui/gui/psppire-var-sheet.h" #include "ui/gui/psppire-var-store.h" -#include "ui/gui/widget-io.h" +#include "ui/gui/psppire-scanf.h" #include "ui/syntax-gen.h" #include "gl/error.h" @@ -225,14 +226,15 @@ static GtkTreeViewColumn *make_data_column (struct import_assistant *, gint column_idx); static GtkTreeView *create_data_tree_view (bool input, GtkContainer *parent, struct import_assistant *); -static void escape_underscores (const char *in, char *out); +static char *escape_underscores (const char *in); static void push_watch_cursor (struct import_assistant *); static void pop_watch_cursor (struct import_assistant *); /* Pops up the Text Data Import assistant. */ void -text_data_import_assistant (GtkWindow *parent_window) +text_data_import_assistant (PsppireDataWindow *dw) { + GtkWindow *parent_window = GTK_WINDOW (dw); struct import_assistant *ia; ia = xzalloc (sizeof *ia); @@ -257,7 +259,7 @@ text_data_import_assistant (GtkWindow *parent_window) switch (ia->asst.response) { case GTK_RESPONSE_APPLY: - free (execute_syntax_string (generate_syntax (ia))); + free (execute_syntax_string (dw, generate_syntax (ia))); break; case PSPPIRE_RESPONSE_PASTE: free (paste_syntax_to_window (generate_syntax (ia))); @@ -329,7 +331,7 @@ apply_dict (const struct dictionary *dict, struct string *s) ds_put_cstr (s, "\n "); syntax_gen_value (s, &vl->value, width, format); ds_put_byte (s, ' '); - syntax_gen_string (s, ss_cstr (val_lab_get_label (vl))); + syntax_gen_string (s, ss_cstr (val_lab_get_escaped_label (vl))); } free (labels); ds_put_cstr (s, ".\n"); @@ -475,8 +477,8 @@ init_file (struct import_assistant *ia, GtkWindow *parent_window) destroy_file (ia); return false; } - ds_chomp (line, '\n'); - ds_chomp (line, '\r'); + ds_chomp_byte (line, '\n'); + ds_chomp_byte (line, '\r'); } if (file->line_cnt == 0) @@ -523,16 +525,17 @@ destroy_file (struct import_assistant *ia) static char * choose_file (GtkWindow *parent_window) { - GtkWidget *dialog; char *file_name; - dialog = gtk_file_chooser_dialog_new (_("Import Delimited Text Data"), + GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Import Delimited Text Data"), parent_window, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); + g_object_set (dialog, "local-only", FALSE, NULL); + switch (gtk_dialog_run (GTK_DIALOG (dialog))) { case GTK_RESPONSE_ACCEPT: @@ -579,7 +582,7 @@ init_assistant (struct import_assistant *ia, GtkWindow *parent_window) gtk_window_set_title (GTK_WINDOW (a->assistant), _("Importing Delimited Text Data")); gtk_window_set_transient_for (GTK_WINDOW (a->assistant), parent_window); - gtk_window_set_icon_name (GTK_WINDOW (a->assistant), "psppicon"); + gtk_window_set_icon_name (GTK_WINDOW (a->assistant), "pspp"); a->prop_renderer = gtk_cell_renderer_text_new (); g_object_ref_sink (a->prop_renderer); @@ -726,7 +729,7 @@ init_intro_page (struct import_assistant *ia) p->n_cases_spin = gtk_spin_button_new_with_range (0, INT_MAX, 100); - hbox_n_cases = widget_scanf (_("Only the first %4d cases"), &p->n_cases_spin); + hbox_n_cases = psppire_scanf_new (_("Only the first %4d cases"), &p->n_cases_spin); table = get_widget_assert (builder, "button-table"); @@ -736,7 +739,7 @@ init_intro_page (struct import_assistant *ia) p->percent_spin = gtk_spin_button_new_with_range (0, 100, 10); - hbox_percent = widget_scanf (_("Only the first %3d %% of file (approximately)"), &p->percent_spin); + hbox_percent = psppire_scanf_new (_("Only the first %3d %% of file (approximately)"), &p->percent_spin); gtk_table_attach_defaults (GTK_TABLE (table), hbox_percent, 1, 2, @@ -871,7 +874,7 @@ create_lines_tree_view (GtkContainer *parent, struct import_assistant *ia) size_t max_line_length; gint content_width, header_width; size_t i; - gchar *title = _("Text"); + const gchar *title = _("Text"); make_tree_view (ia, 0, &tree_view); @@ -1251,19 +1254,17 @@ choose_column_names (struct import_assistant *ia) struct column *col; size_t name_row; - dict = dict_create (); + dict = dict_create (get_default_encoding ()); name_row = f->variable_names && f->skip_lines ? f->skip_lines : 0; for (col = s->columns; col < &s->columns[s->column_cnt]; col++) { - char name[VAR_NAME_LEN + 1]; - char *hint; + char *hint, *name; hint = name_row ? ss_xstrdup (col->contents[name_row - 1]) : NULL; - if (!dict_make_unique_var_name (dict, hint, &generated_name_count, name)) - NOT_REACHED (); + name = dict_make_unique_var_name (dict, hint, &generated_name_count); free (hint); - col->name = xstrdup (name); + col->name = name; dict_create_var_assert (dict, name, 0); } dict_destroy (dict); @@ -1596,12 +1597,11 @@ prepare_formats_page (struct import_assistant *ia) push_watch_cursor (ia); - dict = dict_create (); + dict = dict_create (get_default_encoding ()); fg = fmt_guesser_create (); for (column_idx = 0; column_idx < s->column_cnt; column_idx++) { struct variable *modified_var; - char name[VAR_NAME_LEN + 1]; modified_var = (column_idx < p->modified_var_cnt ? p->modified_vars[column_idx] : NULL); @@ -1610,11 +1610,11 @@ prepare_formats_page (struct import_assistant *ia) struct column *column = &s->columns[column_idx]; struct variable *var; struct fmt_spec format; + char *name; size_t row; /* Choose variable name. */ - if (!dict_make_unique_var_name (dict, column->name, &number, name)) - NOT_REACHED (); + name = dict_make_unique_var_name (dict, column->name, &number); /* Choose variable format. */ fmt_guesser_clear (fg); @@ -1626,13 +1626,17 @@ prepare_formats_page (struct import_assistant *ia) /* Create variable. */ var = dict_create_var_assert (dict, name, fmt_var_width (&format)); var_set_both_formats (var, &format); + + free (name); } else { - if (!dict_make_unique_var_name (dict, var_get_name (modified_var), - &number, name)) - NOT_REACHED (); + char *name; + + name = dict_make_unique_var_name (dict, var_get_name (modified_var), + &number); dict_clone_var_as_assert (dict, modified_var, name); + free (name); } } fmt_guesser_destroy (fg); @@ -1767,8 +1771,7 @@ parse_field (struct import_assistant *ia, { char *error; - error = data_in (field, LEGACY_NATIVE, in->type, &val, - var_get_width (var), + error = data_in (field, C_ENCODING, in->type, &val, var_get_width (var), dict_get_encoding (ia->formats.dict)); if (error != NULL) { @@ -1880,7 +1883,7 @@ get_tooltip_location (GtkWidget *widget, gint wx, gint wy, to make the data related to the tool tips part of a GObject that only gets destroyed when all references are released, but this solution appears to be effective too. */ - if (!GTK_WIDGET_MAPPED (widget)) + if (!gtk_widget_get_mapped (widget)) return FALSE; gtk_tree_view_convert_widget_to_bin_window_coords (tree_view, @@ -1967,17 +1970,17 @@ make_data_column (struct import_assistant *ia, GtkTreeView *tree_view, { struct variable *var = NULL; struct column *column = NULL; - char name[(VAR_NAME_LEN * 2) + 1]; size_t char_cnt; gint content_width, header_width; GtkTreeViewColumn *tree_column; + char *name; if (input) column = &ia->separators.columns[dict_idx]; else var = dict_get_var (ia->formats.dict, dict_idx); - escape_underscores (input ? column->name : var_get_name (var), name); + 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->asst.fixed_renderer, char_cnt); @@ -1997,6 +2000,8 @@ make_data_column (struct import_assistant *ia, GtkTreeView *tree_view, gtk_tree_view_column_set_fixed_width (tree_column, MAX (content_width, header_width)); + free (name); + return tree_column; } @@ -2027,16 +2032,22 @@ create_data_tree_view (bool input, GtkContainer *parent, return tree_view; } -static void -escape_underscores (const char *in, char *out) +static char * +escape_underscores (const char *in) { + char *out = xmalloc (2 * strlen (in) + 1); + char *p; + + p = out; for (; *in != '\0'; in++) { if (*in == '_') - *out++ = '_'; - *out++ = *in; + *p++ = '_'; + *p++ = *in; } - *out = '\0'; + *p = '\0'; + + return out; } /* TextImportModel, a GtkTreeModel implementation used by some