Fix bug rendering margin in output viewer.
[pspp] / src / ui / gui / psppire-output-view.c
index 93e9e2f6e0a5232289b390ac7e2a13a718225b3f..a7367ed76a9d85723d195e2ce98b21035c57463b 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;
@@ -160,11 +160,34 @@ create_xr (struct psppire_output_view *view)
   cairo_destroy (cr);
 }
 
+/* Return the horizontal position to place a widget whose 
+   width is CHILD_WIDTH */
+static gint
+get_xpos (const struct psppire_output_view *view, gint child_width)
+{
+  GdkWindow *gdkw = gtk_widget_get_window (GTK_WIDGET (view->output));
+  guint w = gdk_window_get_width (gdkw);
+  int gutter = 0;
+  g_object_get (view->output, "border-width", &gutter, NULL);
+  return (gtk_widget_get_direction (GTK_WIDGET (view->output)) ==  GTK_TEXT_DIR_RTL) ? w - child_width - gutter: gutter;
+}
+
 static void
 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);
 
@@ -172,7 +195,9 @@ create_drawing_area (struct psppire_output_view *view,
                     G_CALLBACK (draw_callback), view);
 
   gtk_widget_set_size_request (drawing_area, tw, th);
-  gtk_layout_put (view->output, drawing_area, 0, view->y);
+  gint xpos = get_xpos (view, tw);
+
+  gtk_layout_put (view->output, drawing_area, xpos, view->y);
 
   gtk_widget_show (drawing_area);
 }
@@ -181,13 +206,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 +235,8 @@ rerender (struct psppire_output_view *view)
 
       xr_rendering_measure (r, &tw, &th);
 
+      gint xpos = get_xpos (view, tw);
+
       if (!item->drawing_area)
         {
           item->drawing_area = gtk_drawing_area_new ();
@@ -218,10 +247,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 +373,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);