X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-window.c;h=609b88120d2219116ec2ff1aa5329fd23d81090b;hb=refs%2Fbuilds%2F20140106033045%2Fpspp;hp=edaa372670755020b0cfc9594e8cb0c6d5fde3db;hpb=5592ebfc98cd6ca4285abf0771c877e3deb00ec8;p=pspp diff --git a/src/ui/gui/psppire-window.c b/src/ui/gui/psppire-window.c index edaa372670..609b88120d 100644 --- a/src/ui/gui/psppire-window.c +++ b/src/ui/gui/psppire-window.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2009, 2010, 2011 Free Software Foundation + Copyright (C) 2009, 2010, 2011, 2013 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 @@ -17,6 +17,7 @@ #include #include "psppire-window.h" +#include "psppire-window-base.h" #include @@ -28,17 +29,16 @@ #define N_(msgid) msgid #include "data/any-reader.h" +#include "data/file-name.h" #include "data/dataset.h" #include "helper.h" -#include "psppire-conf.h" #include "psppire-data-window.h" #include "psppire-encoding-selector.h" #include "psppire-syntax-window.h" #include "psppire-window-register.h" #include "psppire.h" -static void psppire_window_base_finalize (PsppireWindowClass *, gpointer); static void psppire_window_base_init (PsppireWindowClass *class); static void psppire_window_class_init (PsppireWindowClass *class); static void psppire_window_init (PsppireWindow *window); @@ -57,7 +57,7 @@ psppire_window_get_type (void) { sizeof (PsppireWindowClass), (GBaseInitFunc) psppire_window_base_init, - (GBaseFinalizeFunc) psppire_window_base_finalize, + (GBaseFinalizeFunc) NULL, (GClassInitFunc) psppire_window_class_init, (GClassFinalizeFunc) NULL, NULL, @@ -67,7 +67,7 @@ psppire_window_get_type (void) }; psppire_window_type = - g_type_register_static (GTK_TYPE_WINDOW, "PsppireWindow", + g_type_register_static (PSPPIRE_TYPE_WINDOW_BASE, "PsppireWindow", &psppire_window_info, G_TYPE_FLAG_ABSTRACT); } @@ -85,12 +85,6 @@ enum }; -gchar * -uniquify (const gchar *str, int *x) -{ - return g_strdup_printf ("%s%d", str, (*x)++); -} - static void psppire_window_set_title (PsppireWindow *window) { @@ -235,17 +229,6 @@ psppire_window_get_property (GObject *object, } -static void -on_realize (GtkWindow *window, gpointer data) -{ - PsppireConf *conf = psppire_conf_new (); - - const gchar *base = G_OBJECT_TYPE_NAME (window); - - psppire_conf_set_window_geometry (conf, base, window); -} - - static void psppire_window_finalize (GObject *object) { @@ -253,6 +236,8 @@ psppire_window_finalize (GObject *object) PsppireWindowRegister *reg = psppire_window_register_new (); + g_signal_handler_disconnect (reg, window->remove_handler); + g_signal_handler_disconnect (reg, window->insert_handler); psppire_window_register_remove (reg, window->list_name); g_free (window->filename); g_free (window->basename); @@ -260,12 +245,6 @@ psppire_window_finalize (GObject *object) g_free (window->description); g_free (window->list_name); - g_signal_handler_disconnect (psppire_window_register_new (), - window->remove_handler); - - g_signal_handler_disconnect (psppire_window_register_new (), - window->insert_handler); - g_hash_table_destroy (window->menuitem_table); if (G_OBJECT_CLASS (parent_class)->finalize) @@ -328,17 +307,13 @@ psppire_window_base_init (PsppireWindowClass *class) -static void -psppire_window_base_finalize (PsppireWindowClass *class, - gpointer class_data) -{ -} - static void menu_toggled (GtkCheckMenuItem *mi, gpointer data) { +#if GTK3_TRANSITION /* Prohibit changes to the state */ mi->active = !mi->active; +#endif } @@ -363,11 +338,12 @@ insert_menuitem_into_menu (PsppireWindow *window, gpointer key) /* Add a separator before adding the first real item. If we add a separator at any other time, sometimes GtkUIManager removes it. */ - if (g_hash_table_size (window->menuitem_table) == 0) + if (!window->added_separator) { GtkWidget *separator = gtk_separator_menu_item_new (); gtk_widget_show (separator); gtk_menu_shell_append (window->menu, separator); + window->added_separator = TRUE; } filename = g_filename_display_name (key); @@ -381,9 +357,11 @@ insert_menuitem_into_menu (PsppireWindow *window, gpointer key) gtk_menu_shell_append (window->menu, item); +#if GTK3_TRANSITION /* Set the state without emitting a signal */ GTK_CHECK_MENU_ITEM (item)->active = (psppire_window_register_lookup (psppire_window_register_new (), key) == window); +#endif g_hash_table_insert (window->menuitem_table, key, item); } @@ -435,13 +413,6 @@ on_delete (PsppireWindow *w, GdkEvent *event, gpointer user_data) { PsppireWindowRegister *reg = psppire_window_register_new (); - const gchar *base = G_OBJECT_TYPE_NAME (w); - - PsppireConf *conf = psppire_conf_new (); - - psppire_conf_save_window_geometry (conf, base, GTK_WINDOW (w)); - - if ( w->dirty ) { gint response = psppire_window_query_save (w); @@ -497,14 +468,12 @@ psppire_window_init (PsppireWindow *window) G_CALLBACK (remove_menuitem), window); + window->added_separator = FALSE; window->dirty = FALSE; g_signal_connect_swapped (window, "delete-event", G_CALLBACK (on_delete), window); - g_object_set (window, "icon-name", "psppicon", NULL); - - g_signal_connect (window, "realize", - G_CALLBACK (on_realize), window); + g_object_set (window, "icon-name", "pspp", NULL); } /* @@ -539,7 +508,7 @@ psppire_window_query_save (PsppireWindow *se) description); g_free (description); - g_object_set (dialog, "icon-name", "psppicon", NULL); + g_object_set (dialog, "icon-name", "pspp", NULL); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), _("If you don't save, changes from the last %ld seconds will be permanently lost."), @@ -695,7 +664,7 @@ psppire_window_save_as (PsppireWindow *w) static void delete_recent (const char *file_name); gboolean -psppire_window_load (PsppireWindow *w, const gchar *file) +psppire_window_load (PsppireWindow *w, const gchar *file, gpointer hint) { gboolean ok; PsppireWindowIface *i = PSPPIRE_WINDOW_MODEL_GET_IFACE (w); @@ -706,7 +675,7 @@ psppire_window_load (PsppireWindow *w, const gchar *file) g_return_val_if_fail (i->load, FALSE); - ok = i->load (w, file); + ok = i->load (w, file, hint); if ( ok ) { @@ -719,9 +688,32 @@ psppire_window_load (PsppireWindow *w, const gchar *file) return ok; } + +static void +on_selection_changed (GtkFileChooser *chooser, GtkWidget *encoding_selector) +{ + const gchar *sysname; + + const gchar *name = gtk_file_chooser_get_filename (chooser); + + if ( NULL == name ) + return; + + sysname = convert_glib_filename_to_system_filename (name, NULL); + + if ( ! fn_exists (sysname)) + { + gtk_widget_set_sensitive (encoding_selector, FALSE); + return; + } + + gtk_widget_set_sensitive (encoding_selector, ! any_reader_may_open (sysname)); +} + GtkWidget * psppire_window_file_chooser_dialog (PsppireWindow *toplevel) { + GtkFileFilter *filter = gtk_file_filter_new (); GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Open"), GTK_WINDOW (toplevel), @@ -730,28 +722,25 @@ psppire_window_file_chooser_dialog (PsppireWindow *toplevel) GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); - GtkFileFilter *filter; + g_object_set (dialog, "local-only", FALSE, NULL); - filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Data and Syntax Files")); - gtk_file_filter_add_pattern (filter, "*.sav"); - gtk_file_filter_add_pattern (filter, "*.SAV"); - gtk_file_filter_add_pattern (filter, "*.por"); - gtk_file_filter_add_pattern (filter, "*.POR"); + gtk_file_filter_add_mime_type (filter, "application/x-spss-sav"); + gtk_file_filter_add_mime_type (filter, "application/x-spss-por"); + gtk_file_filter_add_pattern (filter, "*.zsav"); gtk_file_filter_add_pattern (filter, "*.sps"); gtk_file_filter_add_pattern (filter, "*.SPS"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); filter = gtk_file_filter_new (); - gtk_file_filter_set_name (filter, _("System Files (*.sav)")); - gtk_file_filter_add_pattern (filter, "*.sav"); - gtk_file_filter_add_pattern (filter, "*.SAV"); + gtk_file_filter_set_name (filter, _("System Files (*.sav, *.zsav)")); + gtk_file_filter_add_mime_type (filter, "application/x-spss-sav"); + gtk_file_filter_add_pattern (filter, "*.zsav"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Portable Files (*.por) ")); - gtk_file_filter_add_pattern (filter, "*.por"); - gtk_file_filter_add_pattern (filter, "*.POR"); + gtk_file_filter_add_mime_type (filter, "application/x-spss-por"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); filter = gtk_file_filter_new (); @@ -786,8 +775,17 @@ psppire_window_file_chooser_dialog (PsppireWindow *toplevel) free (dir_name); } - gtk_file_chooser_set_extra_widget ( - GTK_FILE_CHOOSER (dialog), psppire_encoding_selector_new ("Auto", true)); + + { + GtkWidget *encoding_selector = psppire_encoding_selector_new ("Auto", true); + + gtk_widget_set_sensitive (encoding_selector, FALSE); + + g_signal_connect (dialog, "selection-changed", G_CALLBACK (on_selection_changed), + encoding_selector); + + gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (dialog), encoding_selector); + } return dialog; } @@ -812,7 +810,7 @@ psppire_window_open (PsppireWindow *de) gtk_file_chooser_get_extra_widget (GTK_FILE_CHOOSER (dialog))); if (any_reader_may_open (sysname)) - open_data_window (de, name); + open_data_window (de, name, NULL); else open_syntax_window (name, encoding);