1 /* GAIL - The GNOME Accessibility Enabling Library
2 * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
24 #include "gailscrolledwindow.h"
27 static void gail_scrolled_window_class_init (GailScrolledWindowClass *klass);
28 static void gail_scrolled_window_init (GailScrolledWindow *window);
29 static void gail_scrolled_window_real_initialize
33 static gint gail_scrolled_window_get_n_children (AtkObject *object);
34 static AtkObject* gail_scrolled_window_ref_child (AtkObject *obj,
36 static void gail_scrolled_window_scrollbar_visibility_changed
41 G_DEFINE_TYPE (GailScrolledWindow, gail_scrolled_window, GAIL_TYPE_CONTAINER)
44 gail_scrolled_window_class_init (GailScrolledWindowClass *klass)
46 AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
48 class->get_n_children = gail_scrolled_window_get_n_children;
49 class->ref_child = gail_scrolled_window_ref_child;
50 class->initialize = gail_scrolled_window_real_initialize;
54 gail_scrolled_window_init (GailScrolledWindow *window)
59 gail_scrolled_window_real_initialize (AtkObject *obj,
62 GtkScrolledWindow *window;
64 ATK_OBJECT_CLASS (gail_scrolled_window_parent_class)->initialize (obj, data);
66 window = GTK_SCROLLED_WINDOW (data);
68 g_signal_connect_data (gtk_scrolled_window_get_hscrollbar (window), "notify::visible",
69 G_CALLBACK (gail_scrolled_window_scrollbar_visibility_changed),
71 g_signal_connect_data (gtk_scrolled_window_get_vscrollbar (window), "notify::visible",
72 G_CALLBACK (gail_scrolled_window_scrollbar_visibility_changed),
75 obj->role = ATK_ROLE_SCROLL_PANE;
79 gail_scrolled_window_get_n_children (AtkObject *object)
82 GtkScrolledWindow *gtk_window;
86 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (object));
88 /* Object is defunct */
91 gtk_window = GTK_SCROLLED_WINDOW (widget);
93 /* Get the number of children returned by the backing GtkScrolledWindow */
95 children = gtk_container_get_children (GTK_CONTAINER(gtk_window));
96 n_children = g_list_length (children);
97 g_list_free (children);
99 /* Add one to the count for each visible scrollbar */
101 if (gtk_scrolled_window_get_hscrollbar (gtk_window))
103 if (gtk_scrolled_window_get_vscrollbar (gtk_window))
109 gail_scrolled_window_ref_child (AtkObject *obj,
113 GtkScrolledWindow *gtk_window;
114 GtkWidget *hscrollbar, *vscrollbar;
115 GList *children, *tmp_list;
117 AtkObject *accessible = NULL;
119 g_return_val_if_fail (child >= 0, NULL);
121 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
123 /* Object is defunct */
126 gtk_window = GTK_SCROLLED_WINDOW (widget);
127 hscrollbar = gtk_scrolled_window_get_hscrollbar (gtk_window);
128 vscrollbar = gtk_scrolled_window_get_vscrollbar (gtk_window);
130 children = gtk_container_get_children (GTK_CONTAINER (gtk_window));
131 n_children = g_list_length (children);
133 if (child == n_children)
135 if (gtk_scrolled_window_get_hscrollbar (gtk_window))
136 accessible = gtk_widget_get_accessible (hscrollbar);
137 else if (gtk_scrolled_window_get_vscrollbar (gtk_window))
138 accessible = gtk_widget_get_accessible (vscrollbar);
140 else if (child == n_children+1 &&
141 gtk_scrolled_window_get_hscrollbar (gtk_window) &&
142 gtk_scrolled_window_get_vscrollbar (gtk_window))
143 accessible = gtk_widget_get_accessible (vscrollbar);
144 else if (child < n_children)
146 tmp_list = g_list_nth (children, child);
148 accessible = gtk_widget_get_accessible (
149 GTK_WIDGET (tmp_list->data));
152 g_list_free (children);
154 g_object_ref (accessible);
159 gail_scrolled_window_scrollbar_visibility_changed (GObject *object,
163 if (!strcmp (pspec->name, "visible"))
167 gboolean child_added = FALSE;
170 GtkScrolledWindow *gtk_window;
171 GtkWidget *hscrollbar, *vscrollbar;
172 GailScrolledWindow *gail_window = GAIL_SCROLLED_WINDOW (user_data);
175 gtk_window = GTK_SCROLLED_WINDOW (gtk_accessible_get_widget (GTK_ACCESSIBLE (user_data)));
176 if (gtk_window == NULL)
178 children = gtk_container_get_children (GTK_CONTAINER (gtk_window));
179 index = n_children = g_list_length (children);
180 g_list_free (children);
182 hscrollbar = gtk_scrolled_window_get_hscrollbar (gtk_window);
183 vscrollbar = gtk_scrolled_window_get_vscrollbar (gtk_window);
185 if ((gpointer) object == (gpointer) (hscrollbar))
187 if (gtk_scrolled_window_get_hscrollbar (gtk_window))
190 child = gtk_widget_get_accessible (hscrollbar);
192 else if ((gpointer) object == (gpointer) (vscrollbar))
194 if (gtk_scrolled_window_get_vscrollbar (gtk_window))
197 child = gtk_widget_get_accessible (vscrollbar);
198 if (gtk_scrolled_window_get_hscrollbar (gtk_window))
199 index = n_children+1;
203 g_assert_not_reached ();
208 signal_name = "children_changed::add";
210 signal_name = "children_changed::delete";
212 g_signal_emit_by_name (gail_window, signal_name, index, child, NULL);