gtkstatusbaraccessible.c 3.96 KB
Newer Older
Matthias Clasen's avatar
Matthias Clasen committed
1
/* GTK+ - accessibility implementations
2 3 4 5 6 7 8 9 10 11 12 13 14
 * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
Javier Jardon's avatar
Javier Jardon committed
15
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16 17 18 19 20 21 22 23 24
 */

#include "config.h"

#include <string.h>
#include <gtk/gtk.h>
#include "gtkstatusbaraccessible.h"


25
G_DEFINE_TYPE (GtkStatusbarAccessible, gtk_statusbar_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE)
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

static void
text_changed (GtkStatusbar *statusbar,
              guint         context_id,
              const gchar  *text,
              AtkObject    *obj)
{
  if (!obj->name)
    g_object_notify (G_OBJECT (obj), "accessible-name");
  g_signal_emit_by_name (obj, "visible-data-changed");
}

static void
gtk_statusbar_accessible_initialize (AtkObject *obj,
                                     gpointer   data)
{
  GtkWidget *statusbar = data;

44
  ATK_OBJECT_CLASS (gtk_statusbar_accessible_parent_class)->initialize (obj, data);
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

  g_signal_connect_after (statusbar, "text-pushed",
                          G_CALLBACK (text_changed), obj);
  g_signal_connect_after (statusbar, "text-popped",
                          G_CALLBACK (text_changed), obj);

  obj->role = ATK_ROLE_STATUSBAR;
}

static GtkWidget *
find_label_child (GtkContainer *container)
{
  GList *children, *tmp_list;
  GtkWidget *child;

  children = gtk_container_get_children (container);

  child = NULL;
  for (tmp_list = children; tmp_list != NULL; tmp_list = tmp_list->next)
    {
      if (GTK_IS_LABEL (tmp_list->data))
        {
          child = GTK_WIDGET (tmp_list->data);
          break;
        }
      else if (GTK_IS_CONTAINER (tmp_list->data))
        {
          child = find_label_child (GTK_CONTAINER (tmp_list->data));
          if (child)
            break;
        }
    }
  g_list_free (children);

  return child;
}

static GtkWidget *
get_label_from_statusbar (GtkStatusbar *statusbar)
{
  GtkWidget *box;

  box = gtk_statusbar_get_message_area (statusbar);

  return find_label_child (GTK_CONTAINER (box));
}

static const gchar *
gtk_statusbar_accessible_get_name (AtkObject *obj)
{
  const gchar *name;
  GtkWidget *widget;
  GtkWidget *label;

  widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
  if (widget == NULL)
    return NULL;

103
  name = ATK_OBJECT_CLASS (gtk_statusbar_accessible_parent_class)->get_name (obj);
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
  if (name != NULL)
    return name;

  label = get_label_from_statusbar (GTK_STATUSBAR (widget));
  if (GTK_IS_LABEL (label))
    return gtk_label_get_label (GTK_LABEL (label));

  return NULL;
}

static gint
gtk_statusbar_accessible_get_n_children (AtkObject *obj)
{
  return 0;
}

static AtkObject*
gtk_statusbar_accessible_ref_child (AtkObject *obj,
                                    gint       i)
{
  return NULL;
}

static void
128
gtk_statusbar_accessible_class_init (GtkStatusbarAccessibleClass *klass)
129 130
{
  AtkObjectClass  *class = ATK_OBJECT_CLASS (klass);
131
  GtkContainerAccessibleClass *container_class = (GtkContainerAccessibleClass*)klass;
132 133 134 135 136 137 138 139 140 141 142 143 144 145

  class->get_name = gtk_statusbar_accessible_get_name;
  class->get_n_children = gtk_statusbar_accessible_get_n_children;
  class->ref_child = gtk_statusbar_accessible_ref_child;
  class->initialize = gtk_statusbar_accessible_initialize;
  /*
   * As we report the statusbar as having no children
   * we are not interested in add and remove signals
   */
  container_class->add_gtk = NULL;
  container_class->remove_gtk = NULL;
}

static void
146
gtk_statusbar_accessible_init (GtkStatusbarAccessible *bar)
147 148
{
}