summaryrefslogtreecommitdiff
path: root/tests/dummyatk/my-atk-hypertext.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/dummyatk/my-atk-hypertext.c')
-rw-r--r--tests/dummyatk/my-atk-hypertext.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/tests/dummyatk/my-atk-hypertext.c b/tests/dummyatk/my-atk-hypertext.c
new file mode 100644
index 0000000..80abb3f
--- /dev/null
+++ b/tests/dummyatk/my-atk-hypertext.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <glib.h>
+#include <string.h>
+#include <atk/atk.h>
+#include <stdio.h>
+
+#include "my-atk-object.h"
+#include "my-atk-hypertext.h"
+#include "my-atk-hyperlink.h"
+
+typedef struct _MyAtkHypertextInfo MyAtkHypertextInfo;
+
+static void atk_hypertext_interface_init (AtkHypertextIface *iface);
+static void GDestroyNotifyGOBJptrArray (gpointer data);
+
+G_DEFINE_TYPE_WITH_CODE (MyAtkHypertext,
+ my_atk_hypertext,
+ MY_TYPE_ATK_OBJECT,
+ G_IMPLEMENT_INTERFACE (ATK_TYPE_HYPERTEXT,
+ atk_hypertext_interface_init));
+
+gint
+my_atk_set_hypertext (AtkHypertext *obj, const gchar *text)
+{
+ MyAtkHypertext *self = MY_ATK_HYPERTEXT (obj);
+ MyAtkHyperlink *link;
+ gchar *ptr;
+ const gchar *fstr= "href=";
+ gint len = strlen (fstr);
+ gint text_len = strlen (text);
+ gint index = 0;
+ gint start_offset;
+ g_return_val_if_fail (MY_IS_ATK_HYPERTEXT (obj), -1);
+
+ if (text_len < len)
+ return -1;
+
+ while (text) {
+ ptr = g_strstr_len (text + index, text_len - index, fstr);
+ index = ptr - text + len;
+ if (ptr) {
+ if (text_len < index || index < len)
+ break;
+ if (text[index] == '\'') {
+ start_offset = index + 1;
+ while (++index < text_len && text[index] != '\'');
+ if (text[index] != '\'')
+ break;
+ link = new_MyAtkHyperlink ();
+ my_atk_set_hyperlink (ATK_HYPERLINK (link),
+ g_strndup (text + start_offset, index - start_offset),
+ start_offset,
+ index);
+ g_ptr_array_add (self->array, link);
+ }
+ } else
+ break;
+ }
+
+ return self->array->len > 0 ? 0 : -1;
+}
+
+static gint
+my_atk_hypertext_get_n_links (AtkHypertext *obj)
+{
+ MyAtkHypertext *self = MY_ATK_HYPERTEXT (obj);
+ g_return_val_if_fail (MY_IS_ATK_HYPERTEXT (obj), -1);
+ return self->array->len;
+
+}
+
+static AtkHyperlink *
+my_atk_hypertext_get_link (AtkHypertext *obj, gint link_index)
+{
+ MyAtkHypertext *self = MY_ATK_HYPERTEXT (obj);
+ AtkHyperlink *link = NULL;
+ g_return_val_if_fail (MY_IS_ATK_HYPERTEXT (obj), NULL);
+ if (0 <= link_index && link_index < self->array->len)
+ link = g_ptr_array_index (self->array, link_index);
+ return link;
+}
+
+static gint
+my_atk_hypertext_get_link_index (AtkHypertext *obj, gint char_index)
+{
+ MyAtkHypertext *self = MY_ATK_HYPERTEXT (obj);
+ gint i;
+ MyAtkHyperlink *link;
+ g_return_val_if_fail (MY_IS_ATK_HYPERTEXT (obj), -1);
+
+ for (i = 0; i < self->array->len; i++) {
+ link = g_ptr_array_index (self->array, i);
+ if (link->start <= char_index && char_index <= link->end)
+ return i;
+ }
+ return -1;
+}
+
+static void
+my_atk_hypertext_link_selected (AtkHypertext *obj, gint link_index)
+{
+ g_return_if_fail (MY_IS_ATK_HYPERTEXT (obj));
+}
+
+static void
+GDestroyNotifyGOBJptrArray (gpointer data)
+{
+ g_object_unref (data);
+}
+
+static void
+atk_hypertext_interface_init (AtkHypertextIface *iface)
+{
+ if (!iface) return;
+ iface->get_n_links = my_atk_hypertext_get_n_links;
+ iface->get_link = my_atk_hypertext_get_link;
+ iface->get_link_index = my_atk_hypertext_get_link_index;
+ iface->link_selected = my_atk_hypertext_link_selected;
+}
+
+static void
+my_atk_hypertext_init (MyAtkHypertext *self)
+{
+ self->array = g_ptr_array_new_full (2, GDestroyNotifyGOBJptrArray);
+}
+
+static void
+my_atk_hypertext_class_initialize (AtkObject *obj, gpointer data)
+{
+}
+
+static void
+my_atk_hypertext_class_finalize (GObject *obj)
+{
+}
+
+static void
+my_atk_hypertext_class_init(MyAtkHypertextClass *my_class)
+{
+ AtkObjectClass *atk_class = ATK_OBJECT_CLASS(my_class);
+ GObjectClass *gobject_class = G_OBJECT_CLASS(my_class);
+
+ gobject_class->finalize = my_atk_hypertext_class_finalize;
+
+ atk_class->initialize = my_atk_hypertext_class_initialize;
+}