Add an overwrite confirmation dialog for print-to-file. (#474302, Marek

2008-03-12  Matthias Clasen  <mclasen@redhat.com>

        * gtk/gtkprintunixdialog.c: Add an overwrite confirmation
        dialog for print-to-file.  (#474302, Marek Kašík)



svn path=/trunk/; revision=19787
This commit is contained in:
Matthias Clasen 2008-03-12 18:02:29 +00:00 committed by Matthias Clasen
parent b1f8302299
commit b7aeafa395
2 changed files with 119 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2008-03-12 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkprintunixdialog.c: Add an overwrite confirmation
dialog for print-to-file. (#474302, Marek Kašík)
2008-03-12 Matthias Clasen <mclasen@redhat.com>
* modules/printbackends/cups/gtkprintbackendcups.c: Fix a crash

View File

@ -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);