gtk+ r19787 - in trunk: . gtk
- From: matthiasc svn gnome org
- To: svn-commits-list gnome org
- Subject: gtk+ r19787 - in trunk: . gtk
- Date: Wed, 12 Mar 2008 18:02:30 +0000 (GMT)
Author: matthiasc
Date: Wed Mar 12 18:02:29 2008
New Revision: 19787
URL: http://svn.gnome.org/viewvc/gtk+?rev=19787&view=rev
Log:
2008-03-12 Matthias Clasen <mclasen redhat com>
* gtk/gtkprintunixdialog.c: Add an overwrite confirmation
dialog for print-to-file. (#474302, Marek KaÅÃk)
Modified:
trunk/ChangeLog
trunk/gtk/gtkprintunixdialog.c
Modified: trunk/gtk/gtkprintunixdialog.c
==============================================================================
--- trunk/gtk/gtkprintunixdialog.c (original)
+++ trunk/gtk/gtkprintunixdialog.c Wed Mar 12 18:02:29 2008
@@ -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 @@
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 @@
(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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]