Add a silent zone "gutter" to the output viewer.
[pspp] / src / ui / gui / psppire-output-view.c
index 93e9e2f6e0a5232289b390ac7e2a13a718225b3f..ca3f9dc60523d0e775584ef478fe3d5f812acee4 100644 (file)
@@ -54,7 +54,7 @@ struct psppire_output_view
     GtkLayout *output;
     int render_width;
     int max_width;
-    int y;
+    glong y;
 
     struct string_map render_opts;
     GtkTreeView *overview;
@@ -165,6 +165,17 @@ create_drawing_area (struct psppire_output_view *view,
                      GtkWidget *drawing_area, struct xr_rendering *r,
                      int tw, int th)
 {
+  /* Enable this to help with debugging.  It shows you which widgets are being
+     put where. */
+  if (0)
+    {
+      GdkRGBA green = {0, 1, 0, 1};
+      gtk_widget_override_background_color (GTK_WIDGET (view->output),
+                                           GTK_STATE_NORMAL, &green);
+      GdkRGBA red = {1, 0, 0, 1};
+      gtk_widget_override_background_color (drawing_area, GTK_STATE_NORMAL, &red);
+    }
+
   g_object_set_data_full (G_OBJECT (drawing_area),
                           "rendering", r, free_rendering);
 
@@ -181,13 +192,15 @@ static void
 rerender (struct psppire_output_view *view)
 {
   struct output_view_item *item;
+  GdkWindow *gdkw = gtk_widget_get_window (GTK_WIDGET (view->output));
   cairo_t *cr;
 
-  if (!view->n_items || !gtk_widget_get_window (GTK_WIDGET (view->output)))
+  if (!view->n_items || ! gdkw)
     return;
 
-  cr = gdk_cairo_create (gtk_widget_get_window (GTK_WIDGET (view->output)));
-
+  cr = gdk_cairo_create (gdkw);
+  if (view->xr == NULL)
+    create_xr (view);
   view->y = 0;
   view->max_width = 0;
   for (item = view->items; item < &view->items[view->n_items]; item++)
@@ -208,6 +221,10 @@ rerender (struct psppire_output_view *view)
 
       xr_rendering_measure (r, &tw, &th);
 
+      guint w = gdk_window_get_width (gdkw);
+      const gint gutter = 5;
+      gint xpos = (gtk_widget_get_direction (GTK_WIDGET (view->output)) ==  GTK_TEXT_DIR_RTL) ? w - tw - gutter: gutter;
+
       if (!item->drawing_area)
         {
           item->drawing_area = gtk_drawing_area_new ();
@@ -218,10 +235,10 @@ rerender (struct psppire_output_view *view)
           g_object_set_data_full (G_OBJECT (item->drawing_area),
                                   "rendering", r, free_rendering);
           gtk_widget_set_size_request (item->drawing_area, tw, th);
-          gtk_layout_move (view->output, item->drawing_area, 0, view->y);
+          gtk_layout_move (view->output, item->drawing_area, xpos, view->y);
         }
 
-      alloc.x = 0;
+      alloc.x = xpos;
       alloc.y = view->y;
       alloc.width = tw;
       alloc.height = th;
@@ -344,7 +361,7 @@ psppire_output_view_put (struct psppire_output_view *view,
       gtk_tree_store_set (store, &iter,
                           COL_NAME, ds_cstr (&name),
                          COL_ADDR, item,
-                          COL_Y, (glong)(view->y),
+                          COL_Y, (view->y),
                           -1);
       ds_destroy (&name);