X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fui%2Fgui%2Fpsppire-window.c;h=407ba9737296142db83d3cb86849cca6d5d87cad;hb=55077868a3eb1776432bcb46a3627cc8e0ee54db;hp=29be4c2082fd4c44270bc64f761e89265185fc9c;hpb=23a109b05ec5e76c4f629338dcaafedbf1e8954b;p=pspp diff --git a/src/ui/gui/psppire-window.c b/src/ui/gui/psppire-window.c index 29be4c2082..407ba97372 100644 --- a/src/ui/gui/psppire-window.c +++ b/src/ui/gui/psppire-window.c @@ -16,9 +16,12 @@ #include +#include +#include #include #include #include +#include #include @@ -60,7 +63,7 @@ psppire_window_get_type (void) psppire_window_type = g_type_register_static (GTK_TYPE_WINDOW, "PsppireWindow", - &psppire_window_info, 0); + &psppire_window_info, G_TYPE_FLAG_ABSTRACT); } return psppire_window_type; @@ -90,7 +93,8 @@ psppire_window_set_title (PsppireWindow *window) GString *title = g_string_sized_new (80); g_string_printf (title, _("%s %s PSPPIRE %s"), - window->basename, mdash, window->description); + window->basename ? window->basename : "", + mdash, window->description); if ( window->unsaved) g_string_prepend_c (title, '*'); @@ -345,6 +349,32 @@ insert_existing_items (PsppireWindow *window) psppire_window_register_foreach (psppire_window_register_new (), insert_item, window); } + +static gboolean +on_delete (PsppireWindow *w, GdkEvent *event, gpointer user_data) +{ + PsppireWindowRegister *reg = psppire_window_register_new (); + + if ( w->unsaved ) + { + gint response = psppire_window_query_save (w); + + if ( response == GTK_RESPONSE_CANCEL) + return TRUE; + + if ( response == GTK_RESPONSE_ACCEPT) + { + psppire_window_save (w); + } + } + + if ( 1 == psppire_window_register_n_items (reg)) + gtk_main_quit (); + + return FALSE; +} + + static void psppire_window_init (PsppireWindow *window) { @@ -367,15 +397,57 @@ psppire_window_init (PsppireWindow *window) window); window->unsaved = FALSE; + + g_signal_connect_swapped (window, "delete-event", G_CALLBACK (on_delete), window); + + g_object_set (window, "icon-name", "psppicon", NULL); + } -GtkWidget* -psppire_window_new (void) +/* + Ask the user if the buffer should be saved. + Return the response. +*/ +gint +psppire_window_query_save (PsppireWindow *se) { - return GTK_WIDGET (g_object_new (psppire_window_get_type (), - "type", GTK_WINDOW_TOPLEVEL, - NULL)); + gint response; + GtkWidget *dialog; + + const gchar *description; + const gchar *filename = psppire_window_get_filename (se); + + g_object_get (se, "description", &description, NULL); + + g_return_val_if_fail (filename != NULL, GTK_RESPONSE_NONE); + + dialog = + gtk_message_dialog_new (GTK_WINDOW (se), + GTK_DIALOG_MODAL, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + _("Save contents of %s to \"%s\"?"), + description, + filename); + + gtk_dialog_add_button (GTK_DIALOG (dialog), + GTK_STOCK_YES, + GTK_RESPONSE_ACCEPT); + + gtk_dialog_add_button (GTK_DIALOG (dialog), + GTK_STOCK_NO, + GTK_RESPONSE_REJECT); + + gtk_dialog_add_button (GTK_DIALOG (dialog), + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL); + + response = gtk_dialog_run (GTK_DIALOG (dialog)); + + gtk_widget_destroy (dialog); + + return response; } @@ -402,6 +474,13 @@ psppire_window_set_unsaved (PsppireWindow *w, gboolean unsaved) psppire_window_set_title (w); } +gboolean +psppire_window_get_unsaved (PsppireWindow *w) +{ + return w->unsaved; +} + + @@ -419,3 +498,67 @@ psppire_window_minimise_all (void) g_hash_table_foreach (reg->name_table, minimise_window, NULL); } + + + + +GType +psppire_window_model_get_type (void) +{ + static GType window_model_type = 0; + + if (! window_model_type) + { + static const GTypeInfo window_model_info = + { + sizeof (PsppireWindowIface), /* class_size */ + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, + 0, /* n_preallocs */ + NULL + }; + + window_model_type = + g_type_register_static (G_TYPE_INTERFACE, "PsppireWindowModel", + &window_model_info, 0); + + g_type_interface_add_prerequisite (window_model_type, G_TYPE_OBJECT); + } + + return window_model_type; +} + + +void +psppire_window_save (PsppireWindow *w) +{ + PsppireWindowIface *i = PSPPIRE_WINDOW_MODEL_GET_IFACE (w); + + g_assert (PSPPIRE_IS_WINDOW_MODEL (w)); + + g_assert (i); + + g_return_if_fail (i->save); + + i->save (w); +} + + +/* Puts FILE_NAME into the recent list. + If it's already in the list, it moves it to the top +*/ +void +add_most_recent (const char *file_name, GtkRecentManager *rm) +{ + gchar *uri = g_filename_to_uri (file_name, NULL, NULL); + + if ( uri ) + gtk_recent_manager_add_item (rm, uri); + + g_free (uri); +} +