]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
only call ev_properties_fonts_set_document() if the document implements
[evince.git] / shell / ev-window.c
index 11ee1ad46bd3d55f0b07443a723639c2b47bc63a..854079b573e0888cfbb9a4c2929daeafce1adf06 100644 (file)
@@ -37,7 +37,8 @@
 #include "ev-password.h"
 #include "ev-password-view.h"
 #include "ev-print-job.h"
-#include "ev-properties.h"
+#include "ev-properties-dialog.h"
+#include "ev-ps-exporter.h"
 #include "ev-document-thumbnails.h"
 #include "ev-document-links.h"
 #include "ev-document-fonts.h"
@@ -60,6 +61,7 @@
 #include "ev-application.h"
 #include "ev-stock-icons.h"
 #include "ev-file-helpers.h"
+#include "ev-metadata-manager.h"
 
 #include <poppler.h>
 
@@ -106,7 +108,7 @@ struct _EvWindowPrivate {
        GtkWidget *sidebar_thumbs;
 
        /* Dialogs */
-       EvProperties *properties;
+       GtkWidget *properties;
 
        /* UI Builders */
        GtkActionGroup *action_group;
@@ -179,8 +181,8 @@ static void     ev_window_zoom_changed_cb           (EvView           *view,
                                                         EvWindow         *ev_window);
 static void     ev_window_add_recent                    (EvWindow         *window,
                                                         const char       *filename);
-static void     ev_window_fullscreen                    (EvWindow         *window);
-static void     ev_window_unfullscreen                  (EvWindow         *window);
+static void     ev_window_run_fullscreen                (EvWindow         *window);
+static void     ev_window_stop_fullscreen               (EvWindow         *window);
 static void     ev_window_cmd_view_fullscreen           (GtkAction        *action,
                                                         EvWindow         *window);
 static void     ev_window_run_presentation              (EvWindow         *window);
@@ -236,6 +238,9 @@ update_action_sensitivity (EvWindow *ev_window)
                ok_to_copy = (info->permissions & EV_DOCUMENT_PERMISSIONS_OK_TO_COPY);
        }
 
+       if (has_document && !EV_IS_PS_EXPORTER(document))
+               ok_to_print = FALSE;
+
        if (!info || info->fields_mask == 0) {
                has_properties = FALSE;
        }
@@ -622,7 +627,7 @@ update_document_mode (EvWindow *window, EvDocumentMode mode)
                ev_window_run_presentation (window);
        }
        else if (mode == EV_DOCUMENT_MODE_FULL_SCREEN) {
-               ev_window_fullscreen (window);
+               ev_window_run_fullscreen (window);
        }
 }
 
@@ -667,8 +672,8 @@ ev_window_setup_document (EvWindow *ev_window)
        update_document_mode (ev_window, info->mode);
 
        if (ev_window->priv->properties) {
-               ev_properties_set_document (ev_window->priv->properties,
-                                           ev_window->priv->document);
+               ev_properties_dialog_set_document (EV_PROPERTIES_DIALOG (ev_window->priv->properties),
+                                                  ev_window->priv->document);
        }
 }
 
@@ -906,6 +911,23 @@ ev_window_xfer_job_cb  (EvJobXfer *job,
        }               
 }
 
+#ifdef ENABLE_METADATA
+static void
+ev_window_setup_from_metadata (EvWindow *window)
+{
+       char *uri = window->priv->uri;
+       GValue width = { 0, };
+       GValue height = { 0, };
+
+       ev_metadata_manager_get (uri, "window_width", &width);
+       ev_metadata_manager_get (uri, "window_height", &height);
+
+       gtk_window_set_default_size (GTK_WINDOW (window),
+                                    g_value_get_int (&width),
+                                    g_value_get_int (&height));
+}
+#endif
+
 void
 ev_window_open_uri (EvWindow *ev_window, const char *uri)
 {
@@ -914,6 +936,10 @@ ev_window_open_uri (EvWindow *ev_window, const char *uri)
 
        g_free (ev_window->priv->uri);
        ev_window->priv->uri = g_strdup (uri);
+
+#ifdef ENABLE_METADATA
+       ev_window_setup_from_metadata (ev_window);
+#endif
        
        ev_window_clear_jobs (ev_window);
        ev_window_clear_local_uri (ev_window);
@@ -1297,14 +1323,16 @@ static void
 ev_window_cmd_file_properties (GtkAction *action, EvWindow *ev_window)
 {
        if (ev_window->priv->properties == NULL) {
-               ev_window->priv->properties = ev_properties_new ();
-               ev_properties_set_document (ev_window->priv->properties,
-                                           ev_window->priv->document);
+               ev_window->priv->properties = ev_properties_dialog_new ();
+               ev_properties_dialog_set_document (EV_PROPERTIES_DIALOG (ev_window->priv->properties),
+                                                  ev_window->priv->document);
                g_object_add_weak_pointer (G_OBJECT (ev_window->priv->properties),
                                           (gpointer *) &(ev_window->priv->properties));
+               gtk_window_set_transient_for (GTK_WINDOW (ev_window->priv->properties),
+                                             GTK_WINDOW (ev_window));
        }
 
-       ev_properties_show (ev_window->priv->properties, GTK_WIDGET (ev_window));
+       gtk_widget_show (ev_window->priv->properties);
 }
                                        
 static void
@@ -1612,7 +1640,7 @@ ev_window_update_fullscreen_action (EvWindow *window)
 }
 
 static void
-ev_window_fullscreen (EvWindow *window)
+ev_window_run_fullscreen (EvWindow *window)
 {
        ev_view_set_fullscreen (EV_VIEW (window->priv->view), TRUE);
        if (window->priv->fullscreen_popup == NULL)
@@ -1641,10 +1669,13 @@ ev_window_fullscreen (EvWindow *window)
 }
 
 static void
-ev_window_unfullscreen (EvWindow *window)
+ev_window_stop_fullscreen (EvWindow *window)
 {
        EvView *view = EV_VIEW (window->priv->view);
 
+       if (!ev_view_get_fullscreen (EV_VIEW (view)))
+               return;
+
        ev_view_set_fullscreen (view, FALSE);
        g_object_set (G_OBJECT (window->priv->scrolled_window),
                      "shadow-type", GTK_SHADOW_IN,
@@ -1673,9 +1704,9 @@ ev_window_cmd_view_fullscreen (GtkAction *action, EvWindow *window)
 
        fullscreen = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        if (fullscreen) {
-               ev_window_fullscreen (window);
+               ev_window_run_fullscreen (window);
        } else {
-               ev_window_unfullscreen (window);
+               ev_window_stop_fullscreen (window);
        }
 }
 
@@ -1710,7 +1741,7 @@ ev_window_run_presentation (EvWindow *window)
 static void
 ev_window_stop_presentation (EvWindow *window)
 {
-       if (! ev_view_get_presentation (EV_VIEW (window->priv->view)))
+       if (!ev_view_get_presentation (EV_VIEW (window->priv->view)))
                return;
 
        g_object_set (G_OBJECT (window->priv->scrolled_window),
@@ -1728,6 +1759,7 @@ ev_window_cmd_view_presentation (GtkAction *action, EvWindow *window)
        gboolean presentation;
 
         g_return_if_fail (EV_IS_WINDOW (window));
+       ev_window_stop_fullscreen (window);
 
        presentation = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        if (presentation) {
@@ -2020,7 +2052,7 @@ ev_window_cmd_escape (GtkAction *action, EvWindow *window)
                              NULL);
 
                if (fullscreen)
-                       ev_window_unfullscreen (window);
+                       ev_window_stop_fullscreen (window);
                if (presentation)
                        ev_window_stop_presentation (window);
 
@@ -2975,6 +3007,25 @@ sidebar_page_main_widget_update_cb (GObject *ev_sidebar_page,
        }
 }
 
+static gboolean
+window_configure_event_cb (EvWindow *window, gpointer dummy)
+{
+#ifdef ENABLE_METADATA
+       int width, height;
+
+       if (window->priv->uri == NULL) {
+               return FALSE;
+       }
+
+       gtk_window_get_size (GTK_WINDOW (window), &width, &height);
+
+       ev_metadata_manager_set_int (window->priv->uri, "window_width", width);
+       ev_metadata_manager_set_int (window->priv->uri, "window_height", height);
+#endif
+
+       return FALSE;
+}
+
 static void
 ev_window_init (EvWindow *ev_window)
 {
@@ -2986,6 +3037,9 @@ ev_window_init (EvWindow *ev_window)
        GConfClient *client;
        int sidebar_size;
 
+       g_signal_connect (ev_window, "configure_event",
+                         G_CALLBACK (window_configure_event_cb), NULL);
+
        ev_window->priv = EV_WINDOW_GET_PRIVATE (ev_window);
 
        ev_window->priv->page_mode = PAGE_MODE_DOCUMENT;