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 ();
126 psppire_output_window_setup ();
129 textdomain (PACKAGE);
132 the_recent_mgr = gtk_recent_manager_get_default ();
134 psppire_selector_set_default_selection_func (GTK_TYPE_ENTRY, insert_source_row_into_entry);
135 psppire_selector_set_default_selection_func (PSPPIRE_VAR_VIEW_TYPE, insert_source_row_into_tree_view);
136 psppire_selector_set_default_selection_func (GTK_TYPE_TREE_VIEW, insert_source_row_into_tree_view);
138 the_data_window = psppire_data_window_new ();
140 command_line_processor_replace_aux (clp, &post_init_argp, the_source_stream);
141 command_line_processor_replace_aux (clp, &non_option_argp, the_source_stream);
143 command_line_processor_parse (clp, argc, argv);
145 execute_syntax (create_syntax_string_source (""));
147 gtk_widget_show (the_data_window);
154 destroy_source_stream (the_source_stream);
155 message_dialog_done ();
163 func (gpointer key, gpointer value, gpointer data)
166 PsppireWindow *window = PSPPIRE_WINDOW (value);
168 g_signal_emit_by_name (window, "delete-event", 0, &rv);
174 PsppireWindowRegister *reg = psppire_window_register_new ();
175 psppire_window_register_foreach (reg, func, NULL);
183 const char *file_name;
188 static const struct icon_info icons[] =
190 {PKGDATADIR "/value-labels.png", "pspp-value-labels"},
191 {PKGDATADIR "/weight-cases.png", "pspp-weight-cases"},
192 {PKGDATADIR "/goto-variable.png", "pspp-goto-variable"},
193 {PKGDATADIR "/insert-variable.png", "pspp-insert-variable"},
194 {PKGDATADIR "/insert-case.png", "pspp-insert-case"},
195 {PKGDATADIR "/split-file.png", "pspp-split-file"},
196 {PKGDATADIR "/select-cases.png", "pspp-select-cases"},
197 {PKGDATADIR "/recent-dialogs.png", "pspp-recent-dialogs"},
198 {PKGDATADIR "/nominal.png", "var-nominal"},
199 {PKGDATADIR "/ordinal.png", "var-ordinal"},
200 {PKGDATADIR "/scale.png", "var-scale"},
201 {PKGDATADIR "/string.png", "var-string"},
202 {PKGDATADIR "/date-scale.png", "var-date-scale"}
206 create_icon_factory (void)
209 GtkIconFactory *factory = gtk_icon_factory_new ();
211 for (i = 0 ; i < sizeof (icons) / sizeof(icons[0]); ++i)
215 gdk_pixbuf_new_from_file (relocate (icons[i].file_name), &err);
219 GtkIconSet *icon_set = gtk_icon_set_new_from_pixbuf (pixbuf);
220 g_object_unref (pixbuf);
221 gtk_icon_factory_add ( factory, icons[i].id, icon_set);
225 g_warning ("Cannot create icon: %s", err->message);
226 g_clear_error (&err);
231 /* Create our own "pspp-stock-reset" item, using the
232 GTK_STOCK_REFRESH icon set */
234 GtkStockItem items[] = {
235 {"pspp-stock-reset", N_("_Reset"), 0, 0, PACKAGE},
236 {"pspp-stock-select", N_("_Select"), 0, 0, PACKAGE}
240 gtk_stock_add (items, 2);
241 gtk_icon_factory_add (factory, "pspp-stock-reset",
242 gtk_icon_factory_lookup_default (GTK_STOCK_REFRESH)
245 gtk_icon_factory_add (factory, "pspp-stock-select",
246 gtk_icon_factory_lookup_default (GTK_STOCK_INDEX)
250 gtk_icon_factory_add_default (factory);
256 parse_non_options (int key, char *arg, struct argp_state *state)
258 struct source_stream *ss = state->input;
267 gchar *filename = NULL;
269 const gchar *local_encoding = NULL;
271 const gboolean local_is_utf8 = g_get_charset (&local_encoding);
273 /* There seems to be no Glib function to convert from local encoding
274 to filename encoding. Therefore it has to be done in two steps:
275 the intermediate encoding is UTF8.
277 Either step could fail. However, in many cases the file can still
278 be loaded even if the conversion fails. So in those cases, after showing
279 a warning, we simply copy the locally encoded filename to the destination
280 and hope for the best.
285 utf8 = xstrdup (arg);
290 utf8 = g_locale_to_utf8 (arg, -1, NULL, &written, &err);
293 g_warning ("Cannot convert filename from local encoding \"%s\" to UTF-8: %s",
296 g_clear_error (&err);
303 filename = g_filename_from_utf8 (utf8, written, NULL, NULL, &err);
304 if ( NULL == filename)
306 g_warning ("Cannot convert filename from UTF8 to filename encoding: %s",
308 g_clear_error (&err);
314 if ( filename == NULL)
315 filename = xstrdup (arg);
317 psppire_window_load (PSPPIRE_WINDOW (the_data_window), filename);
323 return ARGP_ERR_UNKNOWN;
329 const struct argp non_option_argp = {NULL, parse_non_options, 0, 0, 0, 0, 0};