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);
202 int resolution; /* The dimension of the images which will be used */
203 size_t n_sizes; /* The number of items in the array below. */
204 const GtkIconSize *usage; /* An array determining for what the icon set is used */
207 static const GtkIconSize menus[] = {GTK_ICON_SIZE_MENU};
208 static const GtkIconSize large_toolbar[] = {GTK_ICON_SIZE_LARGE_TOOLBAR};
209 static const GtkIconSize small_toolbar[] = {GTK_ICON_SIZE_SMALL_TOOLBAR};
212 /* We currently have three icon sets viz: 16x16, 24x24 and 32x32
213 We use the 16x16 for menus, the 32x32 for the large_toolbars and
214 the 24x24 for small_toolbars.
216 The order of this array is pertinent. The icons in the sets occuring
217 earlier in the array will be used a the wildcard (default) icon size,
218 if such an icon exists.
220 static const struct icon_size sizemap[] =
222 {24, sizeof (small_toolbar) / sizeof (GtkIconSize), small_toolbar},
223 {16, sizeof (menus) / sizeof (GtkIconSize), menus},
224 {32, sizeof (large_toolbar) / sizeof (GtkIconSize), large_toolbar}
229 create_icon_factory (void)
232 GtkIconFactory *factory = gtk_icon_factory_new ();
233 struct icon_context ctx[2];
234 ctx[0] = action_icon_context;
235 ctx[1] = category_icon_context;
236 for (c = 0 ; c < 2 ; ++c)
238 const struct icon_context *ic = &ctx[c];
240 for (i = 0 ; i < ic->n_icons ; ++i)
242 gboolean wildcarded = FALSE;
243 GtkIconSet *icon_set = gtk_icon_set_new ();
245 for (r = 0 ; r < sizeof (sizemap) / sizeof (sizemap[0]); ++r)
248 GtkIconSource *source = gtk_icon_source_new ();
249 gchar *filename = g_strdup_printf ("%s/%s/%dx%d/%s.png", PKGDATADIR,
251 sizemap[r].resolution, sizemap[r].resolution,
253 const char *relocated_filename = relocate (filename);
254 GFile *gf = g_file_new_for_path (relocated_filename);
255 if (g_file_query_exists (gf, NULL))
257 gtk_icon_source_set_filename (source, relocated_filename);
260 gtk_icon_source_set_size_wildcarded (source, TRUE);
266 for (s = 0 ; s < sizemap[r].n_sizes ; ++s)
267 gtk_icon_source_set_size (source, sizemap[r].usage[s]);
268 if (filename != relocated_filename)
269 free (CONST_CAST (char *, relocated_filename));
272 if ( gtk_icon_source_get_filename (source))
273 gtk_icon_set_add_source (icon_set, source);
275 gtk_icon_source_free (source);
278 gtk_icon_factory_add (factory, ic->icon_name[i], icon_set);
289 /* We have our own icons for some things.
290 But we want the Stock Item to be identical to the Gtk standard
291 ones in all other respects.
293 const struct iconmap map[] = {
294 {GTK_STOCK_NEW, "file-new-document"},
295 {GTK_STOCK_QUIT, "file-quit"},
296 {GTK_STOCK_SAVE, "file-save-document"},
297 {GTK_STOCK_CUT, "edit-cut"},
298 {GTK_STOCK_COPY, "edit-copy"},
299 {GTK_STOCK_PASTE, "edit-paste"},
300 {GTK_STOCK_UNDO, "edit-undo"},
301 {GTK_STOCK_REDO, "edit-redo"},
302 {GTK_STOCK_DELETE, "edit-delete"},
303 {GTK_STOCK_ABOUT, "help-about"},
304 {GTK_STOCK_PRINT, "file-print-document"}
307 GtkStockItem customised[sizeof (map) / sizeof (map[0])];
310 for (i = 0; i < sizeof (map) / sizeof (map[0]); ++i)
312 gtk_stock_lookup (map[i].gtk_id, &customised[i]);
313 customised[i].stock_id = map[i].pspp_id;
318 gtk_stock_add (customised, sizeof (map) / sizeof (map[0]));
322 /* Create our own "pspp-stock-reset" item, using the
323 GTK_STOCK_REFRESH icon set */
324 GtkStockItem items[2] = {
325 {"pspp-stock-reset", N_("_Reset"), 0, 0, PACKAGE},
326 {"pspp-stock-select", N_("_Select"), 0, 0, PACKAGE}
329 gtk_stock_add (items, 2);
331 gtk_icon_factory_add (factory, "pspp-stock-reset",
332 gtk_icon_factory_lookup_default (GTK_STOCK_REFRESH)
335 gtk_icon_factory_add (factory, "pspp-stock-select",
336 gtk_icon_factory_lookup_default (GTK_STOCK_INDEX)
340 gtk_icon_factory_add_default (factory);
346 handle_msg (const struct msg *m_, void *lexer_)
348 struct lexer *lexer = lexer_;
351 if (lexer != NULL && m.file_name == NULL)
353 m.file_name = CONST_CAST (char *, lex_get_file_name (lexer));
354 m.first_line = lex_get_first_line_number (lexer, 0);
355 m.last_line = lex_get_last_line_number (lexer, 0);
356 m.first_column = lex_get_first_column (lexer, 0);
357 m.last_column = lex_get_last_column (lexer, 0);
360 message_item_submit (message_item_create (&m));
364 psppire_set_lexer (struct lexer *lexer)
366 msg_set_handler (handle_msg, lexer);