]> Pileus Git - ~andy/gtk/blob - gtk/a11y/gtklinkbuttonaccessible.c
Change FSF Address
[~andy/gtk] / gtk / a11y / gtklinkbuttonaccessible.c
1 /* GAIL - The GNOME Accessibility Implementation Library
2  * Copyright 2011 Red Hat, Inc.
3  *
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.
8  *
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.
13  *
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/>.
16  */
17
18 #include "config.h"
19
20 #include <gtk/gtk.h>
21 #include "gtklinkbuttonaccessible.h"
22
23 typedef struct _GtkLinkButtonAccessibleLink GtkLinkButtonAccessibleLink;
24 typedef struct _GtkLinkButtonAccessibleLinkClass GtkLinkButtonAccessibleLinkClass;
25
26 struct _GtkLinkButtonAccessibleLink
27 {
28   AtkHyperlink parent;
29
30   GtkLinkButtonAccessible *button;
31 };
32
33 struct _GtkLinkButtonAccessibleLinkClass
34 {
35   AtkHyperlinkClass parent_class;
36 };
37
38 static void atk_action_interface_init (AtkActionIface *iface);
39
40 G_DEFINE_TYPE_WITH_CODE (GtkLinkButtonAccessibleLink, _gtk_link_button_accessible_link, ATK_TYPE_HYPERLINK,
41                          G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init))
42
43 static AtkHyperlink *
44 gtk_link_button_accessible_link_new (GtkLinkButtonAccessible *button)
45 {
46   GtkLinkButtonAccessibleLink *l;
47
48   l = g_object_new (_gtk_link_button_accessible_link_get_type (), NULL);
49   l->button = button;
50
51   return ATK_HYPERLINK (l);
52 }
53
54 static gchar *
55 gtk_link_button_accessible_link_get_uri (AtkHyperlink *atk_link,
56                                          gint          i)
57 {
58   GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)atk_link;
59   GtkWidget *widget;
60   const gchar *uri;
61
62   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (l->button));
63   uri = gtk_link_button_get_uri (GTK_LINK_BUTTON (widget));
64
65   return g_strdup (uri);
66 }
67
68 static gint
69 gtk_link_button_accessible_link_get_n_anchors (AtkHyperlink *atk_link)
70 {
71   return 1;
72 }
73
74 static gboolean
75 gtk_link_button_accessible_link_is_valid (AtkHyperlink *atk_link)
76 {
77   return TRUE;
78 }
79
80 static AtkObject *
81 gtk_link_button_accessible_link_get_object (AtkHyperlink *atk_link,
82                                             gint          i)
83 {
84   GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)atk_link;
85
86   return ATK_OBJECT (l->button);
87 }
88
89 static gint
90 gtk_link_button_accessible_link_get_start_index (AtkHyperlink *atk_link)
91 {
92   return 0;
93 }
94
95 static gint
96 gtk_link_button_accessible_link_get_end_index (AtkHyperlink *atk_link)
97 {
98   GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)atk_link;
99
100   return atk_text_get_character_count (ATK_TEXT (l->button));
101 }
102
103 static void
104 _gtk_link_button_accessible_link_init (GtkLinkButtonAccessibleLink *l)
105 {
106 }
107
108 static void
109 _gtk_link_button_accessible_link_class_init (GtkLinkButtonAccessibleLinkClass *class)
110 {
111   AtkHyperlinkClass *atk_link_class = ATK_HYPERLINK_CLASS (class);
112
113   atk_link_class->get_uri = gtk_link_button_accessible_link_get_uri;
114   atk_link_class->get_n_anchors = gtk_link_button_accessible_link_get_n_anchors;
115   atk_link_class->is_valid = gtk_link_button_accessible_link_is_valid;
116   atk_link_class->get_object = gtk_link_button_accessible_link_get_object;
117   atk_link_class->get_start_index = gtk_link_button_accessible_link_get_start_index;
118   atk_link_class->get_end_index = gtk_link_button_accessible_link_get_end_index;
119 }
120
121 static gboolean
122 gtk_link_button_accessible_link_do_action (AtkAction *action,
123                                            gint       i)
124 {
125   GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)action;
126   GtkWidget *widget;
127
128   widget = GTK_WIDGET (l->button);
129   if (widget == NULL)
130     return FALSE;
131
132   if (i != 0)
133     return FALSE;
134
135   if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_visible (widget))
136     return FALSE;
137
138   gtk_button_clicked (GTK_BUTTON (widget));
139
140   return TRUE;
141 }
142
143 static gint
144 gtk_link_button_accessible_link_get_n_actions (AtkAction *action)
145 {
146   return 1;
147 }
148
149 static const gchar *
150 gtk_link_button_accessible_link_get_name (AtkAction *action,
151                                           gint       i)
152 {
153   if (i != 0)
154     return NULL;
155
156   return "activate";
157 }
158
159 static void
160 atk_action_interface_init (AtkActionIface *iface)
161 {
162   iface->do_action = gtk_link_button_accessible_link_do_action;
163   iface->get_n_actions = gtk_link_button_accessible_link_get_n_actions;
164   iface->get_name = gtk_link_button_accessible_link_get_name;
165 }
166
167 static gboolean
168 activate_link (GtkLinkButton *button,
169                AtkHyperlink  *atk_link)
170 {
171   g_signal_emit_by_name (atk_link, "link-activated");
172
173   return FALSE;
174 }
175
176 static AtkHyperlink *
177 gtk_link_button_accessible_get_hyperlink (AtkHyperlinkImpl *impl)
178 {
179   GtkLinkButtonAccessible *button = GTK_LINK_BUTTON_ACCESSIBLE (impl);
180
181   if (!button->link)
182     {
183       button->link = gtk_link_button_accessible_link_new (button);
184       g_signal_connect (gtk_accessible_get_widget (GTK_ACCESSIBLE (button)),
185                         "activate-link", G_CALLBACK (activate_link), button->link);
186     }
187
188   return g_object_ref (button->link);
189 }
190
191 static void atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface);
192
193 G_DEFINE_TYPE_WITH_CODE (GtkLinkButtonAccessible, _gtk_link_button_accessible, GTK_TYPE_BUTTON_ACCESSIBLE,
194                          G_IMPLEMENT_INTERFACE (ATK_TYPE_HYPERLINK_IMPL, atk_hypertext_impl_interface_init))
195
196 static void
197 _gtk_link_button_accessible_init (GtkLinkButtonAccessible *button)
198 {
199 }
200
201 static void
202 gtk_link_button_accessible_finalize (GObject *object)
203 {
204   GtkLinkButtonAccessible *button = GTK_LINK_BUTTON_ACCESSIBLE (object);
205
206   if (button->link)
207     g_object_unref (button->link);
208
209   G_OBJECT_CLASS (_gtk_link_button_accessible_parent_class)->finalize (object);
210 }
211
212 static void
213 _gtk_link_button_accessible_class_init (GtkLinkButtonAccessibleClass *klass)
214 {
215   G_OBJECT_CLASS (klass)->finalize = gtk_link_button_accessible_finalize;
216 }
217
218 static void
219 atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface)
220 {
221   iface->get_hyperlink = gtk_link_button_accessible_get_hyperlink;
222 }