Sheet Grid Lines: Correct positioning.
[pspp] / src / ui / gui / pspp-sheet-view.c
index 138f86fd4213df848fec6491d71e2238aef1e39e..709adea3918cce671c5ea330f307be89acbda23c 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2011, 2012, 2013 Free Software Foundation, Inc.
+   Copyright (C) 2011, 2012, 2013, 2015 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -1523,11 +1523,7 @@ pspp_sheet_view_realize (GtkWidget *widget)
                            &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
 
-#if GTK_CHECK_VERSION(3,8,0)
   gtk_widget_register_window (widget, window);
-#else
-  gdk_window_set_user_data (window, widget);
-#endif
   gtk_widget_get_allocation (widget, &allocation);
 
   /* Make the window for the tree */
@@ -1546,11 +1542,7 @@ pspp_sheet_view_realize (GtkWidget *widget)
 
   tree_view->priv->bin_window = gdk_window_new (window,
                                                &attributes, attributes_mask);
-#if GTK_CHECK_VERSION(3,8,0)
   gtk_widget_register_window (widget, tree_view->priv->bin_window);
-#else
-  gdk_window_set_user_data (tree_view->priv->bin_window, widget);
-#endif
   gtk_widget_get_allocation (widget, &allocation);
 
   /* Make the column header window */
@@ -1568,11 +1560,7 @@ pspp_sheet_view_realize (GtkWidget *widget)
 
   tree_view->priv->header_window = gdk_window_new (window,
                                                   &attributes, attributes_mask);
-#if GTK_CHECK_VERSION(3,8,0)
   gtk_widget_register_window (widget, tree_view->priv->header_window);
-#else
-  gdk_window_set_user_data (tree_view->priv->header_window, widget);
-#endif
 
   { /* Ensure Background */
     GtkStyleContext *context;
@@ -1782,7 +1770,9 @@ pspp_sheet_view_size_request (GtkWidget      *widget,
       tmp_list = tmp_list->next;
 
       if (gtk_widget_get_visible (child->widget))
-        gtk_widget_size_request (child->widget, &child_requisition);
+       {
+         gtk_widget_get_preferred_size (child->widget, NULL, &child_requisition);
+       }
     }
 }
 
@@ -2042,6 +2032,9 @@ pspp_sheet_view_size_allocate (GtkWidget     *widget,
   if (allocation->width != old_allocation.width)
     width_changed = TRUE;
 
+  if (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL)   
+    allocation->x += allocation->width - tree_view->priv->width ;
+
   gtk_widget_set_allocation (widget, allocation);
 
   /* We size-allocate the columns first because the width of the
@@ -2576,11 +2569,14 @@ pspp_sheet_view_button_press (GtkWidget      *widget,
        {
          gpointer drag_data;
 
-         if (gdk_pointer_grab (column->window, FALSE,
-                               GDK_POINTER_MOTION_HINT_MASK |
-                               GDK_BUTTON1_MOTION_MASK |
-                               GDK_BUTTON_RELEASE_MASK,
-                               NULL, NULL, event->time))
+         if (GDK_GRAB_SUCCESS != gdk_device_grab (event->device,
+                                                  column->window,
+                                                  GDK_OWNERSHIP_NONE,
+                                                  FALSE,
+                                                  GDK_POINTER_MOTION_HINT_MASK |
+                                                  GDK_BUTTON1_MOTION_MASK |
+                                                  GDK_BUTTON_RELEASE_MASK,
+                                                  NULL, event->time))
            return FALSE;
 
          gtk_grab_add (widget);
@@ -2696,8 +2692,8 @@ pspp_sheet_view_button_release_column_resize (GtkWidget      *widget,
 
   PSPP_SHEET_VIEW_UNSET_FLAG (tree_view, PSPP_SHEET_VIEW_IN_COLUMN_RESIZE);
   gtk_grab_remove (widget);
-  gdk_display_pointer_ungrab (gdk_window_get_display (event->window),
-                             event->time);
+  gdk_device_ungrab (event->device, event->time);
+
   return TRUE;
 }
 
@@ -3832,35 +3828,30 @@ pspp_sheet_view_draw_vertical_grid_lines (PsppSheetView    *tree_view,
                                          gint max_y)
 {
   GList *list = tree_view->priv->columns;
-  gint i = 0;
-  gint current_x = 0;
+  gint x = 0;
 
   if (tree_view->priv->grid_lines != PSPP_SHEET_VIEW_GRID_LINES_VERTICAL
       && tree_view->priv->grid_lines != PSPP_SHEET_VIEW_GRID_LINES_BOTH)
     return;
 
   /* Only draw the lines for visible rows and columns */
-  for (list = tree_view->priv->columns; list; list = list->next, i++)
+  gboolean rtl = (gtk_widget_get_direction (GTK_WIDGET (tree_view)) == GTK_TEXT_DIR_RTL);
+
+  for (list = (rtl ? g_list_last (tree_view->priv->columns) : g_list_first (tree_view->priv->columns));
+       list;
+       list = (rtl ? list->prev : list->next))
     {
       PsppSheetViewColumn *column = list->data;
-      gint x;
 
       if (! column->visible)
        continue;
 
-      current_x += column->width;
-
-      /* Generally the grid lines should fit within the column, but for the
-         last visible column we put it just past the end of the column.
-         (Otherwise horizontal grid lines sometimes stick out by one pixel.) */
-      x = current_x;
-      if (i != n_visible_columns - 1)
-        x--;
+      x += column->width;
 
       cairo_set_line_width (cr, 1.0);
       cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
       cairo_move_to (cr, x + 0.5, min_y);
-      cairo_line_to (cr, x + 0.5, max_y - min_y);
+      cairo_line_to (cr, x + 0.5, max_y - min_y - 0.5);
       cairo_stroke (cr);
     }
 }
@@ -3897,7 +3888,6 @@ pspp_sheet_view_draw_bin (GtkWidget      *widget,
   gint horizontal_separator;
   gint focus_line_width;
   gboolean allow_rules;
-  gboolean has_special_cell;
   gboolean rtl;
   gint n_visible_columns;
   gint grid_line_width;
@@ -4054,27 +4044,6 @@ pspp_sheet_view_draw_bin (GtkWidget      *widget,
 
       parity = node % 2;
 
-      if (tree_view->priv->special_cells == PSPP_SHEET_VIEW_SPECIAL_CELLS_DETECT)
-        {
-          /* we *need* to set cell data on all cells before the call
-           * to _has_special_cell, else _has_special_cell() does not
-           * return a correct value.
-           */
-          for (list = (rtl ? g_list_last (tree_view->priv->columns) : g_list_first (tree_view->priv->columns));
-               list;
-               list = (rtl ? list->prev : list->next))
-            {
-              PsppSheetViewColumn *column = list->data;
-              pspp_sheet_view_column_cell_set_cell_data (column,
-                                                         tree_view->priv->model,
-                                                         &iter);
-            }
-
-          has_special_cell = pspp_sheet_view_has_special_cell (tree_view);
-        }
-      else
-        has_special_cell = tree_view->priv->special_cells == PSPP_SHEET_VIEW_SPECIAL_CELLS_YES;
-
       for (list = (rtl ? g_list_last (tree_view->priv->columns) : g_list_first (tree_view->priv->columns));
           list;
           list = (rtl ? list->prev : list->next))
@@ -5156,7 +5125,6 @@ validate_visible_area (PsppSheetView *tree_view)
   GtkTreePath *above_path = NULL;
   GtkTreeIter iter;
   int node = -1;
-  gboolean size_changed = FALSE;
   gint total_height;
   gint area_above = 0;
   gint area_below = 0;
@@ -5330,23 +5298,6 @@ validate_visible_area (PsppSheetView *tree_view)
   pspp_sheet_view_set_top_row (tree_view, above_path, -area_above);
   pspp_sheet_view_top_row_to_dy (tree_view);
 
-  /* update width/height and queue a resize */
-  if (size_changed)
-    {
-      GtkRequisition requisition;
-
-      /* We temporarily guess a size, under the assumption that it will be the
-       * same when we get our next size_allocate.  If we don't do this, we'll be
-       * in an inconsistent state if we call top_row_to_dy. */
-
-      gtk_widget_size_request (GTK_WIDGET (tree_view), &requisition);
-      gtk_adjustment_set_upper (tree_view->priv->hadjustment, MAX (gtk_adjustment_get_upper (tree_view->priv->hadjustment), (gfloat)requisition.width));
-      gtk_adjustment_set_upper (tree_view->priv->vadjustment, MAX (gtk_adjustment_get_upper (tree_view->priv->vadjustment), (gfloat)requisition.height));
-      gtk_adjustment_changed (tree_view->priv->hadjustment);
-      gtk_adjustment_changed (tree_view->priv->vadjustment);
-      gtk_widget_queue_resize (GTK_WIDGET (tree_view));
-    }
-
   gtk_tree_row_reference_free (tree_view->priv->scroll_to_path);
   tree_view->priv->scroll_to_path = NULL;
 
@@ -5417,7 +5368,7 @@ do_presize_handler (PsppSheetView *tree_view)
   if (! gtk_widget_get_realized (GTK_WIDGET (tree_view)))
     return FALSE;
 
-  gtk_widget_size_request (GTK_WIDGET (tree_view), &requisition);
+  gtk_widget_get_preferred_size (GTK_WIDGET (tree_view), NULL, &requisition);
 
   gtk_adjustment_set_upper (tree_view->priv->hadjustment, MAX (gtk_adjustment_get_upper (tree_view->priv->hadjustment), (gfloat)requisition.width));
   gtk_adjustment_set_upper (tree_view->priv->vadjustment, MAX (gtk_adjustment_get_upper (tree_view->priv->vadjustment), (gfloat)requisition.height));
@@ -8588,7 +8539,7 @@ pspp_sheet_view_ensure_interactive_directory (PsppSheetView *tree_view)
   gtk_widget_show (frame);
   gtk_container_add (GTK_CONTAINER (tree_view->priv->search_window), frame);
 
-  vbox = gtk_vbox_new (FALSE, 0);
+  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
   gtk_widget_show (vbox);
   gtk_container_add (GTK_CONTAINER (frame), vbox);
   gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);
@@ -12444,7 +12395,6 @@ pspp_sheet_view_real_start_editing (PsppSheetView       *tree_view,
 {
   PsppSheetSelectionMode mode = pspp_sheet_selection_get_mode (tree_view->priv->selection);
   gint pre_val = gtk_adjustment_get_value (tree_view->priv->vadjustment);
-  GtkRequisition requisition;
   gint row;
 
   g_return_if_fail (gtk_tree_path_get_depth (path) == 1);