psppire-output-window: Insert a half-line of space between output items.
[pspp-builds.git] / src / ui / gui / psppire-output-window.c
index 5aba7c90fe857538e6a7825f285ddf3efb0e691f..658d36a4669f7d9aecb236a25214678ead7f4444 100644 (file)
 
 #include <config.h>
 
-#include <gtk/gtksignal.h>
-#include <gtk/gtkbox.h>
-#include "helper.h"
-
-#include <libpspp/cast.h>
-#include <libpspp/message.h>
-#include <libpspp/string-map.h>
-#include <output/cairo.h>
-#include <output/chart-item.h>
-#include <output/driver-provider.h>
-#include <output/output-item.h>
-#include <output/table-item.h>
-#include <output/text-item.h>
-#include <output/tab.h>
+#include <errno.h>
+#include <gtk/gtk.h>
 #include <stdlib.h>
-
-#include "help-menu.h"
-
-#include "psppire-output-window.h"
-
-
-#include "xalloc.h"
-
-#include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/types.h>
 #include <unistd.h>
 
+#include "libpspp/cast.h"
+#include "libpspp/message.h"
+#include "libpspp/string-map.h"
+#include "output/cairo.h"
+#include "output/chart-item.h"
+#include "output/driver-provider.h"
+#include "output/output-item.h"
+#include "output/tab.h"
+#include "output/table-item.h"
+#include "output/text-item.h"
+#include "ui/gui/help-menu.h"
+#include "ui/gui/helper.h"
+#include "ui/gui/psppire-output-window.h"
+
+#include "gl/error.h"
+#include "gl/tmpdir.h"
+#include "gl/xalloc.h"
+
 #include <gettext.h>
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
@@ -111,7 +109,8 @@ psppire_output_window_dispose (GObject *obj)
   viewer->items = NULL;
   viewer->n_items = viewer->allocated_items = 0;
 
-  g_object_unref (viewer->print_settings);
+  if (viewer->print_settings != NULL)
+    g_object_unref (viewer->print_settings);
 
   /* Chain up to the parent class */
   G_OBJECT_CLASS (parent_class)->dispose (obj);
@@ -150,6 +149,7 @@ struct psppire_output_driver
     struct output_driver driver;
     PsppireOutputWindow *viewer;
     struct xr_driver *xr;
+    int font_height;
   };
 
 static struct output_driver_class psppire_output_class;
@@ -168,7 +168,8 @@ expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
   cairo_t *cr;
 
   cr = gdk_cairo_create (widget->window);
-  xr_rendering_draw (r, cr);
+  xr_rendering_draw (r, cr, event->area.x, event->area.y,
+                     event->area.width, event->area.height);
   cairo_destroy (cr);
 
   return TRUE;
@@ -222,8 +223,10 @@ psppire_output_submit (struct output_driver *this,
     {
       const GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (viewer));
       struct string_map options = STRING_MAP_INITIALIZER (options);
+      struct text_item *text_item;
       PangoFontDescription *font_desc;
       char *font_name;
+      int font_width;
 
       /* Use GTK+ default font as proportional font. */
       font_name = pango_font_description_to_string (style->font_desc);
@@ -244,7 +247,6 @@ psppire_output_submit (struct output_driver *this,
          it is already close enough to INT_MAX when expressed as thousands of a
          point.) */
       string_map_insert (&options, "paper-size", "300x200000mm");
-      string_map_insert (&options, "headers", "off");
       string_map_insert (&options, "left-margin", "0");
       string_map_insert (&options, "right-margin", "0");
       string_map_insert (&options, "top-margin", "0");
@@ -253,7 +255,15 @@ psppire_output_submit (struct output_driver *this,
       pod->xr = xr_driver_create (cr, &options);
 
       string_map_destroy (&options);
+
+      text_item = text_item_create (TEXT_ITEM_PARAGRAPH, "X");
+      r = xr_rendering_create (pod->xr, text_item_super (text_item), cr);
+      xr_rendering_measure (r, &font_width, &pod->font_height);
+      /* xr_rendering_destroy (r); */
+      text_item_unref (text_item);
     }
+  else
+    pod->viewer->y += pod->font_height / 2;
 
   r = xr_rendering_create (pod->xr, item, cr);
   if (r == NULL)
@@ -454,7 +464,7 @@ enum
 #define N_EXTENTIONS (n_FT - 1)
 
 struct file_types ft[n_FT] = {
-  {N_("Infer file type from extention"),  NULL},
+  {N_("Infer file type from extension"),  NULL},
   {N_("PDF (*.pdf)"),                     ".pdf"},
   {N_("HTML (*.html)"),                   ".html"},
   {N_("OpenDocument (*.odt)"),            ".odt"},
@@ -800,7 +810,7 @@ clipboard_get_cb (GtkClipboard     *clipboard,
   gsize length;
   gchar *text = NULL;
   struct output_driver *driver = NULL;
-  char *filename = NULL;
+  char dirname[PATH_MAX], *filename;
   struct string_map options;
 
   GtkTreeSelection *sel = gtk_tree_view_get_selection (window->overview);
@@ -812,8 +822,15 @@ clipboard_get_cb (GtkClipboard     *clipboard,
   if ( n == NULL)
     return;
 
+  if (path_search (dirname, sizeof dirname, NULL, NULL, true)
+      || mkdtemp (dirname) == NULL)
+    {
+      error (0, errno, _("failed to create temporary directory"));
+      return;
+    }
+  filename = xasprintf ("%s/clip.tmp", dirname);
+
   string_map_init (&options);
-  filename = tempnam (NULL, NULL);
   string_map_insert (&options, "output-file", filename);
 
   switch (info)
@@ -883,6 +900,7 @@ clipboard_get_cb (GtkClipboard     *clipboard,
 
   unlink (filename);
   free (filename);
+  rmdir (dirname);
 
   g_list_free (rows);
 }
@@ -1037,7 +1055,8 @@ GtkWidget*
 psppire_output_window_new (void)
 {
   return GTK_WIDGET (g_object_new (psppire_output_window_get_type (),
-                                  "filename", "Output",
+                                  /* TRANSLATORS: This will form a filename.  Please avoid whitespace. */
+                                  "filename", _("Output"),
                                   "description", _("Output Viewer"),
                                   NULL));
 }