1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
2 /* this file is part of evince, a gnome document viewer
4 * Copyright (C) 2004 Red Hat, Inc
6 * Evince is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * Evince is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
21 #include <glib/gi18n.h>
23 #include "ev-view-accessible.h"
24 #include "ev-view-private.h"
26 #define EV_TYPE_VIEW_ACCESSIBLE (ev_view_accessible_get_type ())
27 #define EV_VIEW_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EV_TYPE_VIEW_ACCESSIBLE, EvViewAccessible))
28 #define EV_IS_VIEW_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EV_TYPE_VIEW_ACCESSIBLE))
30 static GType ev_view_accessible_get_type (void);
38 static const gchar *const ev_view_accessible_action_names[] =
45 static const gchar *const ev_view_accessible_action_descriptions[] =
48 N_("Scroll View Down"),
54 gchar *action_descriptions[LAST_ACTION];
55 guint action_idle_handler;
56 EvScrollType idle_scroll;
57 } EvViewAccessiblePriv;
59 typedef GtkAccessibleClass EvViewAccessibleClass;
61 #define EV_VIEW_ACCESSIBLE_GET_PRIVATE(inst) (G_TYPE_INSTANCE_GET_PRIVATE ((inst), EV_TYPE_VIEW_ACCESSIBLE, EvViewAccessiblePriv))
64 ev_view_accessible_finalize (GObject *object)
66 EvViewAccessiblePriv *priv = EV_VIEW_ACCESSIBLE_GET_PRIVATE (object);
69 if (priv->action_idle_handler)
70 g_source_remove (priv->action_idle_handler);
71 for (i = 0; i < LAST_ACTION; i++)
72 g_free (priv->action_descriptions [i]);
75 static void ev_view_accessible_class_init (EvViewAccessibleClass *klass)
77 GObjectClass *object_class = G_OBJECT_CLASS (klass);
79 object_class->finalize = ev_view_accessible_finalize;
81 g_type_class_add_private (klass, sizeof (EvViewAccessiblePriv));
85 ev_view_accessible_get_text (AtkText *text,
91 widget = GTK_ACCESSIBLE (text)->widget;
93 /* State is defunct */
100 ev_view_accessible_get_character_at_offset (AtkText *text,
105 widget = GTK_ACCESSIBLE (text)->widget;
107 /* State is defunct */
114 ev_view_accessible_get_text_before_offset (AtkText *text,
116 AtkTextBoundary boundary_type,
122 widget = GTK_ACCESSIBLE (text)->widget;
124 /* State is defunct */
131 ev_view_accessible_get_text_at_offset (AtkText *text,
133 AtkTextBoundary boundary_type,
139 widget = GTK_ACCESSIBLE (text)->widget;
141 /* State is defunct */
148 ev_view_accessible_get_text_after_offset (AtkText *text,
150 AtkTextBoundary boundary_type,
156 widget = GTK_ACCESSIBLE (text)->widget;
158 /* State is defunct */
165 ev_view_accessible_get_character_count (AtkText *text)
169 widget = GTK_ACCESSIBLE (text)->widget;
171 /* State is defunct */
178 ev_view_accessible_get_caret_offset (AtkText *text)
182 widget = GTK_ACCESSIBLE (text)->widget;
184 /* State is defunct */
191 ev_view_accessible_set_caret_offset (AtkText *text, gint offset)
195 widget = GTK_ACCESSIBLE (text)->widget;
197 /* State is defunct */
203 static AtkAttributeSet*
204 ev_view_accessible_get_run_attributes (AtkText *text,
211 widget = GTK_ACCESSIBLE (text)->widget;
213 /* State is defunct */
219 static AtkAttributeSet*
220 ev_view_accessible_get_default_attributes (AtkText *text)
224 widget = GTK_ACCESSIBLE (text)->widget;
226 /* State is defunct */
233 ev_view_accessible_get_character_extents (AtkText *text,
243 widget = GTK_ACCESSIBLE (text)->widget;
245 /* State is defunct */
252 ev_view_accessible_get_offset_at_point (AtkText *text,
259 widget = GTK_ACCESSIBLE (text)->widget;
261 /* State is defunct */
268 ev_view_accessible_get_n_selections (AtkText *text)
272 widget = GTK_ACCESSIBLE (text)->widget;
274 /* State is defunct */
281 ev_view_accessible_get_selection (AtkText *text,
288 widget = GTK_ACCESSIBLE (text)->widget;
290 /* State is defunct */
297 ev_view_accessible_add_selection (AtkText *text,
303 widget = GTK_ACCESSIBLE (text)->widget;
305 /* State is defunct */
312 ev_view_accessible_remove_selection (AtkText *text,
317 widget = GTK_ACCESSIBLE (text)->widget;
319 /* State is defunct */
326 ev_view_accessible_set_selection (AtkText *text,
333 widget = GTK_ACCESSIBLE (text)->widget;
335 /* State is defunct */
342 static void ev_view_accessible_text_iface_init (AtkTextIface * iface)
344 g_return_if_fail (iface != NULL);
346 iface->get_text = ev_view_accessible_get_text;
347 iface->get_character_at_offset = ev_view_accessible_get_character_at_offset;
348 iface->get_text_before_offset = ev_view_accessible_get_text_before_offset;
349 iface->get_text_at_offset = ev_view_accessible_get_text_at_offset;
350 iface->get_text_after_offset = ev_view_accessible_get_text_after_offset;
351 iface->get_caret_offset = ev_view_accessible_get_caret_offset;
352 iface->set_caret_offset = ev_view_accessible_set_caret_offset;
353 iface->get_character_count = ev_view_accessible_get_character_count;
354 iface->get_n_selections = ev_view_accessible_get_n_selections;
355 iface->get_selection = ev_view_accessible_get_selection;
356 iface->add_selection = ev_view_accessible_add_selection;
357 iface->remove_selection = ev_view_accessible_remove_selection;
358 iface->set_selection = ev_view_accessible_set_selection;
359 iface->get_run_attributes = ev_view_accessible_get_run_attributes;
360 iface->get_default_attributes = ev_view_accessible_get_default_attributes;
361 iface->get_character_extents = ev_view_accessible_get_character_extents;
362 iface->get_offset_at_point = ev_view_accessible_get_offset_at_point;
367 ev_view_accessible_idle_do_action (gpointer data)
369 EvViewAccessiblePriv* priv = EV_VIEW_ACCESSIBLE_GET_PRIVATE (data);
371 ev_view_scroll (EV_VIEW (GTK_ACCESSIBLE (data)->widget),
374 priv->action_idle_handler = 0;
379 ev_view_accessible_action_do_action (AtkAction *action,
382 EvViewAccessiblePriv* priv = EV_VIEW_ACCESSIBLE_GET_PRIVATE (action);
384 if (GTK_ACCESSIBLE (action)->widget == NULL)
387 if (priv->action_idle_handler)
391 case ACTION_SCROLL_UP:
392 priv->idle_scroll = EV_SCROLL_PAGE_BACKWARD;
394 case ACTION_SCROLL_DOWN:
395 priv->idle_scroll = EV_SCROLL_PAGE_FORWARD;
400 priv->action_idle_handler = g_idle_add (ev_view_accessible_idle_do_action,
406 ev_view_accessible_action_get_n_actions (AtkAction *action)
412 ev_view_accessible_action_get_description (AtkAction *action,
415 EvViewAccessiblePriv* priv = EV_VIEW_ACCESSIBLE_GET_PRIVATE (action);
417 if (i < 0 || i >= LAST_ACTION)
420 if (priv->action_descriptions[i])
421 return priv->action_descriptions[i];
423 return ev_view_accessible_action_descriptions[i];
427 ev_view_accessible_action_get_name (AtkAction *action,
430 if (i < 0 || i >= LAST_ACTION)
433 return ev_view_accessible_action_names[i];
437 ev_view_accessible_action_set_description (AtkAction *action,
439 const gchar *description)
441 EvViewAccessiblePriv* priv = EV_VIEW_ACCESSIBLE_GET_PRIVATE (action);
442 gchar *old_description;
444 if (i < 0 || i >= LAST_ACTION)
447 old_description = priv->action_descriptions[i];
448 priv->action_descriptions[i] = g_strdup (description);
449 g_free (old_description);
454 static void ev_view_accessible_action_iface_init (AtkActionIface * iface)
456 iface->do_action = ev_view_accessible_action_do_action;
457 iface->get_n_actions = ev_view_accessible_action_get_n_actions;
458 iface->get_description = ev_view_accessible_action_get_description;
459 iface->get_name = ev_view_accessible_action_get_name;
460 iface->set_description = ev_view_accessible_action_set_description;
463 GType ev_view_accessible_get_type (void)
465 static GType type = 0;
467 if (G_UNLIKELY (type == 0)) {
470 (GBaseInitFunc) NULL, /* base init */
471 (GBaseFinalizeFunc) NULL, /* base finalize */
472 (GClassInitFunc) ev_view_accessible_class_init, /* class init */
473 (GClassFinalizeFunc) NULL, /* class finalize */
474 NULL, /* class data */
475 0, /* instance size */
476 0, /* nb preallocs */
477 (GInstanceInitFunc) NULL, /* instance init */
478 NULL /* value table */
481 const GInterfaceInfo atk_text_info = {
483 ev_view_accessible_text_iface_init,
484 (GInterfaceFinalizeFunc) NULL,
488 const GInterfaceInfo atk_action_info = {
490 ev_view_accessible_action_iface_init,
491 (GInterfaceFinalizeFunc) NULL,
495 * Figure out the size of the class and instance
496 * we are deriving from
498 AtkObjectFactory *factory;
501 GType derived_atk_type;
503 derived_type = g_type_parent (EV_TYPE_VIEW);
504 factory = atk_registry_get_factory (atk_get_default_registry (),
506 derived_atk_type = atk_object_factory_get_accessible_type (factory);
508 g_type_query (derived_atk_type, &query);
509 tinfo.class_size = query.class_size;
510 tinfo.instance_size = query.instance_size;
512 type = g_type_register_static (derived_atk_type, "EvViewAccessible",
514 g_type_add_interface_static (type, ATK_TYPE_TEXT,
516 g_type_add_interface_static (type, ATK_TYPE_ACTION,
523 static AtkObject *ev_view_accessible_new(GObject * obj)
525 AtkObject *accessible;
527 g_return_val_if_fail(EV_IS_VIEW (obj), NULL);
529 accessible = g_object_new (ev_view_accessible_get_type (), NULL);
530 atk_object_initialize (accessible, obj);
532 atk_object_set_name (ATK_OBJECT (accessible), _("Document View"));
533 atk_object_set_role (ATK_OBJECT (accessible), ATK_ROLE_UNKNOWN);
538 typedef AtkObjectFactory EvViewAccessibleFactory;
539 typedef AtkObjectFactoryClass EvViewAccessibleFactoryClass;
541 static void ev_view_accessible_factory_init (EvViewAccessibleFactory *factory)
545 static GType ev_view_accessible_factory_get_accessible_type(void)
547 return ev_view_accessible_get_type();
550 static AtkObject *ev_view_accessible_factory_create_accessible (GObject * obj)
552 return ev_view_accessible_new(obj);
555 static void ev_view_accessible_factory_class_init (AtkObjectFactoryClass * klass)
557 klass->create_accessible = ev_view_accessible_factory_create_accessible;
558 klass->get_accessible_type =
559 ev_view_accessible_factory_get_accessible_type;
562 G_DEFINE_TYPE (EvViewAccessibleFactory, ev_view_accessible_factory, ATK_TYPE_OBJECT_FACTORY)