1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2004, 2005, 2006, 2009, 2010 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 "ui/gui/psppire.h"
22 #include <gsl/gsl_errno.h>
27 #include "data/casereader.h"
28 #include "data/datasheet.h"
29 #include "data/file-handle-def.h"
30 #include "data/file-name.h"
31 #include "data/por-file-reader.h"
32 #include "data/procedure.h"
33 #include "data/settings.h"
34 #include "data/sys-file-reader.h"
35 #include "language/lexer/lexer.h"
36 #include "language/syntax-string-source.h"
37 #include "libpspp/getl.h"
38 #include "libpspp/i18n.h"
39 #include "libpspp/message.h"
40 #include "libpspp/version.h"
41 #include "output/driver.h"
42 #include "output/journal.h"
43 #include "output/message-item.h"
44 #include "ui/gui/dict-display.h"
45 #include "ui/gui/executor.h"
46 #include "ui/gui/psppire-data-store.h"
47 #include "ui/gui/psppire-data-window.h"
48 #include "ui/gui/psppire-dict.h"
49 #include "ui/gui/psppire-output-window.h"
50 #include "ui/gui/psppire-selector.h"
51 #include "ui/gui/psppire-var-store.h"
52 #include "ui/gui/psppire-var-view.h"
53 #include "ui/gui/psppire-window-register.h"
54 #include "ui/gui/psppire.h"
55 #include "ui/gui/widgets.h"
56 #include "ui/source-init-opts.h"
57 #include "ui/syntax-gen.h"
59 #include "gl/xalloc.h"
60 #include "gl/relocatable.h"
62 GtkRecentManager *the_recent_mgr = 0;
63 PsppireDataStore *the_data_store = 0;
64 PsppireVarStore *the_var_store = 0;
66 static void create_icon_factory (void);
68 struct source_stream *the_source_stream ;
69 struct dataset * the_dataset = NULL;
71 static GtkWidget *the_data_window;
73 static void handle_msg (const struct msg *);
74 static void load_data_file (const char *);
77 replace_casereader (struct casereader *s)
79 psppire_data_store_set_reader (the_data_store, s);
82 #define _(msgid) gettext (msgid)
83 #define N_(msgid) msgid
89 initialize (struct source_stream *ss, const char *data_file)
91 PsppireDict *dictionary = 0;
95 preregister_widgets ();
97 gsl_set_error_handler_off ();
98 settings_init (&viewer_width, &viewer_length);
101 the_dataset = create_dataset ();
103 the_source_stream = ss;
104 msg_init (ss, handle_msg);
106 dictionary = psppire_dict_new_from_dict (dataset_dict (the_dataset));
108 bind_textdomain_codeset (PACKAGE, "UTF-8");
110 /* Create the model for the var_sheet */
111 the_var_store = psppire_var_store_new (dictionary);
113 the_data_store = psppire_data_store_new (dictionary);
114 replace_casereader (NULL);
116 create_icon_factory ();
118 psppire_output_window_setup ();
121 textdomain (PACKAGE);
124 the_recent_mgr = gtk_recent_manager_get_default ();
126 psppire_selector_set_default_selection_func (GTK_TYPE_ENTRY, insert_source_row_into_entry);
127 psppire_selector_set_default_selection_func (PSPPIRE_VAR_VIEW_TYPE, insert_source_row_into_tree_view);
128 psppire_selector_set_default_selection_func (GTK_TYPE_TREE_VIEW, insert_source_row_into_tree_view);
130 the_data_window = psppire_data_window_new ();
131 if (data_file != NULL)
132 load_data_file (data_file);
134 execute_syntax (create_syntax_string_source (""));
136 gtk_widget_show (the_data_window);
143 destroy_source_stream (the_source_stream);
151 func (gpointer key, gpointer value, gpointer data)
154 PsppireWindow *window = PSPPIRE_WINDOW (value);
156 g_signal_emit_by_name (window, "delete-event", 0, &rv);
162 PsppireWindowRegister *reg = psppire_window_register_new ();
163 psppire_window_register_foreach (reg, func, NULL);
171 const char *file_name;
176 static const struct icon_info icons[] =
178 {PKGDATADIR "/value-labels.png", "pspp-value-labels"},
179 {PKGDATADIR "/weight-cases.png", "pspp-weight-cases"},
180 {PKGDATADIR "/goto-variable.png", "pspp-goto-variable"},
181 {PKGDATADIR "/insert-variable.png", "pspp-insert-variable"},
182 {PKGDATADIR "/insert-case.png", "pspp-insert-case"},
183 {PKGDATADIR "/split-file.png", "pspp-split-file"},
184 {PKGDATADIR "/select-cases.png", "pspp-select-cases"},
185 {PKGDATADIR "/recent-dialogs.png", "pspp-recent-dialogs"},
186 {PKGDATADIR "/nominal.png", "var-nominal"},
187 {PKGDATADIR "/ordinal.png", "var-ordinal"},
188 {PKGDATADIR "/scale.png", "var-scale"},
189 {PKGDATADIR "/string.png", "var-string"},
190 {PKGDATADIR "/date-scale.png", "var-date-scale"}
194 create_icon_factory (void)
197 GtkIconFactory *factory = gtk_icon_factory_new ();
199 for (i = 0 ; i < sizeof (icons) / sizeof(icons[0]); ++i)
203 gdk_pixbuf_new_from_file (relocate (icons[i].file_name), &err);
207 GtkIconSet *icon_set = gtk_icon_set_new_from_pixbuf (pixbuf);
208 g_object_unref (pixbuf);
209 gtk_icon_factory_add ( factory, icons[i].id, icon_set);
213 g_warning ("Cannot create icon: %s", err->message);
214 g_clear_error (&err);
219 /* Create our own "pspp-stock-reset" item, using the
220 GTK_STOCK_REFRESH icon set */
222 GtkStockItem items[] = {
223 {"pspp-stock-reset", N_("_Reset"), 0, 0, PACKAGE},
224 {"pspp-stock-select", N_("_Select"), 0, 0, PACKAGE}
228 gtk_stock_add (items, 2);
229 gtk_icon_factory_add (factory, "pspp-stock-reset",
230 gtk_icon_factory_lookup_default (GTK_STOCK_REFRESH)
233 gtk_icon_factory_add (factory, "pspp-stock-select",
234 gtk_icon_factory_lookup_default (GTK_STOCK_INDEX)
238 gtk_icon_factory_add_default (factory);
242 load_data_file (const char *arg)
244 gchar *filename = NULL;
246 const gchar *local_encoding = NULL;
248 const gboolean local_is_utf8 = g_get_charset (&local_encoding);
250 /* There seems to be no Glib function to convert from local encoding
251 to filename encoding. Therefore it has to be done in two steps:
252 the intermediate encoding is UTF8.
254 Either step could fail. However, in many cases the file can still
255 be loaded even if the conversion fails. So in those cases, after showing
256 a warning, we simply copy the locally encoded filename to the destination
257 and hope for the best.
262 utf8 = xstrdup (arg);
267 utf8 = g_locale_to_utf8 (arg, -1, NULL, &written, &err);
270 g_warning ("Cannot convert filename from local encoding \"%s\" to UTF-8: %s",
273 g_clear_error (&err);
280 filename = g_filename_from_utf8 (utf8, written, NULL, NULL, &err);
281 if ( NULL == filename)
283 g_warning ("Cannot convert filename from UTF8 to filename encoding: %s",
285 g_clear_error (&err);
291 if ( filename == NULL)
292 filename = xstrdup (arg);
294 psppire_window_load (PSPPIRE_WINDOW (the_data_window), filename);
300 handle_msg (const struct msg *m)
302 message_item_submit (message_item_create (m));