gui: Fix behavior of print preview in psppire-output-window.
[pspp-builds.git] / src / ui / gui / psppire-output-window.c
index 4793b3b305b007f8d10480ebf01875df96d29467..8c8f0768b7eb3354ba08f793b59f77519501ac44 100644 (file)
@@ -374,9 +374,8 @@ psppire_output_window_setup (void)
                       SETTINGS_DEVICE_UNFILTERED);
   output_driver_register (d);
 }
+
 \f
-int viewer_length = 16;
-int viewer_width = 59;
 
 /* Callback for the "delete" action (clicking the x on the top right
    hand corner of the window) */
@@ -469,7 +468,7 @@ enum
     n_FT
   };
 
-#define N_EXTENTIONS (n_FT - 1)
+#define N_EXTENSIONS (n_FT - 1)
 
 struct file_types ft[n_FT] = {
   {N_("Infer file type from extension"),  NULL},
@@ -504,7 +503,7 @@ on_combo_change (GtkFileChooser *chooser)
       if ( x != 0 )
        sensitive = TRUE;
 
-      for (i = 1 ; i < N_EXTENTIONS ; ++i)
+      for (i = 1 ; i < N_EXTENSIONS ; ++i)
        {
          if ( g_str_has_suffix (fn, ft[i].ext))
            {
@@ -558,7 +557,7 @@ create_file_type_list (void)
   GtkTreeIter iter;
   GtkListStore *list = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
   
-  for (i = 0 ; i < 6 ; ++i)
+  for (i = 0 ; i < n_FT ; ++i)
     {
       gtk_list_store_append (list, &iter);
       gtk_list_store_set (list, &iter,
@@ -629,7 +628,7 @@ psppire_output_window_export (PsppireOutputWindow *window)
       if (file_type == FT_AUTO)
        {
          gint i;
-         for (i = 1 ; i < N_EXTENTIONS ; ++i)
+         for (i = 1 ; i < N_EXTENSIONS ; ++i)
            {
              if ( g_str_has_suffix (filename, ft[i].ext))
                {
@@ -1000,10 +999,16 @@ paginate (GtkPrintOperation *operation,
          GtkPrintContext   *context,
          PsppireOutputWindow *window)
 {
-  if ( window->print_item < window->n_items )
+  if (window->paginated)
+    {
+      /* Sometimes GTK+ emits this signal again even after pagination is
+         complete.  Don't let that screw up printing. */
+      return TRUE;
+    }
+  else if ( window->print_item < window->n_items )
     {
       xr_driver_output_item (window->print_xrd, window->items[window->print_item++]);
-      if (xr_driver_need_new_page (window->print_xrd))
+      while (xr_driver_need_new_page (window->print_xrd))
        {
          xr_driver_next_page (window->print_xrd, NULL);
          window->print_n_pages ++;
@@ -1013,8 +1018,13 @@ paginate (GtkPrintOperation *operation,
   else
     {
       gtk_print_operation_set_n_pages (operation, window->print_n_pages);
-      window->print_item = 0;
+
+      /* Re-create the driver to do the real printing. */
+      xr_driver_destroy (window->print_xrd);
       create_xr_print_driver (context, window);
+      window->print_item = 0;
+      window->paginated = TRUE;
+
       return TRUE;
     }
 }
@@ -1028,6 +1038,7 @@ begin_print (GtkPrintOperation *operation,
 
   window->print_item = 0;
   window->print_n_pages = 1;
+  window->paginated = FALSE;
 }
 
 static void
@@ -1046,12 +1057,9 @@ draw_page (GtkPrintOperation *operation,
           PsppireOutputWindow *window)
 {
   xr_driver_next_page (window->print_xrd, gtk_print_context_get_cairo_context (context));
-  while ( window->print_item < window->n_items)
-    {
-      xr_driver_output_item (window->print_xrd, window->items [window->print_item++]);
-      if ( xr_driver_need_new_page (window->print_xrd) )
-         break;          
-    }
+  while (!xr_driver_need_new_page (window->print_xrd)
+         && window->print_item < window->n_items)
+    xr_driver_output_item (window->print_xrd, window->items [window->print_item++]);
 }