X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=shell%2Fev-window.c;h=a9d7bdc063777277d585383881c6cdd02c227560;hb=db17ed167f5fdfac352c96349f7bda5814dc0711;hp=ed568f953873985d2b7c2286485fd594c05a7818;hpb=595d902c5518765e086e8a911124ef36ed9300b7;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index ed568f95..a9d7bdc0 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -91,6 +91,10 @@ #include #include +#include "ev-message-area.h" + +#include "eggfileformatchooser.h" + #if !GLIB_CHECK_VERSION (2, 13, 3) char *xdg_user_dir_lookup (char *type); #endif @@ -119,10 +123,12 @@ struct _EvWindowPrivate { GtkWidget *menubar; GtkWidget *toolbar; GtkWidget *hpaned; + GtkWidget *view_box; GtkWidget *sidebar; GtkWidget *find_bar; GtkWidget *scrolled_window; GtkWidget *view; + GtkWidget *message_area; GtkWidget *password_view; GtkWidget *sidebar_thumbs; GtkWidget *sidebar_links; @@ -389,6 +395,7 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window) ev_window_set_action_sensitive (ev_window, "ViewBestFit", has_pages); ev_window_set_action_sensitive (ev_window, "ViewPageWidth", has_pages); ev_window_set_action_sensitive (ev_window, "ViewReload", has_pages); + ev_window_set_action_sensitive (ev_window, "ViewAutoscroll", has_pages); /* Toolbar-specific actions: */ ev_window_set_action_sensitive (ev_window, PAGE_SELECTOR_ACTION, has_pages); @@ -624,29 +631,55 @@ ev_window_is_empty (const EvWindow *ev_window) } static void -ev_window_error_dialog_response_cb (GtkWidget *dialog, - gint response_id, - EvWindow *ev_window) +ev_window_set_message_area (EvWindow *window, + GtkWidget *area) { - gtk_widget_destroy (dialog); + if (window->priv->message_area == area) + return; + + if (window->priv->message_area) + gtk_widget_destroy (window->priv->message_area); + window->priv->message_area = area; + + if (!area) + return; + + gtk_box_pack_start (GTK_BOX (window->priv->view_box), + window->priv->message_area, + FALSE, FALSE, 0); + gtk_box_reorder_child (GTK_BOX (window->priv->view_box), + window->priv->message_area, 0); + g_object_add_weak_pointer (G_OBJECT (window->priv->message_area), + (gpointer) &(window->priv->message_area)); } static void -ev_window_error_dialog (GtkWindow *window, const gchar *msg, GError *error) +ev_window_error_message_response_cb (EvMessageArea *area, + gint response_id, + EvWindow *window) { - GtkWidget *dialog; + ev_window_set_message_area (window, NULL); +} - dialog = gtk_message_dialog_new (GTK_WINDOW (window), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - msg); - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), - "%s", error->message); - g_signal_connect (dialog, "response", - G_CALLBACK (ev_window_error_dialog_response_cb), - window); - gtk_widget_show (dialog); +static void +ev_window_error_message (GtkWindow *window, const gchar *msg, GError *error) +{ + GtkWidget *area; + + if (EV_WINDOW (window)->priv->message_area) + return; + + area = ev_message_area_new (GTK_MESSAGE_ERROR, + msg, + GTK_STOCK_CLOSE, + GTK_RESPONSE_CANCEL, + NULL); + ev_message_area_set_secondary_text (EV_MESSAGE_AREA (area), error->message); + g_signal_connect (area, "response", + G_CALLBACK (ev_window_error_message_response_cb), + window); + gtk_widget_show (area); + ev_window_set_message_area (EV_WINDOW (window), area); } static void @@ -1149,6 +1182,8 @@ ev_window_set_document (EvWindow *ev_window, EvDocument *document) if (ev_window->priv->document) g_object_unref (ev_window->priv->document); ev_window->priv->document = g_object_ref (document); + + ev_window_set_message_area (ev_window, NULL); ev_window->priv->page_cache = ev_page_cache_get (ev_window->priv->document); g_signal_connect (ev_window->priv->page_cache, "page-changed", @@ -1384,9 +1419,9 @@ ev_window_load_job_cb (EvJobLoad *job, ev_window_popup_password_dialog (ev_window); } else { - ev_window_error_dialog (GTK_WINDOW (ev_window), - _("Unable to open document"), - job->error); + ev_window_error_message (GTK_WINDOW (ev_window), + _("Unable to open document"), + job->error); ev_window_clear_load_job (ev_window); ev_window->priv->in_reload = FALSE; } @@ -1679,9 +1714,9 @@ ev_window_cmd_file_open_copy_at_dest (EvWindow *window, EvLinkDest *dest) new_filename = ev_window_create_tmp_symlink (old_filename, &error); if (error) { - ev_window_error_dialog (GTK_WINDOW (window), - _("Cannot open a copy."), - error); + ev_window_error_message (GTK_WINDOW (window), + _("Cannot open a copy."), + error); g_error_free (error); g_free (old_filename); @@ -1998,7 +2033,7 @@ ev_window_save_job_cb (EvJobSave *job, gchar *msg; msg = g_strdup_printf (_("The file could not be saved as “%s”."), job->uri); - ev_window_error_dialog (GTK_WINDOW (window), msg, job->error); + ev_window_error_message (GTK_WINDOW (window), msg, job->error); g_free (msg); } @@ -3326,6 +3361,12 @@ ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window) g_free (uri); } +static void +ev_window_cmd_view_autoscroll (GtkAction *action, EvWindow *ev_window) +{ + ev_view_autoscroll (EV_VIEW (ev_window->priv->view)); +} + static void ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window) { @@ -4367,6 +4408,9 @@ static const GtkActionEntry entries[] = { N_("Reload the document"), G_CALLBACK (ev_window_cmd_view_reload) }, + { "ViewAutoscroll", GTK_STOCK_MEDIA_PLAY, N_("Auto_scroll"), NULL, NULL, + G_CALLBACK (ev_window_cmd_view_autoscroll) }, + /* Go menu */ { "GoPreviousPage", GTK_STOCK_GO_BACK, N_("_Previous Page"), "Page_Up", N_("Go to the previous page"), @@ -4932,37 +4976,48 @@ image_save_dialog_response_cb (GtkWidget *fc, gint response_id, EvWindow *ev_window) { + GtkWidget *format_chooser; GnomeVFSURI *target_uri; gchar *uri; + gchar *uri_extension; gchar *filename; + gchar *file_format; gboolean is_local; GError *error = NULL; + guint format; if (response_id != GTK_RESPONSE_OK) { gtk_widget_destroy (fc); return; } + format_chooser = gtk_file_chooser_get_extra_widget (GTK_FILE_CHOOSER (fc)); + uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fc)); - target_uri = gnome_vfs_uri_new (uri); + format = egg_file_format_chooser_get_format (EGG_FILE_FORMAT_CHOOSER (format_chooser), uri); + uri_extension = egg_file_format_chooser_append_extension (EGG_FILE_FORMAT_CHOOSER (format_chooser), + uri, format); + file_format = (char *)egg_file_format_chooser_get_format_data (EGG_FILE_FORMAT_CHOOSER (format_chooser), + format); + target_uri = gnome_vfs_uri_new (uri_extension); is_local = gnome_vfs_uri_is_local (target_uri); if (is_local) { - filename = g_filename_from_uri (uri, NULL, NULL); + filename = g_filename_from_uri (uri_extension, NULL, NULL); } else { filename = ev_tmp_filename ("saveimage"); } g_free (uri); + g_free (uri_extension); - /* FIXME: allow saving in other image formats than png */ gdk_pixbuf_save (ev_image_get_pixbuf (ev_window->priv->image), - filename, "png", &error, NULL); + filename, file_format, &error, NULL); if (error) { - ev_window_error_dialog (GTK_WINDOW (ev_window), - _("The image could not be saved."), - error); + ev_window_error_message (GTK_WINDOW (ev_window), + _("The image could not be saved."), + error); g_error_free (error); g_free (filename); gnome_vfs_uri_unref (target_uri); @@ -4990,7 +5045,7 @@ image_save_dialog_response_cb (GtkWidget *fc, static void ev_view_popup_cmd_save_image_as (GtkAction *action, EvWindow *window) { - GtkWidget *fc; + GtkWidget *fc, *format_chooser; GtkFileFilter *filter; if (!window->priv->image) @@ -5007,11 +5062,12 @@ ev_view_popup_cmd_save_image_as (GtkAction *action, EvWindow *window) gtk_dialog_set_default_response (GTK_DIALOG (fc), GTK_RESPONSE_OK); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (fc), FALSE); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (fc), TRUE); - - filter = gtk_file_filter_new (); - gtk_file_filter_set_name (filter, _("Images")); - gtk_file_filter_add_pixbuf_formats (filter); - gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (fc), filter); + + format_chooser = egg_file_format_chooser_new (); + egg_file_format_chooser_add_pixbuf_formats (EGG_FILE_FORMAT_CHOOSER (format_chooser), + 0, NULL); + + gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (fc), format_chooser); g_signal_connect (fc, "response", G_CALLBACK (image_save_dialog_response_cb), @@ -5051,9 +5107,9 @@ ev_attachment_popup_cmd_open_attachment (GtkAction *action, EvWindow *window) ev_attachment_open (attachment, &error); if (error) { - ev_window_error_dialog (GTK_WINDOW (window), - _("Unable to open attachment"), - error); + ev_window_error_message (GTK_WINDOW (window), + _("Unable to open attachment"), + error); g_error_free (error); } } @@ -5104,9 +5160,9 @@ attachment_save_dialog_response_cb (GtkWidget *fc, ev_attachment_save (attachment, filename, &error); if (error) { - ev_window_error_dialog (GTK_WINDOW (ev_window), - _("The attachment could not be saved."), - error); + ev_window_error_message (GTK_WINDOW (ev_window), + _("The attachment could not be saved."), + error); g_error_free (error); g_free (filename); @@ -5338,14 +5394,19 @@ ev_window_init (EvWindow *ev_window) 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, "shadow-type", GTK_SHADOW_IN, NULL)); + gtk_box_pack_start (GTK_BOX (ev_window->priv->view_box), + ev_window->priv->scrolled_window, + TRUE, TRUE, 0); gtk_widget_show (ev_window->priv->scrolled_window); gtk_paned_add2 (GTK_PANED (ev_window->priv->hpaned), - ev_window->priv->scrolled_window); + ev_window->priv->view_box); + gtk_widget_show (ev_window->priv->view_box); ev_window->priv->view = ev_view_new (); ev_view_set_screen_dpi (EV_VIEW (ev_window->priv->view),