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;
95 preregister_widgets ();
97 gsl_set_error_handler_off ();
100 settings_init (&viewer_width, &viewer_length);
103 create_source_stream (
104 fn_getenv_default ("STAT_INCLUDE_PATH", include_path)
107 the_dataset = create_dataset ();
110 message_dialog_init (the_source_stream);
112 dictionary = psppire_dict_new_from_dict (dataset_dict (the_dataset));
114 bind_textdomain_codeset (PACKAGE, "UTF-8");
116 /* Create the model for the var_sheet */
117 the_var_store = psppire_var_store_new (dictionary);
119 the_data_store = psppire_data_store_new (dictionary);
120 replace_casereader (NULL);
122 create_icon_factory ();
124 psppire_output_window_setup ();
127 textdomain (PACKAGE);
130 the_recent_mgr = gtk_recent_manager_get_default ();
132 the_data_window = psppire_data_window_new ();
134 command_line_processor_replace_aux (clp, &post_init_argp, the_source_stream);
135 command_line_processor_replace_aux (clp, &non_option_argp, the_source_stream);
137 command_line_processor_parse (clp, argc, argv);
139 execute_syntax (create_syntax_string_source (""));
141 gtk_widget_show (the_data_window);
148 destroy_source_stream (the_source_stream);
149 message_dialog_done ();
157 func (gpointer key, gpointer value, gpointer data)
160 PsppireWindow *window = PSPPIRE_WINDOW (value);
162 g_signal_emit_by_name (window, "delete-event", 0, &rv);
168 PsppireWindowRegister *reg = psppire_window_register_new ();
169 psppire_window_register_foreach (reg, func, NULL);
177 const char *file_name;
182 static const struct icon_info icons[] =
184 {PKGDATADIR "/value-labels.png", "pspp-value-labels"},
185 {PKGDATADIR "/weight-cases.png", "pspp-weight-cases"},
186 {PKGDATADIR "/goto-variable.png", "pspp-goto-variable"},
187 {PKGDATADIR "/insert-variable.png", "pspp-insert-variable"},
188 {PKGDATADIR "/insert-case.png", "pspp-insert-case"},
189 {PKGDATADIR "/split-file.png", "pspp-split-file"},
190 {PKGDATADIR "/select-cases.png", "pspp-select-cases"},
191 {PKGDATADIR "/recent-dialogs.png", "pspp-recent-dialogs"},
192 {PKGDATADIR "/nominal.png", "var-nominal"},
193 {PKGDATADIR "/ordinal.png", "var-ordinal"},
194 {PKGDATADIR "/scale.png", "var-scale"},
195 {PKGDATADIR "/string.png", "var-string"},
196 {PKGDATADIR "/date-scale.png", "var-date-scale"}
200 create_icon_factory (void)
203 GtkIconFactory *factory = gtk_icon_factory_new ();
205 for (i = 0 ; i < sizeof (icons) / sizeof(icons[0]); ++i)
209 gdk_pixbuf_new_from_file (relocate (icons[i].file_name), &err);
213 GtkIconSet *icon_set = gtk_icon_set_new_from_pixbuf (pixbuf);
214 g_object_unref (pixbuf);
215 gtk_icon_factory_add ( factory, icons[i].id, icon_set);
219 g_warning ("Cannot create icon: %s", err->message);
220 g_clear_error (&err);
225 /* Create our own "pspp-stock-reset" item, using the
226 GTK_STOCK_REFRESH icon set */
228 GtkStockItem items[] = {
229 {"pspp-stock-reset", N_("_Reset"), 0, 0, PACKAGE},
230 {"pspp-stock-select", N_("_Select"), 0, 0, PACKAGE}
234 gtk_stock_add (items, 2);
235 gtk_icon_factory_add (factory, "pspp-stock-reset",
236 gtk_icon_factory_lookup_default (GTK_STOCK_REFRESH)
239 gtk_icon_factory_add (factory, "pspp-stock-select",
240 gtk_icon_factory_lookup_default (GTK_STOCK_INDEX)
244 gtk_icon_factory_add_default (factory);
250 parse_non_options (int key, char *arg, struct argp_state *state)
252 struct source_stream *ss = state->input;
261 gchar *filename = NULL;
263 const gchar *local_encoding = NULL;
265 const gboolean local_is_utf8 = g_get_charset (&local_encoding);
267 /* There seems to be no Glib function to convert from local encoding
268 to filename encoding. Therefore it has to be done in two steps:
269 the intermediate encoding is UTF8.
271 Either step could fail. However, in many cases the file can still
272 be loaded even if the conversion fails. So in those cases, after showing
273 a warning, we simply copy the locally encoded filename to the destination
274 and hope for the best.
279 utf8 = xstrdup (arg);
284 utf8 = g_locale_to_utf8 (arg, -1, NULL, &written, &err);
287 g_warning ("Cannot convert filename from local encoding \"%s\" to UTF-8: %s",
290 g_clear_error (&err);
297 filename = g_filename_from_utf8 (utf8, written, NULL, NULL, &err);
298 if ( NULL == filename)
300 g_warning ("Cannot convert filename from UTF8 to filename encoding: %s",
302 g_clear_error (&err);
308 if ( filename == NULL)
309 filename = xstrdup (arg);
311 psppire_window_load (PSPPIRE_WINDOW (the_data_window), filename);
317 return ARGP_ERR_UNKNOWN;
323 const struct argp non_option_argp = {NULL, parse_non_options, 0, 0, 0, 0, 0};