2 #include "ev-page-cache.h"
3 #include "ev-document-thumbnails.h"
16 gboolean dual_even_left;
21 struct _EvPageCacheClass
23 GObjectClass parent_class;
25 void (* page_changed) (EvPageCache *page_cache, gint page);
26 void (* history_changed) (EvPageCache *page_cache, gint page);
36 static guint signals[N_SIGNALS] = {0, };
38 static void ev_page_cache_init (EvPageCache *page_cache);
39 static void ev_page_cache_class_init (EvPageCacheClass *page_cache);
40 static void ev_page_cache_finalize (GObject *object);
42 G_DEFINE_TYPE (EvPageCache, ev_page_cache, G_TYPE_OBJECT)
45 ev_page_cache_init (EvPageCache *page_cache)
47 page_cache->current_page = -1;
51 ev_page_cache_class_init (EvPageCacheClass *class)
53 GObjectClass *object_class;
55 object_class = G_OBJECT_CLASS (class);
57 object_class->finalize = ev_page_cache_finalize;
59 signals [PAGE_CHANGED] =
60 g_signal_new ("page-changed",
63 G_STRUCT_OFFSET (EvPageCacheClass, page_changed),
65 g_cclosure_marshal_VOID__INT,
69 signals [HISTORY_CHANGED] =
70 g_signal_new ("history-changed",
73 G_STRUCT_OFFSET (EvPageCacheClass, history_changed),
75 g_cclosure_marshal_VOID__INT,
82 ev_page_cache_finalize (GObject *object)
84 EvPageCache *page_cache = EV_PAGE_CACHE (object);
86 page_cache->document = NULL;
88 G_OBJECT_CLASS (ev_page_cache_parent_class)->finalize (object);
92 ev_page_cache_new (EvDocument *document)
94 EvPageCache *page_cache;
96 page_cache = (EvPageCache *) g_object_new (EV_TYPE_PAGE_CACHE, NULL);
97 page_cache->document = document;
99 if (ev_document_get_n_pages (page_cache->document) > 0)
100 ev_page_cache_set_current_page (page_cache, 0);
106 ev_page_cache_get_current_page (EvPageCache *page_cache)
108 g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), 0);
110 return page_cache->current_page;
114 ev_page_cache_set_current_page (EvPageCache *page_cache,
117 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
119 if (page == page_cache->current_page)
122 page_cache->current_page = page;
123 g_signal_emit (page_cache, signals[PAGE_CHANGED], 0, page);
127 ev_page_cache_set_current_page_history (EvPageCache *page_cache,
130 if (abs (page - page_cache->current_page) > 1)
131 g_signal_emit (page_cache, signals [HISTORY_CHANGED], 0, page);
133 ev_page_cache_set_current_page (page_cache, page);
137 ev_page_cache_set_page_label (EvPageCache *page_cache,
138 const gchar *page_label)
142 g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE);
144 if (ev_document_find_page_by_label (page_cache->document, page_label, &page)) {
145 ev_page_cache_set_current_page (page_cache, page);
153 ev_page_cache_get_size (EvPageCache *page_cache,
162 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
164 ev_document_get_page_size (page_cache->document, page, &w, &h);
169 if (rotation == 0 || rotation == 180) {
170 if (width) *width = (int)w;
171 if (height) *height = (int)h;
173 if (width) *width = (int)h;
174 if (height) *height = (int)w;
179 ev_page_cache_get_max_width (EvPageCache *page_cache,
186 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
191 ev_document_get_max_page_size (page_cache->document, &w, &h);
192 *width = (rotation == 0 || rotation == 180) ? w * scale : h * scale;
196 ev_page_cache_get_max_height (EvPageCache *page_cache,
203 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
208 ev_document_get_max_page_size (page_cache->document, &w, &h);
209 *height = (rotation == 0 || rotation == 180) ? h * scale : w * scale;
213 ev_page_cache_get_dual_even_left (EvPageCache *page_cache)
215 g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), 0);
217 return (ev_document_get_n_pages (page_cache->document) > 2);
220 #define PAGE_CACHE_STRING "ev-page-cache"
223 ev_page_cache_get (EvDocument *document)
225 EvPageCache *page_cache;
227 g_return_val_if_fail (EV_IS_DOCUMENT (document), NULL);
229 page_cache = g_object_get_data (G_OBJECT (document), PAGE_CACHE_STRING);
230 if (page_cache == NULL) {
231 page_cache = ev_page_cache_new (document);
232 g_object_set_data_full (G_OBJECT (document), PAGE_CACHE_STRING, page_cache, g_object_unref);