]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
Move mime-type functions from document-facrory to file-helpers so that it
[evince.git] / shell / ev-window.c
index 6e0c76eb648b7edb5ca790333615203595147241..47ce4c77a5c4824893b4b1ee0cb64cf0727fb63a 100644 (file)
 #include <glib/gi18n.h>
 #include <gio/gio.h>
 #include <gtk/gtk.h>
+#if GTK_CHECK_VERSION (2, 14, 0)
 #include <gtk/gtkunixprint.h>
+#else
+#include <gtk/gtkprintunixdialog.h>
+#endif
 #include <gconf/gconf-client.h>
 
 #include "egg-editable-toolbar.h"
@@ -77,6 +81,7 @@
 #include "ev-sidebar-links.h"
 #include "ev-sidebar-page.h"
 #include "ev-sidebar-thumbnails.h"
+#include "ev-sidebar-layers.h"
 #include "ev-stock-icons.h"
 #include "ev-utils.h"
 #include "ev-view.h"
@@ -125,6 +130,7 @@ struct _EvWindowPrivate {
        GtkWidget *sidebar_thumbs;
        GtkWidget *sidebar_links;
        GtkWidget *sidebar_attachments;
+       GtkWidget *sidebar_layers;
 
        /* Dialogs */
        GtkWidget *properties;
@@ -161,6 +167,7 @@ struct _EvWindowPrivate {
 
        /* Document */
        char *uri;
+       glong uri_mtime;
        char *local_uri;
        EvLinkDest *dest;
        gboolean unlink_temp_file;
@@ -207,6 +214,7 @@ struct _EvWindowPrivate {
 #define LINKS_SIDEBAR_ID "links"
 #define THUMBNAILS_SIDEBAR_ID "thumbnails"
 #define ATTACHMENTS_SIDEBAR_ID "attachments"
+#define LAYERS_SIDEBAR_ID "layers"
 
 static const gchar *document_print_settings[] = {
        GTK_PRINT_SETTINGS_N_COPIES,
@@ -902,6 +910,7 @@ setup_sidebar_from_metadata (EvWindow *window, EvDocument *document)
        GtkWidget *links = window->priv->sidebar_links;
        GtkWidget *thumbs = window->priv->sidebar_thumbs;
        GtkWidget *attachments = window->priv->sidebar_attachments;
+       GtkWidget *layers = window->priv->sidebar_layers;
        GValue sidebar_size = { 0, };
        GValue sidebar_page = { 0, };
        GValue sidebar_visibility = { 0, };
@@ -912,19 +921,29 @@ setup_sidebar_from_metadata (EvWindow *window, EvDocument *document)
                g_value_unset(&sidebar_size);
        }
        
-       if (document && ev_metadata_manager_get (uri, "sidebar_page", &sidebar_page, FALSE)) {
+       if (document && ev_metadata_manager_get (uri, "sidebar_page", &sidebar_page, TRUE)) {
                const char *page_id = g_value_get_string (&sidebar_page);
-               
+
                if (strcmp (page_id, LINKS_SIDEBAR_ID) == 0 && ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (links), document)) {
                        ev_sidebar_set_page (EV_SIDEBAR (sidebar), links);
-               } else if (strcmp (page_id, THUMBNAILS_SIDEBAR_ID) && ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (thumbs), document)) {
+               } else if (strcmp (page_id, THUMBNAILS_SIDEBAR_ID) == 0 && ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (thumbs), document)) {
                        ev_sidebar_set_page (EV_SIDEBAR (sidebar), thumbs);
-               } else if (strcmp (page_id, ATTACHMENTS_SIDEBAR_ID) && ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (attachments), document)) {
+               } else if (strcmp (page_id, ATTACHMENTS_SIDEBAR_ID) == 0 && ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (attachments), document)) {
                        ev_sidebar_set_page (EV_SIDEBAR (sidebar), attachments);
+               } else if (strcmp (page_id, LAYERS_SIDEBAR_ID) == 0 && ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (layers), document)) {
+                       ev_sidebar_set_page (EV_SIDEBAR (sidebar), layers);
                }
                g_value_unset (&sidebar_page);
-       } else if (document && ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (links), document)) {
-               ev_sidebar_set_page (EV_SIDEBAR (sidebar), links);
+       } else if (document) {
+               if (ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (links), document)) {
+                       ev_sidebar_set_page (EV_SIDEBAR (sidebar), links);
+               } else if (ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (thumbs), document)) {
+                       ev_sidebar_set_page (EV_SIDEBAR (sidebar), thumbs);
+               } else if (ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (attachments), document)) {
+                       ev_sidebar_set_page (EV_SIDEBAR (sidebar), attachments);
+               } else if (ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (layers), document)) {
+                       ev_sidebar_set_page (EV_SIDEBAR (sidebar), layers);
+               }
        }
 
        if (ev_metadata_manager_get (uri, "sidebar_visibility", &sidebar_visibility, FALSE)) {
@@ -1418,7 +1437,7 @@ ev_window_load_job_cb (EvJob *job,
                }
 
                /* Create a monitor for the document */
-               ev_window->priv->monitor = ev_file_monitor_new (job_load->uri);
+               ev_window->priv->monitor = ev_file_monitor_new (ev_window->priv->uri);
                g_signal_connect_swapped (G_OBJECT (ev_window->priv->monitor), "changed",
                                          G_CALLBACK (ev_window_document_changed),
                                          ev_window);
@@ -1522,6 +1541,31 @@ ev_window_load_remote_failed (EvWindow *ev_window,
                                 "%s", _("Unable to open document"));
        g_free (ev_window->priv->local_uri);
        ev_window->priv->local_uri = NULL;
+       ev_window->priv->uri_mtime = 0;
+}
+
+static void
+set_uri_mtime (GFile        *source,
+              GAsyncResult *async_result,
+              EvWindow     *ev_window)
+{
+       GFileInfo *info;
+       GError *error = NULL;
+
+       info = g_file_query_info_finish (source, async_result, &error);
+
+       if (error) {
+               ev_window->priv->uri_mtime = 0;
+               g_error_free (error);
+       } else {
+               GTimeVal mtime;
+               
+               g_file_info_get_modification_time (info, &mtime);
+               ev_window->priv->uri_mtime = mtime.tv_sec;
+               g_object_unref (info);
+       }
+
+       g_object_unref (source);
 }
 
 static void
@@ -1554,8 +1598,12 @@ window_open_file_copy_ready_cb (GFile        *source,
        g_file_copy_finish (source, async_result, &error);
        if (!error) {
                ev_job_scheduler_push_job (ev_window->priv->load_job, EV_JOB_PRIORITY_NONE);
-               g_object_unref (source);
-               
+               g_file_query_info_async (source,
+                                        G_FILE_ATTRIBUTE_TIME_MODIFIED,
+                                        0, G_PRIORITY_DEFAULT,
+                                        NULL,
+                                        (GAsyncReadyCallback)set_uri_mtime,
+                                        ev_window);
                return;
        }
 
@@ -1668,12 +1716,9 @@ ev_window_open_uri (EvWindow       *ev_window,
 }
 
 static void
-ev_window_reload_document (EvWindow *ev_window)
+ev_window_reload_local (EvWindow *ev_window)
 {
        const gchar *uri;
-
-       ev_window_clear_reload_job (ev_window);
-       ev_window->priv->in_reload = TRUE;
        
        uri = ev_window->priv->local_uri ? ev_window->priv->local_uri : ev_window->priv->uri;
        ev_window->priv->reload_job = ev_job_load_new (uri, NULL, 0, NULL);
@@ -1683,6 +1728,84 @@ ev_window_reload_document (EvWindow *ev_window)
        ev_job_scheduler_push_job (ev_window->priv->reload_job, EV_JOB_PRIORITY_NONE);
 }
 
+static void
+reload_remote_copy_ready_cb (GFile        *remote,
+                            GAsyncResult *async_result,
+                            EvWindow     *ev_window)
+{
+       g_file_copy_finish (remote, async_result, NULL);
+       ev_window_reload_local (ev_window);
+       g_object_unref (remote);
+}
+
+static void
+query_remote_uri_mtime_cb (GFile        *remote,
+                          GAsyncResult *async_result,
+                          EvWindow     *ev_window)
+{
+       GFileInfo *info;
+       GTimeVal   mtime;
+       GError    *error = NULL;
+
+       info = g_file_query_info_finish (remote, async_result, &error);
+       if (error) {
+               g_error_free (error);
+               g_object_unref (remote);
+               ev_window_reload_local (ev_window);
+
+               return;
+       }
+       
+       g_file_info_get_modification_time (info, &mtime);
+       if (ev_window->priv->uri_mtime != mtime.tv_sec) {
+               GFile *target_file;
+                       
+               /* Remote file has changed */
+               ev_window->priv->uri_mtime = mtime.tv_sec;
+               target_file = g_file_new_for_uri (ev_window->priv->local_uri);
+               g_file_copy_async (remote, target_file,
+                                  G_FILE_COPY_OVERWRITE,
+                                  G_PRIORITY_DEFAULT, NULL,
+                                  NULL, NULL, /* no progress callback */
+                                  (GAsyncReadyCallback) reload_remote_copy_ready_cb,
+                                  ev_window);
+               g_object_unref (target_file);
+       } else {
+               g_object_unref (remote);
+               ev_window_reload_local (ev_window);
+       }
+       
+       g_object_unref (info);
+}
+
+static void
+ev_window_reload_remote (EvWindow *ev_window)
+{
+       GFile *remote;
+       
+       remote = g_file_new_for_uri (ev_window->priv->uri);
+       /* Reload the remote uri only if it has changed */
+       g_file_query_info_async (remote,
+                                G_FILE_ATTRIBUTE_TIME_MODIFIED,
+                                0, G_PRIORITY_DEFAULT,
+                                NULL,
+                                (GAsyncReadyCallback)query_remote_uri_mtime_cb,
+                                ev_window);
+}
+
+static void
+ev_window_reload_document (EvWindow *ev_window)
+{
+       ev_window_clear_reload_job (ev_window);
+       ev_window->priv->in_reload = TRUE;
+
+       if (ev_window->priv->local_uri) {
+               ev_window_reload_remote (ev_window);
+       } else {
+               ev_window_reload_local (ev_window);
+       }
+}
+
 static void
 file_open_dialog_response_cb (GtkWidget *chooser,
                              gint       response_id,
@@ -3815,6 +3938,8 @@ ev_window_sidebar_current_page_changed_cb (EvSidebar  *ev_sidebar,
                id = THUMBNAILS_SIDEBAR_ID;
        } else if (current_page == ev_window->priv->sidebar_attachments) {
                id = ATTACHMENTS_SIDEBAR_ID;
+       } else if (current_page == ev_window->priv->sidebar_layers) {
+               id = LAYERS_SIDEBAR_ID;
        } else {
                g_assert_not_reached();
        }
@@ -4588,6 +4713,13 @@ navigation_action_activate_link_cb (EvNavigationAction *action, EvLink *link, Ev
        gtk_widget_grab_focus (window->priv->view);
 }
 
+static void
+sidebar_layers_visibility_changed (EvSidebarLayers *layers,
+                                  EvWindow        *window)
+{
+       ev_view_reload (EV_VIEW (window->priv->view));
+}
+
 static void
 register_custom_actions (EvWindow *window, GtkActionGroup *group)
 {
@@ -4875,9 +5007,11 @@ static void
 launch_external_uri (EvWindow *window, EvLinkAction *action)
 {
        const gchar *uri = ev_link_action_get_uri (action);
-       GAppLaunchContext *context = NULL;
        GError *error = NULL;
        gboolean ret;
+#if GTK_CHECK_VERSION (2, 14, 0)
+       GAppLaunchContext *context = NULL;
+#endif
 
 #if GTK_CHECK_VERSION (2, 14, 0)
        context = G_APP_LAUNCH_CONTEXT (gdk_app_launch_context_new ());
@@ -5489,6 +5623,16 @@ ev_window_init (EvWindow *ev_window)
        ev_sidebar_add_page (EV_SIDEBAR (ev_window->priv->sidebar),
                             sidebar_widget);
 
+       sidebar_widget = ev_sidebar_layers_new ();
+       ev_window->priv->sidebar_layers = sidebar_widget;
+       g_signal_connect (sidebar_widget,
+                         "layers_visibility_changed",
+                         G_CALLBACK (sidebar_layers_visibility_changed),
+                         ev_window);
+       gtk_widget_show (sidebar_widget);
+       ev_sidebar_add_page (EV_SIDEBAR (ev_window->priv->sidebar),
+                            sidebar_widget);
+
        ev_window->priv->view_box = gtk_vbox_new (FALSE, 0);
        ev_window->priv->scrolled_window =
                GTK_WIDGET (g_object_new (GTK_TYPE_SCROLLED_WINDOW,