]> Pileus Git - ~andy/gtk/blob - gtk/a11y/gtklinkbuttonaccessible.c
filechooser: Rename _gtk_file_is_path_not_local() to _gtk_file_has_native_path()
[~andy/gtk] / gtk / a11y / gtklinkbuttonaccessible.c
1 /* GTK+ - accessibility implementations
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 _GtkLinkButtonAccessiblePrivate
27 {
28   AtkHyperlink *link;
29 };
30
31 struct _GtkLinkButtonAccessibleLink
32 {
33   AtkHyperlink parent;
34
35   GtkLinkButtonAccessible *button;
36 };
37
38 struct _GtkLinkButtonAccessibleLinkClass
39 {
40   AtkHyperlinkClass parent_class;
41 };
42
43 static void atk_action_interface_init (AtkActionIface *iface);
44
45 GType _gtk_link_button_accessible_link_get_type (void);
46
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))
49
50 static AtkHyperlink *
51 gtk_link_button_accessible_link_new (GtkLinkButtonAccessible *button)
52 {
53   GtkLinkButtonAccessibleLink *l;
54
55   l = g_object_new (_gtk_link_button_accessible_link_get_type (), NULL);
56   l->button = button;
57
58   return ATK_HYPERLINK (l);
59 }
60
61 static gchar *
62 gtk_link_button_accessible_link_get_uri (AtkHyperlink *atk_link,
63                                          gint          i)
64 {
65   GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)atk_link;
66   GtkWidget *widget;
67   const gchar *uri;
68
69   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (l->button));
70   uri = gtk_link_button_get_uri (GTK_LINK_BUTTON (widget));
71
72   return g_strdup (uri);
73 }
74
75 static gint
76 gtk_link_button_accessible_link_get_n_anchors (AtkHyperlink *atk_link)
77 {
78   return 1;
79 }
80
81 static gboolean
82 gtk_link_button_accessible_link_is_valid (AtkHyperlink *atk_link)
83 {
84   return TRUE;
85 }
86
87 static AtkObject *
88 gtk_link_button_accessible_link_get_object (AtkHyperlink *atk_link,
89                                             gint          i)
90 {
91   GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)atk_link;
92
93   return ATK_OBJECT (l->button);
94 }
95
96 static gint
97 gtk_link_button_accessible_link_get_start_index (AtkHyperlink *atk_link)
98 {
99   return 0;
100 }
101
102 static gint
103 gtk_link_button_accessible_link_get_end_index (AtkHyperlink *atk_link)
104 {
105   GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)atk_link;
106
107   return atk_text_get_character_count (ATK_TEXT (l->button));
108 }
109
110 static void
111 _gtk_link_button_accessible_link_init (GtkLinkButtonAccessibleLink *l)
112 {
113 }
114
115 static void
116 _gtk_link_button_accessible_link_class_init (GtkLinkButtonAccessibleLinkClass *class)
117 {
118   AtkHyperlinkClass *atk_link_class = ATK_HYPERLINK_CLASS (class);
119
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;
126 }
127
128 static gboolean
129 gtk_link_button_accessible_link_do_action (AtkAction *action,
130                                            gint       i)
131 {
132   GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)action;
133   GtkWidget *widget;
134
135   widget = GTK_WIDGET (l->button);
136   if (widget == NULL)
137     return FALSE;
138
139   if (i != 0)
140     return FALSE;
141
142   if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_visible (widget))
143     return FALSE;
144
145   gtk_button_clicked (GTK_BUTTON (widget));
146
147   return TRUE;
148 }
149
150 static gint
151 gtk_link_button_accessible_link_get_n_actions (AtkAction *action)
152 {
153   return 1;
154 }
155
156 static const gchar *
157 gtk_link_button_accessible_link_get_name (AtkAction *action,
158                                           gint       i)
159 {
160   if (i != 0)
161     return NULL;
162
163   return "activate";
164 }
165
166 static void
167 atk_action_interface_init (AtkActionIface *iface)
168 {
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;
172 }
173
174 static gboolean
175 activate_link (GtkLinkButton *button,
176                AtkHyperlink  *atk_link)
177 {
178   g_signal_emit_by_name (atk_link, "link-activated");
179
180   return FALSE;
181 }
182
183 static AtkHyperlink *
184 gtk_link_button_accessible_get_hyperlink (AtkHyperlinkImpl *impl)
185 {
186   GtkLinkButtonAccessible *button = GTK_LINK_BUTTON_ACCESSIBLE (impl);
187
188   if (!button->priv->link)
189     {
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);
193     }
194
195   return g_object_ref (button->priv->link);
196 }
197
198 static void atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface);
199
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))
202
203 static void
204 gtk_link_button_accessible_init (GtkLinkButtonAccessible *button)
205 {
206   button->priv = G_TYPE_INSTANCE_GET_PRIVATE (button,
207                                               GTK_TYPE_LINK_BUTTON_ACCESSIBLE,
208                                               GtkLinkButtonAccessiblePrivate);
209 }
210
211 static void
212 gtk_link_button_accessible_finalize (GObject *object)
213 {
214   GtkLinkButtonAccessible *button = GTK_LINK_BUTTON_ACCESSIBLE (object);
215
216   if (button->priv->link)
217     g_object_unref (button->priv->link);
218
219   G_OBJECT_CLASS (gtk_link_button_accessible_parent_class)->finalize (object);
220 }
221
222 static void
223 gtk_link_button_accessible_class_init (GtkLinkButtonAccessibleClass *klass)
224 {
225   G_OBJECT_CLASS (klass)->finalize = gtk_link_button_accessible_finalize;
226
227   g_type_class_add_private (klass, sizeof (GtkLinkButtonAccessiblePrivate));
228 }
229
230 static void
231 atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface)
232 {
233   iface->get_hyperlink = gtk_link_button_accessible_get_hyperlink;
234 }