]> Pileus Git - ~andy/gtk/blobdiff - gtk/a11y/gtktreeviewaccessible.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / gtk / a11y / gtktreeviewaccessible.c
index 8bec29102bb024ef542434356057805f14c866f7..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
@@ -12,9 +12,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "config.h"
 #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
@@ -76,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)
@@ -140,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);
@@ -165,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
@@ -189,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)
         {
@@ -209,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
@@ -217,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
@@ -252,6 +257,7 @@ get_n_columns (GtkTreeView *tree_view)
 
   return visible_columns;
 }
+
 static gint
 gtk_tree_view_accessible_get_n_children (AtkObject *obj)
 {
@@ -345,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;
 
@@ -375,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
@@ -396,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)
@@ -488,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)
@@ -498,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);
@@ -523,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 */
@@ -1431,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
@@ -1612,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 ||
@@ -1671,11 +1682,11 @@ to_visible_column_id (GtkTreeView *treeview,
   return id - invisible;
 }
 
-void
-_gtk_tree_view_accessible_do_add_column (GtkTreeViewAccessible *accessible,
-                                         GtkTreeView           *treeview,
-                                         GtkTreeViewColumn     *column,
-                                         guint                  id)
+static void
+gtk_tree_view_accessible_do_add_column (GtkTreeViewAccessible *accessible,
+                                        GtkTreeView           *treeview,
+                                        GtkTreeViewColumn     *column,
+                                        guint                  id)
 {
   guint row, n_rows, n_cols;
 
@@ -1708,17 +1719,17 @@ _gtk_tree_view_accessible_add_column (GtkTreeView       *treeview,
   if (obj == NULL)
     return;
 
-  _gtk_tree_view_accessible_do_add_column (GTK_TREE_VIEW_ACCESSIBLE (obj),
-                                           treeview,
-                                           column,
-                                           to_visible_column_id (treeview, id));
+  gtk_tree_view_accessible_do_add_column (GTK_TREE_VIEW_ACCESSIBLE (obj),
+                                          treeview,
+                                          column,
+                                          to_visible_column_id (treeview, id));
 }
 
-void
-_gtk_tree_view_accessible_do_remove_column (GtkTreeViewAccessible *accessible,
-                                            GtkTreeView           *treeview,
-                                            GtkTreeViewColumn     *column,
-                                            guint                  id)
+static void
+gtk_tree_view_accessible_do_remove_column (GtkTreeViewAccessible *accessible,
+                                           GtkTreeView           *treeview,
+                                           GtkTreeViewColumn     *column,
+                                           guint                  id)
 {
   GtkTreeViewAccessibleCellInfo *cell_info;
   GHashTableIter iter;
@@ -1726,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;
@@ -1763,10 +1774,10 @@ _gtk_tree_view_accessible_remove_column (GtkTreeView       *treeview,
   if (obj == NULL)
     return;
 
-  _gtk_tree_view_accessible_do_remove_column (GTK_TREE_VIEW_ACCESSIBLE (obj),
-                                              treeview,
-                                              column,
-                                              to_visible_column_id (treeview, id));
+  gtk_tree_view_accessible_do_remove_column (GTK_TREE_VIEW_ACCESSIBLE (obj),
+                                             treeview,
+                                             column,
+                                             to_visible_column_id (treeview, id));
 }
 
 void
@@ -1787,27 +1798,44 @@ _gtk_tree_view_accessible_toggle_visibility (GtkTreeView       *treeview,
                                              GtkTreeViewColumn *column)
 {
   AtkObject *obj;
-  guint id;
+  guint i, id;
 
   obj = _gtk_widget_peek_accessible (GTK_WIDGET (treeview));
   if (obj == NULL)
     return;
 
-  id = get_column_number (treeview, column);
-
   if (gtk_tree_view_column_get_visible (column))
-    _gtk_tree_view_accessible_do_add_column (GTK_TREE_VIEW_ACCESSIBLE (obj),
-                                             treeview,
-                                             column,
-                                             id);
+    {
+      id = get_column_number (treeview, column);
+
+      gtk_tree_view_accessible_do_add_column (GTK_TREE_VIEW_ACCESSIBLE (obj),
+                                              treeview,
+                                              column,
+                                              id);
+    }
   else
-    _gtk_tree_view_accessible_do_remove_column (GTK_TREE_VIEW_ACCESSIBLE (obj),
-                                                treeview,
-                                                column,
-                                                id);
+    {
+      id = 0;
+
+      for (i = 0; i < gtk_tree_view_get_n_columns (treeview); i++)
+        {
+          GtkTreeViewColumn *cur = gtk_tree_view_get_column (treeview, i);
+          
+          if (gtk_tree_view_column_get_visible (cur))
+            id++;
+
+          if (cur == column)
+            break;
+        }
+
+      gtk_tree_view_accessible_do_remove_column (GTK_TREE_VIEW_ACCESSIBLE (obj),
+                                                 treeview,
+                                                 column,
+                                                 id);
+    }
 }
 
-GtkTreeViewColumn *
+static GtkTreeViewColumn *
 get_effective_focus_column (GtkTreeView       *treeview,
                             GtkTreeViewColumn *column)
 {
@@ -1856,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);
     }
 }
@@ -1868,6 +1896,7 @@ _gtk_tree_view_accessible_add_state (GtkTreeView          *treeview,
                                      GtkCellRendererState  state)
 {
   GtkTreeViewAccessible *accessible;
+  GtkTreeViewColumn *single_column;
   AtkObject *obj;
   guint i;
 
@@ -1879,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 (focus_column)
+      if (cell != NULL)
+        _gtk_cell_accessible_state_changed (cell, state, 0);
+
+      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)
@@ -1922,6 +1961,7 @@ _gtk_tree_view_accessible_remove_state (GtkTreeView          *treeview,
                                         GtkCellRendererState  state)
 {
   GtkTreeViewAccessible *accessible;
+  GtkTreeViewColumn *single_column;
   AtkObject *obj;
   guint i;
 
@@ -1933,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));
 
-      _gtk_cell_accessible_state_changed (cell, 0, state);
+          if (cell == NULL)
+            continue;
+
+          _gtk_cell_accessible_state_changed (cell, 0, state);
+        }
     }
 
   if (state == GTK_CELL_RENDERER_SELECTED)