]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
Fix several history bugs
[evince.git] / shell / ev-window.c
index 007ca8893ac86d434178bde2ad9beb9d35b3695e..64b80c33abdd79d5002eea9572012af1d383b783 100644 (file)
@@ -32,7 +32,7 @@
 #include "ev-navigation-action.h"
 #include "ev-page-action.h"
 #include "ev-sidebar.h"
-#include "ev-sidebar-bookmarks.h"
+#include "ev-sidebar-links.h"
 #include "ev-sidebar-thumbnails.h"
 #include "ev-view.h"
 #include "ev-print-job.h"
@@ -190,6 +190,12 @@ update_action_sensitivity (EvWindow *ev_window)
        set_action_sensitive (ev_window, "GoLastPage", page < n_pages);
 }
 
+void
+ev_window_open_link (EvWindow *ev_window, EvLink *link)
+{
+       ev_view_go_to_link (EV_VIEW (ev_window->priv->view), link);
+}
+
 gboolean
 ev_window_is_empty (const EvWindow *ev_window)
 {
@@ -348,6 +354,119 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *ev_window)
        ev_application_open (EV_APP, NULL);
 }
 
+/* FIXME
+static gboolean
+overwrite_existing_file (GtkWindow *window, const gchar *file_name)
+{
+       GtkWidget *msgbox;
+       gchar *utf8_file_name;
+       AtkObject *obj;
+       gint ret;
+
+       utf8_file_name = g_filename_to_utf8 (file_name, -1, NULL, NULL, NULL);
+       msgbox = gtk_message_dialog_new (
+               window,
+               (GtkDialogFlags)GTK_DIALOG_DESTROY_WITH_PARENT,
+               GTK_MESSAGE_QUESTION,
+               GTK_BUTTONS_NONE,
+               _("A file named \"%s\" already exists."),
+               utf8_file_name);
+       g_free (utf8_file_name);
+
+       gtk_message_dialog_format_secondary_text (
+               GTK_MESSAGE_DIALOG (msgbox),
+               _("Do you want to replace it with the one you are saving?"));
+
+       gtk_dialog_add_button (GTK_DIALOG (msgbox), 
+                              GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+
+       gtk_dialog_add_button (GTK_DIALOG (msgbox),
+                              _("_Replace"), GTK_RESPONSE_YES);
+
+       gtk_dialog_set_default_response (GTK_DIALOG (msgbox),
+                                        GTK_RESPONSE_CANCEL);
+
+       obj = gtk_widget_get_accessible (msgbox);
+
+       if (GTK_IS_ACCESSIBLE (obj))
+               atk_object_set_name (obj, _("Question"));
+
+       ret = gtk_dialog_run (GTK_DIALOG (msgbox));
+       gtk_widget_destroy (msgbox);
+
+       return (ret == GTK_RESPONSE_YES);
+}
+*/
+
+static void
+save_error_dialog (GtkWindow *window, const gchar *file_name)
+{
+       GtkWidget *error_dialog;
+
+       error_dialog = gtk_message_dialog_new (
+               window,
+               (GtkDialogFlags)GTK_DIALOG_DESTROY_WITH_PARENT,
+               GTK_MESSAGE_ERROR,
+               GTK_BUTTONS_CLOSE,
+               _("The file could not be saved as \"%s\"."),
+               file_name);
+
+       /* Easy way to make the text bold while keeping the string
+        * above free from pango markup (FIXME ?) */
+       gtk_message_dialog_format_secondary_text (
+               GTK_MESSAGE_DIALOG (error_dialog), " ");
+
+       gtk_dialog_run (GTK_DIALOG (error_dialog));
+       gtk_widget_destroy (error_dialog);
+}
+
+static void
+ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
+{
+       GtkWidget *fc;
+       GtkFileFilter *pdf_filter, *all_filter;
+       gchar *uri = NULL; 
+
+       fc = gtk_file_chooser_dialog_new (
+               _("Save a Copy"),
+               NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
+               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+               GTK_STOCK_SAVE, GTK_RESPONSE_OK,
+               NULL);
+       gtk_window_set_modal (GTK_WINDOW (fc), TRUE);
+
+       pdf_filter = gtk_file_filter_new ();
+       gtk_file_filter_set_name (pdf_filter, _("PDF Documents"));
+       gtk_file_filter_add_mime_type (pdf_filter, "application/pdf");
+       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (fc), pdf_filter);
+
+       all_filter = gtk_file_filter_new ();
+       gtk_file_filter_set_name (all_filter, _("All Files"));
+       gtk_file_filter_add_pattern (all_filter, "*");
+       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (fc), all_filter);
+       gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (fc), pdf_filter);
+       
+       gtk_dialog_set_default_response (GTK_DIALOG (fc), GTK_RESPONSE_OK);
+
+       gtk_widget_show (fc);
+
+       while (gtk_dialog_run (GTK_DIALOG (fc)) == GTK_RESPONSE_OK) {
+               uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fc));
+
+/* FIXME
+               if (g_file_test (uri, G_FILE_TEST_EXISTS) &&  
+                   !overwrite_existing_file (GTK_WINDOW (fc), uri))
+                               continue;
+*/
+
+               if (ev_document_save (ev_window->priv->document, uri, NULL))
+                       break;
+               else
+                       save_error_dialog (GTK_WINDOW (fc), uri);    
+       }
+       gtk_widget_destroy (fc);
+}
+
 static gboolean
 using_postscript_printer (GnomePrintConfig *config)
 {
@@ -432,8 +551,10 @@ ev_window_print (EvWindow *ev_window)
                                
        gtk_widget_destroy (print_dialog);
 
-       if (print_job != NULL)
+       if (print_job != NULL) {
                ev_print_job_print (print_job, GTK_WINDOW (ev_window));
+               g_object_unref (print_job);
+       }
 }
 
 static void
@@ -470,6 +591,14 @@ find_not_supported_dialog (EvWindow   *ev_window)
        gtk_widget_destroy (dialog);
 }
 
+static void
+ev_window_cmd_edit_select_all (GtkAction *action, EvWindow *ev_window)
+{
+       g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+       ev_view_select_all (EV_VIEW (ev_window->priv->view));
+}
+
 static void
 ev_window_cmd_edit_find (GtkAction *action, EvWindow *ev_window)
 {
@@ -494,7 +623,7 @@ ev_window_cmd_edit_copy (GtkAction *action, EvWindow *ev_window)
 {
         g_return_if_fail (EV_IS_WINDOW (ev_window));
 
-        /* FIXME */
+       ev_view_copy (EV_VIEW (ev_window->priv->view));
 }
 
 static void
@@ -743,7 +872,7 @@ ev_window_cmd_go_back (GtkAction *action, EvWindow *ev_window)
 {
         g_return_if_fail (EV_IS_WINDOW (ev_window));
 
-        /* FIXME */
+       ev_view_go_back (EV_VIEW (ev_window->priv->view));
 }
 
 static void
@@ -751,7 +880,7 @@ ev_window_cmd_go_forward (GtkAction *action, EvWindow *ev_window)
 {
         g_return_if_fail (EV_IS_WINDOW (ev_window));
 
-        /* FIXME */
+       ev_view_go_forward (EV_VIEW (ev_window->priv->view));
 }
 
 static void
@@ -1112,7 +1241,10 @@ static GtkActionEntry entries[] = {
        { "FileOpen", GTK_STOCK_OPEN, N_("_Open"), "<control>O",
          N_("Open a file"),
          G_CALLBACK (ev_window_cmd_file_open) },
-        { "FilePrint", GTK_STOCK_PRINT, N_("_Print"), "<control>P",
+               { "FileSaveAs", GTK_STOCK_SAVE_AS, N_("_Save a Copy..."), NULL,
+         N_("Save the current document with a new filename"),
+         G_CALLBACK (ev_window_cmd_save_as) },
+       { "FilePrint", GTK_STOCK_PRINT, N_("_Print"), "<control>P",
          N_("Print this document"),
          G_CALLBACK (ev_window_cmd_file_print) },
        { "FileCloseWindow", GTK_STOCK_CLOSE, N_("_Close"), "<control>W",
@@ -1123,7 +1255,9 @@ static GtkActionEntry entries[] = {
         { "EditCopy", GTK_STOCK_COPY, N_("_Copy"), "<control>C",
           N_("Copy text from the document"),
           G_CALLBACK (ev_window_cmd_edit_copy) },
-        
+       { "EditSelectAll", NULL, N_("Select _All"), "<control>A",
+         N_("Select the entire page"),
+         G_CALLBACK (ev_window_cmd_edit_select_all) }, 
         { "EditFind", GTK_STOCK_FIND, N_("_Find"), "<control>F",
           N_("Find a word or phrase in the document"),
           G_CALLBACK (ev_window_cmd_edit_find) },
@@ -1195,8 +1329,11 @@ static GtkToggleActionEntry toggle_entries[] = {
 static void
 goto_page_cb (GtkAction *action, int page_number, EvWindow *ev_window)
 {
+       EvView *view = EV_VIEW (ev_window->priv->view);
 
-       ev_view_set_page (EV_VIEW (ev_window->priv->view), page_number);
+       if (ev_view_get_page (view) != page_number) {
+               ev_view_set_page (view, page_number);
+       }
 }
 
 static void
@@ -1213,6 +1350,8 @@ register_custom_actions (EvWindow *window, GtkActionGroup *group)
                               "direction", EV_NAVIGATION_DIRECTION_BACK,
                               "is_important", TRUE,
                               NULL);
+       g_signal_connect (action, "activate",
+                         G_CALLBACK (ev_window_cmd_go_back), window);
        gtk_action_group_add_action (group, action);
        g_object_unref (action);
 
@@ -1224,6 +1363,8 @@ register_custom_actions (EvWindow *window, GtkActionGroup *group)
                               "arrow-tooltip", _("Forward history"),
                               "direction", EV_NAVIGATION_DIRECTION_FORWARD,
                               NULL);
+       g_signal_connect (action, "activate",
+                         G_CALLBACK (ev_window_cmd_go_forward), window);
        gtk_action_group_add_action (group, action);
        g_object_unref (action);
 
@@ -1311,11 +1452,11 @@ ev_window_init (EvWindow *ev_window)
                        ev_window->priv->sidebar);
 
        /* Stub sidebar, for now */
-       sidebar_widget = ev_sidebar_bookmarks_new ();
+       sidebar_widget = ev_sidebar_links_new ();
        gtk_widget_show (sidebar_widget);
        ev_sidebar_add_page (EV_SIDEBAR (ev_window->priv->sidebar),
-                            "bookmarks",
-                            _("Bookmarks"),
+                            "index",
+                            _("Index"),
                             sidebar_widget);
 
        sidebar_widget = ev_sidebar_thumbnails_new ();