[gtk+] Hypertext does not really make sense for GtkLinkButton



commit edeb6aaf88e5985187a33207b61ded9e0dd0fa6f
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Feb 17 21:00:35 2011 -0500

    Hypertext does not really make sense for GtkLinkButton
    
    Instead, implement HyperLinkImpl and return the single link
    object. This commit also adds an AtkAction implementation
    for the link object.

 modules/other/gail/gaillinkbutton.c |  145 +++++++++++++++++++++++++---------
 1 files changed, 106 insertions(+), 39 deletions(-)
---
diff --git a/modules/other/gail/gaillinkbutton.c b/modules/other/gail/gaillinkbutton.c
index cfb212c..16671f8 100644
--- a/modules/other/gail/gaillinkbutton.c
+++ b/modules/other/gail/gaillinkbutton.c
@@ -30,6 +30,7 @@ struct _GailLinkButtonLink
   AtkHyperlink parent;
 
   GailLinkButton *button;
+  gchar *description;
 };
 
 struct _GailLinkButtonLinkClass
@@ -37,7 +38,10 @@ struct _GailLinkButtonLinkClass
   AtkHyperlinkClass parent_class;
 };
 
-G_DEFINE_TYPE (GailLinkButtonLink, gail_link_button_link, ATK_TYPE_HYPERLINK)
+static void atk_action_interface_init (AtkActionIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (GailLinkButtonLink, gail_link_button_link, ATK_TYPE_HYPERLINK,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init))
 
 static gchar *
 gail_link_button_link_get_uri (AtkHyperlink *link,
@@ -91,13 +95,27 @@ gail_link_button_link_get_end_index (AtkHyperlink *link)
 static void
 gail_link_button_link_init (GailLinkButtonLink *link)
 {
+  link->description = NULL;
+}
+
+static void
+gail_link_button_link_finalize (GObject *obj)
+{
+  GailLinkButtonLink *link = (GailLinkButtonLink *)obj;
+
+  g_free (link->description);
+
+  G_OBJECT_CLASS (gail_link_button_link_parent_class)->finalize (obj);
 }
 
 static void
 gail_link_button_link_class_init (GailLinkButtonLinkClass *class)
 {
+  GObjectClass *object_class = G_OBJECT_CLASS (class);
   AtkHyperlinkClass *hyperlink_class = ATK_HYPERLINK_CLASS (class);
 
+  object_class->finalize = gail_link_button_link_finalize;
+
   hyperlink_class->get_uri = gail_link_button_link_get_uri;
   hyperlink_class->get_n_anchors = gail_link_button_link_get_n_anchors;
   hyperlink_class->is_valid = gail_link_button_link_is_valid;
@@ -107,6 +125,80 @@ gail_link_button_link_class_init (GailLinkButtonLinkClass *class)
 }
 
 static gboolean
+gail_link_button_link_do_action (AtkAction *action,
+                                 gint       i)
+{
+  GailLinkButtonLink *link = (GailLinkButtonLink *)action;
+  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
+gail_link_button_link_get_n_actions (AtkAction *action)
+{
+  return 1;
+}
+
+static const gchar *
+gail_link_button_link_get_name (AtkAction *action,
+                                gint i)
+{
+  g_return_val_if_fail (i == 0, NULL);
+
+  return "activate";
+}
+
+static const gchar *
+gail_link_button_link_get_description (AtkAction *action,
+                                       gint       i)
+{
+  GailLinkButtonLink *link = (GailLinkButtonLink *)action;
+
+  g_return_val_if_fail (i == 0, NULL);
+
+  return link->description;
+}
+
+static gboolean
+gail_link_button_link_set_description (AtkAction   *action,
+                                       gint         i,
+                                       const gchar *description)
+{
+  GailLinkButtonLink *link = (GailLinkButtonLink *)action;
+
+  g_return_val_if_fail (i == 0, FALSE);
+
+  g_free (link->description);
+  link->description = g_strdup (description);
+
+  return TRUE;
+}
+
+
+static void
+atk_action_interface_init (AtkActionIface *iface)
+{
+  iface->do_action = gail_link_button_link_do_action;
+  iface->get_n_actions = gail_link_button_link_get_n_actions;
+  iface->get_name = gail_link_button_link_get_name;
+  iface->get_description = gail_link_button_link_get_description;
+  iface->set_description = gail_link_button_link_set_description;
+}
+
+static gboolean
 activate_link (GtkLinkButton *button, AtkHyperlink *link)
 {
   g_signal_emit_by_name (link, "link-activated");
@@ -115,22 +207,24 @@ activate_link (GtkLinkButton *button, AtkHyperlink *link)
 }
 
 static AtkHyperlink *
-gail_link_button_link_new (GailLinkButton *button)
+gail_link_button_get_hyperlink (AtkHyperlinkImpl *impl)
 {
-  GailLinkButtonLink *link;
+  GailLinkButton *button = GAIL_LINK_BUTTON (impl);
 
-  link = g_object_new (gail_link_button_link_get_type (), NULL);
-  link->button = button;
-  g_signal_connect (gtk_accessible_get_widget (GTK_ACCESSIBLE (button)),
-                    "activate-link", G_CALLBACK (activate_link), link);
+  if (!button->link)
+    {
+      button->link = g_object_new (gail_link_button_link_get_type (), NULL);
+      g_signal_connect (gtk_accessible_get_widget (GTK_ACCESSIBLE (button)),
+                        "activate-link", G_CALLBACK (activate_link), button->link);
+    }
 
-  return ATK_HYPERLINK (link);
+  return button->link;
 }
 
-static void atk_hypertext_interface_init (AtkHypertextIface *iface);
+static void atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface);
 
 G_DEFINE_TYPE_WITH_CODE (GailLinkButton, gail_link_button, GAIL_TYPE_BUTTON,
-                         G_IMPLEMENT_INTERFACE (ATK_TYPE_HYPERTEXT, atk_hypertext_interface_init))
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_HYPERLINK_IMPL, atk_hypertext_impl_interface_init))
 
 static void
 gail_link_button_init (GailLinkButton *button)
@@ -154,35 +248,8 @@ gail_link_button_class_init (GailLinkButtonClass *klass)
   G_OBJECT_CLASS (klass)->finalize = gail_link_button_finalize;
 }
 
-static gint
-gail_link_button_get_n_links (AtkHypertext *hypertext)
-{
-  return 1;
-}
-
-static gint
-gail_link_button_get_link_index (AtkHypertext *hypertext,
-                                 gint          char_index)
-{
-  return 0;
-}
-
-static AtkHyperlink *
-gail_link_button_get_link (AtkHypertext *hypertext,
-                           gint          link_index)
-{
-  GailLinkButton *button = GAIL_LINK_BUTTON (hypertext);
-
-  if (!button->link)
-    button->link = gail_link_button_link_new (button);
-
-  return button->link;
-}
-
 static void
-atk_hypertext_interface_init (AtkHypertextIface *iface)
+atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface)
 {
-  iface->get_link = gail_link_button_get_link;
-  iface->get_n_links = gail_link_button_get_n_links;
-  iface->get_link_index = gail_link_button_get_link_index;
+  iface->get_hyperlink = gail_link_button_get_hyperlink;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]