Move column count from seperators into assist
[pspp] / src / ui / gui / text-data-import-dialog.h
1 /* PSPPIRE - a graphical user interface for PSPP.
2    Copyright (C) 2008, 2010, 2011, 2013  Free Software Foundation
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #ifndef TEXT_DATA_IMPORT_DIALOG_H
18 #define TEXT_DATA_IMPORT_DIALOG_H
19
20 #include <glib-object.h>
21 #include "ui/gui/psppire-data-window.h"
22 #include "data/spreadsheet-reader.h"
23
24 #include "libpspp/str.h"
25
26 enum { MAX_PREVIEW_LINES = 1000 }; /* Max number of lines to read. */
27
28 /* The file to be imported. */
29 struct file
30   {
31     char *file_name;        /* File name. */
32
33     /* Relevant only for text files */
34
35     gchar *encoding;        /* Encoding. */
36     unsigned long int total_lines; /* Number of lines in file. */
37     bool total_is_exact;    /* Is total_lines exact (or an estimate)? */
38
39     /* The first several lines of the file. */
40     struct string *lines;
41     size_t line_cnt;
42   };
43
44 /* The main body of the GTK+ assistant and related data. */
45 struct assistant
46   {
47     GtkBuilder *builder;
48     GtkAssistant *assistant;
49     GMainLoop *main_loop;
50     GtkWidget *paste_button;
51     GtkWidget *reset_button;
52     int response;
53     int watch_cursor;
54
55     GtkCellRenderer *prop_renderer;
56     GtkCellRenderer *fixed_renderer;
57
58   };
59
60
61
62 /* Page where the user chooses the first line of data. */
63 struct first_line_page
64   {
65     int skip_lines;    /* Number of initial lines to skip? */
66     bool variable_names; /* Variable names above first line of data? */
67
68     GtkWidget *page;
69     GtkTreeView *tree_view;
70     GtkWidget *variable_names_cb;
71   };
72
73
74 /* Page where the user chooses field separators. */
75 struct separators_page
76   {
77     /* How to break lines into columns. */
78     struct string separators;   /* Field separators. */
79     struct string quotes;       /* Quote characters. */
80     bool escape;                /* Doubled quotes yield a quote mark? */
81
82     GtkWidget *page;
83     GtkWidget *custom_cb;
84     GtkWidget *custom_entry;
85     GtkWidget *quote_cb;
86     GtkWidget *quote_combo;
87     GtkEntry *quote_entry;
88     GtkWidget *escape_cb;
89     GtkTreeView *fields_tree_view;
90   };
91
92 /* Page where the user verifies and adjusts input formats. */
93 struct formats_page
94   {
95     struct dictionary *dict;
96
97     GtkWidget *page;
98     GtkTreeView *data_tree_view;
99     PsppireDict *psppire_dict;
100     struct variable **modified_vars;
101     size_t modified_var_cnt;
102   };
103
104
105 struct import_assistant
106   {
107     struct file file;
108     struct assistant asst;
109
110     struct intro_page *intro;
111     struct sheet_spec_page *sheet_spec;
112     struct first_line_page *first_line;
113     struct separators_page *separators;
114     struct formats_page *formats;
115
116     /* The columns produced. */
117     struct column *columns;     /* Information about each column. */
118     size_t column_cnt;          /* Number of columns. */
119   };
120
121
122
123
124 struct column
125   {
126     /* Variable name for this column.  This is the variable name
127        used on the separators page; it can be overridden by the
128        user on the formats page. */
129     char *name;
130
131     /* Maximum length of any row in this column. */
132     size_t width;
133
134     /* Contents of this column: contents[row] is the contents for
135        the given row.
136
137        A null substring indicates a missing column for that row
138        (because the line contains an insufficient number of
139        separators).
140
141        contents[] elements may be substrings of the lines[]
142        strings that represent the whole lines of the file, to
143        save memory.  Other elements are dynamically allocated
144        with ss_alloc_substring. */
145     struct substring *contents;
146   };
147
148
149 GtkWidget * add_page_to_assistant (struct import_assistant *ia,
150                                    GtkWidget *page, GtkAssistantPageType type);
151
152 void text_data_import_assistant (PsppireDataWindow *);
153
154 /* FIXME: Should this be private to first line page ? */
155 void make_tree_view (const struct import_assistant *ia,
156                             size_t first_line,
157                             GtkTreeView **tree_view);
158
159 gint get_monospace_width (GtkTreeView *, GtkCellRenderer *,
160                                  size_t char_cnt);
161 gint get_string_width (GtkTreeView *, GtkCellRenderer *,
162                               const char *string);
163
164
165
166 void push_watch_cursor (struct import_assistant *);
167 void pop_watch_cursor (struct import_assistant *);
168
169
170 GtkTreeView *create_data_tree_view (bool input, GtkContainer *parent,
171                                            struct import_assistant *);
172
173 GtkTreeViewColumn *make_data_column (struct import_assistant *,
174                                             GtkTreeView *, bool input,
175                                             gint column_idx);
176
177
178 void  update_assistant (struct import_assistant *ia);
179
180 bool init_file (struct import_assistant *ia, GtkWindow *parent_window);
181 void destroy_file (struct import_assistant *ia);
182
183
184 void init_sheet_spec_page (struct import_assistant *);
185 void prepare_sheet_spec_page (struct import_assistant *ia);
186 void reset_sheet_spec_page (struct import_assistant *);
187 void post_sheet_spec_page (struct import_assistant *ia);
188
189 void init_first_line_page (struct import_assistant *ia);
190 void prepare_first_line_page (struct import_assistant *ia);
191 void reset_first_line_page (struct import_assistant *);
192
193 void init_separators_page (struct import_assistant *ia);
194 void prepare_separators_page (struct import_assistant *ia);
195 void reset_separators_page (struct import_assistant *);
196 void destroy_separators_page (struct import_assistant *ia);
197
198 void init_formats_page (struct import_assistant *ia);
199 void prepare_formats_page (struct import_assistant *ia);
200 void reset_formats_page (struct import_assistant *);
201 void destroy_formats_page (struct import_assistant *ia);
202
203 struct import_assistant * init_assistant (GtkWindow *);
204 void destroy_assistant (struct import_assistant *);
205
206
207 #endif