[gtk+] a11y: Split out cell creation function



commit bf8d9ceb2fb61079f09dcc09d78151e17fd96e7e
Author: Benjamin Otte <otte redhat com>
Date:   Sat Feb 11 04:36:40 2012 +0100

    a11y: Split out cell creation function

 gtk/a11y/gtktreeviewaccessible.c |  123 +++++++++++++++++++++-----------------
 1 files changed, 67 insertions(+), 56 deletions(-)
---
diff --git a/gtk/a11y/gtktreeviewaccessible.c b/gtk/a11y/gtktreeviewaccessible.c
index df952b4..460373c 100644
--- a/gtk/a11y/gtktreeviewaccessible.c
+++ b/gtk/a11y/gtktreeviewaccessible.c
@@ -365,51 +365,21 @@ peek_cell (GtkTreeViewAccessible *accessible,
   return cell_info->cell;
 }
 
-static AtkObject *
-gtk_tree_view_accessible_ref_child (AtkObject *obj,
-                                    gint       i)
+static GtkCellAccessible *
+create_cell (GtkTreeView           *treeview,
+             GtkTreeViewAccessible *accessible,
+             GtkRBTree             *tree,
+             GtkRBNode             *node,
+             GtkTreeViewColumn     *column)
 {
-  GtkWidget *widget;
-  GtkTreeViewAccessible *accessible;
-  GtkCellAccessible *cell;
-  GtkTreeView *tree_view;
   GtkCellRenderer *renderer;
-  GtkTreeViewColumn *tv_col;
-  GtkRBTree *tree;
-  GtkRBNode *node;
-  AtkObject *child;
   AtkObject *parent;
   GList *renderer_list;
   GList *l;
   GtkContainerCellAccessible *container = NULL;
+  GtkCellAccessible *cell;
 
-  widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
-  if (widget == NULL)
-    return NULL;
-
-  if (i >= gtk_tree_view_accessible_get_n_children (obj))
-    return NULL;
-
-  accessible = GTK_TREE_VIEW_ACCESSIBLE (obj);
-  tree_view = GTK_TREE_VIEW (widget);
-  if (i < get_n_columns (tree_view))
-    {
-      tv_col = get_visible_column (tree_view, i);
-      child = get_header_from_column (tv_col);
-      if (child)
-        g_object_ref (child);
-      return child;
-    }
-
-  /* Find the RBTree and GtkTreeViewColumn for the index */
-  if (!get_rbtree_column_from_index (tree_view, i, &tree, &node, &tv_col))
-    return NULL;
-
-  cell = peek_cell (accessible, tree, node, tv_col);
-  if (cell)
-    return g_object_ref (cell);
-
-  renderer_list = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (tv_col));
+  renderer_list = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
 
   /* If there is not exactly one renderer in the list,
    * make a container
@@ -421,67 +391,108 @@ gtk_tree_view_accessible_ref_child (AtkObject *obj,
       container = _gtk_container_cell_accessible_new ();
 
       container_cell = GTK_CELL_ACCESSIBLE (container);
-      _gtk_cell_accessible_initialise (container_cell, widget, ATK_OBJECT (accessible));
+      _gtk_cell_accessible_initialise (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
        * a position will be for the container
        */
-      cell_info_new (accessible, tree, node, tv_col, container_cell);
+      cell_info_new (accessible, tree, node, column, container_cell);
       parent = ATK_OBJECT (container);
     }
   else
     parent = ATK_OBJECT (accessible);
 
-  child = NULL;
+  cell = NULL;
 
   for (l = renderer_list; l; l = l->next)
     {
       renderer = GTK_CELL_RENDERER (l->data);
 
-      child = _gtk_renderer_cell_accessible_new (renderer);
-
-      cell = GTK_CELL_ACCESSIBLE (child);
+      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, tv_col, cell);
+        cell_info_new (accessible, tree, node, column, cell);
 
-      _gtk_cell_accessible_initialise (cell, widget, parent);
+      _gtk_cell_accessible_initialise (cell, GTK_WIDGET (treeview), parent);
 
       if (container)
         _gtk_container_cell_accessible_add_child (container, cell);
     }
   g_list_free (renderer_list);
   if (container)
-    child = ATK_OBJECT (container);
+    cell = GTK_CELL_ACCESSIBLE (container);
 
-  set_cell_data (tree_view, accessible, GTK_CELL_ACCESSIBLE (child));
-  _gtk_cell_accessible_update_cache (GTK_CELL_ACCESSIBLE (child));
+  set_cell_data (treeview, accessible, cell);
+  _gtk_cell_accessible_update_cache (cell);
 
-  if (gtk_tree_view_get_expander_column (tree_view) == tv_col)
+  if (gtk_tree_view_get_expander_column (treeview) == column)
     {
       AtkRelationSet *relation_set;
       AtkRelation* relation;
       AtkObject *parent_node;
 
-      relation_set = atk_object_ref_relation_set (ATK_OBJECT (child));
+      relation_set = atk_object_ref_relation_set (ATK_OBJECT (cell));
 
       if (tree->parent_tree)
         {
-          /* XXX: force creation here */
-          parent_node = ATK_OBJECT (peek_cell (accessible, tree->parent_tree, tree->parent_node, tv_col));
+          parent_node = ATK_OBJECT (peek_cell (accessible, tree->parent_tree, tree->parent_node, column));
+          if (parent_node == NULL)
+            parent_node = ATK_OBJECT (create_cell (treeview, accessible, tree->parent_tree, tree->parent_node, column));
         }
       else
-        parent_node = obj;
+        parent_node = ATK_OBJECT (accessible);
       relation = atk_relation_new (&parent_node, 1, ATK_RELATION_NODE_CHILD_OF);
       atk_relation_set_add (relation_set, relation);
-      atk_object_add_relationship (parent_node, ATK_RELATION_NODE_PARENT_OF, child);
+      atk_object_add_relationship (parent_node, ATK_RELATION_NODE_PARENT_OF, ATK_OBJECT (cell));
       g_object_unref (relation);
       g_object_unref (relation_set);
     }
 
-  return child;
+  return cell;
+}
+
+static AtkObject *
+gtk_tree_view_accessible_ref_child (AtkObject *obj,
+                                    gint       i)
+{
+  GtkWidget *widget;
+  GtkTreeViewAccessible *accessible;
+  GtkCellAccessible *cell;
+  GtkTreeView *tree_view;
+  GtkTreeViewColumn *tv_col;
+  GtkRBTree *tree;
+  GtkRBNode *node;
+  AtkObject *child;
+
+  widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
+  if (widget == NULL)
+    return NULL;
+
+  if (i >= gtk_tree_view_accessible_get_n_children (obj))
+    return NULL;
+
+  accessible = GTK_TREE_VIEW_ACCESSIBLE (obj);
+  tree_view = GTK_TREE_VIEW (widget);
+  if (i < get_n_columns (tree_view))
+    {
+      tv_col = get_visible_column (tree_view, i);
+      child = get_header_from_column (tv_col);
+      if (child)
+        g_object_ref (child);
+      return child;
+    }
+
+  /* Find the RBTree and GtkTreeViewColumn for the index */
+  if (!get_rbtree_column_from_index (tree_view, i, &tree, &node, &tv_col))
+    return NULL;
+
+  cell = peek_cell (accessible, tree, node, tv_col);
+  if (cell == NULL)
+    cell = create_cell (tree_view, accessible, tree, node, tv_col);
+
+  return g_object_ref (cell);
 }
 
 static AtkStateSet*



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]