From b7aeafa39571a8d657b5416b460ecbeb75a5e4ea Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 12 Mar 2008 18:02:29 +0000 Subject: [PATCH] Add an overwrite confirmation dialog for print-to-file. (#474302, Marek MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2008-03-12 Matthias Clasen * gtk/gtkprintunixdialog.c: Add an overwrite confirmation dialog for print-to-file. (#474302, Marek Kašík) svn path=/trunk/; revision=19787 --- ChangeLog | 5 ++ gtk/gtkprintunixdialog.c | 114 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) diff --git a/ChangeLog b/ChangeLog index 1292dda449..f0e1ff37a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-03-12 Matthias Clasen + + * gtk/gtkprintunixdialog.c: Add an overwrite confirmation + dialog for print-to-file. (#474302, Marek Kašík) + 2008-03-12 Matthias Clasen * modules/printbackends/cups/gtkprintbackendcups.c: Fix a crash diff --git a/gtk/gtkprintunixdialog.c b/gtk/gtkprintunixdialog.c index 9ee4c5cd18..bc7ba8d199 100644 --- a/gtk/gtkprintunixdialog.c +++ b/gtk/gtkprintunixdialog.c @@ -56,6 +56,9 @@ #include "gtkprinteroptionwidget.h" #include "gtkalias.h" +#include "gtkmessagedialog.h" +#include "gtkbutton.h" + #define EXAMPLE_PAGE_AREA_SIZE 140 #define GTK_PRINT_UNIX_DIALOG_GET_PRIVATE(o) \ @@ -273,6 +276,112 @@ gtk_print_unix_dialog_class_init (GtkPrintUnixDialogClass *class) g_type_class_add_private (class, sizeof (GtkPrintUnixDialogPrivate)); } +/* Returns a toplevel GtkWindow, or NULL if none */ +static GtkWindow * +get_toplevel (GtkWidget *widget) +{ + GtkWidget *toplevel = NULL; + + toplevel = gtk_widget_get_toplevel (widget); + if (!GTK_WIDGET_TOPLEVEL (toplevel)) + return NULL; + else + return GTK_WINDOW (toplevel); +} + +static void +add_custom_button_to_dialog (GtkDialog *dialog, + const gchar *mnemonic_label, + const gchar *stock_id, + gint response_id) +{ + GtkWidget *button = NULL; + + button = gtk_button_new_with_mnemonic (mnemonic_label); + GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); + gtk_button_set_image (GTK_BUTTON (button), + gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_BUTTON)); + gtk_widget_show (button); + + gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, response_id); +} + +/* Presents an overwrite confirmation dialog ("print to file" backend). + */ +static gboolean +overwrite_confirmation_dialog (GtkPrintUnixDialog *print_dialog, + gint print_dialog_response_id, + gpointer data) +{ + GtkPrintUnixDialogPrivate *priv = print_dialog->priv; + GtkPrinterOption *option = NULL; + GtkPrinter *printer = NULL; + GtkWindow *toplevel = NULL; + GtkWidget *dialog = NULL; + gchar *filename = NULL; + gchar *basename = NULL; + gchar *dirname = NULL; + int response; + + if (print_dialog != NULL && print_dialog_response_id == GTK_RESPONSE_OK) + { + printer = gtk_print_unix_dialog_get_selected_printer (print_dialog); + + if (printer != NULL && gtk_printer_is_virtual (printer)) + { + option = gtk_printer_option_set_lookup (priv->options, "gtk-main-page-custom-input"); + + if (option != NULL && option->type == GTK_PRINTER_OPTION_TYPE_FILESAVE) + { + filename = g_filename_from_uri (option->value, NULL, NULL); + + if (filename != NULL && g_file_test (filename, G_FILE_TEST_EXISTS)) + { + toplevel = get_toplevel (GTK_WIDGET (print_dialog)); + + basename = g_path_get_basename (filename); + dirname = g_path_get_dirname (filename); + + dialog = gtk_message_dialog_new (toplevel, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + _("A file named \"%s\" already exists. Do you want to replace it?"), + basename); + + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + _("The file already exists in \"%s\". Replacing it will " + "overwrite its contents."), + dirname); + + gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + add_custom_button_to_dialog (GTK_DIALOG (dialog), _("_Replace"), GTK_STOCK_PRINT, GTK_RESPONSE_ACCEPT); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT); + + if (toplevel->group) + gtk_window_group_add_window (toplevel->group, GTK_WINDOW (dialog)); + + response = gtk_dialog_run (GTK_DIALOG (dialog)); + + gtk_widget_destroy (dialog); + + if (response != GTK_RESPONSE_ACCEPT) + { + g_signal_stop_emission_by_name (print_dialog, "response"); + return TRUE; + } + + g_free (dirname); + g_free (basename); + } + + g_free (filename); + } + } + } + return FALSE; +} + static void gtk_print_unix_dialog_init (GtkPrintUnixDialog *dialog) { @@ -289,6 +398,11 @@ gtk_print_unix_dialog_init (GtkPrintUnixDialog *dialog) (GCallback) gtk_print_unix_dialog_destroy, NULL); + g_signal_connect (dialog, + "response", + (GCallback) overwrite_confirmation_dialog, + NULL); + priv->preview_button = gtk_button_new_from_stock (GTK_STOCK_PRINT_PREVIEW); gtk_widget_show (priv->preview_button);