* Boston, MA 02111-1307, USA.
*/
-#include <config.h>
+#include "config.h"
#include <string.h>
#include <gtk/gtk.h>
#ifdef GDK_WINDOWING_X11
#include <gdk/x11/gdkx.h>
#endif
-#include <gtk/gtktreeviewcolumn.h>
#include "gailtreeview.h"
#include "gailrenderercell.h"
#include "gailbooleancell.h"
static void columns_changed (GtkTreeView *tree_view);
static void cursor_changed (GtkTreeView *tree_view);
static gint idle_cursor_changed (gpointer data);
+static void focus_in (GtkWidget *widget);
+static void focus_out (GtkWidget *widget);
static void model_row_changed (GtkTreeModel *tree_model,
GtkTreePath *path,
(GCallback) columns_changed, NULL, NULL, 0);
g_signal_connect_data (tree_view, "cursor-changed",
(GCallback) cursor_changed, NULL, NULL, 0);
+ g_signal_connect_data (GTK_WIDGET (tree_view), "focus-in-event",
+ (GCallback) focus_in, NULL, NULL, 0);
+ g_signal_connect_data (GTK_WIDGET (tree_view), "focus-out-event",
+ (GCallback) focus_out, NULL, NULL, 0);
view->tree_model = tree_model;
if (tree_model)
gtk_tree_view_column_cell_set_cell_data (tv_col, tree_model, &iter,
is_expander, is_expanded);
- renderer_list = gtk_tree_view_column_get_cell_renderers (tv_col);
+ renderer_list = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (tv_col));
/* If there are more than one renderer in the list, make a container */
fake_renderer = g_object_new (GTK_TYPE_CELL_RENDERER_TEXT, NULL);
default_registry = atk_get_default_registry ();
factory = atk_registry_get_factory (default_registry,
- GTK_OBJECT_TYPE (fake_renderer));
+ G_OBJECT_TYPE (fake_renderer));
child = atk_object_factory_create_accessible (factory,
G_OBJECT (fake_renderer));
gail_return_val_if_fail (GAIL_IS_RENDERER_CELL (child), NULL);
default_registry = atk_get_default_registry ();
factory = atk_registry_get_factory (default_registry,
- GTK_OBJECT_TYPE (renderer));
+ G_OBJECT_TYPE (renderer));
child = atk_object_factory_create_accessible (factory,
G_OBJECT (renderer));
gail_return_val_if_fail (GAIL_IS_RENDERER_CELL (child), NULL);
{
gailview->focus_cell = g_object_ref (cell);
gail_cell_add_state (cell, ATK_STATE_FOCUSED, FALSE);
+ g_signal_emit_by_name (gailview,
+ "active-descendant-changed",
+ cell);
}
}
g_list_free (renderer_list);
relation = atk_relation_new (accessible_array, 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);
g_object_unref (relation);
g_object_unref (relation_set);
}
GtkTreePath *path;
GtkTreeViewColumn *tv_column;
gint x_pos, y_pos;
+ gint bx, by;
gboolean ret_val;
widget = GTK_ACCESSIBLE (component)->widget;
tree_view = GTK_TREE_VIEW (widget);
atk_component_get_extents (component, &x_pos, &y_pos, NULL, NULL, coord_type);
+ gtk_tree_view_convert_widget_to_bin_window_coords (tree_view, x, y, &bx, &by);
ret_val = gtk_tree_view_get_path_at_pos (tree_view,
- x - x_pos, y - y_pos,
+ bx - x_pos, by - y_pos,
&path, &tv_column, NULL, NULL);
if (ret_val)
{
GtkTreePath *root_tree;
n_rows = 0;
- root_tree = gtk_tree_path_new_root ();
+ root_tree = gtk_tree_path_new_first ();
iterate_thru_children (tree_view, tree_model,
root_tree, NULL, &n_rows, 0);
gtk_tree_path_free (root_tree);
GtkCellRenderer *renderer;
cell_index = atk_object_get_index_in_parent (ATK_OBJECT (cell));
- renderers = gtk_tree_view_column_get_cell_renderers (tv_col);
+ renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (tv_col));
renderer = g_list_nth_data (renderers, cell_index);
found = gtk_tree_view_column_cell_get_position (tv_col, renderer, &cell_start, &cell_width);
*/
GList *renderers;
- renderers = gtk_tree_view_column_get_cell_renderers (tv_col);
+ renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (tv_col));
if (cell_info->in_use) {
index = atk_object_get_index_in_parent (cell_object);
renderer = g_list_nth_data (renderers, index);
gtk_tree_path_free (path);
gtk_widget_grab_focus (widget);
toplevel = gtk_widget_get_toplevel (widget);
- if (GTK_WIDGET_TOPLEVEL (toplevel))
+ if (gtk_widget_is_toplevel (toplevel))
{
#ifdef GDK_WINDOWING_X11
gtk_window_present_with_time (GTK_WINDOW (toplevel), gdk_x11_get_server_time (widget->window));
tree_selection = gtk_tree_view_get_selection (tree_view);
+ clean_rows (gailview);
+
for (l = cell_list; l; l = l->next)
{
info = (GailTreeViewCellInfo *) (l->data);
if (gail_tree_view->focus_cell)
{
gail_cell_remove_state (GAIL_CELL (gail_tree_view->focus_cell), ATK_STATE_ACTIVE, FALSE);
+ gail_cell_remove_state (GAIL_CELL (gail_tree_view->focus_cell), ATK_STATE_FOCUSED, FALSE);
g_object_unref (gail_tree_view->focus_cell);
}
gail_tree_view->focus_cell = cell;
if (GTK_WIDGET_HAS_FOCUS (widget))
- gail_cell_add_state (GAIL_CELL (cell), ATK_STATE_ACTIVE, FALSE);
+ {
+ gail_cell_add_state (GAIL_CELL (cell), ATK_STATE_ACTIVE, FALSE);
+ gail_cell_add_state (GAIL_CELL (cell), ATK_STATE_FOCUSED, FALSE);
+ }
g_signal_emit_by_name (gail_tree_view,
"active-descendant-changed",
cell);
return FALSE;
}
+static void
+focus_in (GtkWidget *widget)
+{
+ GtkTreeView *tree_view;
+ GailTreeView *gail_tree_view;
+ AtkStateSet *state_set;
+ AtkObject *cell;
+
+ tree_view = GTK_TREE_VIEW (widget);
+ gail_tree_view = GAIL_TREE_VIEW (gtk_widget_get_accessible (widget));
+
+ if (gail_tree_view->focus_cell == NULL)
+ {
+ cell = gail_tree_view_ref_focus_cell (tree_view);
+ if (cell)
+ {
+ state_set = atk_object_ref_state_set (cell);
+ if (state_set)
+ {
+ if (!atk_state_set_contains_state (state_set, ATK_STATE_FOCUSED))
+ {
+ gail_cell_add_state (GAIL_CELL (cell), ATK_STATE_ACTIVE, FALSE);
+ gail_tree_view->focus_cell = cell;
+ gail_cell_add_state (GAIL_CELL (cell), ATK_STATE_FOCUSED, FALSE);
+ g_signal_emit_by_name (gail_tree_view,
+ "active-descendant-changed",
+ cell);
+ }
+ g_object_unref (state_set);
+ }
+ }
+ }
+}
+
+static void
+focus_out (GtkWidget *widget)
+{
+ GailTreeView *gail_tree_view;
+
+ gail_tree_view = GAIL_TREE_VIEW (gtk_widget_get_accessible (widget));
+ if (gail_tree_view->focus_cell)
+ {
+ gail_cell_remove_state (GAIL_CELL (gail_tree_view->focus_cell), ATK_STATE_ACTIVE, FALSE);
+ gail_cell_remove_state (GAIL_CELL (gail_tree_view->focus_cell), ATK_STATE_FOCUSED, FALSE);
+ g_object_unref (gail_tree_view->focus_cell);
+ gail_tree_view->focus_cell = NULL;
+ }
+}
+
static void
model_row_changed (GtkTreeModel *tree_model,
GtkTreePath *path,
GtkTreePath *path_copy;
AtkObject *atk_obj;
GailTreeView *gailview;
- gint row;
+ gint row, col, n_cols;
tree_view = (GtkTreeView *)user_data;
atk_obj = gtk_widget_get_accessible (GTK_WIDGET (tree_view));
g_signal_emit_by_name (atk_obj, "row_deleted", row,
gailview->n_children_deleted + 1);
gailview->n_children_deleted = 0;
+
+ /* Generate children-changed signals */
+ n_cols = get_n_actual_columns (tree_view);
+ for (col = 0; col < n_cols; col++)
+ {
+ /*
+ * Pass NULL as the child object, 4th argument.
+ */
+ g_signal_emit_by_name (atk_obj, "children_changed::remove",
+ ((row * n_cols) + col), NULL, NULL);
+ }
}
/*
{
GdkRectangle rect, *visible_rect;
GdkRectangle rect1, *tree_cell_rect;
+ gint bx, by;
gboolean is_showing;
/*
* A cell is considered "SHOWING" if any part of the cell is in the visible
visible_rect = ▭
tree_cell_rect = &rect1;
tree_cell_rect->x = cell_rect->x;
+ tree_cell_rect->y = cell_rect->y;
tree_cell_rect->width = cell_rect->width;
tree_cell_rect->height = cell_rect->height;
gtk_tree_view_get_visible_rect (tree_view, visible_rect);
- gtk_tree_view_widget_to_tree_coords (tree_view, cell_rect->x, cell_rect->y,
- NULL, &(rect1.y));
+ gtk_tree_view_convert_tree_to_bin_window_coords (tree_view, visible_rect->x,
+ visible_rect->y, &bx, &by);
- if (((tree_cell_rect->x + tree_cell_rect->width) < visible_rect->x) ||
- ((tree_cell_rect->y + tree_cell_rect->height) < (visible_rect->y)) ||
- (tree_cell_rect->x > (visible_rect->x + visible_rect->width)) ||
- (tree_cell_rect->y > (visible_rect->y + visible_rect->height)))
+ if (((tree_cell_rect->x + tree_cell_rect->width) < bx) ||
+ ((tree_cell_rect->y + tree_cell_rect->height) < by) ||
+ (tree_cell_rect->x > (bx + visible_rect->width)) ||
+ (tree_cell_rect->y > (by + visible_rect->height)))
is_showing = FALSE;
else
is_showing = TRUE;
gtk_tree_view_column_cell_set_cell_data (cell_info->cell_col_ref,
tree_model, &iter, is_expander, is_expanded);
}
- renderers = gtk_tree_view_column_get_cell_renderers (cell_info->cell_col_ref);
+ renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (cell_info->cell_col_ref));
gail_return_val_if_fail (renderers, FALSE);
/*
GtkTreeModel *tree_model;
tree_model = gtk_tree_view_get_model (tree_view);
- gtk_tree_model_get_iter_root (tree_model, iter);
+ gtk_tree_model_get_iter_first (tree_model, iter);
iter = return_iter_nth_row (tree_view, tree_model, iter, 0 , row);
}
row = gtk_tree_path_get_indices (path)[0];
else
{
- root_tree = gtk_tree_path_new_root ();
+ root_tree = gtk_tree_path_new_first ();
row = 0;
iterate_thru_children (tree_view, tree_model, root_tree, path, &row, 0);
gtk_tree_path_free (root_tree);
if (cell_info->in_use) {
obj = G_OBJECT (cell_info->cell);
- gail_cell_add_state (cell_info->cell, ATK_STATE_DEFUNCT, TRUE);
+ gail_cell_add_state (cell_info->cell, ATK_STATE_DEFUNCT, FALSE);
g_object_weak_unref (obj, (GWeakNotify) cell_destroyed, cell_info);
cell_info->in_use = FALSE;
if (!gailview->garbage_collection_pending) {
garbage_collect_cell_data (gpointer data)
{
GailTreeView *tree_view;
- GList *temp_list;
+ GList *temp_list, *list;
GailTreeViewCellInfo *cell_info;
g_assert (GAIL_IS_TREE_VIEW (data));
tree_view = (GailTreeView *)data;
- temp_list = g_list_copy (tree_view->cell_data);
+ list = g_list_copy (tree_view->cell_data);
tree_view->garbage_collection_pending = FALSE;
if (tree_view->idle_garbage_collect_id != 0)
}
/* Must loop through them all */
+ temp_list = list;
while (temp_list != NULL)
{
cell_info = temp_list->data;
}
temp_list = temp_list->next;
}
- g_list_free (temp_list);
+ g_list_free (list);
return tree_view->garbage_collection_pending;
}
if (cell_info->in_use)
{
row_path = gtk_tree_row_reference_get_path (cell_info->cell_row_ref);
- g_assert (row_path != NULL);
+ g_return_if_fail (row_path != NULL);
if (tree_path == NULL)
act_on_cell = TRUE;
else
gail_return_if_fail (path);
pathstring = gtk_tree_path_to_string (path);
- renderers = gtk_tree_view_column_get_cell_renderers (cell_info->cell_col_ref);
+ renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (cell_info->cell_col_ref));
gail_return_if_fail (renderers);
/*