X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fui%2Fgui%2Fpsppire.c;h=bdd5ad5332f4062d4b0bf6927a42ea2b57223d30;hb=258cbd9cdf386687122b0854274923acafc786d4;hp=239d153e4b0d5ca3454f2080f7c21946181cb2af;hpb=1dabf6c48c0f5827a933af82c01a26bdf55488bd;p=pspp diff --git a/src/ui/gui/psppire.c b/src/ui/gui/psppire.c index 239d153e4b..7d9cdf5298 100644 --- a/src/ui/gui/psppire.c +++ b/src/ui/gui/psppire.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2004, 2005, 2006 Free Software Foundation + Copyright (C) 2004, 2005, 2006, 2009, 2010, 2011, 2012, 2013, 2014, 2016 Free Software Foundation This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,196 +16,207 @@ #include -#include + #include -#include #include - -#include "relocatable.h" - -#include "data-editor.h" -#include "psppire.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include -#include -#include "psppire-dict.h" -#include "psppire-var-store.h" -#include "psppire-data-store.h" -#include "helper.h" -#include "message-dialog.h" - -#include "output-viewer.h" - -PsppireDataStore *the_data_store = 0; -PsppireVarStore *the_var_store = 0; - -static void create_icon_factory (void); - -struct source_stream *the_source_stream ; -struct dataset * the_dataset = NULL; - +#include +#include -static void -replace_casereader (struct casereader *s) -{ - PsppireCaseFile *pcf = psppire_case_file_new (s); - - psppire_data_store_set_case_file (the_data_store, pcf); -} +#include "data/any-reader.h" +#include "data/casereader.h" +#include "data/dataset.h" +#include "data/datasheet.h" +#include "data/file-handle-def.h" +#include "data/session.h" +#include "data/settings.h" + +#include "language/lexer/lexer.h" +#include "libpspp/i18n.h" +#include "libpspp/message.h" +#include "libpspp/version.h" + +#include "output/driver.h" +#include "output/journal.h" +#include "output/message-item.h" + +#include "ui/gui/dict-display.h" +#include "ui/gui/executor.h" +#include "ui/gui/psppire-data-store.h" +#include "ui/gui/psppire-data-window.h" +#include "ui/gui/psppire-dict.h" +#include "ui/gui/psppire.h" +#include "ui/gui/psppire-output-window.h" +#include "ui/gui/psppire-syntax-window.h" +#include "ui/gui/psppire-selector.h" +#include "ui/gui/psppire-var-view.h" +#include "ui/gui/psppire-means-layer.h" +#include "ui/gui/psppire-window-register.h" +#include "ui/gui/widgets.h" +#include "ui/source-init-opts.h" +#include "ui/syntax-gen.h" + + +#include "gl/configmake.h" +#include "gl/xalloc.h" +#include "gl/relocatable.h" + +void create_icon_factory (void); #define _(msgid) gettext (msgid) #define N_(msgid) msgid - void -initialize (void) +register_selection_functions (void) { - PsppireDict *dictionary = 0; - - /* gtk_init messes with the locale. - So unset the bits we want to control ourselves */ - setlocale (LC_NUMERIC, "C"); - - bindtextdomain (PACKAGE, locale_dir); - - - glade_init (); - - gsl_set_error_handler_off (); - fn_init (); - outp_init (); - settings_init (&viewer_width, &viewer_length); - fh_init (); - the_source_stream = - create_source_stream ( - fn_getenv_default ("STAT_INCLUDE_PATH", include_path) - ); - - the_dataset = create_dataset (); - - - message_dialog_init (the_source_stream); - - dictionary = psppire_dict_new_from_dict (dataset_dict (the_dataset)); - - bind_textdomain_codeset (PACKAGE, "UTF-8"); - - /* Create the model for the var_sheet */ - the_var_store = psppire_var_store_new (dictionary); - - the_data_store = psppire_data_store_new (dictionary); - replace_casereader (NULL); - - create_icon_factory (); - - outp_configure_driver_line ( - ss_cstr ("gui:ascii:screen:squeeze=on headers=off top-margin=0 " - "bottom-margin=0 paginate=off length=auto width=auto " - "emphasis=none " - "output-file=\"" OUTPUT_FILE_NAME "\" append=yes")); - - unlink (OUTPUT_FILE_NAME); - - journal_enable (); - textdomain (PACKAGE); + psppire_selector_set_default_selection_func (GTK_TYPE_ENTRY, insert_source_row_into_entry); + psppire_selector_set_default_selection_func (PSPPIRE_VAR_VIEW_TYPE, insert_source_row_into_tree_view); + psppire_selector_set_default_selection_func (GTK_TYPE_TREE_VIEW, insert_source_row_into_tree_view); + psppire_selector_set_default_selection_func (PSPPIRE_TYPE_MEANS_LAYER, insert_source_row_into_layers); +} - new_data_window (NULL, NULL); +bool +initialize (const struct init_source *is) +{ + switch (is->state) + { + case 0: + i18n_init (); + break; + case 1: + preregister_widgets (); + break; + case 2: + gsl_set_error_handler_off (); + break; + case 3: + output_engine_push (); + break; + case 4: + settings_init (); + break; + case 5: + fh_init (); + break; + case 6: + psppire_set_lexer (NULL); + break; + case 7: + bind_textdomain_codeset (PACKAGE, "UTF-8"); + break; + case 8: + if ( ! gtk_parse_args (is->argc, is->argv) ) + { + perror ("Error parsing arguments"); + exit (1); + } + break; + case 9: + journal_init (); + break; + case 10: + textdomain (PACKAGE); + break; + default: + return TRUE; + break; + } + return FALSE; } void de_initialize (void) { - destroy_source_stream (the_source_stream); - message_dialog_done (); settings_done (); - outp_done (); + output_engine_pop (); + i18n_done (); } +void +psppire_quit (GApplication *app) +{ + g_application_quit (app); +} - -struct icon_info +struct icon_size { - const char *file_name; - const gchar *id; + int resolution; /* The dimension of the images which will be used */ + size_t n_sizes; /* The number of items in the array below. */ + const GtkIconSize *usage; /* An array determining for what the icon set is used */ }; +static const GtkIconSize menus[] = {GTK_ICON_SIZE_MENU}; +static const GtkIconSize large_toolbar[] = {GTK_ICON_SIZE_LARGE_TOOLBAR}; +static const GtkIconSize small_toolbar[] = {GTK_ICON_SIZE_SMALL_TOOLBAR}; + -static const struct icon_info icons[] = +/* We currently have three icon sets viz: 16x16, 24x24 and 32x32 + We use the 16x16 for menus, the 32x32 for the large_toolbars and + the 24x24 for small_toolbars. + + The order of this array is pertinent. The icons in the sets occuring + earlier in the array will be used a the wildcard (default) icon size, + if such an icon exists. +*/ +static const struct icon_size sizemap[] = { - {PKGDATADIR "/value-labels.png", "pspp-value-labels"}, - {PKGDATADIR "/weight-cases.png", "pspp-weight-cases"}, - {PKGDATADIR "/goto-variable.png", "pspp-goto-variable"}, - {PKGDATADIR "/insert-variable.png", "pspp-insert-variable"}, - {PKGDATADIR "/insert-case.png", "pspp-insert-case"}, - {PKGDATADIR "/split-file.png", "pspp-split-file"}, - {PKGDATADIR "/select-cases.png", "pspp-select-cases"}, - {PKGDATADIR "/recent-dialogs.png", "pspp-recent-dialogs"}, - {PKGDATADIR "/nominal.png", "var-nominal"}, - {PKGDATADIR "/ordinal.png", "var-ordinal"}, - {PKGDATADIR "/scale.png", "var-scale"}, - {PKGDATADIR "/string.png", "var-string"}, - {PKGDATADIR "/date-scale.png", "var-date-scale"} + {24, sizeof (small_toolbar) / sizeof (GtkIconSize), small_toolbar}, + {16, sizeof (menus) / sizeof (GtkIconSize), menus}, + {32, sizeof (large_toolbar) / sizeof (GtkIconSize), large_toolbar} }; + + + + static void -create_icon_factory (void) +handle_msg (const struct msg *m_, void *lexer_) { - gint i; - GtkIconFactory *factory = gtk_icon_factory_new (); + struct lexer *lexer = lexer_; + struct msg m = *m_; - for (i = 0 ; i < sizeof (icons) / sizeof(icons[0]); ++i) + if (lexer != NULL && m.file_name == NULL) { - GError *err = NULL; - GdkPixbuf *pixbuf = - gdk_pixbuf_new_from_file (relocate (icons[i].file_name), &err); - - if ( pixbuf ) - { - GtkIconSet *icon_set = gtk_icon_set_new_from_pixbuf (pixbuf); - g_object_unref (pixbuf); - gtk_icon_factory_add ( factory, icons[i].id, icon_set); - } - else - { - g_warning ("Cannot create icon: %s", err->message); - g_clear_error (&err); - } + m.file_name = CONST_CAST (char *, lex_get_file_name (lexer)); + m.first_line = lex_get_first_line_number (lexer, 0); + m.last_line = lex_get_last_line_number (lexer, 0); + m.first_column = lex_get_first_column (lexer, 0); + m.last_column = lex_get_last_column (lexer, 0); } - { - /* Create our own "pspp-stock-reset" item, using the - GTK_STOCK_REFRESH icon set */ - - GtkStockItem items[] = { - {"pspp-stock-reset", N_("_Reset"), 0, 0, PACKAGE}, - {"pspp-stock-select", N_("_Select"), 0, 0, PACKAGE} - }; + message_item_submit (message_item_create (&m)); +} +void +psppire_set_lexer (struct lexer *lexer) +{ + msg_set_handler (handle_msg, lexer); +} - gtk_stock_add (items, 2); - gtk_icon_factory_add (factory, "pspp-stock-reset", - gtk_icon_factory_lookup_default (GTK_STOCK_REFRESH) - ); - gtk_icon_factory_add (factory, "pspp-stock-select", - gtk_icon_factory_lookup_default (GTK_STOCK_INDEX) - ); - } +void +psppire_preload_file (const gchar *file) +{ + const gchar *local_encoding = "UTF-8"; + + struct file_handle *fh = fh_create_file (NULL, + file, + local_encoding, + fh_default_properties ()); + const char *filename = fh_get_file_name (fh); + + int retval = any_reader_detect (fh, NULL); + + /* Check to see if the file is a .sav or a .por file. If not + assume that it is a syntax file */ + if (retval == 1) + open_data_window (NULL, filename, NULL, NULL); + else if (retval == 0) + { + create_data_window (); + open_syntax_window (filename, NULL); + } - gtk_icon_factory_add_default (factory); + fh_unref (fh); } -