psppire-var-sheet: Refresh var sheet when variables change.
[pspp] / src / ui / gui / pspp-sheet-view.c
index 0219411a4688909d0782498fd1e93902d12e8329..c569d20403c201d967cbe7832349f71452141901 100644 (file)
@@ -160,8 +160,7 @@ static void     pspp_sheet_view_get_property         (GObject         *object,
                                                    GValue          *value,
                                                    GParamSpec      *pspec);
 
-/* gtkobject signals */
-static void     pspp_sheet_view_destroy              (GtkObject        *object);
+static void     pspp_sheet_view_dispose              (GObject        *object);
 
 /* gtkwidget signals */
 static void     pspp_sheet_view_realize              (GtkWidget        *widget);
@@ -444,7 +443,6 @@ static void
 pspp_sheet_view_class_init (PsppSheetViewClass *class)
 {
   GObjectClass *o_class;
-  GtkObjectClass *object_class;
   GtkWidgetClass *widget_class;
   GtkContainerClass *container_class;
   GtkBindingSet *binding_set[2];
@@ -456,7 +454,6 @@ pspp_sheet_view_class_init (PsppSheetViewClass *class)
   edit_bindings = binding_set[1];
 
   o_class = (GObjectClass *) class;
-  object_class = (GtkObjectClass *) class;
   widget_class = (GtkWidgetClass *) class;
   container_class = (GtkContainerClass *) class;
 
@@ -464,9 +461,7 @@ pspp_sheet_view_class_init (PsppSheetViewClass *class)
   o_class->set_property = pspp_sheet_view_set_property;
   o_class->get_property = pspp_sheet_view_get_property;
   o_class->finalize = pspp_sheet_view_finalize;
-
-  /* GtkObject signals */
-  object_class->destroy = pspp_sheet_view_destroy;
+  o_class->dispose = pspp_sheet_view_dispose;
 
   /* GtkWidget signals */
   widget_class->map = pspp_sheet_view_map;
@@ -823,7 +818,7 @@ pspp_sheet_view_class_init (PsppSheetViewClass *class)
 
   tree_view_signals[MOVE_CURSOR] =
     g_signal_new ("move-cursor",
-                 G_TYPE_FROM_CLASS (object_class),
+                 G_TYPE_FROM_CLASS (o_class),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (PsppSheetViewClass, move_cursor),
                  NULL, NULL,
@@ -834,7 +829,7 @@ pspp_sheet_view_class_init (PsppSheetViewClass *class)
 
   tree_view_signals[SELECT_ALL] =
     g_signal_new ("select-all",
-                 G_TYPE_FROM_CLASS (object_class),
+                 G_TYPE_FROM_CLASS (o_class),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (PsppSheetViewClass, select_all),
                  NULL, NULL,
@@ -843,7 +838,7 @@ pspp_sheet_view_class_init (PsppSheetViewClass *class)
 
   tree_view_signals[UNSELECT_ALL] =
     g_signal_new ("unselect-all",
-                 G_TYPE_FROM_CLASS (object_class),
+                 G_TYPE_FROM_CLASS (o_class),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (PsppSheetViewClass, unselect_all),
                  NULL, NULL,
@@ -852,7 +847,7 @@ pspp_sheet_view_class_init (PsppSheetViewClass *class)
 
   tree_view_signals[SELECT_CURSOR_ROW] =
     g_signal_new ("select-cursor-row",
-                 G_TYPE_FROM_CLASS (object_class),
+                 G_TYPE_FROM_CLASS (o_class),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (PsppSheetViewClass, select_cursor_row),
                  NULL, NULL,
@@ -862,7 +857,7 @@ pspp_sheet_view_class_init (PsppSheetViewClass *class)
 
   tree_view_signals[TOGGLE_CURSOR_ROW] =
     g_signal_new ("toggle-cursor-row",
-                 G_TYPE_FROM_CLASS (object_class),
+                 G_TYPE_FROM_CLASS (o_class),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (PsppSheetViewClass, toggle_cursor_row),
                  NULL, NULL,
@@ -871,7 +866,7 @@ pspp_sheet_view_class_init (PsppSheetViewClass *class)
 
   tree_view_signals[START_INTERACTIVE_SEARCH] =
     g_signal_new ("start-interactive-search",
-                 G_TYPE_FROM_CLASS (object_class),
+                 G_TYPE_FROM_CLASS (o_class),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (PsppSheetViewClass, start_interactive_search),
                  NULL, NULL,
@@ -1060,6 +1055,8 @@ pspp_sheet_view_init (PsppSheetView *tree_view)
   tree_view->priv->anchor_column = NULL;
 
   tree_view->priv->button_style = NULL;
+
+  tree_view->dispose_has_run = FALSE;
 }
 
 \f
@@ -1217,9 +1214,41 @@ pspp_sheet_view_get_property (GObject    *object,
 }
 
 static void
-pspp_sheet_view_finalize (GObject *object)
+pspp_sheet_view_dispose (GObject *object)
 {
-  G_OBJECT_CLASS (pspp_sheet_view_parent_class)->finalize (object);
+  PsppSheetView *tree_view = PSPP_SHEET_VIEW (object);
+
+  if (tree_view->dispose_has_run)
+    return;
+
+  tree_view->dispose_has_run = TRUE;
+
+  if (tree_view->priv->selection != NULL)
+    {
+      _pspp_sheet_selection_set_tree_view (tree_view->priv->selection, NULL);
+      g_object_unref (tree_view->priv->selection);
+      tree_view->priv->selection = NULL;
+    }
+
+  if (tree_view->priv->hadjustment)
+    {
+      g_object_unref (tree_view->priv->hadjustment);
+      tree_view->priv->hadjustment = NULL;
+    }
+  if (tree_view->priv->vadjustment)
+    {
+      g_object_unref (tree_view->priv->vadjustment);
+      tree_view->priv->vadjustment = NULL;
+    }
+
+  if (tree_view->priv->button_style)
+    {
+      g_object_unref (tree_view->priv->button_style);
+      tree_view->priv->button_style = NULL;
+    }
+
+
+  G_OBJECT_CLASS (pspp_sheet_view_parent_class)->dispose (object);
 }
 
 \f
@@ -1233,14 +1262,10 @@ pspp_sheet_view_buildable_add_child (GtkBuildable *tree_view,
   pspp_sheet_view_append_column (PSPP_SHEET_VIEW (tree_view), PSPP_SHEET_VIEW_COLUMN (child));
 }
 
-/* GtkObject Methods
- */
-
 static void
-pspp_sheet_view_destroy (GtkObject *object)
+pspp_sheet_view_finalize (GObject *object)
 {
   PsppSheetView *tree_view = PSPP_SHEET_VIEW (object);
-  GList *list;
 
   pspp_sheet_view_stop_editing (tree_view, TRUE);
 
@@ -1250,27 +1275,9 @@ pspp_sheet_view_destroy (GtkObject *object)
       tree_view->priv->selected = NULL;
     }
 
-  if (tree_view->priv->columns != NULL)
-    {
-      list = tree_view->priv->columns;
-      while (list)
-       {
-         PsppSheetViewColumn *column;
-         column = PSPP_SHEET_VIEW_COLUMN (list->data);
-         list = list->next;
-         pspp_sheet_view_remove_column (tree_view, column);
-       }
-      tree_view->priv->columns = NULL;
-    }
 
   tree_view->priv->prelight_node = -1;
 
-  if (tree_view->priv->selection != NULL)
-    {
-      _pspp_sheet_selection_set_tree_view (tree_view->priv->selection, NULL);
-      g_object_unref (tree_view->priv->selection);
-      tree_view->priv->selection = NULL;
-    }
 
   if (tree_view->priv->scroll_to_path != NULL)
     {
@@ -1337,24 +1344,8 @@ pspp_sheet_view_destroy (GtkObject *object)
 
   pspp_sheet_view_set_model (tree_view, NULL);
 
-  if (tree_view->priv->hadjustment)
-    {
-      g_object_unref (tree_view->priv->hadjustment);
-      tree_view->priv->hadjustment = NULL;
-    }
-  if (tree_view->priv->vadjustment)
-    {
-      g_object_unref (tree_view->priv->vadjustment);
-      tree_view->priv->vadjustment = NULL;
-    }
 
-  if (tree_view->priv->button_style)
-    {
-      g_object_unref (tree_view->priv->button_style);
-      tree_view->priv->button_style = NULL;
-    }
-
-  GTK_OBJECT_CLASS (pspp_sheet_view_parent_class)->destroy (object);
+  G_OBJECT_CLASS (pspp_sheet_view_parent_class)->finalize (object);
 }
 
 \f
@@ -1429,6 +1420,7 @@ pspp_sheet_view_map (GtkWidget *widget)
 static void
 pspp_sheet_view_realize (GtkWidget *widget)
 {
+  gint i;
   PsppSheetView *tree_view = PSPP_SHEET_VIEW (widget);
   GList *tmp_list;
   GdkWindowAttr attributes;
@@ -1510,15 +1502,24 @@ pspp_sheet_view_realize (GtkWidget *widget)
   pspp_sheet_view_set_grid_lines (tree_view, tree_view->priv->grid_lines);
 
   install_presize_handler (tree_view); 
+
+  for (i = 0; i < 5; ++i)
+    {
+      tree_view->priv->grid_line_gc[i] = gdk_gc_new (widget->window);
+      gdk_gc_copy (tree_view->priv->grid_line_gc[i], widget->style->text_aa_gc[i]);
+    }
 }
 
 static void
 pspp_sheet_view_unrealize (GtkWidget *widget)
 {
+  gint x;
   PsppSheetView *tree_view = PSPP_SHEET_VIEW (widget);
   PsppSheetViewPrivate *priv = tree_view->priv;
   GList *list;
 
+  GTK_WIDGET_CLASS (pspp_sheet_view_parent_class)->unrealize (widget);
+
   if (priv->scroll_timeout != 0)
     {
       g_source_remove (priv->scroll_timeout);
@@ -1580,13 +1581,21 @@ pspp_sheet_view_unrealize (GtkWidget *widget)
       priv->drag_highlight_window = NULL;
     }
 
-  if (priv->grid_line_gc)
+  for (x = 0 ; x < 5 ; ++x)
+    g_object_unref (priv->grid_line_gc[x]);
+
+  if (tree_view->priv->columns != NULL)
     {
-      g_object_unref (priv->grid_line_gc);
-      priv->grid_line_gc = NULL;
+      list = tree_view->priv->columns;
+      while (list)
+       {
+         PsppSheetViewColumn *column;
+         column = PSPP_SHEET_VIEW_COLUMN (list->data);
+         list = list->next;
+         pspp_sheet_view_remove_column (tree_view, column);
+       }
+      tree_view->priv->columns = NULL;
     }
-
-  GTK_WIDGET_CLASS (pspp_sheet_view_parent_class)->unrealize (widget);
 }
 
 /* GtkWidget::size_request helper */
@@ -3736,7 +3745,7 @@ pspp_sheet_view_draw_grid_lines (PsppSheetView    *tree_view,
       if (current_x - 1 >= event->area.x
           && current_x - 1 < event->area.x + event->area.width)
         gdk_draw_line (event->window,
-                       tree_view->priv->grid_line_gc,
+                       tree_view->priv->grid_line_gc[GTK_WIDGET(tree_view)->state],
                        current_x - 1, min_y,
                        current_x - 1, max_y - min_y);
     }
@@ -4119,14 +4128,14 @@ pspp_sheet_view_bin_expose (GtkWidget      *widget,
            {
              if (background_area.y > 0)
                gdk_draw_line (event->window,
-                              tree_view->priv->grid_line_gc,
+                              tree_view->priv->grid_line_gc[widget->state],
                               background_area.x, background_area.y,
                               background_area.x + background_area.width,
                               background_area.y);
 
              if (y_offset + max_height >= event->area.height)
                gdk_draw_line (event->window,
-                              tree_view->priv->grid_line_gc,
+                              tree_view->priv->grid_line_gc[widget->state],
                               background_area.x, background_area.y + max_height,
                               background_area.x + background_area.width,
                               background_area.y + max_height);
@@ -5351,6 +5360,9 @@ do_presize_handler (PsppSheetView *tree_view)
   validate_visible_area (tree_view);
   tree_view->priv->presize_handler_timer = 0;
 
+  if (! gtk_widget_get_realized (GTK_WIDGET (tree_view)))
+    return FALSE;
+
   gtk_widget_size_request (GTK_WIDGET (tree_view), &requisition);
 
   tree_view->priv->hadjustment->upper = MAX (tree_view->priv->hadjustment->upper, (gfloat)requisition.width);
@@ -6815,9 +6827,18 @@ pspp_sheet_view_style_set (GtkWidget *widget,
 
   if (gtk_widget_get_realized (widget))
     {
+      gint i;
+      PsppSheetViewPrivate *priv = PSPP_SHEET_VIEW (widget)->priv;
+
       gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
       gdk_window_set_background (tree_view->priv->bin_window, &widget->style->base[widget->state]);
       gtk_style_set_background (widget->style, tree_view->priv->header_window, GTK_STATE_NORMAL);
+      for (i = 0; i < 5 ; ++i)
+       {
+         g_object_unref (priv->grid_line_gc[i]);
+         priv->grid_line_gc[i] = gdk_gc_new (widget->window);
+         gdk_gc_copy (priv->grid_line_gc[i], widget->style->text_aa_gc[i]);
+       }
 
       pspp_sheet_view_set_grid_lines (tree_view, tree_view->priv->grid_lines);
     }
@@ -9215,7 +9236,8 @@ pspp_sheet_view_remove_column (PsppSheetView       *tree_view,
        }
 
       if (tree_view->priv->n_columns == 0 &&
-         pspp_sheet_view_get_headers_visible (tree_view))
+         pspp_sheet_view_get_headers_visible (tree_view) && 
+         tree_view->priv->header_window)
        gdk_window_hide (tree_view->priv->header_window);
 
       gtk_widget_queue_resize (GTK_WIDGET (tree_view));
@@ -12510,29 +12532,6 @@ pspp_sheet_view_set_grid_lines (PsppSheetView           *tree_view,
   old_grid_lines = priv->grid_lines;
   priv->grid_lines = grid_lines;
   
-  if (gtk_widget_get_realized (widget))
-    {
-      if (grid_lines == PSPP_SHEET_VIEW_GRID_LINES_NONE &&
-         priv->grid_line_gc)
-       {
-         g_object_unref (priv->grid_line_gc);
-         priv->grid_line_gc = NULL;
-       }
-      
-      if (grid_lines != PSPP_SHEET_VIEW_GRID_LINES_NONE && 
-         !priv->grid_line_gc)
-       {
-         gint line_width;
-
-         gtk_widget_style_get (widget,
-                               "grid-line-width", &line_width,
-                               NULL);
-      
-         priv->grid_line_gc = gdk_gc_new (widget->window);
-         gdk_gc_copy (priv->grid_line_gc, widget->style->black_gc);
-       }      
-    }
-
   if (old_grid_lines != grid_lines)
     {
       gtk_widget_queue_draw (GTK_WIDGET (tree_view));