X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-window.c;h=4c7fcf57dc2040c32357e9e371bbad8f6339d75d;hb=9d1bfb34842de4a129140622ee3d800297c0e69d;hp=81fcb8c0591f2ffa9cb6e2121707121d94a611e8;hpb=380110cc2fc8ee8511c2c4a1b3ee1da8a70cdb18;p=pspp diff --git a/src/ui/gui/psppire-window.c b/src/ui/gui/psppire-window.c index 81fcb8c059..4c7fcf57dc 100644 --- a/src/ui/gui/psppire-window.c +++ b/src/ui/gui/psppire-window.c @@ -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) { @@ -328,12 +311,6 @@ 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) { @@ -435,13 +412,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); @@ -501,10 +471,7 @@ psppire_window_init (PsppireWindow *window) 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 +506,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."), @@ -692,8 +659,6 @@ psppire_window_save_as (PsppireWindow *w) } } - -static void add_most_recent (const char *file_name); static void delete_recent (const char *file_name); gboolean @@ -713,7 +678,6 @@ psppire_window_load (PsppireWindow *w, const gchar *file) if ( ok ) { psppire_window_set_filename (w, file); - add_most_recent (file); w->dirty = FALSE; } else @@ -722,9 +686,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), @@ -733,28 +720,23 @@ 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, "*.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_add_mime_type (filter, "application/x-spss-sav"); 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 (); @@ -789,8 +771,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; } @@ -832,16 +823,31 @@ psppire_window_open (PsppireWindow *de) } -/* Puts FILE_NAME into the recent list. - If it's already in the list, it moves it to the top -*/ -static void -add_most_recent (const char *file_name) +/* Puts FILE_NAME (encoded in the glib file name encoding) into the recent list + with associated MIME_TYPE. If it's already in the list, it moves it to the + top. */ +void +add_most_recent (const char *file_name, const char *mime_type) { gchar *uri = g_filename_to_uri (file_name, NULL, NULL); if ( uri ) - gtk_recent_manager_add_item (gtk_recent_manager_get_default (), uri); + { + GtkRecentData recent_data; + + recent_data.display_name = NULL; + recent_data.description = NULL; + recent_data.mime_type = CONST_CAST (gchar *, mime_type); + recent_data.app_name = CONST_CAST (gchar *, g_get_application_name ()); + recent_data.app_exec = g_strjoin (" ", g_get_prgname (), "%u", NULL); + recent_data.groups = NULL; + recent_data.is_private = FALSE; + + gtk_recent_manager_add_full (gtk_recent_manager_get_default (), + uri, &recent_data); + + g_free (recent_data.app_exec); + } g_free (uri); }