1 /* GAIL - The GNOME Accessibility Implementation Library
2 * Copyright 2011 Red Hat, 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, see <http://www.gnu.org/licenses/>.
21 #include "gtklinkbuttonaccessible.h"
23 typedef struct _GtkLinkButtonAccessibleLink GtkLinkButtonAccessibleLink;
24 typedef struct _GtkLinkButtonAccessibleLinkClass GtkLinkButtonAccessibleLinkClass;
26 struct _GtkLinkButtonAccessiblePrivate
31 struct _GtkLinkButtonAccessibleLink
35 GtkLinkButtonAccessible *button;
38 struct _GtkLinkButtonAccessibleLinkClass
40 AtkHyperlinkClass parent_class;
43 static void atk_action_interface_init (AtkActionIface *iface);
45 GType _gtk_link_button_accessible_link_get_type (void);
47 G_DEFINE_TYPE_WITH_CODE (GtkLinkButtonAccessibleLink, _gtk_link_button_accessible_link, ATK_TYPE_HYPERLINK,
48 G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init))
51 gtk_link_button_accessible_link_new (GtkLinkButtonAccessible *button)
53 GtkLinkButtonAccessibleLink *l;
55 l = g_object_new (_gtk_link_button_accessible_link_get_type (), NULL);
58 return ATK_HYPERLINK (l);
62 gtk_link_button_accessible_link_get_uri (AtkHyperlink *atk_link,
65 GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)atk_link;
69 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (l->button));
70 uri = gtk_link_button_get_uri (GTK_LINK_BUTTON (widget));
72 return g_strdup (uri);
76 gtk_link_button_accessible_link_get_n_anchors (AtkHyperlink *atk_link)
82 gtk_link_button_accessible_link_is_valid (AtkHyperlink *atk_link)
88 gtk_link_button_accessible_link_get_object (AtkHyperlink *atk_link,
91 GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)atk_link;
93 return ATK_OBJECT (l->button);
97 gtk_link_button_accessible_link_get_start_index (AtkHyperlink *atk_link)
103 gtk_link_button_accessible_link_get_end_index (AtkHyperlink *atk_link)
105 GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)atk_link;
107 return atk_text_get_character_count (ATK_TEXT (l->button));
111 _gtk_link_button_accessible_link_init (GtkLinkButtonAccessibleLink *l)
116 _gtk_link_button_accessible_link_class_init (GtkLinkButtonAccessibleLinkClass *class)
118 AtkHyperlinkClass *atk_link_class = ATK_HYPERLINK_CLASS (class);
120 atk_link_class->get_uri = gtk_link_button_accessible_link_get_uri;
121 atk_link_class->get_n_anchors = gtk_link_button_accessible_link_get_n_anchors;
122 atk_link_class->is_valid = gtk_link_button_accessible_link_is_valid;
123 atk_link_class->get_object = gtk_link_button_accessible_link_get_object;
124 atk_link_class->get_start_index = gtk_link_button_accessible_link_get_start_index;
125 atk_link_class->get_end_index = gtk_link_button_accessible_link_get_end_index;
129 gtk_link_button_accessible_link_do_action (AtkAction *action,
132 GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)action;
135 widget = GTK_WIDGET (l->button);
142 if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_visible (widget))
145 gtk_button_clicked (GTK_BUTTON (widget));
151 gtk_link_button_accessible_link_get_n_actions (AtkAction *action)
157 gtk_link_button_accessible_link_get_name (AtkAction *action,
167 atk_action_interface_init (AtkActionIface *iface)
169 iface->do_action = gtk_link_button_accessible_link_do_action;
170 iface->get_n_actions = gtk_link_button_accessible_link_get_n_actions;
171 iface->get_name = gtk_link_button_accessible_link_get_name;
175 activate_link (GtkLinkButton *button,
176 AtkHyperlink *atk_link)
178 g_signal_emit_by_name (atk_link, "link-activated");
183 static AtkHyperlink *
184 gtk_link_button_accessible_get_hyperlink (AtkHyperlinkImpl *impl)
186 GtkLinkButtonAccessible *button = GTK_LINK_BUTTON_ACCESSIBLE (impl);
188 if (!button->priv->link)
190 button->priv->link = gtk_link_button_accessible_link_new (button);
191 g_signal_connect (gtk_accessible_get_widget (GTK_ACCESSIBLE (button)),
192 "activate-link", G_CALLBACK (activate_link), button->priv->link);
195 return g_object_ref (button->priv->link);
198 static void atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface);
200 G_DEFINE_TYPE_WITH_CODE (GtkLinkButtonAccessible, _gtk_link_button_accessible, GTK_TYPE_BUTTON_ACCESSIBLE,
201 G_IMPLEMENT_INTERFACE (ATK_TYPE_HYPERLINK_IMPL, atk_hypertext_impl_interface_init))
204 _gtk_link_button_accessible_init (GtkLinkButtonAccessible *button)
206 button->priv = G_TYPE_INSTANCE_GET_PRIVATE (button,
207 GTK_TYPE_LINK_BUTTON_ACCESSIBLE,
208 GtkLinkButtonAccessiblePrivate);
212 gtk_link_button_accessible_finalize (GObject *object)
214 GtkLinkButtonAccessible *button = GTK_LINK_BUTTON_ACCESSIBLE (object);
216 if (button->priv->link)
217 g_object_unref (button->priv->link);
219 G_OBJECT_CLASS (_gtk_link_button_accessible_parent_class)->finalize (object);
223 _gtk_link_button_accessible_class_init (GtkLinkButtonAccessibleClass *klass)
225 G_OBJECT_CLASS (klass)->finalize = gtk_link_button_accessible_finalize;
227 g_type_class_add_private (klass, sizeof (GtkLinkButtonAccessiblePrivate));
231 atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface)
233 iface->get_hyperlink = gtk_link_button_accessible_get_hyperlink;