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 <atk/atk.h>
22
#include <glib.h>
23
#include <stdio.h>
24
#include <string.h>
25

            
26
#include "my-atk-hyperlink.h"
27
#include "my-atk-object.h"
28
#include "my-atk-text.h"
29

            
30
typedef struct _MyAtkHyperlinkInfo MyAtkHyperlinkInfo;
31

            
32
10
G_DEFINE_TYPE (MyAtkHyperlink, my_atk_hyperlink, ATK_TYPE_HYPERLINK)
33

            
34
gint
35
20
my_atk_set_hyperlink (AtkHyperlink *obj, const gchar *uri, gint start, gint end)
36
{
37
20
  MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
38
20
  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
39

            
40
20
  self->uri = g_strdup (uri);
41
20
  self->start = start;
42
20
  self->end = end;
43
20
  self->state = FALSE;
44
20
  self->selected = FALSE;
45

            
46
20
  return 0;
47
}
48

            
49
MyAtkHyperlink *
50
20
new_MyAtkHyperlink (void)
51
{
52
20
  return g_object_new (MY_TYPE_ATK_HYPERLINK, NULL);
53
}
54

            
55
static gchar *
56
3
my_atk_hyperlink_get_uri (AtkHyperlink *obj, gint i)
57
{
58
3
  MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
59
3
  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), NULL);
60

            
61
3
  return self->uri;
62
}
63

            
64
static AtkObject *
65
1
my_atk_hyperlink_get_object (AtkHyperlink *obj, gint i)
66
{
67
1
  MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
68
  MyAtkText *text;
69
1
  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), NULL);
70

            
71
1
  text = my_atk_text_new ();
72
1
  my_atk_set_text (ATK_TEXT (text),
73
1
                   self->uri,
74
                   10,
75
                   50,
76
1
                   self->end - self->start,
77
                   15,
78
                   NULL);
79

            
80
1
  return ATK_OBJECT (text);
81
}
82

            
83
static gint
84
1
my_atk_hyperlink_get_end_index (AtkHyperlink *obj)
85
{
86
1
  MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
87
1
  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
88

            
89
1
  return self->end;
90
}
91

            
92
static gint
93
1
my_atk_hyperlink_get_start_index (AtkHyperlink *obj)
94
{
95
1
  MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
96
1
  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
97

            
98
1
  return self->start;
99
}
100

            
101
static gboolean
102
1
my_atk_hyperlink_is_valid (AtkHyperlink *obj)
103
{
104
1
  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), FALSE);
105

            
106
1
  return TRUE;
107
}
108

            
109
static gint
110
1
my_atk_hyperlink_get_n_anchors (AtkHyperlink *obj)
111
{
112
1
  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
113

            
114
1
  return 1;
115
}
116

            
117
static guint
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
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
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
145
20
my_atk_hyperlink_init (MyAtkHyperlink *self)
146
{
147
20
  self->uri = NULL;
148
20
  self->start = -1;
149
20
  self->end = -1;
150
20
  self->state = FALSE;
151
20
  self->selected = FALSE;
152
20
}
153

            
154
static void
155
my_atk_hyperlink_set_property (GObject *obj,
156
                               guint id,
157
                               const GValue *value,
158
                               GParamSpec *spec)
159
{
160
  switch (id)
161
    {
162
    case 1:
163
      break;
164
    case 2:
165
      break;
166
    case 3:
167
      break;
168
    default:
169
      // G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, id, pspec);
170
      break;
171
    }
172
}
173

            
174
static void
175
my_atk_hyperlink_get_property (GObject *obj,
176
                               guint id,
177
                               GValue *value,
178
                               GParamSpec *pspec)
179
{
180
}
181

            
182
static void
183
my_atk_hyperlink_class_finalize (GObject *obj)
184
{
185
}
186

            
187
static void
188
10
my_atk_hyperlink_class_init (MyAtkHyperlinkClass *my_class)
189
{
190
10
  GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
191
10
  AtkHyperlinkClass *iface = ATK_HYPERLINK_CLASS (my_class);
192
10
  const gchar *inst_tab[] = { "accessible-name", "accessible-description", "accessible-role", NULL };
193

            
194
10
  gobject_class->finalize = my_atk_hyperlink_class_finalize;
195
10
  gobject_class->set_property = my_atk_hyperlink_set_property;
196
10
  gobject_class->get_property = my_atk_hyperlink_get_property;
197

            
198
  gint i;
199
40
  for (i = 0; inst_tab[i] != NULL; i++)
200
30
    g_object_class_install_property (gobject_class,
201
30
                                     i + 1,
202
                                     g_param_spec_string (inst_tab[i],
203
                                                          inst_tab[i],
204
                                                          inst_tab[i],
205
                                                          NULL,
206
                                                          G_PARAM_READWRITE));
207

            
208
10
  iface->get_uri = my_atk_hyperlink_get_uri;
209
10
  iface->get_object = my_atk_hyperlink_get_object;
210
10
  iface->get_end_index = my_atk_hyperlink_get_end_index;
211
10
  iface->get_start_index = my_atk_hyperlink_get_start_index;
212
10
  iface->is_valid = my_atk_hyperlink_is_valid;
213
10
  iface->get_n_anchors = my_atk_hyperlink_get_n_anchors;
214
10
  iface->link_state = my_atk_hyperlink_link_state;
215
10
  iface->is_selected_link = my_atk_hyperlink_is_selected_link;
216
10
  iface->link_activated = my_atk_hyperlink_link_activated;
217
10
}