1
0
mirror of https://gitlab.gnome.org/GNOME/evince synced 2024-07-05 00:59:07 +00:00

[libview] Cache GtkTextBuffer in EvViewAccessible

This commit is contained in:
Daniel Garcia 2010-06-29 16:44:19 +02:00 committed by Carlos Garcia Campos
parent 9dd59f719b
commit 39ce3d71b0

View File

@ -43,24 +43,6 @@ enum {
LAST_ACTION
};
static GtkTextBuffer *
ev_view_accessible_get_text_buffer (EvView *view)
{
EvPageCache *page_cache;
GtkTextBuffer *buffer;
const gchar *retval = NULL;
page_cache = view->page_cache;
if (!page_cache) {
return NULL;
}
retval = ev_page_cache_get_text (page_cache, view->current_page);
buffer = gtk_text_buffer_new (NULL);
gtk_text_buffer_set_text (buffer, retval, -1);
return buffer;
}
static const gchar *const ev_view_accessible_action_names[] =
{
N_("Scroll Up"),
@ -80,9 +62,12 @@ typedef struct {
gchar *action_descriptions[LAST_ACTION];
guint action_idle_handler;
GtkScrollType idle_scroll;
GtkTextBuffer *buffer;
guint current_page;
} EvViewAccessiblePriv;
typedef GtkAccessibleClass EvViewAccessibleClass;
typedef GtkAccessible EvViewAccessible;
#define EV_VIEW_ACCESSIBLE_GET_PRIVATE(inst) (G_TYPE_INSTANCE_GET_PRIVATE ((inst), EV_TYPE_VIEW_ACCESSIBLE, EvViewAccessiblePriv))
@ -96,6 +81,9 @@ ev_view_accessible_finalize (GObject *object)
g_source_remove (priv->action_idle_handler);
for (i = 0; i < LAST_ACTION; i++)
g_free (priv->action_descriptions [i]);
if (priv->buffer)
g_object_unref (priv->buffer);
}
static void ev_view_accessible_class_init (EvViewAccessibleClass *klass)
@ -107,6 +95,34 @@ static void ev_view_accessible_class_init (EvViewAccessibleClass *klass)
g_type_class_add_private (klass, sizeof (EvViewAccessiblePriv));
}
static GtkTextBuffer *
ev_view_accessible_get_text_buffer (EvViewAccessible *accessible, EvView *view)
{
EvPageCache *page_cache;
const gchar *retval = NULL;
EvViewAccessiblePriv* priv = EV_VIEW_ACCESSIBLE_GET_PRIVATE (accessible);
page_cache = view->page_cache;
if (!page_cache) {
return NULL;
}
if (view->current_page == priv->current_page && priv->buffer) {
return priv->buffer;
}
priv->current_page = view->current_page;
if (!priv->buffer) {
priv->buffer = gtk_text_buffer_new (NULL);
}
retval = ev_page_cache_get_text (page_cache, view->current_page);
gtk_text_buffer_set_text (priv->buffer, retval, -1);
return priv->buffer;
}
static gchar*
ev_view_accessible_get_text (AtkText *text,
gint start_pos,
@ -122,14 +138,13 @@ ev_view_accessible_get_text (AtkText *text,
/* State is defunct */
return NULL;
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return NULL;
gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
retval = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
g_object_unref (buffer);
return retval;
}
@ -149,7 +164,7 @@ ev_view_accessible_get_character_at_offset (AtkText *text,
/* State is defunct */
return '\0';
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return '\0';
@ -162,7 +177,6 @@ ev_view_accessible_get_character_at_offset (AtkText *text,
string = gtk_text_buffer_get_slice (buffer, &start, &end, FALSE);
unichar = g_utf8_get_char (string);
g_free(string);
g_object_unref (buffer);
return unichar;
}
@ -185,7 +199,7 @@ ev_view_accessible_get_text_before_offset (AtkText *text,
/* State is defunct */
return NULL;
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return NULL;
@ -195,7 +209,6 @@ ev_view_accessible_get_text_before_offset (AtkText *text,
GAIL_BEFORE_OFFSET, boundary_type,
offset, start_offset, end_offset);
g_object_unref (gail_text);
g_object_unref (buffer);
return retval;
}
@ -218,7 +231,7 @@ ev_view_accessible_get_text_at_offset (AtkText *text,
/* State is defunct */
return NULL;
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return NULL;
@ -228,7 +241,6 @@ ev_view_accessible_get_text_at_offset (AtkText *text,
GAIL_AT_OFFSET, boundary_type,
offset, start_offset, end_offset);
g_object_unref (gail_text);
g_object_unref (buffer);
return retval;
}
@ -251,7 +263,7 @@ ev_view_accessible_get_text_after_offset (AtkText *text,
/* State is defunct */
return NULL;
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return NULL;
@ -261,7 +273,6 @@ ev_view_accessible_get_text_after_offset (AtkText *text,
GAIL_AFTER_OFFSET, boundary_type,
offset, start_offset, end_offset);
g_object_unref (gail_text);
g_object_unref (buffer);
return retval;
}
@ -278,12 +289,11 @@ ev_view_accessible_get_character_count (AtkText *text)
/* State is defunct */
return 0;
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return 0;
retval = gtk_text_buffer_get_char_count (buffer);
g_object_unref (buffer);
return retval;
}
@ -302,14 +312,13 @@ ev_view_accessible_get_caret_offset (AtkText *text)
/* State is defunct */
return 0;
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return 0;
cursor_mark = gtk_text_buffer_get_insert (buffer);
gtk_text_buffer_get_iter_at_mark (buffer, &cursor_itr, cursor_mark);
retval = gtk_text_iter_get_offset (&cursor_itr);
g_object_unref (buffer);
return retval;
}
@ -326,13 +335,12 @@ ev_view_accessible_set_caret_offset (AtkText *text, gint offset)
/* State is defunct */
return FALSE;
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return FALSE;
gtk_text_buffer_get_iter_at_offset (buffer, &pos_itr, offset);
gtk_text_buffer_place_cursor (buffer, &pos_itr);
g_object_unref (buffer);
return TRUE;
}
@ -352,13 +360,12 @@ ev_view_accessible_get_run_attributes (AtkText *text,
/* State is defunct */
return NULL;
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return NULL;
retval = gail_misc_buffer_get_run_attributes (buffer, offset,
start_offset, end_offset);
g_object_unref (buffer);
return retval;
}
@ -523,7 +530,7 @@ ev_view_accessible_get_n_selections (AtkText *text)
/* State is defunct */
return -1;
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return -1;
@ -531,8 +538,6 @@ ev_view_accessible_get_n_selections (AtkText *text)
select_start = gtk_text_iter_get_offset (&start);
select_end = gtk_text_iter_get_offset (&end);
g_object_unref (buffer);
if (select_start != select_end)
return 1;
else
@ -558,7 +563,7 @@ ev_view_accessible_get_selection (AtkText *text,
if (selection_num != 0)
return NULL;
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return NULL;
@ -569,8 +574,6 @@ ev_view_accessible_get_selection (AtkText *text,
if (*start_pos != *end_pos)
retval = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
g_object_unref (buffer);
return retval;
}
@ -591,7 +594,7 @@ ev_view_accessible_add_selection (AtkText *text,
/* State is defunct */
return FALSE;
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return FALSE;
@ -611,8 +614,6 @@ ev_view_accessible_add_selection (AtkText *text,
retval = TRUE;
}
g_object_unref (buffer);
return retval;
}
@ -633,7 +634,7 @@ ev_view_accessible_remove_selection (AtkText *text,
/* State is defunct */
return FALSE;
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return FALSE;
@ -652,8 +653,6 @@ ev_view_accessible_remove_selection (AtkText *text,
retval = TRUE;
}
g_object_unref (buffer);
return retval;
}
@ -675,7 +674,7 @@ ev_view_accessible_set_selection (AtkText *text,
/* State is defunct */
return FALSE;
buffer = ev_view_accessible_get_text_buffer (EV_VIEW (widget));
buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
if (!buffer)
return FALSE;
@ -692,8 +691,6 @@ ev_view_accessible_set_selection (AtkText *text,
retval = TRUE;
}
g_object_unref (buffer);
return retval;
}