3 #include "my-atk-text.h"
4 #include "my-atk-hyperlink.h"
5 #include "my-atk-hypertext.h"
7 //***************************implementation****************************************
8 static MyAtkTextClass *parent_class_atk_text = NULL;
12 gint start_offset, end_offset;
15 // Implementation of virtual functions
17 //***************************my_atk_hypertext_get_n_links*************************
18 gint my_atk_hypertext_get_n_links(AtkHypertext* hypertext)
20 MyAtkHypertext* self = (MyAtkHypertext*)hypertext;
22 return self->hyperlinks->len;
24 //***************************my_atk_hypertext_get_link***********************
25 AtkHyperlink* my_atk_hypertext_get_link(AtkHypertext* hypertext, gint link_index)
27 MyAtkHypertext* self = (MyAtkHypertext*)hypertext;
29 if(link_index < 0 || link_index >= self->hyperlinks->len)
31 return g_ptr_array_index(self->hyperlinks, link_index);
33 //*************************my_atk_hypertext_get_link_index*******************
34 gint my_atk_hypertext_get_link_index(AtkHypertext* hypertext, gint char_index)
37 MyAtkHypertext* self = (MyAtkHypertext*)hypertext;
38 GArray* ranges = self->hyperlink_ranges;
39 for(i = ranges->len - 1; i >= 0; i--)
41 HyperlinkRange *range = &g_array_index(ranges, HyperlinkRange, i);
42 if(range->start_offset <= char_index)
44 if(range->end_offset > char_index)return range->index;
51 gboolean my_atk_hypertext_add_hyperlink(MyAtkHypertext* hypertext,
52 gint start_index, gint end_index, const gchar* uri)
54 MyAtkHyperlink* new_hyperlink;
55 GArray* ranges = hypertext->hyperlink_ranges;
57 for(i = 0; i < ranges->len; i++)
59 HyperlinkRange *range = &g_array_index(ranges, HyperlinkRange, i);
60 if(range->end_offset <= start_index) continue;
61 if(range->start_offset < end_index) return FALSE;
64 new_hyperlink = my_atk_hyperlink_new(start_index, end_index, uri);
65 g_ptr_array_add(hypertext->hyperlinks, new_hyperlink);
66 HyperlinkRange new_range;
67 new_range.start_offset = start_index;
68 new_range.end_offset = end_index;
69 new_range.index = hypertext->hyperlinks->len - 1;
70 g_array_insert_val(ranges, i, new_range);
74 void my_atk_hypertext_select_link(MyAtkHypertext* hypertext, gint index)
76 if(index < 0 || index >= my_atk_hypertext_get_n_links((AtkHypertext*)hypertext))
79 if(hypertext->current_selected_link != -1)
81 MyAtkHyperlink *selected_link_old =
82 (MyAtkHyperlink*)my_atk_hypertext_get_link(
83 (AtkHypertext*)hypertext, hypertext->current_selected_link);
84 selected_link_old->is_selected = FALSE;
87 hypertext->current_selected_link = index;
88 MyAtkHyperlink *selected_link_new = (MyAtkHyperlink*)my_atk_hypertext_get_link(
89 (AtkHypertext*)hypertext, hypertext->current_selected_link);
90 selected_link_new->is_selected = TRUE;
92 g_signal_emit_by_name(hypertext,
93 "link-selected", hypertext->current_selected_link);
95 //initialize/finalize functions
96 static void my_atk_hypertext_instance_init(GTypeInstance *obj, gpointer g_class)
98 MyAtkHypertext *self = (MyAtkHypertext*)obj;
100 self->hyperlink_ranges = g_array_new(FALSE, FALSE, sizeof(HyperlinkRange));
101 self->hyperlinks = g_ptr_array_new();
103 self->current_selected_link = -1;
105 static void my_atk_hypertext_instance_finalize(GObject* obj)
107 MyAtkHypertext *self = (MyAtkHypertext*)obj;
109 g_array_free(self->hyperlink_ranges, FALSE);
111 g_ptr_array_foreach(self->hyperlinks,(GFunc)g_object_unref, NULL);
112 g_ptr_array_free(self->hyperlinks, FALSE);
115 static void my_atk_hypertext_class_init(gpointer g_class, gpointer class_data)
117 GObjectClass* g_object_class = (GObjectClass*)g_class;
118 //GObject virtual table
119 g_object_class->finalize = my_atk_hypertext_instance_finalize;
121 parent_class_atk_text = g_type_class_peek_parent(g_class);
123 static void my_atk_hypertext_interface_init(gpointer g_iface, gpointer iface_data)
125 AtkHypertextIface *klass = (AtkHypertextIface*)g_iface;
127 klass->get_link = my_atk_hypertext_get_link;
128 klass->get_n_links = my_atk_hypertext_get_n_links;
129 klass->get_link_index = my_atk_hypertext_get_link_index;
132 GType my_atk_hypertext_get_type()
134 static GType type = 0;
137 static const GTypeInfo typeInfo =
139 sizeof(MyAtkHypertextClass),
141 NULL, //base_finalize
142 my_atk_hypertext_class_init, //class_init
143 NULL, //class_finalize
145 sizeof(MyAtkHypertext),
147 my_atk_hypertext_instance_init //instance_init
150 static const GInterfaceInfo AtkTextIface_info =
152 my_atk_text_interface_init, /* interface_init*/
153 NULL, /* interface_finalize*/
154 NULL /* interface_data */
156 static const GInterfaceInfo AtkHypertextIface_info =
158 my_atk_hypertext_interface_init,/* interface_init*/
159 NULL, /* interface_finalize*/
160 NULL /* interface_data */
162 type = g_type_register_static(MY_TYPE_ATK_TEXT, "MyAtkHypertext", &typeInfo, 0);
163 g_type_add_interface_static(type,
167 g_type_add_interface_static(type,
169 &AtkHypertextIface_info);