1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2004, 2005, 2006, 2009, 2010, 2011, 2012, 2013, 2014 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/>. */
21 #include <gsl/gsl_errno.h>
26 #include "data/any-reader.h"
27 #include "data/casereader.h"
28 #include "data/dataset.h"
29 #include "data/datasheet.h"
30 #include "data/file-handle-def.h"
31 #include "data/session.h"
32 #include "data/settings.h"
34 #include "language/lexer/lexer.h"
35 #include "libpspp/i18n.h"
36 #include "libpspp/message.h"
37 #include "libpspp/version.h"
39 #include "output/driver.h"
40 #include "output/journal.h"
41 #include "output/message-item.h"
43 #include "ui/gui/dict-display.h"
44 #include "ui/gui/executor.h"
45 #include "ui/gui/psppire-data-store.h"
46 #include "ui/gui/psppire-data-window.h"
47 #include "ui/gui/psppire-dict.h"
48 #include "ui/gui/psppire.h"
49 #include "ui/gui/psppire-output-window.h"
50 #include "ui/gui/psppire-syntax-window.h"
51 #include "ui/gui/psppire-selector.h"
52 #include "ui/gui/psppire-var-view.h"
53 #include "ui/gui/psppire-means-layer.h"
54 #include "ui/gui/psppire-window-register.h"
55 #include "ui/gui/widgets.h"
56 #include "ui/source-init-opts.h"
57 #include "ui/syntax-gen.h"
59 #include "ui/gui/icons/icon-names.h"
62 #include "gl/configmake.h"
63 #include "gl/xalloc.h"
64 #include "gl/relocatable.h"
66 static void create_icon_factory (void);
68 #define _(msgid) gettext (msgid)
69 #define N_(msgid) msgid
73 initialize (const struct init_source *is)
81 preregister_widgets ();
84 gsl_set_error_handler_off ();
87 output_engine_push ();
96 psppire_set_lexer (NULL);
99 bind_textdomain_codeset (PACKAGE, "UTF-8");
102 if ( ! gtk_parse_args (is->argc, is->argv) )
104 perror ("Error parsing arguments");
109 create_icon_factory ();
112 psppire_output_window_setup ();
118 textdomain (PACKAGE);
121 /* FIXME: This should be implemented with a GtkInterface */
122 psppire_selector_set_default_selection_func (GTK_TYPE_ENTRY, insert_source_row_into_entry);
123 psppire_selector_set_default_selection_func (PSPPIRE_VAR_VIEW_TYPE, insert_source_row_into_tree_view);
124 psppire_selector_set_default_selection_func (GTK_TYPE_TREE_VIEW, insert_source_row_into_tree_view);
125 psppire_selector_set_default_selection_func (PSPPIRE_TYPE_MEANS_LAYER, insert_source_row_into_layers);
131 const gchar *local_encoding = NULL;
132 g_get_charset (&local_encoding);
134 struct file_handle *fh = fh_create_file (NULL, is->file, local_encoding, fh_default_properties ());
135 const char *filename = fh_get_file_name (fh);
137 int retval = any_reader_detect (fh, NULL);
139 /* Check to see if the file is a .sav or a .por file. If not
140 assume that it is a syntax file */
142 open_data_window (NULL, filename, NULL, NULL);
143 else if (retval == 0)
145 create_data_window ();
146 open_syntax_window (filename, NULL);
153 create_data_window ();
170 output_engine_pop ();
175 func (gpointer key, gpointer value, gpointer data)
178 PsppireWindow *window = PSPPIRE_WINDOW (value);
180 g_signal_emit_by_name (window, "delete-event", 0, &rv);
186 PsppireWindowRegister *reg = psppire_window_register_new ();
187 psppire_window_register_foreach (reg, func, NULL);
194 int resolution; /* The dimension of the images which will be used */
195 size_t n_sizes; /* The number of items in the array below. */
196 const GtkIconSize *usage; /* An array determining for what the icon set is used */
199 static const GtkIconSize menus[] = {GTK_ICON_SIZE_MENU};
200 static const GtkIconSize large_toolbar[] = {GTK_ICON_SIZE_LARGE_TOOLBAR};
201 static const GtkIconSize small_toolbar[] = {GTK_ICON_SIZE_SMALL_TOOLBAR};
204 /* We currently have three icon sets viz: 16x16, 24x24 and 32x32
205 We use the 16x16 for menus, the 32x32 for the large_toolbars and
206 the 24x24 for small_toolbars.
208 The order of this array is pertinent. The icons in the sets occuring
209 earlier in the array will be used a the wildcard (default) icon size,
210 if such an icon exists.
212 static const struct icon_size sizemap[] =
214 {24, sizeof (small_toolbar) / sizeof (GtkIconSize), small_toolbar},
215 {16, sizeof (menus) / sizeof (GtkIconSize), menus},
216 {32, sizeof (large_toolbar) / sizeof (GtkIconSize), large_toolbar}
221 create_icon_factory (void)
224 GtkIconFactory *factory = gtk_icon_factory_new ();
225 struct icon_context ctx[2];
226 ctx[0] = action_icon_context;
227 ctx[1] = category_icon_context;
228 for (c = 0 ; c < 2 ; ++c)
230 const struct icon_context *ic = &ctx[c];
232 for (i = 0 ; i < ic->n_icons ; ++i)
234 gboolean wildcarded = FALSE;
235 GtkIconSet *icon_set = gtk_icon_set_new ();
237 for (r = 0 ; r < sizeof (sizemap) / sizeof (sizemap[0]); ++r)
240 GtkIconSource *source = gtk_icon_source_new ();
241 gchar *filename = g_strdup_printf ("%s/%s/%dx%d/%s.png", PKGDATADIR,
243 sizemap[r].resolution, sizemap[r].resolution,
245 const char *relocated_filename = relocate (filename);
246 GFile *gf = g_file_new_for_path (relocated_filename);
247 if (g_file_query_exists (gf, NULL))
249 gtk_icon_source_set_filename (source, relocated_filename);
252 gtk_icon_source_set_size_wildcarded (source, TRUE);
258 for (s = 0 ; s < sizemap[r].n_sizes ; ++s)
259 gtk_icon_source_set_size (source, sizemap[r].usage[s]);
260 if (filename != relocated_filename)
261 free (CONST_CAST (char *, relocated_filename));
264 if ( gtk_icon_source_get_filename (source))
265 gtk_icon_set_add_source (icon_set, source);
267 gtk_icon_source_free (source);
270 gtk_icon_factory_add (factory, ic->icon_name[i], icon_set);
281 /* We have our own icons for some things.
282 But we want the Stock Item to be identical to the Gtk standard
283 ones in all other respects.
285 const struct iconmap map[] = {
286 {GTK_STOCK_NEW, "file-new-document"},
287 {GTK_STOCK_QUIT, "file-quit"},
288 {GTK_STOCK_SAVE, "file-save-document"},
289 {GTK_STOCK_CUT, "edit-cut"},
290 {GTK_STOCK_COPY, "edit-copy"},
291 {GTK_STOCK_PASTE, "edit-paste"},
292 {GTK_STOCK_UNDO, "edit-undo"},
293 {GTK_STOCK_REDO, "edit-redo"},
294 {GTK_STOCK_DELETE, "edit-delete"},
295 {GTK_STOCK_ABOUT, "help-about"},
296 {GTK_STOCK_PRINT, "file-print-document"}
299 GtkStockItem customised[sizeof (map) / sizeof (map[0])];
302 for (i = 0; i < sizeof (map) / sizeof (map[0]); ++i)
304 gtk_stock_lookup (map[i].gtk_id, &customised[i]);
305 customised[i].stock_id = map[i].pspp_id;
310 gtk_stock_add (customised, sizeof (map) / sizeof (map[0]));
314 /* Create our own "pspp-stock-reset" item, using the
315 GTK_STOCK_REFRESH icon set */
316 GtkStockItem items[2] = {
317 {"pspp-stock-reset", N_("_Reset"), 0, 0, PACKAGE},
318 {"pspp-stock-select", N_("_Select"), 0, 0, PACKAGE}
321 gtk_stock_add (items, 2);
323 gtk_icon_factory_add (factory, "pspp-stock-reset",
324 gtk_icon_factory_lookup_default (GTK_STOCK_REFRESH)
327 gtk_icon_factory_add (factory, "pspp-stock-select",
328 gtk_icon_factory_lookup_default (GTK_STOCK_INDEX)
332 gtk_icon_factory_add_default (factory);
338 handle_msg (const struct msg *m_, void *lexer_)
340 struct lexer *lexer = lexer_;
343 if (lexer != NULL && m.file_name == NULL)
345 m.file_name = CONST_CAST (char *, lex_get_file_name (lexer));
346 m.first_line = lex_get_first_line_number (lexer, 0);
347 m.last_line = lex_get_last_line_number (lexer, 0);
348 m.first_column = lex_get_first_column (lexer, 0);
349 m.last_column = lex_get_last_column (lexer, 0);
352 message_item_submit (message_item_create (&m));
356 psppire_set_lexer (struct lexer *lexer)
358 msg_set_handler (handle_msg, lexer);