gtk+ r19787 - in trunk: . gtk



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]