1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2004, 2005, 2006, 2009 Free Software Foundation
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.
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.
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/>. */
19 #include <libpspp/i18n.h>
22 #include <gsl/gsl_errno.h>
26 #include <ui/command-line.h>
27 #include "relocatable.h"
29 #include "psppire-data-window.h"
33 #include <libpspp/getl.h>
35 #include <data/casereader.h>
36 #include <data/datasheet.h>
37 #include <data/file-handle-def.h>
38 #include <data/settings.h>
39 #include <data/file-name.h>
40 #include <data/procedure.h>
41 #include <libpspp/getl.h>
42 #include <language/lexer/lexer.h>
43 #include <libpspp/version.h>
44 #include <output/output.h>
45 #include <output/journal.h>
46 #include <language/syntax-string-source.h>
49 #include "psppire-dict.h"
50 #include "dict-display.h"
51 #include "psppire-selector.h"
52 #include "psppire-var-view.h"
53 #include "psppire-var-store.h"
54 #include "psppire-data-store.h"
56 #include "message-dialog.h"
57 #include <ui/syntax-gen.h>
59 #include "psppire-window-register.h"
60 #include "psppire-output-window.h"
62 #include <data/sys-file-reader.h>
63 #include <data/por-file-reader.h>
65 #include <ui/source-init-opts.h>
67 GtkRecentManager *the_recent_mgr = 0;
68 PsppireDataStore *the_data_store = 0;
69 PsppireVarStore *the_var_store = 0;
71 static void create_icon_factory (void);
73 struct source_stream *the_source_stream ;
74 struct dataset * the_dataset = NULL;
76 static GtkWidget *the_data_window;
79 replace_casereader (struct casereader *s)
81 psppire_data_store_set_reader (the_data_store, s);
84 #define _(msgid) gettext (msgid)
85 #define N_(msgid) msgid
91 initialize (struct command_line_processor *clp, int argc, char **argv)
93 PsppireDict *dictionary = 0;
97 preregister_widgets ();
99 gsl_set_error_handler_off ();
102 settings_init (&viewer_width, &viewer_length);
105 create_source_stream (
106 fn_getenv_default ("STAT_INCLUDE_PATH", include_path)
109 the_dataset = create_dataset ();
112 message_dialog_init (the_source_stream);
114 dictionary = psppire_dict_new_from_dict (dataset_dict (the_dataset));
116 bind_textdomain_codeset (PACKAGE, "UTF-8");
118 /* Create the model for the var_sheet */
119 the_var_store = psppire_var_store_new (dictionary);
121 the_data_store = psppire_data_store_new (dictionary);
122 replace_casereader (NULL);
124 create_icon_factory ();
127 const char *filename = output_file_name ();
129 struct string config_string;
131 ds_init_empty (&config_string);
133 ds_put_format (&config_string,
134 "gui:ascii:screen:squeeze=on headers=off top-margin=0 "
135 "bottom-margin=0 paginate=off length=auto width=auto "
137 "output-file=\"%s\" append=yes", filename);
139 outp_configure_driver_line (ds_ss (&config_string));
143 ds_destroy (&config_string);
147 textdomain (PACKAGE);
150 the_recent_mgr = gtk_recent_manager_get_default ();
152 psppire_selector_set_default_selection_func (GTK_TYPE_ENTRY, insert_source_row_into_entry);
153 psppire_selector_set_default_selection_func (PSPPIRE_VAR_VIEW_TYPE, insert_source_row_into_tree_view);
154 psppire_selector_set_default_selection_func (GTK_TYPE_TREE_VIEW, insert_source_row_into_tree_view);
156 the_data_window = psppire_data_window_new ();
158 command_line_processor_replace_aux (clp, &post_init_argp, the_source_stream);
159 command_line_processor_replace_aux (clp, &non_option_argp, the_source_stream);
161 command_line_processor_parse (clp, argc, argv);
163 execute_syntax (create_syntax_string_source (""));
165 gtk_widget_show (the_data_window);
172 destroy_source_stream (the_source_stream);
173 message_dialog_done ();
181 func (gpointer key, gpointer value, gpointer data)
184 PsppireWindow *window = PSPPIRE_WINDOW (value);
186 g_signal_emit_by_name (window, "delete-event", 0, &rv);
192 PsppireWindowRegister *reg = psppire_window_register_new ();
193 psppire_window_register_foreach (reg, func, NULL);
201 const char *file_name;
206 static const struct icon_info icons[] =
208 {PKGDATADIR "/value-labels.png", "pspp-value-labels"},
209 {PKGDATADIR "/weight-cases.png", "pspp-weight-cases"},
210 {PKGDATADIR "/goto-variable.png", "pspp-goto-variable"},
211 {PKGDATADIR "/insert-variable.png", "pspp-insert-variable"},
212 {PKGDATADIR "/insert-case.png", "pspp-insert-case"},
213 {PKGDATADIR "/split-file.png", "pspp-split-file"},
214 {PKGDATADIR "/select-cases.png", "pspp-select-cases"},
215 {PKGDATADIR "/recent-dialogs.png", "pspp-recent-dialogs"},
216 {PKGDATADIR "/nominal.png", "var-nominal"},
217 {PKGDATADIR "/ordinal.png", "var-ordinal"},
218 {PKGDATADIR "/scale.png", "var-scale"},
219 {PKGDATADIR "/string.png", "var-string"},
220 {PKGDATADIR "/date-scale.png", "var-date-scale"}
224 create_icon_factory (void)
227 GtkIconFactory *factory = gtk_icon_factory_new ();
229 for (i = 0 ; i < sizeof (icons) / sizeof(icons[0]); ++i)
233 gdk_pixbuf_new_from_file (relocate (icons[i].file_name), &err);
237 GtkIconSet *icon_set = gtk_icon_set_new_from_pixbuf (pixbuf);
238 g_object_unref (pixbuf);
239 gtk_icon_factory_add ( factory, icons[i].id, icon_set);
243 g_warning ("Cannot create icon: %s", err->message);
244 g_clear_error (&err);
249 /* Create our own "pspp-stock-reset" item, using the
250 GTK_STOCK_REFRESH icon set */
252 GtkStockItem items[] = {
253 {"pspp-stock-reset", N_("_Reset"), 0, 0, PACKAGE},
254 {"pspp-stock-select", N_("_Select"), 0, 0, PACKAGE}
258 gtk_stock_add (items, 2);
259 gtk_icon_factory_add (factory, "pspp-stock-reset",
260 gtk_icon_factory_lookup_default (GTK_STOCK_REFRESH)
263 gtk_icon_factory_add (factory, "pspp-stock-select",
264 gtk_icon_factory_lookup_default (GTK_STOCK_INDEX)
268 gtk_icon_factory_add_default (factory);
274 parse_non_options (int key, char *arg, struct argp_state *state)
276 struct source_stream *ss = state->input;
285 gchar *filename = NULL;
287 const gchar *local_encoding = NULL;
289 const gboolean local_is_utf8 = g_get_charset (&local_encoding);
291 /* There seems to be no Glib function to convert from local encoding
292 to filename encoding. Therefore it has to be done in two steps:
293 the intermediate encoding is UTF8.
295 Either step could fail. However, in many cases the file can still
296 be loaded even if the conversion fails. So in those cases, after showing
297 a warning, we simply copy the locally encoded filename to the destination
298 and hope for the best.
303 utf8 = xstrdup (arg);
308 utf8 = g_locale_to_utf8 (arg, -1, NULL, &written, &err);
311 g_warning ("Cannot convert filename from local encoding \"%s\" to UTF-8: %s",
314 g_clear_error (&err);
321 filename = g_filename_from_utf8 (utf8, written, NULL, NULL, &err);
322 if ( NULL == filename)
324 g_warning ("Cannot convert filename from UTF8 to filename encoding: %s",
326 g_clear_error (&err);
332 if ( filename == NULL)
333 filename = xstrdup (arg);
335 psppire_window_load (PSPPIRE_WINDOW (the_data_window), filename);
341 return ARGP_ERR_UNKNOWN;
347 const struct argp non_option_argp = {NULL, parse_non_options, 0, 0, 0, 0, 0};
351 output_file_name (void)
353 const char *dir = default_output_path ();
354 static char *filename = NULL;
356 if ( NULL == filename )
357 filename = xasprintf ("%s%s", dir, OUTPUT_FILE_NAME);