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;
46 struct _EvDocumentModelClass
48 GObjectClass base_class;
51 void (* page_changed) (EvDocumentModel *model,
74 static guint signals[N_SIGNALS] = { 0 };
76 G_DEFINE_TYPE (EvDocumentModel, ev_document_model, G_TYPE_OBJECT)
79 ev_document_model_finalize (GObject *object)
81 EvDocumentModel *model = EV_DOCUMENT_MODEL (object);
83 if (model->document) {
84 g_object_unref (model->document);
85 model->document = NULL;
88 G_OBJECT_CLASS (ev_document_model_parent_class)->finalize (object);
92 ev_document_model_set_property (GObject *object,
97 EvDocumentModel *model = EV_DOCUMENT_MODEL (object);
101 ev_document_model_set_document (model, (EvDocument *)g_value_get_object (value));
104 ev_document_model_set_page (model, g_value_get_int (value));
107 ev_document_model_set_rotation (model, g_value_get_int (value));
110 ev_document_model_set_scale (model, g_value_get_double (value));
112 case PROP_SIZING_MODE:
113 ev_document_model_set_sizing_mode (model, g_value_get_enum (value));
115 case PROP_CONTINUOUS:
116 ev_document_model_set_continuous (model, g_value_get_boolean (value));
119 ev_document_model_set_dual_page (model, g_value_get_boolean (value));
121 case PROP_FULLSCREEN:
122 ev_document_model_set_fullscreen (model, g_value_get_boolean (value));
125 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
130 ev_document_model_get_property (GObject *object,
135 EvDocumentModel *model = EV_DOCUMENT_MODEL (object);
139 g_value_set_object (value, model->document);
142 g_value_set_int (value, model->page);
145 g_value_set_int (value, model->rotation);
148 g_value_set_double (value, model->scale);
150 case PROP_SIZING_MODE:
151 g_value_set_enum (value, model->sizing_mode);
153 case PROP_CONTINUOUS:
154 g_value_set_boolean (value, ev_document_model_get_continuous (model));
157 g_value_set_boolean (value, ev_document_model_get_dual_page (model));
159 case PROP_FULLSCREEN:
160 g_value_set_boolean (value, ev_document_model_get_fullscreen (model));
163 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
168 ev_document_model_class_init (EvDocumentModelClass *klass)
170 GObjectClass *g_object_class = G_OBJECT_CLASS (klass);
172 g_object_class->get_property = ev_document_model_get_property;
173 g_object_class->set_property = ev_document_model_set_property;
174 g_object_class->finalize = ev_document_model_finalize;
177 g_object_class_install_property (g_object_class,
179 g_param_spec_object ("document",
181 "The current document",
184 g_object_class_install_property (g_object_class,
186 g_param_spec_int ("page",
191 g_object_class_install_property (g_object_class,
193 g_param_spec_int ("rotation",
195 "Current rotation angle",
198 g_object_class_install_property (g_object_class,
200 g_param_spec_double ("scale",
202 "Current scale factor",
205 g_object_class_install_property (g_object_class,
207 g_param_spec_enum ("sizing-mode",
209 "Current sizing mode",
213 g_object_class_install_property (g_object_class,
215 g_param_spec_boolean ("continuous",
217 "Whether document is displayed in continuous mode",
220 g_object_class_install_property (g_object_class,
222 g_param_spec_boolean ("dual-page",
224 "Whether document is displayed in dual page mode",
227 g_object_class_install_property (g_object_class,
229 g_param_spec_boolean ("fullscreen",
231 "Whether document is displayed in fullscreen mode",
236 signals [PAGE_CHANGED] =
237 g_signal_new ("page-changed",
238 EV_TYPE_DOCUMENT_MODEL,
240 G_STRUCT_OFFSET (EvDocumentModelClass, page_changed),
242 ev_view_marshal_VOID__INT_INT,
244 G_TYPE_INT, G_TYPE_INT);
248 ev_document_model_init (EvDocumentModel *model)
252 model->sizing_mode = EV_SIZING_FIT_WIDTH;
253 model->continuous = TRUE;
254 model->min_scale = 0.;
255 model->max_scale = G_MAXDOUBLE;
259 ev_document_model_new (void)
261 return g_object_new (EV_TYPE_DOCUMENT_MODEL, NULL);
265 ev_document_model_new_with_document (EvDocument *document)
267 g_return_val_if_fail (EV_IS_DOCUMENT (document), NULL);
269 return g_object_new (EV_TYPE_DOCUMENT_MODEL, "document", document, NULL);
273 ev_document_model_set_document (EvDocumentModel *model,
274 EvDocument *document)
276 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
277 g_return_if_fail (EV_IS_DOCUMENT (document));
279 if (document == model->document)
283 g_object_unref (model->document);
284 model->document = g_object_ref (document);
286 model->n_pages = ev_document_get_n_pages (document);
287 ev_document_model_set_page (model, CLAMP (model->page, 0,
288 model->n_pages - 1));
290 g_object_notify (G_OBJECT (model), "document");
294 ev_document_model_get_document (EvDocumentModel *model)
296 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), NULL);
298 return model->document;
302 ev_document_model_set_page (EvDocumentModel *model,
307 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
309 if (model->page == page)
311 if (page < 0 || (model->document && page >= model->n_pages))
314 old_page = model->page;
316 g_signal_emit (model, signals[PAGE_CHANGED], 0, old_page, page);
318 g_object_notify (G_OBJECT (model), "page");
322 ev_document_model_set_page_by_label (EvDocumentModel *model,
323 const gchar *page_label)
327 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
328 g_return_if_fail (model->document != NULL);
330 if (ev_document_find_page_by_label (model->document, page_label, &page))
331 ev_document_model_set_page (model, page);
335 ev_document_model_get_page (EvDocumentModel *model)
337 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), -1);
343 ev_document_model_set_scale (EvDocumentModel *model,
346 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
348 scale = CLAMP (scale,
349 model->sizing_mode == EV_SIZING_FREE ?
350 model->min_scale : 0, model->max_scale);
352 if (scale == model->scale)
355 model->scale = scale;
357 g_object_notify (G_OBJECT (model), "scale");
361 ev_document_model_get_scale (EvDocumentModel *model)
363 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), 1.0);
369 ev_document_model_set_max_scale (EvDocumentModel *model,
372 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
374 if (max_scale == model->max_scale)
377 model->max_scale = max_scale;
379 if (model->scale > max_scale)
380 ev_document_model_set_scale (model, max_scale);
384 ev_document_model_get_max_scale (EvDocumentModel *model)
386 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), 1.0);
388 return model->max_scale;
392 ev_document_model_set_min_scale (EvDocumentModel *model,
395 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
397 if (min_scale == model->min_scale)
400 model->min_scale = min_scale;
402 if (model->scale < min_scale)
403 ev_document_model_set_scale (model, min_scale);
407 ev_document_model_get_min_scale (EvDocumentModel *model)
409 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), 0.);
411 return model->min_scale;
415 ev_document_model_set_sizing_mode (EvDocumentModel *model,
418 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
420 if (mode == model->sizing_mode)
423 model->sizing_mode = mode;
425 g_object_notify (G_OBJECT (model), "sizing-mode");
429 ev_document_model_get_sizing_mode (EvDocumentModel *model)
431 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), EV_SIZING_FIT_WIDTH);
433 return model->sizing_mode;
437 ev_document_model_set_rotation (EvDocumentModel *model,
440 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
444 else if (rotation < 0)
447 if (rotation == model->rotation)
450 model->rotation = rotation;
452 g_object_notify (G_OBJECT (model), "rotation");
456 ev_document_model_get_rotation (EvDocumentModel *model)
458 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), 0);
460 return model->rotation;
464 ev_document_model_set_continuous (EvDocumentModel *model,
467 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
469 continuous = continuous != FALSE;
471 if (continuous == model->continuous)
474 model->continuous = continuous;
476 g_object_notify (G_OBJECT (model), "continuous");
480 ev_document_model_get_continuous (EvDocumentModel *model)
482 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), TRUE);
484 return model->continuous;
488 ev_document_model_set_dual_page (EvDocumentModel *model,
491 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
493 dual_page = dual_page != FALSE;
495 if (dual_page == model->dual_page)
498 model->dual_page = dual_page;
500 g_object_notify (G_OBJECT (model), "dual-page");
504 ev_document_model_get_dual_page (EvDocumentModel *model)
506 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), FALSE);
508 return model->dual_page;
512 ev_document_model_set_fullscreen (EvDocumentModel *model,
515 g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
517 fullscreen = fullscreen != FALSE;
519 if (fullscreen == model->fullscreen)
522 model->fullscreen = fullscreen;
524 g_object_notify (G_OBJECT (model), "fullscreen");
528 ev_document_model_get_fullscreen (EvDocumentModel *model)
530 g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), FALSE);
532 return model->fullscreen;