]> Pileus Git - ~andy/gtk/blobdiff - gtk/a11y/gtktreeviewaccessible.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / gtk / a11y / gtktreeviewaccessible.c
index 36fbf31383cf5a76c37a0f4f24ba53e9cfb1757b..31032b230558c43fbb1beb331f789df57121fd3f 100644 (file)
@@ -1,4 +1,4 @@
-/* GAIL - The GNOME Accessibility Implementation Library
+/* GTK+ - accessibility implementations
  * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
  *
  * This library is free software; you can redistribute it and/or
 #include "gtktreeprivate.h"
 #include "gtkwidgetprivate.h"
 
-#include "gtktreeviewaccessible.h"
+#include "gtktreeviewaccessibleprivate.h"
+
 #include "gtkrenderercellaccessible.h"
 #include "gtkbooleancellaccessible.h"
 #include "gtkimagecellaccessible.h"
 #include "gtkcontainercellaccessible.h"
 #include "gtktextcellaccessible.h"
 #include "gtkcellaccessibleparent.h"
+#include "gtkcellaccessibleprivate.h"
+
+struct _GtkTreeViewAccessiblePrivate
+{
+  GHashTable *cell_infos;
+};
 
 typedef struct _GtkTreeViewAccessibleCellInfo  GtkTreeViewAccessibleCellInfo;
 struct _GtkTreeViewAccessibleCellInfo
@@ -74,7 +81,7 @@ static void atk_selection_interface_init              (AtkSelectionIface
 static void atk_component_interface_init              (AtkComponentIface            *iface);
 static void gtk_cell_accessible_parent_interface_init (GtkCellAccessibleParentIface *iface);
 
-G_DEFINE_TYPE_WITH_CODE (GtkTreeViewAccessible, _gtk_tree_view_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
+G_DEFINE_TYPE_WITH_CODE (GtkTreeViewAccessible, gtk_tree_view_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
                          G_IMPLEMENT_INTERFACE (ATK_TYPE_TABLE, atk_table_interface_init)
                          G_IMPLEMENT_INTERFACE (ATK_TYPE_SELECTION, atk_selection_interface_init)
                          G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, atk_component_interface_init)
@@ -138,11 +145,11 @@ gtk_tree_view_accessible_initialize (AtkObject *obj,
   GtkTreeModel *tree_model;
   GtkWidget *widget;
 
-  ATK_OBJECT_CLASS (_gtk_tree_view_accessible_parent_class)->initialize (obj, data);
+  ATK_OBJECT_CLASS (gtk_tree_view_accessible_parent_class)->initialize (obj, data);
 
   accessible = GTK_TREE_VIEW_ACCESSIBLE (obj);
 
-  accessible->cell_infos = g_hash_table_new_full (cell_info_hash,
+  accessible->priv->cell_infos = g_hash_table_new_full (cell_info_hash,
       cell_info_equal, NULL, (GDestroyNotify) cell_info_free);
 
   widget = GTK_WIDGET (data);
@@ -163,10 +170,10 @@ gtk_tree_view_accessible_finalize (GObject *object)
 {
   GtkTreeViewAccessible *accessible = GTK_TREE_VIEW_ACCESSIBLE (object);
 
-  if (accessible->cell_infos)
-    g_hash_table_destroy (accessible->cell_infos);
+  if (accessible->priv->cell_infos)
+    g_hash_table_destroy (accessible->priv->cell_infos);
 
-  G_OBJECT_CLASS (_gtk_tree_view_accessible_parent_class)->finalize (object);
+  G_OBJECT_CLASS (gtk_tree_view_accessible_parent_class)->finalize (object);
 }
 
 static void
@@ -187,7 +194,7 @@ gtk_tree_view_accessible_notify_gtk (GObject    *obj,
       AtkRole role;
 
       tree_model = gtk_tree_view_get_model (tree_view);
-      g_hash_table_remove_all (accessible->cell_infos);
+      g_hash_table_remove_all (accessible->priv->cell_infos);
 
       if (tree_model)
         {
@@ -207,7 +214,7 @@ gtk_tree_view_accessible_notify_gtk (GObject    *obj,
       g_object_thaw_notify (G_OBJECT (accessible));
     }
   else
-    GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_tree_view_accessible_parent_class)->notify_gtk (obj, pspec);
+    GTK_WIDGET_ACCESSIBLE_CLASS (gtk_tree_view_accessible_parent_class)->notify_gtk (obj, pspec);
 }
 
 static void
@@ -215,9 +222,9 @@ gtk_tree_view_accessible_widget_unset (GtkAccessible *gtkaccessible)
 {
   GtkTreeViewAccessible *accessible = GTK_TREE_VIEW_ACCESSIBLE (gtkaccessible);
 
-  g_hash_table_remove_all (accessible->cell_infos);
+  g_hash_table_remove_all (accessible->priv->cell_infos);
 
-  GTK_ACCESSIBLE_CLASS (_gtk_tree_view_accessible_parent_class)->widget_unset (gtkaccessible);
+  GTK_ACCESSIBLE_CLASS (gtk_tree_view_accessible_parent_class)->widget_unset (gtkaccessible);
 }
 
 static gint
@@ -250,6 +257,7 @@ get_n_columns (GtkTreeView *tree_view)
 
   return visible_columns;
 }
+
 static gint
 gtk_tree_view_accessible_get_n_children (AtkObject *obj)
 {
@@ -343,7 +351,7 @@ peek_cell (GtkTreeViewAccessible *accessible,
   lookup.node = node;
   lookup.cell_col_ref = column;
 
-  cell_info = g_hash_table_lookup (accessible->cell_infos, &lookup);
+  cell_info = g_hash_table_lookup (accessible->priv->cell_infos, &lookup);
   if (cell_info == NULL)
     return NULL;
 
@@ -373,10 +381,10 @@ create_cell (GtkTreeView           *treeview,
     {
       GtkCellAccessible *container_cell;
 
-      container = _gtk_container_cell_accessible_new ();
+      container = gtk_container_cell_accessible_new ();
 
       container_cell = GTK_CELL_ACCESSIBLE (container);
-      _gtk_cell_accessible_initialise (container_cell, GTK_WIDGET (treeview), ATK_OBJECT (accessible));
+      _gtk_cell_accessible_initialize (container_cell, GTK_WIDGET (treeview), ATK_OBJECT (accessible));
 
       /* The GtkTreeViewAccessibleCellInfo structure for the container will
        * be before the ones for the cells so that the first one we find for
@@ -394,16 +402,16 @@ create_cell (GtkTreeView           *treeview,
     {
       renderer = GTK_CELL_RENDERER (l->data);
 
-      cell = GTK_CELL_ACCESSIBLE (_gtk_renderer_cell_accessible_new (renderer));
+      cell = GTK_CELL_ACCESSIBLE (gtk_renderer_cell_accessible_new (renderer));
 
       /* Create the GtkTreeViewAccessibleCellInfo for this cell */
       if (parent == ATK_OBJECT (accessible))
         cell_info_new (accessible, tree, node, column, cell);
 
-      _gtk_cell_accessible_initialise (cell, GTK_WIDGET (treeview), parent);
+      _gtk_cell_accessible_initialize (cell, GTK_WIDGET (treeview), parent);
 
       if (container)
-        _gtk_container_cell_accessible_add_child (container, cell);
+        gtk_container_cell_accessible_add_child (container, cell);
     }
   g_list_free (renderer_list);
   if (container)
@@ -486,7 +494,7 @@ gtk_tree_view_accessible_ref_state_set (AtkObject *obj)
   AtkStateSet *state_set;
   GtkWidget *widget;
 
-  state_set = ATK_OBJECT_CLASS (_gtk_tree_view_accessible_parent_class)->ref_state_set (obj);
+  state_set = ATK_OBJECT_CLASS (gtk_tree_view_accessible_parent_class)->ref_state_set (obj);
   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
 
   if (widget != NULL)
@@ -496,7 +504,7 @@ gtk_tree_view_accessible_ref_state_set (AtkObject *obj)
 }
 
 static void
-_gtk_tree_view_accessible_class_init (GtkTreeViewAccessibleClass *klass)
+gtk_tree_view_accessible_class_init (GtkTreeViewAccessibleClass *klass)
 {
   AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
@@ -521,11 +529,16 @@ _gtk_tree_view_accessible_class_init (GtkTreeViewAccessibleClass *klass)
   container_class->remove_gtk = NULL;
 
   gobject_class->finalize = gtk_tree_view_accessible_finalize;
+
+  g_type_class_add_private (klass, sizeof (GtkTreeViewAccessiblePrivate));
 }
 
 static void
-_gtk_tree_view_accessible_init (GtkTreeViewAccessible *view)
+gtk_tree_view_accessible_init (GtkTreeViewAccessible *view)
 {
+  view->priv = G_TYPE_INSTANCE_GET_PRIVATE (view,
+                                            GTK_TYPE_TREE_VIEW_ACCESSIBLE,
+                                            GtkTreeViewAccessiblePrivate);
 }
 
 /* atkcomponent.h */
@@ -1429,7 +1442,7 @@ cell_info_new (GtkTreeViewAccessible *accessible,
                       gtk_tree_view_accessible_get_data_quark (),
                       cell_info);
 
-  g_hash_table_replace (accessible->cell_infos, cell_info, cell_info);
+  g_hash_table_replace (accessible->priv->cell_infos, cell_info, cell_info);
 }
 
 /* Returns the column number of the specified GtkTreeViewColumn
@@ -1610,7 +1623,7 @@ _gtk_tree_view_accessible_remove (GtkTreeView *treeview,
           g_signal_emit_by_name (accessible, "children-changed::remove", i, NULL, NULL);
         }
 
-      g_hash_table_iter_init (&iter, accessible->cell_infos);
+      g_hash_table_iter_init (&iter, accessible->priv->cell_infos);
       while (g_hash_table_iter_next (&iter, NULL, (gpointer *)&cell_info))
         {
           if (node == cell_info->node ||
@@ -1724,7 +1737,7 @@ gtk_tree_view_accessible_do_remove_column (GtkTreeViewAccessible *accessible,
   guint row, n_rows, n_cols;
 
   /* Clean column from cache */
-  g_hash_table_iter_init (&iter, accessible->cell_infos);
+  g_hash_table_iter_init (&iter, accessible->priv->cell_infos);
   while (g_hash_table_iter_next (&iter, NULL, &value))
     {
       cell_info = value;
@@ -1871,7 +1884,7 @@ _gtk_tree_view_accessible_update_focus_column (GtkTreeView       *treeview,
         _gtk_cell_accessible_state_changed (cell, 0, GTK_CELL_RENDERER_FOCUSED);
       else
         cell = create_cell (treeview, accessible, cursor_tree, cursor_node, new_focus);
-      
+
       g_signal_emit_by_name (accessible, "active-descendant-changed", cell);
     }
 }
@@ -1883,6 +1896,7 @@ _gtk_tree_view_accessible_add_state (GtkTreeView          *treeview,
                                      GtkCellRendererState  state)
 {
   GtkTreeViewAccessible *accessible;
+  GtkTreeViewColumn *single_column;
   AtkObject *obj;
   guint i;
 
@@ -1894,36 +1908,46 @@ _gtk_tree_view_accessible_add_state (GtkTreeView          *treeview,
 
   if (state == GTK_CELL_RENDERER_FOCUSED)
     {
-      GtkTreeViewColumn *focus_column;
-      
-      focus_column = get_effective_focus_column (treeview, _gtk_tree_view_get_focus_column (treeview));
+      single_column = get_effective_focus_column (treeview, _gtk_tree_view_get_focus_column (treeview));
+    }
+  else if (state == GTK_CELL_RENDERER_EXPANDED ||
+           state == GTK_CELL_RENDERER_EXPANDABLE)
+    {
+      single_column = gtk_tree_view_get_expander_column (treeview);
+    }
+  else
+    single_column = NULL;
+
+  if (single_column)
+    {
+      GtkCellAccessible *cell = peek_cell (accessible,
+                                           tree, node,
+                                           single_column);
+
+      if (cell != NULL)
+        _gtk_cell_accessible_state_changed (cell, state, 0);
 
-      if (focus_column)
+      if (state == GTK_CELL_RENDERER_FOCUSED)
         {
-          GtkCellAccessible *cell;
-          
-          cell = peek_cell (accessible, tree, node, focus_column);
-          if (cell != NULL)
-            _gtk_cell_accessible_state_changed (cell, 0, state);
-          else
-            cell = create_cell (treeview, accessible, tree, node, focus_column);
+          if (cell == NULL)
+            cell = create_cell (treeview, accessible, tree, node, single_column);
           
           g_signal_emit_by_name (accessible, "active-descendant-changed", cell);
         }
-
-      return;
     }
-
-  for (i = 0; i < gtk_tree_view_get_n_columns (treeview); i++)
+  else
     {
-      GtkCellAccessible *cell = peek_cell (accessible,
-                                           tree, node,
-                                           gtk_tree_view_get_column (treeview, i));
+      for (i = 0; i < gtk_tree_view_get_n_columns (treeview); i++)
+        {
+          GtkCellAccessible *cell = peek_cell (accessible,
+                                               tree, node,
+                                               gtk_tree_view_get_column (treeview, i));
 
-      if (cell == NULL)
-        continue;
+          if (cell == NULL)
+            continue;
 
-      _gtk_cell_accessible_state_changed (cell, state, 0);
+          _gtk_cell_accessible_state_changed (cell, state, 0);
+        }
     }
 
   if (state == GTK_CELL_RENDERER_SELECTED)
@@ -1937,6 +1961,7 @@ _gtk_tree_view_accessible_remove_state (GtkTreeView          *treeview,
                                         GtkCellRendererState  state)
 {
   GtkTreeViewAccessible *accessible;
+  GtkTreeViewColumn *single_column;
   AtkObject *obj;
   guint i;
 
@@ -1948,33 +1973,38 @@ _gtk_tree_view_accessible_remove_state (GtkTreeView          *treeview,
 
   if (state == GTK_CELL_RENDERER_FOCUSED)
     {
-      GtkTreeViewColumn *focus_column;
-      
-      focus_column = get_effective_focus_column (treeview, _gtk_tree_view_get_focus_column (treeview));
-
-      if (focus_column)
-        {
-          GtkCellAccessible *cell = peek_cell (accessible,
-                                               tree, node,
-                                               focus_column);
-
-          if (cell != NULL)
-            _gtk_cell_accessible_state_changed (cell, 0, state);
-        }
-
-      return;
+      single_column = get_effective_focus_column (treeview, _gtk_tree_view_get_focus_column (treeview));
+    }
+  else if (state == GTK_CELL_RENDERER_EXPANDED ||
+           state == GTK_CELL_RENDERER_EXPANDABLE)
+    {
+      single_column = gtk_tree_view_get_expander_column (treeview);
     }
+  else
+    single_column = NULL;
 
-  for (i = 0; i < gtk_tree_view_get_n_columns (treeview); i++)
+  if (single_column)
     {
       GtkCellAccessible *cell = peek_cell (accessible,
                                            tree, node,
-                                           gtk_tree_view_get_column (treeview, i));
+                                           single_column);
 
-      if (cell == NULL)
-        continue;
+      if (cell != NULL)
+        _gtk_cell_accessible_state_changed (cell, 0, state);
+    }
+  else
+    {
+      for (i = 0; i < gtk_tree_view_get_n_columns (treeview); i++)
+        {
+          GtkCellAccessible *cell = peek_cell (accessible,
+                                               tree, node,
+                                               gtk_tree_view_get_column (treeview, i));
+
+          if (cell == NULL)
+            continue;
 
-      _gtk_cell_accessible_state_changed (cell, 0, state);
+          _gtk_cell_accessible_state_changed (cell, 0, state);
+        }
     }
 
   if (state == GTK_CELL_RENDERER_SELECTED)