2009-27-09 Mark Doffman <mark.doffman@codethink.co.uk>
[platform/core/uifw/at-spi2-atk.git] / tests / dummyatk / my-atk-hypertext.c
1 #include <atk/atk.h>
2
3 #include "my-atk-text.h"
4 #include "my-atk-hyperlink.h"
5 #include "my-atk-hypertext.h"
6
7 //***************************implementation****************************************
8 static MyAtkTextClass *parent_class_atk_text = NULL;
9
10 typedef struct
11 {
12     gint start_offset, end_offset;
13     gint index;
14 }HyperlinkRange;
15 // Implementation of virtual functions
16
17 //***************************my_atk_hypertext_get_n_links*************************
18 gint my_atk_hypertext_get_n_links(AtkHypertext* hypertext)
19 {
20     MyAtkHypertext* self = (MyAtkHypertext*)hypertext;
21     
22     return self->hyperlinks->len; 
23 }
24 //***************************my_atk_hypertext_get_link***********************
25 AtkHyperlink* my_atk_hypertext_get_link(AtkHypertext* hypertext, gint link_index)
26 {
27     MyAtkHypertext* self = (MyAtkHypertext*)hypertext;
28     
29     if(link_index < 0 || link_index >= self->hyperlinks->len)
30         return NULL;
31     return g_ptr_array_index(self->hyperlinks, link_index);
32 }
33 //*************************my_atk_hypertext_get_link_index*******************
34 gint my_atk_hypertext_get_link_index(AtkHypertext* hypertext, gint char_index)
35 {
36     gint i;
37     MyAtkHypertext* self = (MyAtkHypertext*)hypertext;
38     GArray* ranges = self->hyperlink_ranges; 
39     for(i = ranges->len - 1; i >= 0; i--)
40     {
41         HyperlinkRange *range = &g_array_index(ranges, HyperlinkRange, i);
42         if(range->start_offset <= char_index)
43         {
44             if(range->end_offset > char_index)return range->index;
45             break;
46         }
47     }
48     return -1;
49 }
50 //others functions
51 gboolean my_atk_hypertext_add_hyperlink(MyAtkHypertext* hypertext,
52     gint start_index, gint end_index, const gchar* uri)
53 {
54     MyAtkHyperlink* new_hyperlink;
55     GArray* ranges = hypertext->hyperlink_ranges;
56     gint i;
57     for(i = 0; i < ranges->len; i++)
58     {
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;
62         break;
63     }
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);
71     return TRUE;
72 }
73 //
74 void my_atk_hypertext_select_link(MyAtkHypertext* hypertext, gint index)
75 {
76     if(index < 0 || index >= my_atk_hypertext_get_n_links((AtkHypertext*)hypertext))
77         return;
78     
79     if(hypertext->current_selected_link != -1)
80     {
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;
85     }
86     
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;
91     
92     g_signal_emit_by_name(hypertext,
93         "link-selected", hypertext->current_selected_link);    
94 }
95 //initialize/finalize functions
96 static void my_atk_hypertext_instance_init(GTypeInstance *obj, gpointer g_class)
97 {
98     MyAtkHypertext *self = (MyAtkHypertext*)obj;
99     
100     self->hyperlink_ranges = g_array_new(FALSE, FALSE, sizeof(HyperlinkRange));
101     self->hyperlinks = g_ptr_array_new();
102     
103     self->current_selected_link = -1;
104 }
105 static void my_atk_hypertext_instance_finalize(GObject* obj)
106 {
107     MyAtkHypertext *self = (MyAtkHypertext*)obj;
108     
109     g_array_free(self->hyperlink_ranges, FALSE);
110     
111     g_ptr_array_foreach(self->hyperlinks,(GFunc)g_object_unref, NULL);
112     g_ptr_array_free(self->hyperlinks, FALSE);
113 }
114
115 static void my_atk_hypertext_class_init(gpointer g_class, gpointer class_data)
116 {
117     GObjectClass* g_object_class = (GObjectClass*)g_class;
118     //GObject virtual table
119     g_object_class->finalize = my_atk_hypertext_instance_finalize;
120     //parent_class
121     parent_class_atk_text = g_type_class_peek_parent(g_class);
122 }
123 static void my_atk_hypertext_interface_init(gpointer g_iface, gpointer iface_data)
124 {
125     AtkHypertextIface *klass = (AtkHypertextIface*)g_iface;
126     
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;
130 }
131
132 GType my_atk_hypertext_get_type()
133 {
134     static GType type = 0;
135     if(type == 0)
136     {
137         static const GTypeInfo typeInfo = 
138         {
139             sizeof(MyAtkHypertextClass),
140             NULL,                       //base_init
141             NULL,                       //base_finalize
142             my_atk_hypertext_class_init,     //class_init
143             NULL,                       //class_finalize
144             NULL,                       //class_data
145             sizeof(MyAtkHypertext),
146             0,                          //n_preallocs
147             my_atk_hypertext_instance_init   //instance_init
148         };
149
150         static const GInterfaceInfo AtkTextIface_info = 
151         {
152             my_atk_text_interface_init,         /* interface_init*/
153             NULL,                               /* interface_finalize*/
154             NULL                                /* interface_data */
155         };
156         static const GInterfaceInfo AtkHypertextIface_info = 
157         {
158             my_atk_hypertext_interface_init,/* interface_init*/
159             NULL,                               /* interface_finalize*/
160             NULL                                /* interface_data */
161         };
162         type = g_type_register_static(MY_TYPE_ATK_TEXT, "MyAtkHypertext", &typeInfo, 0);
163         g_type_add_interface_static(type,
164             ATK_TYPE_TEXT,
165             &AtkTextIface_info);
166         
167         g_type_add_interface_static(type,
168             ATK_TYPE_HYPERTEXT,
169             &AtkHypertextIface_info);
170     }
171     return type;    
172 }