X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=libmisc%2Fev-page-action-widget.c;h=2bc74e603024c5a247bc8cfbeadea4542e22872d;hb=d4139205b010ed06310d14284e63114e88ec6de2;hp=c24c75658c886e35d83ba5f1c717ea48e4349683;hpb=1133f4bb67226d6de5cfec6af6893e061878442b;p=evince.git diff --git a/libmisc/ev-page-action-widget.c b/libmisc/ev-page-action-widget.c index c24c7565..2bc74e60 100644 --- a/libmisc/ev-page-action-widget.c +++ b/libmisc/ev-page-action-widget.c @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ @@ -42,9 +42,11 @@ struct _EvPageActionWidget { GtkToolItem parent; + EvDocument *document; + EvDocumentModel *doc_model; + GtkWidget *entry; GtkWidget *label; - EvPageCache *page_cache; guint signal_id; GtkTreeModel *filter_model; GtkTreeModel *model; @@ -56,14 +58,13 @@ G_DEFINE_TYPE (EvPageActionWidget, ev_page_action_widget, GTK_TYPE_TOOL_ITEM) static void update_pages_label (EvPageActionWidget *action_widget, - gint page, - EvPageCache *page_cache) + gint page) { char *label_text; gint n_pages; - n_pages = page_cache ? ev_page_cache_get_n_pages (page_cache) : 0; - if (page_cache && ev_page_cache_has_nonnumeric_page_labels (page_cache)) { + n_pages = ev_document_get_n_pages (action_widget->document); + if (ev_document_has_text_page_labels (action_widget->document)) { label_text = g_strdup_printf (_("(%d of %d)"), page + 1, n_pages); } else { label_text = g_strdup_printf (_("of %d"), n_pages); @@ -73,18 +74,17 @@ update_pages_label (EvPageActionWidget *action_widget, } static void -page_changed_cb (EvPageCache *page_cache, - gint page, - EvPageActionWidget *action_widget) +ev_page_action_widget_set_current_page (EvPageActionWidget *action_widget, + gint page) { - if (page_cache && page >= 0) { + if (page >= 0) { gchar *page_label; gtk_entry_set_width_chars (GTK_ENTRY (action_widget->entry), - CLAMP (ev_page_cache_get_max_label_chars (page_cache), + CLAMP (ev_document_get_max_label_len (action_widget->document), 6, 12)); - page_label = ev_page_cache_get_page_label (page_cache, page); + page_label = ev_document_get_page_label (action_widget->document, page); gtk_entry_set_text (GTK_ENTRY (action_widget->entry), page_label); gtk_editable_set_position (GTK_EDITABLE (action_widget->entry), -1); g_free (page_label); @@ -93,22 +93,31 @@ page_changed_cb (EvPageCache *page_cache, gtk_entry_set_text (GTK_ENTRY (action_widget->entry), ""); } - update_pages_label (action_widget, page, page_cache); + update_pages_label (action_widget, page); +} + +static void +page_changed_cb (EvDocumentModel *model, + gint old_page, + gint new_page, + EvPageActionWidget *action_widget) +{ + ev_page_action_widget_set_current_page (action_widget, new_page); } static gboolean page_scroll_cb (EvPageActionWidget *action_widget, GdkEventScroll *event) { - EvPageCache *page_cache = action_widget->page_cache; + EvDocumentModel *model = action_widget->doc_model; gint pageno; - pageno = ev_page_cache_get_current_page (page_cache); + pageno = ev_document_model_get_page (model); if ((event->direction == GDK_SCROLL_DOWN) && - (pageno < ev_page_cache_get_n_pages (page_cache) - 1)) + (pageno < ev_document_get_n_pages (action_widget->document) - 1)) pageno++; if ((event->direction == GDK_SCROLL_UP) && (pageno > 0)) pageno--; - ev_page_cache_set_current_page (page_cache, pageno); + ev_document_model_set_page (model, pageno); return TRUE; } @@ -116,13 +125,16 @@ page_scroll_cb (EvPageActionWidget *action_widget, GdkEventScroll *event) static void activate_cb (EvPageActionWidget *action_widget) { - EvPageCache *page_cache; + EvDocumentModel *model; const char *text; - gchar *page_label; EvLinkDest *link_dest; EvLinkAction *link_action; EvLink *link; gchar *link_text; + gint current_page; + + model = action_widget->doc_model; + current_page = ev_document_model_get_page (model); text = gtk_entry_get_text (GTK_ENTRY (action_widget->entry)); @@ -136,14 +148,8 @@ activate_cb (EvPageActionWidget *action_widget) g_object_unref (link); g_free (link_text); - /* rest the entry to the current page if we were unable to - * change it */ - page_cache = action_widget->page_cache; - page_label = ev_page_cache_get_page_label (page_cache, - ev_page_cache_get_current_page (page_cache)); - gtk_entry_set_text (GTK_ENTRY (action_widget->entry), page_label); - gtk_editable_set_position (GTK_EDITABLE (action_widget->entry), -1); - g_free (page_label); + if (current_page == ev_document_model_get_page (model)) + ev_page_action_widget_set_current_page (action_widget, current_page); } static void @@ -159,6 +165,7 @@ ev_page_action_widget_init (EvPageActionWidget *action_widget) gtk_widget_add_events (action_widget->entry, GDK_BUTTON_MOTION_MASK); gtk_entry_set_width_chars (GTK_ENTRY (action_widget->entry), 5); + gtk_entry_set_text (GTK_ENTRY (action_widget->entry), ""); g_signal_connect_swapped (action_widget->entry, "scroll-event", G_CALLBACK (page_scroll_cb), action_widget); @@ -185,36 +192,48 @@ ev_page_action_widget_init (EvPageActionWidget *action_widget) gtk_widget_show (GTK_WIDGET (action_widget)); } -void -ev_page_action_widget_set_page_cache (EvPageActionWidget *action_widget, - EvPageCache *page_cache) +static void +ev_page_action_widget_document_changed_cb (EvDocumentModel *model, + GParamSpec *pspec, + EvPageActionWidget *action_widget) { - if (action_widget->page_cache != NULL) { - if (action_widget->signal_id > 0) { - g_signal_handler_disconnect (action_widget->page_cache, - action_widget->signal_id); - action_widget->signal_id = 0; - } - g_object_remove_weak_pointer (G_OBJECT (action_widget->page_cache), - (gpointer)&action_widget->page_cache); - action_widget->page_cache = NULL; - } + EvDocument *document = ev_document_model_get_document (model); - if (page_cache != NULL) { - action_widget->page_cache = page_cache; - g_object_add_weak_pointer (G_OBJECT (page_cache), - (gpointer)&action_widget->page_cache); - action_widget->signal_id = - g_signal_connect_object (page_cache, "page-changed", - G_CALLBACK (page_changed_cb), - action_widget, 0); - page_changed_cb (page_cache, - ev_page_cache_get_current_page (page_cache), - action_widget); - } else { + g_object_ref (document); + if (action_widget->document) + g_object_unref (action_widget->document); + action_widget->document = document; + + if (action_widget->signal_id > 0) { + g_signal_handler_disconnect (action_widget->doc_model, + action_widget->signal_id); action_widget->signal_id = 0; - page_changed_cb (NULL, 0, action_widget); } + action_widget->signal_id = + g_signal_connect_object (action_widget->doc_model, + "page-changed", + G_CALLBACK (page_changed_cb), + action_widget, 0); + + ev_page_action_widget_set_current_page (action_widget, + ev_document_model_get_page (model)); +} + +void +ev_page_action_widget_set_model (EvPageActionWidget *action_widget, + EvDocumentModel *model) +{ + if (action_widget->doc_model) { + g_object_remove_weak_pointer (G_OBJECT (action_widget->doc_model), + (gpointer)&action_widget->doc_model); + } + action_widget->doc_model = model; + g_object_add_weak_pointer (G_OBJECT (model), + (gpointer)&action_widget->doc_model); + + g_signal_connect (model, "notify::document", + G_CALLBACK (ev_page_action_widget_document_changed_cb), + action_widget); } static void @@ -222,15 +241,20 @@ ev_page_action_widget_finalize (GObject *object) { EvPageActionWidget *action_widget = EV_PAGE_ACTION_WIDGET (object); - if (action_widget->page_cache != NULL) { + if (action_widget->doc_model != NULL) { if (action_widget->signal_id > 0) { - g_signal_handler_disconnect (action_widget->page_cache, + g_signal_handler_disconnect (action_widget->doc_model, action_widget->signal_id); action_widget->signal_id = 0; } - g_object_remove_weak_pointer (G_OBJECT (action_widget->page_cache), - (gpointer)&action_widget->page_cache); - action_widget->page_cache = NULL; + g_object_remove_weak_pointer (G_OBJECT (action_widget->doc_model), + (gpointer)&action_widget->doc_model); + action_widget->doc_model = NULL; + } + + if (action_widget->document) { + g_object_unref (action_widget->document); + action_widget->document = NULL; } G_OBJECT_CLASS (ev_page_action_widget_parent_class)->finalize (object); @@ -247,7 +271,7 @@ ev_page_action_widget_class_init (EvPageActionWidgetClass *class) g_signal_new ("activate_link", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (EvPageActionClass, activate_link), + G_STRUCT_OFFSET (EvPageActionWidgetClass, activate_link), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, @@ -423,7 +447,7 @@ get_filter_model_from_model (GtkTreeModel *model) void -ev_page_action_widget_update_model (EvPageActionWidget *proxy, GtkTreeModel *model) +ev_page_action_widget_update_links_model (EvPageActionWidget *proxy, GtkTreeModel *model) { GtkTreeModel *filter_model; GtkEntryCompletion *completion; @@ -461,7 +485,6 @@ ev_page_action_widget_update_model (EvPageActionWidget *proxy, GtkTreeModel *mod gtk_entry_set_completion (GTK_ENTRY (proxy->entry), completion); g_object_unref (completion); - g_object_unref (model); } void