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);
129 if (is->filename_arg != -1)
132 const char *file = (*is->argv)[is->filename_arg];
133 const gchar *local_encoding = NULL;
134 g_get_charset (&local_encoding);
136 char **as = g_win32_get_command_line ();
137 const char *file = as[is->filename_arg];
138 const gchar *local_encoding = "UTF-8";
141 struct file_handle *fh = fh_create_file (NULL,
144 fh_default_properties ());
146 const char *filename = fh_get_file_name (fh);
148 int retval = any_reader_detect (fh, NULL);
150 /* Check to see if the file is a .sav or a .por file. If not
151 assume that it is a syntax file */
153 open_data_window (NULL, filename, NULL, NULL);
154 else if (retval == 0)
156 create_data_window ();
157 open_syntax_window (filename, NULL);
164 create_data_window ();
181 output_engine_pop ();
186 func (gpointer key, gpointer value, gpointer data)
189 PsppireWindow *window = PSPPIRE_WINDOW (value);
191 g_signal_emit_by_name (window, "delete-event", 0, &rv);
197 PsppireWindowRegister *reg = psppire_window_register_new ();
198 psppire_window_register_foreach (reg, func, NULL);
205 int resolution; /* The dimension of the images which will be used */
206 size_t n_sizes; /* The number of items in the array below. */
207 const GtkIconSize *usage; /* An array determining for what the icon set is used */
210 static const GtkIconSize menus[] = {GTK_ICON_SIZE_MENU};
211 static const GtkIconSize large_toolbar[] = {GTK_ICON_SIZE_LARGE_TOOLBAR};
212 static const GtkIconSize small_toolbar[] = {GTK_ICON_SIZE_SMALL_TOOLBAR};
215 /* We currently have three icon sets viz: 16x16, 24x24 and 32x32
216 We use the 16x16 for menus, the 32x32 for the large_toolbars and
217 the 24x24 for small_toolbars.
219 The order of this array is pertinent. The icons in the sets occuring
220 earlier in the array will be used a the wildcard (default) icon size,
221 if such an icon exists.
223 static const struct icon_size sizemap[] =
225 {24, sizeof (small_toolbar) / sizeof (GtkIconSize), small_toolbar},
226 {16, sizeof (menus) / sizeof (GtkIconSize), menus},
227 {32, sizeof (large_toolbar) / sizeof (GtkIconSize), large_toolbar}
232 create_icon_factory (void)
235 GtkIconFactory *factory = gtk_icon_factory_new ();
236 struct icon_context ctx[2];
237 ctx[0] = action_icon_context;
238 ctx[1] = category_icon_context;
239 for (c = 0 ; c < 2 ; ++c)
241 const struct icon_context *ic = &ctx[c];
243 for (i = 0 ; i < ic->n_icons ; ++i)
245 gboolean wildcarded = FALSE;
246 GtkIconSet *icon_set = gtk_icon_set_new ();
248 for (r = 0 ; r < sizeof (sizemap) / sizeof (sizemap[0]); ++r)
251 GtkIconSource *source = gtk_icon_source_new ();
252 gchar *filename = g_strdup_printf ("%s/%s/%dx%d/%s.png", PKGDATADIR,
254 sizemap[r].resolution, sizemap[r].resolution,
256 const char *relocated_filename = relocate (filename);
257 GFile *gf = g_file_new_for_path (relocated_filename);
258 if (g_file_query_exists (gf, NULL))
260 gtk_icon_source_set_filename (source, relocated_filename);
263 gtk_icon_source_set_size_wildcarded (source, TRUE);
269 for (s = 0 ; s < sizemap[r].n_sizes ; ++s)
270 gtk_icon_source_set_size (source, sizemap[r].usage[s]);
271 if (filename != relocated_filename)
272 free (CONST_CAST (char *, relocated_filename));
275 if ( gtk_icon_source_get_filename (source))
276 gtk_icon_set_add_source (icon_set, source);
278 gtk_icon_source_free (source);
281 gtk_icon_factory_add (factory, ic->icon_name[i], icon_set);
292 /* We have our own icons for some things.
293 But we want the Stock Item to be identical to the Gtk standard
294 ones in all other respects.
296 const struct iconmap map[] = {
297 {GTK_STOCK_NEW, "file-new-document"},
298 {GTK_STOCK_QUIT, "file-quit"},
299 {GTK_STOCK_SAVE, "file-save-document"},
300 {GTK_STOCK_CUT, "edit-cut"},
301 {GTK_STOCK_COPY, "edit-copy"},
302 {GTK_STOCK_PASTE, "edit-paste"},
303 {GTK_STOCK_UNDO, "edit-undo"},
304 {GTK_STOCK_REDO, "edit-redo"},
305 {GTK_STOCK_DELETE, "edit-delete"},
306 {GTK_STOCK_ABOUT, "help-about"},
307 {GTK_STOCK_PRINT, "file-print-document"}
310 GtkStockItem customised[sizeof (map) / sizeof (map[0])];
313 for (i = 0; i < sizeof (map) / sizeof (map[0]); ++i)
315 gtk_stock_lookup (map[i].gtk_id, &customised[i]);
316 customised[i].stock_id = map[i].pspp_id;
321 gtk_stock_add (customised, sizeof (map) / sizeof (map[0]));
325 /* Create our own "pspp-stock-reset" item, using the
326 GTK_STOCK_REFRESH icon set */
327 GtkStockItem items[2] = {
328 {"pspp-stock-reset", N_("_Reset"), 0, 0, PACKAGE},
329 {"pspp-stock-select", N_("_Select"), 0, 0, PACKAGE}
332 gtk_stock_add (items, 2);
334 gtk_icon_factory_add (factory, "pspp-stock-reset",
335 gtk_icon_factory_lookup_default (GTK_STOCK_REFRESH)
338 gtk_icon_factory_add (factory, "pspp-stock-select",
339 gtk_icon_factory_lookup_default (GTK_STOCK_INDEX)
343 gtk_icon_factory_add_default (factory);
349 handle_msg (const struct msg *m_, void *lexer_)
351 struct lexer *lexer = lexer_;
354 if (lexer != NULL && m.file_name == NULL)
356 m.file_name = CONST_CAST (char *, lex_get_file_name (lexer));
357 m.first_line = lex_get_first_line_number (lexer, 0);
358 m.last_line = lex_get_last_line_number (lexer, 0);
359 m.first_column = lex_get_first_column (lexer, 0);
360 m.last_column = lex_get_last_column (lexer, 0);
363 message_item_submit (message_item_create (&m));
367 psppire_set_lexer (struct lexer *lexer)
369 msg_set_handler (handle_msg, lexer);