X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window.c;h=8f55f13dd12a08fcbd4a80102fb032d8754f127f;hb=8d858ef399ef70a2c9efb391242e8c8be70e2109;hp=37531df608cbdcaa42cfd153b1875c8ede6abb1b;hpb=4300adb2c68416fe4302c6ee77f50a2735c7aa8d;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index 37531df6..8f55f13d 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -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 @@ -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; } @@ -257,6 +262,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); @@ -620,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); } } @@ -665,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); } } @@ -904,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) { @@ -912,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); @@ -930,42 +958,49 @@ ev_window_open_uri (EvWindow *ev_window, const char *uri) TRUE); } -void -ev_window_open_uri_list (EvWindow *ev_window, GSList *uri_list) +static void +ev_window_cmd_file_open (GtkAction *action, EvWindow *window) { - GSList *list; - gchar *uri; - - g_return_if_fail (uri_list != NULL); - - list = uri_list; - while (list) { + GtkWidget *chooser; + static char *folder = NULL; - uri = (gchar *)list->data; - - if (ev_window_is_empty (EV_WINDOW (ev_window))) { - ev_window_open_uri (ev_window, uri); + chooser = gtk_file_chooser_dialog_new (_("Open document"), + GTK_WINDOW (window), + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_OK, + NULL); - gtk_widget_show (GTK_WIDGET (ev_window)); - } else { - EvWindow *new_window; + if (folder) { + gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (chooser), + folder); + } - new_window = ev_application_new_window (EV_APP); - ev_window_open_uri (new_window, uri); + 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); - gtk_widget_show (GTK_WIDGET (new_window)); - } + if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_OK) { + GSList *uris; - g_free (uri); + uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (chooser)); - list = g_slist_next (list); + if (folder != NULL) + g_free (folder); + + folder = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (chooser)); + + ev_application_open_uri_list (EV_APP, uris); + + g_slist_foreach (uris, (GFunc)g_free, NULL); + g_slist_free (uris); + } else { + if (!GTK_WIDGET_VISIBLE (window)) + gtk_widget_destroy (GTK_WIDGET (window)); } -} -static void -ev_window_cmd_file_open (GtkAction *action, EvWindow *ev_window) -{ - ev_application_open (EV_APP, NULL); + gtk_widget_destroy (GTK_WIDGET (chooser)); } static void @@ -974,16 +1009,13 @@ ev_window_cmd_recent_file_activate (GtkAction *action, { char *uri; EggRecentItem *item; - GtkWidget *window; 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); + + ev_application_open_uri (EV_APP, uri, NULL, NULL); g_free (uri); } @@ -1114,7 +1146,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) { @@ -1194,6 +1226,12 @@ ev_window_print (EvWindow *window) ev_window_print_range (window, 1, -1); } +const char * +ev_window_get_uri (EvWindow *ev_window) +{ + return ev_window->priv->uri; +} + void ev_window_print_range (EvWindow *ev_window, int first_page, int last_page) { @@ -1285,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 @@ -1600,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) @@ -1611,7 +1651,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), @@ -1629,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, @@ -1661,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); } } @@ -1698,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), @@ -1716,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) { @@ -2008,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); @@ -2420,6 +2464,20 @@ zoom_control_changed_cb (EphyZoomAction *action, } } +static void +ev_window_finalize (GObject *object) +{ + GList *windows = gtk_window_list_toplevels (); + + if (windows == NULL) { + ev_application_shutdown (EV_APP); + } else { + g_list_free (windows); + } + + G_OBJECT_CLASS (ev_window_parent_class)->finalize (object); +} + static void ev_window_dispose (GObject *object) { @@ -2443,7 +2501,6 @@ ev_window_dispose (GObject *object) priv->recent_view = NULL; } - if (priv->ui_manager) { g_object_unref (priv->ui_manager); priv->ui_manager = NULL; @@ -2520,6 +2577,7 @@ ev_window_class_init (EvWindowClass *ev_window_class) GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (ev_window_class); g_object_class->dispose = ev_window_dispose; + g_object_class->finalize = ev_window_finalize; widget_class->window_state_event = ev_window_state_event; widget_class->focus_in_event = ev_window_focus_in_event; @@ -2712,7 +2770,7 @@ drag_data_received_cb (GtkWidget *widget, GdkDragContext *context, gnome_vfs_uri_list_free (uri_list); - ev_window_open_uri_list (EV_WINDOW (widget), uris); + ev_application_open_uri_list (EV_APP, uris); g_slist_free (uris); @@ -2948,6 +3006,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) { @@ -2959,6 +3036,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; @@ -3211,3 +3291,18 @@ ev_window_init (EvWindow *ev_window) update_action_sensitivity (ev_window); } +GtkWidget * +ev_window_new (void) +{ + GtkWidget *ev_window; + + ev_window = GTK_WIDGET (g_object_new (EV_TYPE_WINDOW, + "type", GTK_WINDOW_TOPLEVEL, + "default-width", 600, + "default-height", 600, + NULL)); + + return ev_window; +} + +