2011-02-17 12:10:31 +00:00
|
|
|
/* GAIL - The GNOME Accessibility Implementation Library
|
|
|
|
* Copyright 2011 Red Hat, Inc.
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser 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
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser 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 "config.h"
|
|
|
|
|
|
|
|
#include <gtk/gtk.h>
|
2011-06-27 03:48:54 +00:00
|
|
|
#include "gtklinkbuttonaccessible.h"
|
2011-02-17 12:10:31 +00:00
|
|
|
|
2011-06-27 03:48:54 +00:00
|
|
|
typedef struct _GtkLinkButtonAccessibleLink GtkLinkButtonAccessibleLink;
|
|
|
|
typedef struct _GtkLinkButtonAccessibleLinkClass GtkLinkButtonAccessibleLinkClass;
|
2011-02-17 12:10:31 +00:00
|
|
|
|
2011-06-27 03:48:54 +00:00
|
|
|
struct _GtkLinkButtonAccessibleLink
|
2011-02-17 12:10:31 +00:00
|
|
|
{
|
|
|
|
AtkHyperlink parent;
|
|
|
|
|
2011-06-27 03:48:54 +00:00
|
|
|
GtkLinkButtonAccessible *button;
|
2011-02-17 12:10:31 +00:00
|
|
|
};
|
|
|
|
|
2011-06-27 03:48:54 +00:00
|
|
|
struct _GtkLinkButtonAccessibleLinkClass
|
2011-02-17 12:10:31 +00:00
|
|
|
{
|
|
|
|
AtkHyperlinkClass parent_class;
|
|
|
|
};
|
|
|
|
|
2011-02-18 02:00:35 +00:00
|
|
|
static void atk_action_interface_init (AtkActionIface *iface);
|
|
|
|
|
2011-06-27 03:48:54 +00:00
|
|
|
G_DEFINE_TYPE_WITH_CODE (GtkLinkButtonAccessibleLink, gtk_link_button_accessible_link, ATK_TYPE_HYPERLINK,
|
2011-02-18 02:00:35 +00:00
|
|
|
G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init))
|
2011-02-17 12:10:31 +00:00
|
|
|
|
2011-06-20 11:57:50 +00:00
|
|
|
static AtkHyperlink *
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_link_new (GtkLinkButtonAccessible *button)
|
2011-06-19 22:53:24 +00:00
|
|
|
{
|
2011-06-27 03:48:54 +00:00
|
|
|
GtkLinkButtonAccessibleLink *link;
|
2011-06-19 22:53:24 +00:00
|
|
|
|
2011-06-27 03:48:54 +00:00
|
|
|
link = g_object_new (gtk_link_button_accessible_link_get_type (), NULL);
|
2011-06-19 22:53:24 +00:00
|
|
|
link->button = button;
|
|
|
|
|
2011-06-20 11:57:50 +00:00
|
|
|
return ATK_HYPERLINK (link);
|
2011-06-19 22:53:24 +00:00
|
|
|
}
|
|
|
|
|
2011-02-17 12:10:31 +00:00
|
|
|
static gchar *
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_link_get_uri (AtkHyperlink *link,
|
2011-02-17 12:10:31 +00:00
|
|
|
gint i)
|
|
|
|
{
|
2011-06-27 03:48:54 +00:00
|
|
|
GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)link;
|
2011-02-17 12:10:31 +00:00
|
|
|
GtkWidget *widget;
|
|
|
|
const gchar *uri;
|
|
|
|
|
|
|
|
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (l->button));
|
|
|
|
uri = gtk_link_button_get_uri (GTK_LINK_BUTTON (widget));
|
|
|
|
|
|
|
|
return g_strdup (uri);
|
|
|
|
}
|
|
|
|
|
|
|
|
static gint
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_link_get_n_anchors (AtkHyperlink *link)
|
2011-02-17 12:10:31 +00:00
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_link_is_valid (AtkHyperlink *link)
|
2011-02-17 12:10:31 +00:00
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static AtkObject *
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_link_get_object (AtkHyperlink *link,
|
2011-02-17 12:10:31 +00:00
|
|
|
gint i)
|
|
|
|
{
|
2011-06-27 03:48:54 +00:00
|
|
|
GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)link;
|
2011-02-17 12:10:31 +00:00
|
|
|
|
|
|
|
return ATK_OBJECT (l->button);
|
|
|
|
}
|
|
|
|
|
|
|
|
static gint
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_link_get_start_index (AtkHyperlink *link)
|
2011-02-17 12:10:31 +00:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gint
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_link_get_end_index (AtkHyperlink *link)
|
2011-02-17 12:10:31 +00:00
|
|
|
{
|
2011-06-27 03:48:54 +00:00
|
|
|
GtkLinkButtonAccessibleLink *l = (GtkLinkButtonAccessibleLink *)link;
|
2011-02-17 12:10:31 +00:00
|
|
|
|
|
|
|
return atk_text_get_character_count (ATK_TEXT (l->button));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_link_init (GtkLinkButtonAccessibleLink *link)
|
2011-02-17 12:10:31 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_link_class_init (GtkLinkButtonAccessibleLinkClass *class)
|
2011-02-17 12:10:31 +00:00
|
|
|
{
|
|
|
|
AtkHyperlinkClass *hyperlink_class = ATK_HYPERLINK_CLASS (class);
|
|
|
|
|
2011-06-27 03:48:54 +00:00
|
|
|
hyperlink_class->get_uri = gtk_link_button_accessible_link_get_uri;
|
|
|
|
hyperlink_class->get_n_anchors = gtk_link_button_accessible_link_get_n_anchors;
|
|
|
|
hyperlink_class->is_valid = gtk_link_button_accessible_link_is_valid;
|
|
|
|
hyperlink_class->get_object = gtk_link_button_accessible_link_get_object;
|
|
|
|
hyperlink_class->get_start_index = gtk_link_button_accessible_link_get_start_index;
|
|
|
|
hyperlink_class->get_end_index = gtk_link_button_accessible_link_get_end_index;
|
2011-02-17 12:10:31 +00:00
|
|
|
}
|
|
|
|
|
2011-02-18 02:00:35 +00:00
|
|
|
static gboolean
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_link_do_action (AtkAction *action,
|
2011-02-18 02:00:35 +00:00
|
|
|
gint i)
|
|
|
|
{
|
2011-06-27 03:48:54 +00:00
|
|
|
GtkLinkButtonAccessibleLink *link = (GtkLinkButtonAccessibleLink *)action;
|
2011-02-18 02:00:35 +00:00
|
|
|
GtkWidget *widget;
|
|
|
|
|
|
|
|
widget = GTK_WIDGET (link->button);
|
|
|
|
if (widget == NULL)
|
|
|
|
/*
|
|
|
|
* State is defunct
|
|
|
|
*/
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_visible (widget))
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
gtk_button_clicked (GTK_BUTTON (widget));
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gint
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_link_get_n_actions (AtkAction *action)
|
2011-02-18 02:00:35 +00:00
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const gchar *
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_link_get_name (AtkAction *action,
|
|
|
|
gint i)
|
2011-02-18 02:00:35 +00:00
|
|
|
{
|
|
|
|
g_return_val_if_fail (i == 0, NULL);
|
|
|
|
|
|
|
|
return "activate";
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
atk_action_interface_init (AtkActionIface *iface)
|
|
|
|
{
|
2011-06-27 03:48:54 +00:00
|
|
|
iface->do_action = gtk_link_button_accessible_link_do_action;
|
|
|
|
iface->get_n_actions = gtk_link_button_accessible_link_get_n_actions;
|
|
|
|
iface->get_name = gtk_link_button_accessible_link_get_name;
|
2011-02-18 02:00:35 +00:00
|
|
|
}
|
|
|
|
|
2011-02-17 12:10:31 +00:00
|
|
|
static gboolean
|
|
|
|
activate_link (GtkLinkButton *button, AtkHyperlink *link)
|
|
|
|
{
|
|
|
|
g_signal_emit_by_name (link, "link-activated");
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static AtkHyperlink *
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_get_hyperlink (AtkHyperlinkImpl *impl)
|
2011-02-17 12:10:31 +00:00
|
|
|
{
|
2011-06-27 03:48:54 +00:00
|
|
|
GtkLinkButtonAccessible *button = GTK_LINK_BUTTON_ACCESSIBLE (impl);
|
2011-02-17 12:10:31 +00:00
|
|
|
|
2011-02-18 02:00:35 +00:00
|
|
|
if (!button->link)
|
|
|
|
{
|
2011-06-27 03:48:54 +00:00
|
|
|
button->link = gtk_link_button_accessible_link_new (button);
|
2011-02-18 02:00:35 +00:00
|
|
|
g_signal_connect (gtk_accessible_get_widget (GTK_ACCESSIBLE (button)),
|
|
|
|
"activate-link", G_CALLBACK (activate_link), button->link);
|
|
|
|
}
|
2011-02-17 12:10:31 +00:00
|
|
|
|
2011-06-19 22:53:24 +00:00
|
|
|
return g_object_ref (button->link);
|
2011-02-17 12:10:31 +00:00
|
|
|
}
|
|
|
|
|
2011-02-18 02:00:35 +00:00
|
|
|
static void atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface);
|
2011-02-17 12:10:31 +00:00
|
|
|
|
2011-07-02 01:25:53 +00:00
|
|
|
G_DEFINE_TYPE_WITH_CODE (GtkLinkButtonAccessible, gtk_link_button_accessible, GTK_TYPE_BUTTON_ACCESSIBLE,
|
2011-02-18 02:00:35 +00:00
|
|
|
G_IMPLEMENT_INTERFACE (ATK_TYPE_HYPERLINK_IMPL, atk_hypertext_impl_interface_init))
|
2011-02-17 12:10:31 +00:00
|
|
|
|
|
|
|
static void
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_init (GtkLinkButtonAccessible *button)
|
2011-02-17 12:10:31 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_finalize (GObject *object)
|
2011-02-17 12:10:31 +00:00
|
|
|
{
|
2011-06-27 03:48:54 +00:00
|
|
|
GtkLinkButtonAccessible *button = GTK_LINK_BUTTON_ACCESSIBLE (object);
|
2011-02-17 12:10:31 +00:00
|
|
|
|
|
|
|
if (button->link)
|
|
|
|
g_object_unref (button->link);
|
|
|
|
|
2011-06-27 03:48:54 +00:00
|
|
|
G_OBJECT_CLASS (gtk_link_button_accessible_parent_class)->finalize (object);
|
2011-02-17 12:10:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-06-27 03:48:54 +00:00
|
|
|
gtk_link_button_accessible_class_init (GtkLinkButtonAccessibleClass *klass)
|
2011-02-17 12:10:31 +00:00
|
|
|
{
|
2011-06-27 03:48:54 +00:00
|
|
|
G_OBJECT_CLASS (klass)->finalize = gtk_link_button_accessible_finalize;
|
2011-02-17 12:10:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-02-18 02:00:35 +00:00
|
|
|
atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface)
|
2011-02-17 12:10:31 +00:00
|
|
|
{
|
2011-06-27 03:48:54 +00:00
|
|
|
iface->get_hyperlink = gtk_link_button_accessible_get_hyperlink;
|
2011-02-17 12:10:31 +00:00
|
|
|
}
|