1 /* this file is part of evince, a gnome document viewer
3 * Copyright (C) 2009 Carlos Garcia Campos
4 * Copyright (C) 2005 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.
23 #include "ev-document-model.h"
24 #include "ev-view-type-builtins.h"
25 #include "ev-view-marshal.h"
27 struct _EvDocumentModel
37 EvSizingMode sizing_mode;
43 struct _EvDocumentModelClass
45 GObjectClass base_class;
48 void (* page_changed) (EvDocumentModel *model,
68 static guint signals[N_SIGNALS] = { 0 };
70 G_DEFINE_TYPE (EvDocumentModel, ev_document_model, G_TYPE_OBJECT)
73 ev_document_model_finalize (GObject *object)
75 EvDocumentModel *model = EV_DOCUMENT_MODEL (object);
77 if (model->document) {
78 g_object_unref (model->document);
79 model->document = NULL;
82 G_OBJECT_CLASS (ev_document_model_parent_class)->finalize (object);
86 ev_document_model_set_property (GObject *object,
91 EvDocumentModel *model = EV_DOCUMENT_MODEL (object);
95 ev_document_model_set_document (model, (EvDocument *)g_value_get_object (value));
98 ev_document_model_set_page (model, g_value_get_int (value));
101 ev_document_model_set_rotation (model, g_value_get_int (value));
104 ev_document_model_set_scale (model, g_value_get_double (value));
106 case PROP_SIZING_MODE:
107 ev_document_model_set_sizing_mode (model, g_value_get_enum (value));
110 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
115 ev_document_model_get_property (GObject *object,
120 EvDocumentModel *model = EV_DOCUMENT_MODEL (object);
124 g_value_set_object (value, model->document);
127 g_value_set_int (value, model->page);
130 g_value_set_int (value, model->rotation);
133 g_value_set_double (value, model->scale);
135 case PROP_SIZING_MODE:
136 g_value_set_enum (value, model->sizing_mode);
139 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
144 ev_document_model_class_init (EvDocumentModelClass *klass)
146 GObjectClass *g_object_class = G_OBJECT_CLASS (klass);
148 g_object_class->get_property = ev_document_model_get_property;
149 g_object_class->set_property = ev_document_model_set_property;
150 g_object_class->finalize = ev_document_model_finalize;
153 g_object_class_install_property (g_object_class,
155 g_param_spec_object ("document",
157 "The current document",
160 g_object_class_install_property (g_object_class,
162 g_param_spec_int ("page",
167 g_object_class_install_property (g_object_class,
169 g_param_spec_int ("rotation",
171 "Current rotation angle",
174 g_object_class_install_property (g_object_class,
176 g_param_spec_double ("scale",
178 "Current scale factor",
181 g_object_class_install_property (g_object_class,
183 g_param_spec_enum ("sizing-mode",
185 "Current sizing mode",
191 signals [PAGE_CHANGED] =
192 g_signal_new ("page-changed",
193 EV_TYPE_DOCUMENT_MODEL,
195 G_STRUCT_OFFSET (EvDocumentModelClass, page_changed),
197 ev_view_marshal_VOID__INT_INT,
199 G_TYPE_INT, G_TYPE_INT);
203 ev_document_model_init (EvDocumentModel *model)
207 model->sizing_mode = EV_SIZING_FIT_WIDTH;
208 model->min_scale = 0.;
209 model->max_scale = G_MAXDOUBLE;
213 ev_document_model_new (void)
215 return g_object_new (EV_TYPE_DOCUMENT_MODEL, NULL);
219 ev_document_model_new_with_document (EvDocument *document)
221 g_return_val_if_fail (EV_IS_DOCUMENT (document), NULL);
223 return g_object_new (EV_TYPE_DOCUMENT_MODEL, "document", document, NULL);
227 ev_document_model_set_document (EvDocumentModel *model,
228 EvDocument *document)
230 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
231 g_return_if_fail (EV_IS_DOCUMENT (document));
233 if (document == model->document)
237 g_object_unref (model->document);
238 model->document = g_object_ref (document);
240 model->n_pages = ev_document_get_n_pages (document);
241 ev_document_model_set_page (model, CLAMP (model->page, 0,
242 model->n_pages - 1));
244 g_object_notify (G_OBJECT (model), "document");
248 ev_document_model_get_document (EvDocumentModel *model)
250 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), NULL);
252 return model->document;
256 ev_document_model_set_page (EvDocumentModel *model,
261 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
263 if (model->page == page)
265 if (page < 0 || (model->document && page >= model->n_pages))
268 old_page = model->page;
270 g_signal_emit (model, signals[PAGE_CHANGED], 0, old_page, page);
272 g_object_notify (G_OBJECT (model), "page");
276 ev_document_model_set_page_by_label (EvDocumentModel *model,
277 const gchar *page_label)
281 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
282 g_return_if_fail (model->document != NULL);
284 if (ev_document_find_page_by_label (model->document, page_label, &page))
285 ev_document_model_set_page (model, page);
289 ev_document_model_get_page (EvDocumentModel *model)
291 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), -1);
297 ev_document_model_set_scale (EvDocumentModel *model,
300 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
302 scale = CLAMP (scale,
303 model->sizing_mode == EV_SIZING_FREE ?
304 model->min_scale : 0, model->max_scale);
306 if (scale == model->scale)
309 model->scale = scale;
311 g_object_notify (G_OBJECT (model), "scale");
315 ev_document_model_get_scale (EvDocumentModel *model)
317 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), 1.0);
323 ev_document_model_set_max_scale (EvDocumentModel *model,
326 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
328 if (max_scale == model->max_scale)
331 model->max_scale = max_scale;
333 if (model->scale > max_scale)
334 ev_document_model_set_scale (model, max_scale);
338 ev_document_model_get_max_scale (EvDocumentModel *model)
340 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), 1.0);
342 return model->max_scale;
346 ev_document_model_set_min_scale (EvDocumentModel *model,
349 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
351 if (min_scale == model->min_scale)
354 model->min_scale = min_scale;
356 if (model->scale < min_scale)
357 ev_document_model_set_scale (model, min_scale);
361 ev_document_model_get_min_scale (EvDocumentModel *model)
363 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), 0.);
365 return model->min_scale;
369 ev_document_model_set_sizing_mode (EvDocumentModel *model,
372 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
374 if (mode == model->sizing_mode)
377 model->sizing_mode = mode;
379 g_object_notify (G_OBJECT (model), "sizing-mode");
383 ev_document_model_get_sizing_mode (EvDocumentModel *model)
385 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), EV_SIZING_FIT_WIDTH);
387 return model->sizing_mode;
391 ev_document_model_set_rotation (EvDocumentModel *model,
394 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
398 else if (rotation < 0)
401 if (rotation == model->rotation)
404 model->rotation = rotation;
406 g_object_notify (G_OBJECT (model), "rotation");
410 ev_document_model_get_rotation (EvDocumentModel *model)
412 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), 0);
414 return model->rotation;