]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
HIGification of toolbar editor dialogue.
[evince.git] / shell / ev-window.c
index 11ee1ad46bd3d55f0b07443a723639c2b47bc63a..b18f98502f3940d472aba6a466ce04c523505b48 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);
@@ -188,7 +190,7 @@ static void     ev_window_stop_presentation             (EvWindow         *windo
 static void     ev_window_cmd_view_presentation         (GtkAction        *action,
                                                         EvWindow         *window);
 static void     show_fullscreen_popup                   (EvWindow         *window);
-                                                       
+
 
 G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_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;
        }
@@ -613,6 +618,8 @@ page_changed_cb (EvPageCache *page_cache,
                 EvWindow    *ev_window)
 {
        update_action_sensitivity (ev_window);
+
+       ev_metadata_manager_set_int (ev_window->priv->uri, "page", page);
 }
 
 static void
@@ -622,10 +629,24 @@ 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);
        }
 }
 
+static void
+setup_document_from_metadata (EvWindow *window)
+{
+       char *uri = window->priv->uri;
+       GValue page = { 0, };
+
+       /* Page */
+       if (ev_metadata_manager_get (uri, "page", &page)) {
+               ev_page_cache_set_current_page (window->priv->page_cache,
+                                               g_value_get_int (&page));
+       }
+
+}
+
 static void
 ev_window_setup_document (EvWindow *ev_window)
 {
@@ -667,9 +688,11 @@ 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);
        }
+
+       setup_document_from_metadata (ev_window);
 }
 
 static void
@@ -906,6 +929,87 @@ ev_window_xfer_job_cb  (EvJobXfer *job,
        }               
 }
 
+static void
+setup_view_from_metadata (EvWindow *window)
+{
+       EvView *view = EV_VIEW (window->priv->view);
+       char *uri = window->priv->uri;
+       GEnumValue *enum_value;
+       GValue width = { 0, };
+       GValue height = { 0, };
+       GValue maximized = { 0, };
+       GValue x = { 0, };
+       GValue y = { 0, };
+       GValue sizing_mode = { 0, };
+       GValue zoom = { 0, };
+       GValue continuous = { 0, };
+       GValue dual_page = { 0, };
+       GValue presentation = { 0, };
+       GValue fullscreen = { 0, };
+
+       /* Window size */
+       if (!GTK_WIDGET_VISIBLE (window)) {
+               gboolean restore_size = TRUE;
+
+               if (ev_metadata_manager_get (uri, "window_maximized", &maximized)) {
+                       if (g_value_get_boolean (&maximized)) {
+                               gtk_window_maximize (GTK_WINDOW (window));
+                               restore_size = FALSE;
+                       }
+               }
+
+               if (restore_size &&
+                   ev_metadata_manager_get (uri, "window_x", &x) &&
+                   ev_metadata_manager_get (uri, "window_y", &y) &&
+                   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));
+                       gtk_window_move (GTK_WINDOW (window), g_value_get_int (&x),
+                                        g_value_get_int (&y));
+               }
+       }
+
+       /* Sizing mode */
+       if (ev_metadata_manager_get (uri, "sizing_mode", &sizing_mode)) {
+               enum_value = g_enum_get_value_by_nick
+                       (EV_SIZING_MODE_CLASS, g_value_get_string (&sizing_mode));
+               g_value_unset (&sizing_mode);
+               ev_view_set_sizing_mode (view, enum_value->value);
+       }
+
+       /* Zoom */
+       if (ev_metadata_manager_get (uri, "zoom", &zoom) &&
+           ev_view_get_sizing_mode (view) == EV_SIZING_FREE) {
+               ev_view_set_zoom (view, g_value_get_double (&zoom), FALSE);
+       }
+
+       /* Continuous */
+       if (ev_metadata_manager_get (uri, "continuous", &continuous)) {
+               ev_view_set_continuous (view, g_value_get_boolean (&continuous));
+       }
+
+       /* Dual page */
+       if (ev_metadata_manager_get (uri, "dual-page", &dual_page)) {
+               ev_view_set_dual_page (view, g_value_get_boolean (&dual_page));
+       }
+
+       /* Presentation */
+       if (ev_metadata_manager_get (uri, "presentation", &presentation)) {
+               if (g_value_get_boolean (&presentation)) {
+                       ev_window_run_presentation (window);
+               }
+       }
+
+       /* Fullscreen */
+       if (ev_metadata_manager_get (uri, "fullscreen", &fullscreen)) {
+               if (g_value_get_boolean (&fullscreen)) {
+                       ev_window_run_fullscreen (window);
+               }
+       }
+}
+
 void
 ev_window_open_uri (EvWindow *ev_window, const char *uri)
 {
@@ -914,6 +1018,8 @@ ev_window_open_uri (EvWindow *ev_window, const char *uri)
 
        g_free (ev_window->priv->uri);
        ev_window->priv->uri = g_strdup (uri);
+
+       setup_view_from_metadata (ev_window);
        
        ev_window_clear_jobs (ev_window);
        ev_window_clear_local_uri (ev_window);
@@ -951,7 +1057,7 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
                                                         folder);
        }
 
-       ev_document_types_add_filters (chooser);
+       ev_document_types_add_filters (chooser, NULL);
        gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), TRUE);
        gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), FALSE);
 
@@ -989,7 +1095,7 @@ ev_window_cmd_recent_file_activate (GtkAction *action,
 
        uri = egg_recent_item_get_uri (item);
 
-       ev_application_open_uri (EV_APP, uri, NULL);    
+       ev_application_open_uri (EV_APP, uri, NULL, NULL);      
        
        g_free (uri);
 }
@@ -1120,7 +1226,7 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
                NULL);
        gtk_window_set_modal (GTK_WINDOW (fc), TRUE);
 
-       ev_document_types_add_filters_for_type (fc, G_TYPE_FROM_INSTANCE (ev_window->priv->document));
+       ev_document_types_add_filters (fc, ev_window->priv->document);
        gtk_dialog_set_default_response (GTK_DIALOG (fc), GTK_RESPONSE_OK);
        
        if (folder) {
@@ -1297,14 +1403,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 +1720,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)
@@ -1623,7 +1731,7 @@ ev_window_fullscreen (EvWindow *window)
        g_object_set (G_OBJECT (window->priv->scrolled_window),
                      "shadow-type", GTK_SHADOW_NONE,
                      NULL);
-
+       
        g_signal_connect (window->priv->view,
                          "motion-notify-event",
                          G_CALLBACK (fullscreen_motion_notify_cb),
@@ -1638,13 +1746,18 @@ ev_window_fullscreen (EvWindow *window)
        ev_window_update_fullscreen_action (window);
        gtk_window_fullscreen (GTK_WINDOW (window));
        ev_window_update_fullscreen_popup (window);
+
+       ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", TRUE);
 }
 
 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,
@@ -1661,6 +1774,8 @@ ev_window_unfullscreen (EvWindow *window)
        ev_window_update_fullscreen_action (window);
        gtk_window_unfullscreen (GTK_WINDOW (window));
        update_chrome_visibility (window);
+
+       ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", FALSE);
 }
 
 static void
@@ -1673,9 +1788,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);
        }
 }
 
@@ -1705,12 +1820,14 @@ ev_window_run_presentation (EvWindow *window)
        gtk_window_fullscreen (GTK_WINDOW (window));
        ev_window_update_presentation_action (window);
        update_chrome_visibility (window);
+
+       ev_metadata_manager_set_boolean (window->priv->uri, "presentation", TRUE);
 }
 
 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),
@@ -1720,6 +1837,8 @@ ev_window_stop_presentation (EvWindow *window)
        gtk_window_unfullscreen (GTK_WINDOW (window));
        ev_window_update_presentation_action (window);
        update_chrome_visibility (window);
+
+       ev_metadata_manager_set_boolean (window->priv->uri, "presentation", FALSE);
 }
 
 static void
@@ -1728,6 +1847,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) {
@@ -1851,13 +1971,15 @@ ev_window_cmd_edit_toolbar (GtkAction *action, EvWindow *ev_window)
 {
        GtkWidget *dialog;
        GtkWidget *editor;
-       g_return_if_fail (EV_IS_WINDOW (ev_window));
     
-       dialog = gtk_dialog_new_with_buttons (_("Toolbar editor"), GTK_WINDOW (ev_window), 
+       dialog = gtk_dialog_new_with_buttons (_("Toolbar editor"),
+                                             GTK_WINDOW (ev_window), 
                                              GTK_DIALOG_DESTROY_WITH_PARENT, 
                                              GTK_STOCK_CLOSE,
-                                             GTK_RESPONSE_CANCEL
+                                             GTK_RESPONSE_CLOSE
                                              NULL);
+       gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)), 5);
+       gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 18);
        gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
        gtk_window_set_default_size (GTK_WINDOW (dialog), 500, 400);
          
@@ -1865,19 +1987,18 @@ ev_window_cmd_edit_toolbar (GtkAction *action, EvWindow *ev_window)
                                         ev_window->priv->toolbar_model);
        gtk_container_set_border_width (GTK_CONTAINER (editor), 5);
        gtk_box_set_spacing (GTK_BOX (EGG_TOOLBAR_EDITOR (editor)), 5);
-                    
+             
        gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), editor);
        egg_toolbar_editor_load_actions (EGG_TOOLBAR_EDITOR (editor),
-                                     DATADIR"/evince-toolbar.xml");
+                                        DATADIR "/evince-toolbar.xml");
 
        egg_editable_toolbar_set_edit_mode
                (EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar), TRUE);
 
-       gtk_widget_show_all (dialog);
-      
-       g_signal_connect (G_OBJECT (dialog), "response",
+       g_signal_connect (dialog, "response",
                          G_CALLBACK (ev_window_cmd_edit_toolbar_cb),
                          ev_window);
+       gtk_widget_show_all (dialog);
 }
 
 static void
@@ -2020,7 +2141,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);
 
@@ -2061,6 +2182,21 @@ update_view_size (EvView *view, EvWindow *window)
                                   hsb_requisition.height + scrollbar_spacing);
 }
 
+static void
+save_sizing_mode (EvWindow *window)
+{
+       EvSizingMode mode;
+       GEnumValue *enum_value;
+
+       if (window->priv->uri) {
+               mode = ev_view_get_sizing_mode (EV_VIEW (window->priv->view));
+               enum_value = g_enum_get_value (EV_SIZING_MODE_CLASS, mode);
+
+               ev_metadata_manager_set_string (window->priv->uri, "sizing_mode",
+                                               enum_value->value_nick);
+       }
+}
+
 static void     
 ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
                                  EvWindow   *ev_window)
@@ -2107,13 +2243,64 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
        }
 
        update_sizing_buttons (ev_window);
+       save_sizing_mode (ev_window);
 }
 
 static void     
-ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec,
-                          EvWindow   *ev_window)
+ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
 {
         update_action_sensitivity (ev_window);
+
+       if (ev_view_get_sizing_mode (view) == EV_SIZING_FREE) {
+               ev_metadata_manager_set_double (ev_window->priv->uri, "zoom",
+                                               ev_view_get_zoom (view));
+       }
+}
+
+static void
+ev_window_update_continuous_action (EvWindow *window)
+{
+       GtkAction *action;
+
+       action = gtk_action_group_get_action (window->priv->action_group, "ViewContinuous");
+       g_signal_handlers_block_by_func
+               (action, G_CALLBACK (ev_window_cmd_continuous), window);
+       gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
+                                     ev_view_get_continuous (EV_VIEW (window->priv->view)));
+       g_signal_handlers_unblock_by_func
+               (action, G_CALLBACK (ev_window_cmd_continuous), window);
+}
+
+static void
+ev_window_update_dual_page_action (EvWindow *window)
+{
+       GtkAction *action;
+
+       action = gtk_action_group_get_action (window->priv->action_group, "ViewDual");
+       g_signal_handlers_block_by_func
+               (action, G_CALLBACK (ev_window_cmd_dual), window);
+       gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
+                                     ev_view_get_dual_page (EV_VIEW (window->priv->view)));
+       g_signal_handlers_unblock_by_func
+               (action, G_CALLBACK (ev_window_cmd_dual), window);
+}
+
+static void     
+ev_window_continuous_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
+{
+       ev_window_update_continuous_action (ev_window);
+
+       ev_metadata_manager_set_boolean (ev_window->priv->uri, "continuous",
+                                        ev_view_get_continuous (EV_VIEW (ev_window->priv->view)));
+}
+
+static void     
+ev_window_dual_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
+{
+       ev_window_update_dual_page_action (ev_window);
+
+       ev_metadata_manager_set_boolean (ev_window->priv->uri, "dual-page",
+                                        ev_view_get_dual_page (EV_VIEW (ev_window->priv->view)));
 }
 
 static char *
@@ -2469,7 +2656,6 @@ ev_window_dispose (GObject *object)
                priv->recent_view = NULL;
        }
 
-
        if (priv->ui_manager) {
                g_object_unref (priv->ui_manager);
                priv->ui_manager = NULL;
@@ -2975,6 +3161,43 @@ sidebar_page_main_widget_update_cb (GObject *ev_sidebar_page,
        }
 }
 
+static gboolean
+window_state_event_cb (EvWindow *window, GdkEventWindowState *event, gpointer dummy)
+{
+       char *uri = window->priv->uri;
+
+       if (uri && !(event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
+               gboolean maximized;
+
+               maximized = event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED;
+               ev_metadata_manager_set_boolean (uri, "window_maximized", maximized);
+       }
+
+       return FALSE;
+}
+
+static gboolean
+window_configure_event_cb (EvWindow *window, GdkEventConfigure *event, gpointer dummy)
+{
+       char *uri = window->priv->uri;
+       GdkWindowState state;
+       int x, y, width, height;
+
+       state = gdk_window_get_state (GTK_WIDGET (window)->window);
+
+       if (uri && !(state & GDK_WINDOW_STATE_FULLSCREEN)) {
+               gtk_window_get_position (GTK_WINDOW (window), &x, &y);
+               gtk_window_get_size (GTK_WINDOW (window), &width, &height);
+
+               ev_metadata_manager_set_int (uri, "window_x", x);
+               ev_metadata_manager_set_int (uri, "window_y", y);
+               ev_metadata_manager_set_int (uri, "window_width", width);
+               ev_metadata_manager_set_int (uri, "window_height", height);
+       }
+
+       return FALSE;
+}
+
 static void
 ev_window_init (EvWindow *ev_window)
 {
@@ -2986,6 +3209,11 @@ 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);
+       g_signal_connect (ev_window, "window_state_event",
+                         G_CALLBACK (window_state_event_cb), NULL);
+
        ev_window->priv = EV_WINDOW_GET_PRIVATE (ev_window);
 
        ev_window->priv->page_mode = PAGE_MODE_DOCUMENT;
@@ -3173,6 +3401,14 @@ ev_window_init (EvWindow *ev_window)
                          "notify::zoom",
                          G_CALLBACK (ev_window_zoom_changed_cb),
                          ev_window);
+       g_signal_connect (ev_window->priv->view,
+                         "notify::dual-page",
+                         G_CALLBACK (ev_window_dual_mode_changed_cb),
+                         ev_window);
+       g_signal_connect (ev_window->priv->view,
+                         "notify::continuous",
+                         G_CALLBACK (ev_window_continuous_changed_cb),
+                         ev_window);
 
        ev_window->priv->statusbar = ev_statusbar_new ();
        gtk_box_pack_end (GTK_BOX (ev_window->priv->main_box),
@@ -3251,5 +3487,3 @@ ev_window_new (void)
 
        return ev_window;
 }
-
-