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, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
23 #include "gaillinkbutton.h"
25 typedef struct _GailLinkButtonLink GailLinkButtonLink;
26 typedef struct _GailLinkButtonLinkClass GailLinkButtonLinkClass;
28 struct _GailLinkButtonLink
32 GailLinkButton *button;
36 struct _GailLinkButtonLinkClass
38 AtkHyperlinkClass parent_class;
41 static void atk_action_interface_init (AtkActionIface *iface);
43 G_DEFINE_TYPE_WITH_CODE (GailLinkButtonLink, gail_link_button_link, ATK_TYPE_HYPERLINK,
44 G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init))
47 gail_link_button_link_get_uri (AtkHyperlink *link,
50 GailLinkButtonLink *l = (GailLinkButtonLink *)link;
54 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (l->button));
55 uri = gtk_link_button_get_uri (GTK_LINK_BUTTON (widget));
57 return g_strdup (uri);
61 gail_link_button_link_get_n_anchors (AtkHyperlink *link)
67 gail_link_button_link_is_valid (AtkHyperlink *link)
73 gail_link_button_link_get_object (AtkHyperlink *link,
76 GailLinkButtonLink *l = (GailLinkButtonLink *)link;
78 return ATK_OBJECT (l->button);
82 gail_link_button_link_get_start_index (AtkHyperlink *link)
88 gail_link_button_link_get_end_index (AtkHyperlink *link)
90 GailLinkButtonLink *l = (GailLinkButtonLink *)link;
92 return atk_text_get_character_count (ATK_TEXT (l->button));
96 gail_link_button_link_init (GailLinkButtonLink *link)
98 link->description = NULL;
102 gail_link_button_link_finalize (GObject *obj)
104 GailLinkButtonLink *link = (GailLinkButtonLink *)obj;
106 g_free (link->description);
108 G_OBJECT_CLASS (gail_link_button_link_parent_class)->finalize (obj);
112 gail_link_button_link_class_init (GailLinkButtonLinkClass *class)
114 GObjectClass *object_class = G_OBJECT_CLASS (class);
115 AtkHyperlinkClass *hyperlink_class = ATK_HYPERLINK_CLASS (class);
117 object_class->finalize = gail_link_button_link_finalize;
119 hyperlink_class->get_uri = gail_link_button_link_get_uri;
120 hyperlink_class->get_n_anchors = gail_link_button_link_get_n_anchors;
121 hyperlink_class->is_valid = gail_link_button_link_is_valid;
122 hyperlink_class->get_object = gail_link_button_link_get_object;
123 hyperlink_class->get_start_index = gail_link_button_link_get_start_index;
124 hyperlink_class->get_end_index = gail_link_button_link_get_end_index;
128 gail_link_button_link_do_action (AtkAction *action,
131 GailLinkButtonLink *link = (GailLinkButtonLink *)action;
134 widget = GTK_WIDGET (link->button);
141 if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_visible (widget))
144 gtk_button_clicked (GTK_BUTTON (widget));
150 gail_link_button_link_get_n_actions (AtkAction *action)
156 gail_link_button_link_get_name (AtkAction *action,
159 g_return_val_if_fail (i == 0, NULL);
165 gail_link_button_link_get_description (AtkAction *action,
168 GailLinkButtonLink *link = (GailLinkButtonLink *)action;
170 g_return_val_if_fail (i == 0, NULL);
172 return link->description;
176 gail_link_button_link_set_description (AtkAction *action,
178 const gchar *description)
180 GailLinkButtonLink *link = (GailLinkButtonLink *)action;
182 g_return_val_if_fail (i == 0, FALSE);
184 g_free (link->description);
185 link->description = g_strdup (description);
192 atk_action_interface_init (AtkActionIface *iface)
194 iface->do_action = gail_link_button_link_do_action;
195 iface->get_n_actions = gail_link_button_link_get_n_actions;
196 iface->get_name = gail_link_button_link_get_name;
197 iface->get_description = gail_link_button_link_get_description;
198 iface->set_description = gail_link_button_link_set_description;
202 activate_link (GtkLinkButton *button, AtkHyperlink *link)
204 g_signal_emit_by_name (link, "link-activated");
209 static AtkHyperlink *
210 gail_link_button_get_hyperlink (AtkHyperlinkImpl *impl)
212 GailLinkButton *button = GAIL_LINK_BUTTON (impl);
216 button->link = g_object_new (gail_link_button_link_get_type (), NULL);
217 g_signal_connect (gtk_accessible_get_widget (GTK_ACCESSIBLE (button)),
218 "activate-link", G_CALLBACK (activate_link), button->link);
224 static void atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface);
226 G_DEFINE_TYPE_WITH_CODE (GailLinkButton, gail_link_button, GAIL_TYPE_BUTTON,
227 G_IMPLEMENT_INTERFACE (ATK_TYPE_HYPERLINK_IMPL, atk_hypertext_impl_interface_init))
230 gail_link_button_init (GailLinkButton *button)
235 gail_link_button_finalize (GObject *object)
237 GailLinkButton *button = GAIL_LINK_BUTTON (object);
240 g_object_unref (button->link);
242 G_OBJECT_CLASS (gail_link_button_parent_class)->finalize (object);
246 gail_link_button_class_init (GailLinkButtonClass *klass)
248 G_OBJECT_CLASS (klass)->finalize = gail_link_button_finalize;
252 atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface)
254 iface->get_hyperlink = gail_link_button_get_hyperlink;