1 /*
2 * Copyright 2008 Codethink Ltd.
3 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19 */
20
21 #include <glib.h>
22 #include <string.h>
23 #include <atk/atk.h>
24 #include <stdio.h>
25
26 #include "my-atk-object.h"
27 #include "my-atk-hyperlink.h"
28 #include "my-atk-text.h"
29
30 typedef struct _MyAtkHyperlinkInfo MyAtkHyperlinkInfo;
31
G_DEFINE_TYPE(MyAtkHyperlink,my_atk_hyperlink,ATK_TYPE_HYPERLINK)32 G_DEFINE_TYPE (MyAtkHyperlink, my_atk_hyperlink, ATK_TYPE_HYPERLINK)
33
34 gint
35 my_atk_set_hyperlink (AtkHyperlink *obj, const gchar *uri, gint start, gint end)
36 {
37 MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
38 g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
39
40 self->uri = g_strdup (uri);
41 self->start = start;
42 self->end = end;
43 self->state = FALSE;
44 self->selected = FALSE;
45
46 return 0;
47 }
48
49 MyAtkHyperlink *
new_MyAtkHyperlink(void)50 new_MyAtkHyperlink (void)
51 {
52 return g_object_new (MY_TYPE_ATK_HYPERLINK, NULL);
53 }
54
55 static gchar*
my_atk_hyperlink_get_uri(AtkHyperlink * obj,gint i)56 my_atk_hyperlink_get_uri (AtkHyperlink *obj, gint i)
57 {
58 MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
59 g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), NULL);
60
61 return self->uri;
62 }
63
64 static AtkObject *
my_atk_hyperlink_get_object(AtkHyperlink * obj,gint i)65 my_atk_hyperlink_get_object (AtkHyperlink *obj, gint i)
66 {
67 MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
68 MyAtkText *text;
69 g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), NULL);
70
71 text = my_atk_text_new ();
72 my_atk_set_text (ATK_TEXT (text),
73 self->uri,
74 10,
75 50,
76 self->end - self->start,
77 15,
78 NULL);
79
80 return ATK_OBJECT (text);
81 }
82
83 static gint
my_atk_hyperlink_get_end_index(AtkHyperlink * obj)84 my_atk_hyperlink_get_end_index (AtkHyperlink *obj)
85 {
86 MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
87 g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
88
89 return self->end;
90 }
91
92 static gint
my_atk_hyperlink_get_start_index(AtkHyperlink * obj)93 my_atk_hyperlink_get_start_index (AtkHyperlink *obj)
94 {
95 MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
96 g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
97
98 return self->start;
99 }
100
101 static gboolean
my_atk_hyperlink_is_valid(AtkHyperlink * obj)102 my_atk_hyperlink_is_valid (AtkHyperlink *obj)
103 {
104 g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), FALSE);
105
106 return TRUE;
107 }
108
109 static gint
my_atk_hyperlink_get_n_anchors(AtkHyperlink * obj)110 my_atk_hyperlink_get_n_anchors (AtkHyperlink *obj)
111 {
112 g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
113
114 return 1;
115 }
116
117 static guint
my_atk_hyperlink_link_state(AtkHyperlink * obj)118 my_atk_hyperlink_link_state (AtkHyperlink *obj)
119 {
120 MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
121 g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
122
123 return self->state;
124 }
125
126 static gboolean
my_atk_hyperlink_is_selected_link(AtkHyperlink * obj)127 my_atk_hyperlink_is_selected_link (AtkHyperlink *obj)
128 {
129 MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
130 g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), FALSE);
131
132 return self->selected;
133 }
134
135 static void
my_atk_hyperlink_link_activated(AtkHyperlink * obj)136 my_atk_hyperlink_link_activated (AtkHyperlink *obj)
137 {
138 MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
139 g_return_if_fail (MY_IS_ATK_HYPERLINK (obj));
140
141 self->selected = !self->selected;
142 }
143
144 static void
my_atk_hyperlink_init(MyAtkHyperlink * self)145 my_atk_hyperlink_init (MyAtkHyperlink *self)
146 {
147 self->uri =NULL;
148 self->start = -1;
149 self->end = -1;
150 self->state = FALSE;
151 self->selected = FALSE;
152 }
153
154 static void
my_atk_hyperlink_set_property(GObject * obj,guint id,const GValue * value,GParamSpec * spec)155 my_atk_hyperlink_set_property (GObject *obj,
156 guint id,
157 const GValue *value,
158 GParamSpec *spec)
159 {
160 switch (id) {
161 case 1:
162 break;
163 case 2:
164 break;
165 case 3:
166 break;
167 default:
168 //G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, id, pspec);
169 break;
170 }
171 }
172
173 static void
my_atk_hyperlink_get_property(GObject * obj,guint id,GValue * value,GParamSpec * pspec)174 my_atk_hyperlink_get_property (GObject *obj,
175 guint id,
176 GValue *value,
177 GParamSpec *pspec)
178 {
179 }
180
181 static void
my_atk_hyperlink_class_finalize(GObject * obj)182 my_atk_hyperlink_class_finalize (GObject *obj)
183 {
184 }
185
186 static void
my_atk_hyperlink_class_init(MyAtkHyperlinkClass * my_class)187 my_atk_hyperlink_class_init (MyAtkHyperlinkClass *my_class)
188 {
189 GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
190 AtkHyperlinkClass *iface = ATK_HYPERLINK_CLASS (my_class);
191 const gchar *inst_tab[] = {"accessible-name", "accessible-description", "accessible-role", NULL};
192
193 gobject_class->finalize = my_atk_hyperlink_class_finalize;
194 gobject_class->set_property = my_atk_hyperlink_set_property;
195 gobject_class->get_property = my_atk_hyperlink_get_property;
196
197 gint i;
198 for (i = 0; inst_tab[i] != NULL ; i++)
199 g_object_class_install_property (gobject_class,
200 i+1,
201 g_param_spec_string (inst_tab[i],
202 inst_tab[i],
203 inst_tab[i],
204 NULL,
205 G_PARAM_READWRITE)
206 );
207
208 iface->get_uri = my_atk_hyperlink_get_uri;
209 iface->get_object = my_atk_hyperlink_get_object;
210 iface->get_end_index = my_atk_hyperlink_get_end_index;
211 iface->get_start_index = my_atk_hyperlink_get_start_index;
212 iface->is_valid = my_atk_hyperlink_is_valid;
213 iface->get_n_anchors = my_atk_hyperlink_get_n_anchors;
214 iface->link_state = my_atk_hyperlink_link_state;
215 iface->is_selected_link = my_atk_hyperlink_is_selected_link;
216 iface->link_activated = my_atk_hyperlink_link_activated;
217 }
218