]> Pileus Git - ~andy/gtk/blobdiff - gtk/a11y/gtknotebookpageaccessible.c
filechooserbutton: Emit 'selection-changed' when changing the selection programmatically
[~andy/gtk] / gtk / a11y / gtknotebookpageaccessible.c
index 19385042dcfd758e30eb659d8bdd30beba5e4156..b2287575f2c640d5979bc38954698e0b51d0796a 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 "gtknotebookpageaccessible.h"
 
 
+struct _GtkNotebookPageAccessiblePrivate
+{
+  GtkAccessible *notebook;
+  GtkWidget *child;
+};
+
 static void atk_component_interface_init (AtkComponentIface *iface);
 
-G_DEFINE_TYPE_WITH_CODE (GtkNotebookPageAccessible, _gtk_notebook_page_accessible, ATK_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (GtkNotebookPageAccessible, gtk_notebook_page_accessible, ATK_TYPE_OBJECT,
                          G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, atk_component_interface_init))
 
 
@@ -64,14 +68,14 @@ get_label_from_notebook_page (GtkNotebookPageAccessible *page)
   GtkWidget *child;
   GtkNotebook *notebook;
 
-  notebook = GTK_NOTEBOOK (gtk_accessible_get_widget (page->notebook));
+  notebook = GTK_NOTEBOOK (gtk_accessible_get_widget (page->priv->notebook));
   if (!notebook)
     return NULL;
 
   if (!gtk_notebook_get_show_tabs (notebook))
     return NULL;
 
-  child = gtk_notebook_get_tab_label (notebook, page->child);
+  child = gtk_notebook_get_tab_label (notebook, page->priv->child);
 
   if (GTK_IS_LABEL (child))
     return child;
@@ -104,7 +108,7 @@ gtk_notebook_page_accessible_get_parent (AtkObject *accessible)
 
   page = GTK_NOTEBOOK_PAGE_ACCESSIBLE (accessible);
 
-  return ATK_OBJECT (page->notebook);
+  return ATK_OBJECT (page->priv->notebook);
 }
 
 static gint
@@ -124,10 +128,10 @@ gtk_notebook_page_accessible_ref_child (AtkObject *accessible,
     return NULL;
 
   page = GTK_NOTEBOOK_PAGE_ACCESSIBLE (accessible);
-  if (!page->child)
+  if (!page->priv->child)
     return NULL;
 
-  child_obj = gtk_widget_get_accessible (page->child);
+  child_obj = gtk_widget_get_accessible (page->priv->child);
   g_object_ref (child_obj);
 
   return child_obj;
@@ -136,11 +140,20 @@ gtk_notebook_page_accessible_ref_child (AtkObject *accessible,
 static AtkStateSet *
 gtk_notebook_page_accessible_ref_state_set (AtkObject *accessible)
 {
+  GtkNotebookPageAccessible *page = GTK_NOTEBOOK_PAGE_ACCESSIBLE (accessible);
   AtkStateSet *state_set, *label_state_set, *merged_state_set;
   AtkObject *atk_label;
   GtkWidget *label;
+  AtkObject *selected;
 
-  state_set = ATK_OBJECT_CLASS (_gtk_notebook_page_accessible_parent_class)->ref_state_set (accessible);
+  state_set = ATK_OBJECT_CLASS (gtk_notebook_page_accessible_parent_class)->ref_state_set (accessible);
+
+  atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
+
+  selected = atk_selection_ref_selection (ATK_SELECTION (page->priv->notebook), 0);
+  if (selected == accessible)
+    atk_state_set_add_state (state_set, ATK_STATE_SELECTED);
+  g_object_unref (selected);
 
   label = get_label_from_notebook_page (GTK_NOTEBOOK_PAGE_ACCESSIBLE (accessible));
   if (label)
@@ -182,15 +195,15 @@ gtk_notebook_page_accessible_get_index_in_parent (AtkObject *accessible)
   GtkNotebookPageAccessible *page;
 
   page = GTK_NOTEBOOK_PAGE_ACCESSIBLE (accessible);
-  if (!page->child)
+  if (!page->priv->child)
     return -1;
 
-  return gtk_notebook_page_num (GTK_NOTEBOOK (gtk_accessible_get_widget (page->notebook)),
-                                page->child);
+  return gtk_notebook_page_num (GTK_NOTEBOOK (gtk_accessible_get_widget (page->priv->notebook)),
+                                page->priv->child);
 }
 
 static void
-_gtk_notebook_page_accessible_class_init (GtkNotebookPageAccessibleClass *klass)
+gtk_notebook_page_accessible_class_init (GtkNotebookPageAccessibleClass *klass)
 {
   AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
 
@@ -200,11 +213,16 @@ _gtk_notebook_page_accessible_class_init (GtkNotebookPageAccessibleClass *klass)
   class->ref_child = gtk_notebook_page_accessible_ref_child;
   class->ref_state_set = gtk_notebook_page_accessible_ref_state_set;
   class->get_index_in_parent = gtk_notebook_page_accessible_get_index_in_parent;
+
+  g_type_class_add_private (klass, sizeof (GtkNotebookPageAccessiblePrivate));
 }
 
 static void
-_gtk_notebook_page_accessible_init (GtkNotebookPageAccessible *page)
+gtk_notebook_page_accessible_init (GtkNotebookPageAccessible *page)
 {
+  page->priv = G_TYPE_INSTANCE_GET_PRIVATE (page,
+                                            GTK_TYPE_NOTEBOOK_PAGE_ACCESSIBLE,
+                                            GtkNotebookPageAccessiblePrivate);
 }
 
 static void
@@ -218,8 +236,8 @@ notify_tab_label (GObject    *object,
 }
 
 AtkObject *
-_gtk_notebook_page_accessible_new (GtkNotebookAccessible *notebook,
-                                   GtkWidget             *child)
+gtk_notebook_page_accessible_new (GtkNotebookAccessible *notebook,
+                                  GtkWidget             *child)
 {
   GObject *object;
   AtkObject *atk_object;
@@ -231,8 +249,8 @@ _gtk_notebook_page_accessible_new (GtkNotebookAccessible *notebook,
   object = g_object_new (GTK_TYPE_NOTEBOOK_PAGE_ACCESSIBLE, NULL);
 
   page = GTK_NOTEBOOK_PAGE_ACCESSIBLE (object);
-  page->notebook = GTK_ACCESSIBLE (notebook);
-  page->child = child;
+  page->priv->notebook = GTK_ACCESSIBLE (notebook);
+  page->priv->child = child;
 
   atk_object = ATK_OBJECT (page);
   atk_object->role = ATK_ROLE_PAGE_TAB;
@@ -240,7 +258,7 @@ _gtk_notebook_page_accessible_new (GtkNotebookAccessible *notebook,
 
   atk_object_set_parent (gtk_widget_get_accessible (child), atk_object);
 
-  g_signal_connect (gtk_accessible_get_widget (page->notebook),
+  g_signal_connect (gtk_accessible_get_widget (page->priv->notebook),
                     "child-notify::tab-label",
                     G_CALLBACK (notify_tab_label), page);
 
@@ -248,20 +266,20 @@ _gtk_notebook_page_accessible_new (GtkNotebookAccessible *notebook,
 }
 
 void
-_gtk_notebook_page_accessible_invalidate (GtkNotebookPageAccessible *page)
+gtk_notebook_page_accessible_invalidate (GtkNotebookPageAccessible *page)
 {
   AtkObject *obj = ATK_OBJECT (page);
   GtkWidget *notebook;
 
-  notebook = gtk_accessible_get_widget (page->notebook);
+  notebook = gtk_accessible_get_widget (page->priv->notebook);
   if (notebook)
     g_signal_handlers_disconnect_by_func (notebook, notify_tab_label, page);
 
   atk_object_notify_state_change (obj, ATK_STATE_DEFUNCT, TRUE);
   atk_object_set_parent (obj, NULL);
-  page->notebook = NULL;
-  atk_object_set_parent (gtk_widget_get_accessible (page->child), NULL);
-  page->child = NULL;
+  page->priv->notebook = NULL;
+  atk_object_set_parent (gtk_widget_get_accessible (page->priv->child), NULL);
+  page->priv->child = NULL;
 }
 
 static AtkObject*