]> Pileus Git - ~andy/gtk/blobdiff - tests/print-editor.c
Use accessor functions to access GtkNotebook
[~andy/gtk] / tests / print-editor.c
index b18cbe83163c0f39ac8012eeb05ddd1bb69cb5cc..b476e013cd5440138d6fd60c119fc8942ea1732e 100644 (file)
@@ -1,7 +1,6 @@
 #include <math.h>
 #include <pango/pangocairo.h>
 #include <gtk/gtk.h>
-#include <gtk/gtkprintoperation.h>
 
 static GtkWidget *main_window;
 static char *filename = NULL;
@@ -363,6 +362,8 @@ draw_page (GtkPrintOperation *operation,
     }
   while (i < end &&
         pango_layout_iter_next_line (iter));
+
+  pango_layout_iter_free (iter);
 }
 
 static void
@@ -370,9 +371,6 @@ do_page_setup (GtkAction *action)
 {
   GtkPageSetup *new_page_setup;
 
-  if (settings == NULL)
-    settings = gtk_print_settings_new ();
-  
   new_page_setup = gtk_print_run_page_setup_dialog (GTK_WINDOW (main_window),
                                                    page_setup, settings);
 
@@ -497,7 +495,7 @@ preview_got_page_size (GtkPrintOperationPreview *preview,
 
   dpi_x = pop->area->allocation.width/w;
   dpi_y = pop->area->allocation.height/h;
-  
+
   if (fabs (dpi_x - pop->dpi_x) > 0.001 ||
       fabs (dpi_y - pop->dpi_y) > 0.001)
     {
@@ -531,7 +529,7 @@ preview_destroy (GtkWindow *window,
 }
 
 static gboolean 
-do_preview (GtkPrintOperation        *op,
+preview_cb (GtkPrintOperation        *op,
            GtkPrintOperationPreview *preview,
            GtkPrintContext          *context,
            GtkWindow                *parent,
@@ -579,7 +577,7 @@ do_preview (GtkPrintOperation        *op,
   gtk_print_context_set_cairo_context (context, cr, 72, 72);
   cairo_destroy (cr);
   
-  pop->op = op;
+  pop->op = g_object_ref (op);
   pop->preview = preview;
   pop->spin = page;
   pop->area = da;
@@ -603,18 +601,66 @@ do_preview (GtkPrintOperation        *op,
   return TRUE;
 }
 
-/* FIXME had to move this to the heap, since previewing
- * returns too early from the sync api 
- */
-PrintData *print_data;
+static void
+print_done (GtkPrintOperation *op,
+           GtkPrintOperationResult res,
+           PrintData *print_data)
+{
+  GError *error = NULL;
+
+  if (res == GTK_PRINT_OPERATION_RESULT_ERROR)
+    {
+
+      GtkWidget *error_dialog;
+      
+      gtk_print_operation_get_error (op, &error);
+      
+      error_dialog = gtk_message_dialog_new (GTK_WINDOW (main_window),
+                                            GTK_DIALOG_DESTROY_WITH_PARENT,
+                                            GTK_MESSAGE_ERROR,
+                                            GTK_BUTTONS_CLOSE,
+                                            "Error printing file:\n%s",
+                                            error ? error->message : "no details");
+      g_signal_connect (error_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
+      gtk_widget_show (error_dialog);
+    }
+  else if (res == GTK_PRINT_OPERATION_RESULT_APPLY)
+    {
+      if (settings != NULL)
+       g_object_unref (settings);
+      settings = g_object_ref (gtk_print_operation_get_print_settings (op));
+    }
+
+  g_free (print_data->text);
+  g_free (print_data->font);
+  g_free (print_data);
+  
+  if (!gtk_print_operation_is_finished (op))
+    {
+      g_object_ref (op);
+      active_prints = g_list_append (active_prints, op);
+      update_statusbar ();
+      
+      /* This ref is unref:ed when we get the final state change */
+      g_signal_connect (op, "status_changed",
+                       G_CALLBACK (status_changed_cb), NULL);
+    }
+}
+
+static void
+end_print (GtkPrintOperation *op, GtkPrintContext *context, PrintData *print_data)
+{
+  g_list_free (print_data->page_breaks);
+  print_data->page_breaks = NULL;
+  g_object_unref (print_data->layout);
+  print_data->layout = NULL;
+}
 
 static void
-do_print (GtkAction *action)
+do_print_or_preview (GtkAction *action, GtkPrintOperationAction print_action)
 {
-  GtkWidget *error_dialog;
   GtkPrintOperation *print;
-  GtkPrintOperationResult res;
-  GError *error;
+  PrintData *print_data;
 
   print_data = g_new0 (PrintData, 1);
 
@@ -632,54 +678,34 @@ do_print (GtkAction *action)
     gtk_print_operation_set_default_page_setup (print, page_setup);
   
   g_signal_connect (print, "begin_print", G_CALLBACK (begin_print), print_data);
+  g_signal_connect (print, "end-print", G_CALLBACK (end_print), print_data);
   g_signal_connect (print, "draw_page", G_CALLBACK (draw_page), print_data);
   g_signal_connect (print, "create_custom_widget", G_CALLBACK (create_custom_widget), print_data);
   g_signal_connect (print, "custom_widget_apply", G_CALLBACK (custom_widget_apply), print_data);
-  g_signal_connect (print, "preview", G_CALLBACK (do_preview), print_data);
-
-  error = NULL;
+  g_signal_connect (print, "preview", G_CALLBACK (preview_cb), print_data);
 
-#if 1
-  res = gtk_print_operation_run (print, GTK_WINDOW (main_window), &error);
+  g_signal_connect (print, "done", G_CALLBACK (print_done), print_data);
 
-  if (res == GTK_PRINT_OPERATION_RESULT_ERROR)
-    {
-      error_dialog = gtk_message_dialog_new (GTK_WINDOW (main_window),
-                                            GTK_DIALOG_DESTROY_WITH_PARENT,
-                                            GTK_MESSAGE_ERROR,
-                                            GTK_BUTTONS_CLOSE,
-                                            "Error printing file:\n%s",
-                                            error ? error->message : "no details");
-      g_signal_connect (error_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
-      gtk_widget_show (error_dialog);
-      g_error_free (error);
-    }
-  else if (res == GTK_PRINT_OPERATION_RESULT_APPLY)
-    {
-      if (settings != NULL)
-       g_object_unref (settings);
-      settings = g_object_ref (gtk_print_operation_get_print_settings (print));
-    }
+  gtk_print_operation_set_export_filename (print, "test.pdf");
 
-  if (!gtk_print_operation_is_finished (print))
-    {
-      g_object_ref (print);
-      active_prints = g_list_append (active_prints, print);
-      update_statusbar ();
-      
-      /* This ref is unref:ed when we get the final state change */
-      g_signal_connect (print, "status_changed",
-                       G_CALLBACK (status_changed_cb), NULL);
-    }
-#else
-  gtk_print_operation_run_async (print, GTK_WINDOW (main_window));
+#if 0
+  gtk_print_operation_set_allow_async (print, TRUE);
 #endif
+  gtk_print_operation_run (print, print_action, GTK_WINDOW (main_window), NULL);
 
   g_object_unref (print);
-#if 0
-  g_free (print_data.text);
-  g_free (print_data.font);
-#endif
+}
+
+static void
+do_print (GtkAction *action)
+{
+  do_print_or_preview (action, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
+}
+
+static void
+do_preview (GtkAction *action)
+{
+  do_print_or_preview (action, GTK_PRINT_OPERATION_ACTION_PREVIEW);
 }
 
 static void
@@ -735,10 +761,14 @@ static GtkActionEntry entries[] = {
     "Page _Setup", NULL,                       /* label, accelerator */     
     "Set up the page",                         /* tooltip */
     G_CALLBACK (do_page_setup) },
+  { "Preview", NULL,                           /* name, stock id */
+    "Print Preview", NULL,                     /* label, accelerator */     
+    "Preview the printed document",            /* tooltip */
+    G_CALLBACK (do_preview) },
   { "Print", GTK_STOCK_PRINT,                  /* name, stock id */
      NULL, NULL,                               /* label, accelerator */     
     "Print the document",                      /* tooltip */
-    G_CALLBACK (do_print) },
+    G_CALLBACK (do_print) }
 };
 static guint n_entries = G_N_ELEMENTS (entries);
 
@@ -751,6 +781,7 @@ static const gchar *ui_info =
 "      <menuitem action='Save'/>"
 "      <menuitem action='SaveAs'/>"
 "      <menuitem action='PageSetup'/>"
+"      <menuitem action='Preview'/>"
 "      <menuitem action='Print'/>"
 "      <separator/>"
 "      <menuitem action='Quit'/>"
@@ -803,9 +834,14 @@ create_window (void)
   GtkWidget *sw;
   GtkActionGroup *actions;
   GError *error;
+  GtkWindowGroup *group;
   
   main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
+  group = gtk_window_group_new ();
+  gtk_window_group_add_window (group, GTK_WINDOW (main_window));
+  g_object_unref (group);
+
   gtk_window_set_default_size (GTK_WINDOW (main_window),
                               400, 600);
   
@@ -902,14 +938,42 @@ create_window (void)
 int
 main (int argc, char **argv)
 {
+  GError *error = NULL;
+
   g_set_application_name ("Print editor");
   gtk_init (&argc, &argv);
 
+  settings = gtk_print_settings_new_from_file ("print-settings.ini", &error);
+  if (error) {
+    g_print ("Failed to load print settings: %s\n", error->message);
+    g_clear_error (&error);
+
+    settings = gtk_print_settings_new ();
+  }
+  g_assert (settings != NULL);
+
+  page_setup = gtk_page_setup_new_from_file ("page-setup.ini", &error);
+  if (error) {
+    g_print ("Failed to load page setup: %s\n", error->message);
+    g_clear_error (&error);
+  }
+
   create_window ();
 
   if (argc == 2)
     load_file (argv[1]);
   
   gtk_main ();
+
+  if (!gtk_print_settings_to_file (settings, "print-settings.ini", &error)) {
+    g_print ("Failed to save print settings: %s\n", error->message);
+    g_clear_error (&error);
+  }
+  if (page_setup &&
+      !gtk_page_setup_to_file (page_setup, "page-setup.ini", &error)) {
+    g_print ("Failed to save page setup: %s\n", error->message);
+    g_clear_error (&error);
+  }
+
   return 0;
 }