From: Carlos Garcia Campos Date: Mon, 2 Aug 2010 18:45:41 +0000 (+0200) Subject: [shell] Add confirmation dialog on closing window when document has been modified X-Git-Tag: EVINCE_2_31_6~2 X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=commitdiff_plain;h=1ecd95c77d53b2921e555549b4fd53308a49572b;p=evince.git [shell] Add confirmation dialog on closing window when document has been modified Form fields have been filled out or annots have been added/modified --- diff --git a/shell/ev-window.c b/shell/ev-window.c index 27adfb10..fac2a119 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -3366,6 +3366,91 @@ ev_window_cmd_file_properties (GtkAction *action, EvWindow *ev_window) ev_document_fc_mutex_unlock (); } +static void +document_modified_confirmation_dialog_response (GtkDialog *dialog, + gint response, + EvWindow *ev_window) +{ + gtk_widget_destroy (GTK_WIDGET (dialog)); + + switch (response) { + case GTK_RESPONSE_YES: + ev_window_cmd_save_as (NULL, ev_window); + break; + case GTK_RESPONSE_NO: + gtk_widget_destroy (GTK_WIDGET (ev_window)); + break; + case GTK_RESPONSE_CANCEL: + default: + break; + } +} + +static gboolean +ev_window_check_document_modified (EvWindow *ev_window) +{ + EvDocument *document = ev_window->priv->document; + GtkWidget *dialog; + gchar *text, *markup; + const gchar *secondary_text; + + if (!document) + return FALSE; + + if (EV_IS_DOCUMENT_FORMS (document) && + ev_document_forms_document_is_modified (EV_DOCUMENT_FORMS (document))) { + secondary_text = _("Document contains form fields that have been filled out. " + "If you don't save a copy, changes will be permanently lost."); + } else if (EV_IS_DOCUMENT_ANNOTATIONS (document) && + ev_document_annotations_document_is_modified (EV_DOCUMENT_ANNOTATIONS (document))) { + secondary_text = _("Document contains new or modified annotations. " + "If you don't save a copy, changes will be permanently lost."); + } else { + return FALSE; + } + + + text = g_markup_printf_escaped (_("Save a copy of document “%s” before closing?"), + gtk_window_get_title (GTK_WINDOW (ev_window))); + + dialog = gtk_message_dialog_new (GTK_WINDOW (ev_window), + GTK_DIALOG_MODAL, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + NULL); + + markup = g_strdup_printf ("%s", text); + g_free (text); + + gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog), markup); + g_free (markup); + + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + "%s", secondary_text); + + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + _("Close _without Saving"), + GTK_RESPONSE_NO, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + _("Save a _Copy"), + GTK_RESPONSE_YES, + NULL); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES); + gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog), + GTK_RESPONSE_YES, + GTK_RESPONSE_NO, + GTK_RESPONSE_CANCEL, + -1); + + g_signal_connect (dialog, "response", + G_CALLBACK (document_modified_confirmation_dialog_response), + ev_window); + gtk_widget_show (dialog); + + return TRUE; +} + static void print_jobs_confirmation_dialog_response (GtkDialog *dialog, gint response, @@ -3475,6 +3560,9 @@ ev_window_close (EvWindow *ev_window) ev_document_model_set_page (ev_window->priv->model, current_page); } + if (ev_window_check_document_modified (ev_window)) + return FALSE; + if (ev_window_check_print_queue (ev_window)) return FALSE;