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