1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2004, 2005, 2006, 2009, 2010, 2011, 2012, 2013, 2014, 2016 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 ();
193 int resolution; /* The dimension of the images which will be used */
194 size_t n_sizes; /* The number of items in the array below. */
195 const GtkIconSize *usage; /* An array determining for what the icon set is used */
198 static const GtkIconSize menus[] = {GTK_ICON_SIZE_MENU};
199 static const GtkIconSize large_toolbar[] = {GTK_ICON_SIZE_LARGE_TOOLBAR};
200 static const GtkIconSize small_toolbar[] = {GTK_ICON_SIZE_SMALL_TOOLBAR};
203 /* We currently have three icon sets viz: 16x16, 24x24 and 32x32
204 We use the 16x16 for menus, the 32x32 for the large_toolbars and
205 the 24x24 for small_toolbars.
207 The order of this array is pertinent. The icons in the sets occuring
208 earlier in the array will be used a the wildcard (default) icon size,
209 if such an icon exists.
211 static const struct icon_size sizemap[] =
213 {24, sizeof (small_toolbar) / sizeof (GtkIconSize), small_toolbar},
214 {16, sizeof (menus) / sizeof (GtkIconSize), menus},
215 {32, sizeof (large_toolbar) / sizeof (GtkIconSize), large_toolbar}
220 create_icon_factory (void)
223 GtkIconFactory *factory = gtk_icon_factory_new ();
224 struct icon_context ctx[2];
225 ctx[0] = action_icon_context;
226 ctx[1] = category_icon_context;
227 for (c = 0 ; c < 2 ; ++c)
229 const struct icon_context *ic = &ctx[c];
231 for (i = 0 ; i < ic->n_icons ; ++i)
233 gboolean wildcarded = FALSE;
234 GtkIconSet *icon_set = gtk_icon_set_new ();
236 for (r = 0 ; r < sizeof (sizemap) / sizeof (sizemap[0]); ++r)
239 GtkIconSource *source = gtk_icon_source_new ();
240 gchar *filename = g_strdup_printf ("%s/%s/%dx%d/%s.png", PKGDATADIR,
242 sizemap[r].resolution, sizemap[r].resolution,
244 const char *relocated_filename = relocate (filename);
245 GFile *gf = g_file_new_for_path (relocated_filename);
246 if (g_file_query_exists (gf, NULL))
248 gtk_icon_source_set_filename (source, relocated_filename);
251 gtk_icon_source_set_size_wildcarded (source, TRUE);
257 for (s = 0 ; s < sizemap[r].n_sizes ; ++s)
258 gtk_icon_source_set_size (source, sizemap[r].usage[s]);
259 if (filename != relocated_filename)
260 free (CONST_CAST (char *, relocated_filename));
263 if ( gtk_icon_source_get_filename (source))
264 gtk_icon_set_add_source (icon_set, source);
266 gtk_icon_source_free (source);
269 gtk_icon_factory_add (factory, ic->icon_name[i], icon_set);
280 /* We have our own icons for some things.
281 But we want the Stock Item to be identical to the Gtk standard
282 ones in all other respects.
284 const struct iconmap map[] = {
285 {GTK_STOCK_NEW, "file-new-document"},
286 {GTK_STOCK_QUIT, "file-quit"},
287 {GTK_STOCK_SAVE, "file-save-document"},
288 {GTK_STOCK_CUT, "edit-cut"},
289 {GTK_STOCK_COPY, "edit-copy"},
290 {GTK_STOCK_PASTE, "edit-paste"},
291 {GTK_STOCK_UNDO, "edit-undo"},
292 {GTK_STOCK_REDO, "edit-redo"},
293 {GTK_STOCK_DELETE, "edit-delete"},
294 {GTK_STOCK_ABOUT, "help-about"},
295 {GTK_STOCK_PRINT, "file-print-document"}
298 GtkStockItem customised[sizeof (map) / sizeof (map[0])];
301 for (i = 0; i < sizeof (map) / sizeof (map[0]); ++i)
303 gtk_stock_lookup (map[i].gtk_id, &customised[i]);
304 customised[i].stock_id = map[i].pspp_id;
309 gtk_stock_add (customised, sizeof (map) / sizeof (map[0]));
313 /* Create our own "pspp-stock-reset" item, using the
314 GTK_STOCK_REFRESH icon set */
315 GtkStockItem items[2] = {
316 {"pspp-stock-reset", N_("_Reset"), 0, 0, PACKAGE},
317 {"pspp-stock-select", N_("_Select"), 0, 0, PACKAGE}
320 gtk_stock_add (items, 2);
322 gtk_icon_factory_add (factory, "pspp-stock-reset",
323 gtk_icon_factory_lookup_default (GTK_STOCK_REFRESH)
326 gtk_icon_factory_add (factory, "pspp-stock-select",
327 gtk_icon_factory_lookup_default (GTK_STOCK_INDEX)
331 gtk_icon_factory_add_default (factory);
337 handle_msg (const struct msg *m_, void *lexer_)
339 struct lexer *lexer = lexer_;
342 if (lexer != NULL && m.file_name == NULL)
344 m.file_name = CONST_CAST (char *, lex_get_file_name (lexer));
345 m.first_line = lex_get_first_line_number (lexer, 0);
346 m.last_line = lex_get_last_line_number (lexer, 0);
347 m.first_column = lex_get_first_column (lexer, 0);
348 m.last_column = lex_get_last_column (lexer, 0);
351 message_item_submit (message_item_create (&m));
355 psppire_set_lexer (struct lexer *lexer)
357 msg_set_handler (handle_msg, lexer);