]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
unref the pixbuf iff it exists.
[evince.git] / shell / ev-window.c
index b9eb24e430c256aaf86ded5c93a24e458747af98..836bc918a4b4e100e77e392387d6b88a8be04df0 100644 (file)
 #include "ev-document-fonts.h"
 #include "ev-document-find.h"
 #include "ev-document-security.h"
+#include "ev-document-types.h"
 #include "ev-job-queue.h"
 #include "ev-jobs.h"
 #include "ev-statusbar.h"
 #include "ev-sidebar-page.h"
 #include "eggfindbar.h"
-#include "egg-recent-view-gtk.h"
+#include "egg-recent-view-uimanager.h"
 #include "egg-recent-view.h"
 #include "egg-recent-model.h"
 #include "egg-toolbar-editor.h"
@@ -59,6 +60,7 @@
 #include "ev-application.h"
 #include "ev-stock-icons.h"
 #include "ev-file-helpers.h"
+
 #include <poppler.h>
 
 #include <glib/gi18n.h>
@@ -137,7 +139,7 @@ struct _EvWindowPrivate {
 
        /* recent file stuff */
        EggRecentModel *recent_model;
-       EggRecentViewGtk *recent_view;
+       EggRecentViewUIManager *recent_view;
 };
 
 static const GtkTargetEntry ev_drop_types[] = {
@@ -211,13 +213,18 @@ update_action_sensitivity (EvWindow *ev_window)
        int n_pages = 0, page = -1;
        gboolean ok_to_print = TRUE;
        gboolean ok_to_copy = TRUE;
+       gboolean has_properties = TRUE;
 
        view = EV_VIEW (ev_window->priv->view);
+
        document = ev_window->priv->document;
+
        if (document)
                info = ev_page_cache_get_info (ev_window->priv->page_cache);
+
        page_mode = ev_window->priv->page_mode;
        has_document = document != NULL;
+
        if (has_document && ev_window->priv->page_cache) {
                page = ev_page_cache_get_current_page (ev_window->priv->page_cache);
                n_pages = ev_page_cache_get_n_pages (ev_window->priv->page_cache);
@@ -229,11 +236,15 @@ update_action_sensitivity (EvWindow *ev_window)
                ok_to_copy = (info->permissions & EV_DOCUMENT_PERMISSIONS_OK_TO_COPY);
        }
 
+       if (!info || info->fields_mask == 0) {
+               has_properties = FALSE;
+       }
+
        /* File menu */
        /* "FileOpen": always sensitive */
        set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy);
        set_action_sensitive (ev_window, "FilePrint", has_pages && ok_to_print);
-       set_action_sensitive (ev_window, "FileProperties", has_document);
+       set_action_sensitive (ev_window, "FileProperties", has_document && has_properties);
        /* "FileCloseWindow": always sensitive */
 
         /* Edit menu */
@@ -246,6 +257,8 @@ update_action_sensitivity (EvWindow *ev_window)
                              has_pages && EV_IS_DOCUMENT_FIND (document));
        set_action_sensitive (ev_window, "EditFindNext",
                              ev_view_can_find_next (view));
+       set_action_sensitive (ev_window, "EditRotateLeft", has_document);
+       set_action_sensitive (ev_window, "EditRotateRight", has_document);
 
         /* View menu */
        set_action_sensitive (ev_window, "ViewContinuous", has_pages);
@@ -889,6 +902,7 @@ ev_window_xfer_job_cb  (EvJobXfer *job,
                                  G_CALLBACK (ev_window_load_job_cb),
                                  ev_window);
                ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH);
+               g_object_unref (document);
        }               
 }
 
@@ -957,14 +971,18 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *ev_window)
 }
 
 static void
-ev_window_cmd_recent_file_activate (EggRecentViewGtk *view, EggRecentItem *item,
+ev_window_cmd_recent_file_activate (GtkAction *action,
                                    EvWindow *ev_window)
 {
        char *uri;
+       EggRecentItem *item;
        GtkWidget *window;
 
-       uri = egg_recent_item_get_uri (item);
+       item = egg_recent_view_uimanager_get_item (ev_window->priv->recent_view,
+                                                  action);
 
+       uri = egg_recent_item_get_uri (item);
+       
        window = GTK_WIDGET (ev_application_get_empty_window (EV_APP));
        gtk_widget_show (window);
        ev_window_open_uri (EV_WINDOW (window), uri);
@@ -985,23 +1003,20 @@ ev_window_add_recent (EvWindow *window, const char *filename)
 static void
 ev_window_setup_recent (EvWindow *ev_window)
 {
-       GtkWidget *menu_item;
-       GtkWidget *menu;
 
-       menu_item = gtk_ui_manager_get_widget (ev_window->priv->ui_manager, "/MainMenu/FileMenu");
-       menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
-       menu_item = gtk_ui_manager_get_widget (ev_window->priv->ui_manager, "/MainMenu/FileMenu/RecentFilesMenu");
 
-       g_return_if_fail (menu != NULL);
-       g_return_if_fail (menu_item != NULL);
 
        /* it would be better if we just filtered by mime-type, but there
         * doesn't seem to be an easy way to figure out which mime-types we
         * can handle */
        ev_window->priv->recent_model = egg_recent_model_new (EGG_RECENT_MODEL_SORT_MRU);
 
-       ev_window->priv->recent_view = egg_recent_view_gtk_new (menu, menu_item);
-       egg_recent_view_gtk_show_icons (EGG_RECENT_VIEW_GTK (ev_window->priv->recent_view), FALSE);
+       ev_window->priv->recent_view = egg_recent_view_uimanager_new (ev_window->priv->ui_manager,
+                                                                     "/MainMenu/FileMenu/RecentFilesMenu",
+                                                                     G_CALLBACK (ev_window_cmd_recent_file_activate), 
+                                                                     ev_window);       
+
+        egg_recent_view_uimanager_show_icons (EGG_RECENT_VIEW_UIMANAGER (ev_window->priv->recent_view), FALSE);
        egg_recent_model_set_limit (ev_window->priv->recent_model, 5);
 
        egg_recent_view_set_model (EGG_RECENT_VIEW (ev_window->priv->recent_view),
@@ -1010,7 +1025,7 @@ ev_window_setup_recent (EvWindow *ev_window)
        egg_recent_model_set_filter_groups (ev_window->priv->recent_model,
                                            "Evince", NULL);
 
-       egg_recent_view_gtk_set_trailing_sep (ev_window->priv->recent_view, TRUE);
+       egg_recent_view_uimanager_set_trailing_sep (ev_window->priv->recent_view, TRUE);
        
        g_signal_connect (ev_window->priv->recent_view, "activate",
                        G_CALLBACK (ev_window_cmd_recent_file_activate), ev_window);
@@ -1086,8 +1101,11 @@ static void
 ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
 {
        GtkWidget *fc;
-       GtkFileFilter *pdf_filter, *all_filter;
-       gchar *uri = NULL;
+
+       gchar *uri;
+       gchar *basename;
+       static char* folder = NULL;
+
        gboolean success;
 
        fc = gtk_file_chooser_dialog_new (
@@ -1098,18 +1116,17 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
                NULL);
        gtk_window_set_modal (GTK_WINDOW (fc), TRUE);
 
-       pdf_filter = gtk_file_filter_new ();
-       gtk_file_filter_set_name (pdf_filter, _("PDF Documents"));
-       gtk_file_filter_add_mime_type (pdf_filter, "application/pdf");
-       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (fc), pdf_filter);
-
-       all_filter = gtk_file_filter_new ();
-       gtk_file_filter_set_name (all_filter, _("All Files"));
-       gtk_file_filter_add_pattern (all_filter, "*");
-       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (fc), all_filter);
-       gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (fc), pdf_filter);
-
+       ev_document_types_add_filters_for_type (fc, G_TYPE_FROM_INSTANCE (ev_window->priv->document));
        gtk_dialog_set_default_response (GTK_DIALOG (fc), GTK_RESPONSE_OK);
+       
+       if (folder) {
+               gtk_file_chooser_set_current_folder_uri(GTK_FILE_CHOOSER (fc), 
+                                                       folder);
+       }
+       
+       basename = g_path_get_basename (ev_window->priv->uri);
+       gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (fc), basename);
+       g_free (basename);
 
        gtk_widget_show (fc);
 
@@ -1131,6 +1148,12 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
                else
                        save_error_dialog (GTK_WINDOW (fc), uri);
        }
+
+       if (folder != NULL)
+               g_free (folder);
+                               
+       folder = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (fc));
+
        gtk_widget_destroy (fc);
 }
 
@@ -2162,7 +2185,7 @@ ev_window_cmd_help_about (GtkAction *action, EvWindow *ev_window)
                "name", _("Evince"),
                "version", VERSION,
                "copyright",
-               _("\xc2\xa9 1996-2004 The Evince authors"),
+               _("\xc2\xa9 1996-2005 The Evince authors"),
                "license", license_trans,
                "website", "http://www.gnome.org/projects/evince",
                "comments", comments,
@@ -2204,17 +2227,18 @@ ev_window_sidebar_visibility_changed_cb (EvSidebar *ev_sidebar, GParamSpec *pspe
                                         EvWindow   *ev_window)
 {
        GtkAction *action;
-       gboolean visible, fullscreen;
+       gboolean visible, fullscreen_mode;
+
+
+       fullscreen_mode = ev_view_get_presentation (EV_VIEW (ev_window->priv->view)) ||
+                              ev_view_get_fullscreen (EV_VIEW (ev_window->priv->view));
 
-       g_object_get (ev_window->priv->view,
-                     "fullscreen", &fullscreen,
-                     NULL);
        visible = GTK_WIDGET_VISIBLE (ev_sidebar);
 
        /* In fullscreen mode the sidebar is not visible,
         * but we don't want to update the chrome
         */
-       if (fullscreen)
+       if (fullscreen_mode)
                return;
        
        action = gtk_action_group_get_action (ev_window->priv->action_group, "ViewSidebar");
@@ -2389,10 +2413,13 @@ zoom_control_changed_cb (EphyZoomAction *action,
                mode = EV_SIZING_FIT_WIDTH;
        } else {
                mode = EV_SIZING_FREE;
-               ev_view_set_zoom (EV_VIEW (ev_window->priv->view), zoom, FALSE);
        }
        
        ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), mode);
+       
+       if (mode == EV_SIZING_FREE) {
+               ev_view_set_zoom (EV_VIEW (ev_window->priv->view), zoom, FALSE);
+       }
 }
 
 static void
@@ -2408,6 +2435,17 @@ ev_window_dispose (GObject *object)
                priv->toolbar_file = NULL;
        }
 
+       if (priv->recent_model) {
+               g_object_unref (priv->recent_model);
+               priv->recent_model = NULL;
+       }
+
+       if (priv->recent_view) {
+               g_object_unref (priv->recent_view);
+               priv->recent_view = NULL;
+       }
+
+
        if (priv->ui_manager) {
                g_object_unref (priv->ui_manager);
                priv->ui_manager = NULL;
@@ -2857,6 +2895,7 @@ sidebar_widget_model_set (EvSidebarLinks *ev_sidebar_links,
 
        action = gtk_action_group_get_action (ev_window->priv->action_group, PAGE_SELECTOR_ACTION);
        ev_page_action_set_model (EV_PAGE_ACTION (action), model);
+       g_object_unref (model);
 }
 
 
@@ -2900,13 +2939,14 @@ sidebar_page_main_widget_update_cb (GObject *ev_sidebar_page,
        
        g_object_get (ev_sidebar_page, "main_widget", &widget, NULL);
 
-       if (widget != NULL) {           
-       g_signal_connect_object (widget, "focus_in_event",
-                                G_CALLBACK (view_actions_focus_in_cb),
+       if (widget != NULL) {           
+               g_signal_connect_object (widget, "focus_in_event",
+                                        G_CALLBACK (view_actions_focus_in_cb),
                                         ev_window, 0);
-       g_signal_connect_object (widget, "focus_out_event",
-                                G_CALLBACK (view_actions_focus_out_cb),
+               g_signal_connect_object (widget, "focus_out_event",
+                                        G_CALLBACK (view_actions_focus_out_cb),
                                         ev_window, 0);
+               g_object_unref (widget);
        }
 }