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 "psppire-var-store.h"
51 #include "psppire-data-store.h"
53 #include "message-dialog.h"
54 #include <ui/syntax-gen.h>
56 #include "psppire-window-register.h"
57 #include "psppire-output-window.h"
59 #include <data/sys-file-reader.h>
60 #include <data/por-file-reader.h>
62 #include <ui/source-init-opts.h>
64 GtkRecentManager *the_recent_mgr = 0;
65 PsppireDataStore *the_data_store = 0;
66 PsppireVarStore *the_var_store = 0;
68 static void create_icon_factory (void);
70 struct source_stream *the_source_stream ;
71 struct dataset * the_dataset = NULL;
73 static GtkWidget *the_data_window;
76 replace_casereader (struct casereader *s)
78 psppire_data_store_set_reader (the_data_store, s);
81 #define _(msgid) gettext (msgid)
82 #define N_(msgid) msgid
88 initialize (struct command_line_processor *clp, int argc, char **argv)
90 PsppireDict *dictionary = 0;
94 preregister_widgets ();
96 gsl_set_error_handler_off ();
99 settings_init (&viewer_width, &viewer_length);
102 create_source_stream (
103 fn_getenv_default ("STAT_INCLUDE_PATH", include_path)
106 the_dataset = create_dataset ();
109 message_dialog_init (the_source_stream);
111 dictionary = psppire_dict_new_from_dict (dataset_dict (the_dataset));
113 bind_textdomain_codeset (PACKAGE, "UTF-8");
115 /* Create the model for the var_sheet */
116 the_var_store = psppire_var_store_new (dictionary);
118 the_data_store = psppire_data_store_new (dictionary);
119 replace_casereader (NULL);
121 create_icon_factory ();
124 const char *filename = output_file_name ();
126 struct string config_string;
128 ds_init_empty (&config_string);
130 ds_put_format (&config_string,
131 "gui:ascii:screen:squeeze=on headers=off top-margin=0 "
132 "bottom-margin=0 paginate=off length=auto width=auto "
134 "output-file=\"%s\" append=yes", filename);
136 outp_configure_driver_line (ds_ss (&config_string));
140 ds_destroy (&config_string);
144 textdomain (PACKAGE);
147 the_recent_mgr = gtk_recent_manager_get_default ();
149 the_data_window = psppire_data_window_new ();
151 command_line_processor_replace_aux (clp, &post_init_argp, the_source_stream);
152 command_line_processor_replace_aux (clp, &non_option_argp, the_source_stream);
154 command_line_processor_parse (clp, argc, argv);
156 execute_syntax (create_syntax_string_source (""));
158 gtk_widget_show (the_data_window);
165 destroy_source_stream (the_source_stream);
166 message_dialog_done ();
174 func (gpointer key, gpointer value, gpointer data)
177 PsppireWindow *window = PSPPIRE_WINDOW (value);
179 g_signal_emit_by_name (window, "delete-event", 0, &rv);
185 PsppireWindowRegister *reg = psppire_window_register_new ();
186 psppire_window_register_foreach (reg, func, NULL);
194 const char *file_name;
199 static const struct icon_info icons[] =
201 {PKGDATADIR "/value-labels.png", "pspp-value-labels"},
202 {PKGDATADIR "/weight-cases.png", "pspp-weight-cases"},
203 {PKGDATADIR "/goto-variable.png", "pspp-goto-variable"},
204 {PKGDATADIR "/insert-variable.png", "pspp-insert-variable"},
205 {PKGDATADIR "/insert-case.png", "pspp-insert-case"},
206 {PKGDATADIR "/split-file.png", "pspp-split-file"},
207 {PKGDATADIR "/select-cases.png", "pspp-select-cases"},
208 {PKGDATADIR "/recent-dialogs.png", "pspp-recent-dialogs"},
209 {PKGDATADIR "/nominal.png", "var-nominal"},
210 {PKGDATADIR "/ordinal.png", "var-ordinal"},
211 {PKGDATADIR "/scale.png", "var-scale"},
212 {PKGDATADIR "/string.png", "var-string"},
213 {PKGDATADIR "/date-scale.png", "var-date-scale"}
217 create_icon_factory (void)
220 GtkIconFactory *factory = gtk_icon_factory_new ();
222 for (i = 0 ; i < sizeof (icons) / sizeof(icons[0]); ++i)
226 gdk_pixbuf_new_from_file (relocate (icons[i].file_name), &err);
230 GtkIconSet *icon_set = gtk_icon_set_new_from_pixbuf (pixbuf);
231 g_object_unref (pixbuf);
232 gtk_icon_factory_add ( factory, icons[i].id, icon_set);
236 g_warning ("Cannot create icon: %s", err->message);
237 g_clear_error (&err);
242 /* Create our own "pspp-stock-reset" item, using the
243 GTK_STOCK_REFRESH icon set */
245 GtkStockItem items[] = {
246 {"pspp-stock-reset", N_("_Reset"), 0, 0, PACKAGE},
247 {"pspp-stock-select", N_("_Select"), 0, 0, PACKAGE}
251 gtk_stock_add (items, 2);
252 gtk_icon_factory_add (factory, "pspp-stock-reset",
253 gtk_icon_factory_lookup_default (GTK_STOCK_REFRESH)
256 gtk_icon_factory_add (factory, "pspp-stock-select",
257 gtk_icon_factory_lookup_default (GTK_STOCK_INDEX)
261 gtk_icon_factory_add_default (factory);
267 parse_non_options (int key, char *arg, struct argp_state *state)
269 struct source_stream *ss = state->input;
278 gchar *filename = NULL;
280 const gchar *local_encoding = NULL;
282 const gboolean local_is_utf8 = g_get_charset (&local_encoding);
284 /* There seems to be no Glib function to convert from local encoding
285 to filename encoding. Therefore it has to be done in two steps:
286 the intermediate encoding is UTF8.
288 Either step could fail. However, in many cases the file can still
289 be loaded even if the conversion fails. So in those cases, after showing
290 a warning, we simply copy the locally encoded filename to the destination
291 and hope for the best.
296 utf8 = xstrdup (arg);
301 utf8 = g_locale_to_utf8 (arg, -1, NULL, &written, &err);
304 g_warning ("Cannot convert filename from local encoding \"%s\" to UTF-8: %s",
307 g_clear_error (&err);
314 filename = g_filename_from_utf8 (utf8, written, NULL, NULL, &err);
315 if ( NULL == filename)
317 g_warning ("Cannot convert filename from UTF8 to filename encoding: %s",
319 g_clear_error (&err);
325 if ( filename == NULL)
326 filename = xstrdup (arg);
328 psppire_window_load (PSPPIRE_WINDOW (the_data_window), filename);
334 return ARGP_ERR_UNKNOWN;
340 const struct argp non_option_argp = {NULL, parse_non_options, 0, 0, 0, 0, 0};
344 output_file_name (void)
346 const char *dir = default_output_path ();
347 static char *filename = NULL;
349 if ( NULL == filename )
350 filename = xasprintf ("%s%s", dir, OUTPUT_FILE_NAME);