[gedit/wip/loader-saver] tab: start port to GtkSourceFileSaver



commit 695b04caae8bcb670a4940288d87bec55c218f65
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Thu Jun 26 15:24:56 2014 +0200

    tab: start port to GtkSourceFileSaver

 gedit/gedit-tab.c |  225 +++++++++++++++++++++++++++++++----------------------
 1 files changed, 131 insertions(+), 94 deletions(-)
---
diff --git a/gedit/gedit-tab.c b/gedit/gedit-tab.c
index 8e65f73..cd13008 100644
--- a/gedit/gedit-tab.c
+++ b/gedit/gedit-tab.c
@@ -55,7 +55,8 @@ struct _GeditTabPrivate
        GeditPrintJob          *print_job;
 
        /* tmp data for saving */
-       GFile                  *tmp_save_location;
+       GtkSourceFileSaver     *saver;
+       GFile                  *tmp_save_location; /* TODO remove */
 
        /* tmp data for loading */
        GtkSourceFileLoader    *loader;
@@ -67,7 +68,8 @@ struct _GeditTabPrivate
 
        GTimer                 *timer;
 
-       GeditDocumentSaveFlags  save_flags;
+       GeditDocumentSaveFlags  save_flags; /* TODO remove */
+       GtkSourceFileSaverFlags new_save_flags;
 
        gint                    auto_save_interval;
        guint                   auto_save_timeout;
@@ -809,7 +811,7 @@ show_saving_info_bar (GeditTab *tab)
        gchar *msg = NULL;
        gint len;
 
-       g_return_if_fail (tab->priv->tmp_save_location != NULL);
+       g_return_if_fail (tab->priv->saver != NULL);
 
        if (tab->priv->info_bar != NULL)
        {
@@ -829,18 +831,17 @@ show_saving_info_bar (GeditTab *tab)
         */
        if (len > MAX_MSG_LENGTH)
        {
-               from = gedit_utils_str_middle_truncate (short_name,
-                                                       MAX_MSG_LENGTH);
+               from = gedit_utils_str_middle_truncate (short_name, MAX_MSG_LENGTH);
                g_free (short_name);
        }
        else
        {
                gchar *str;
+               GFile *location = gtk_source_file_saver_get_location (tab->priv->saver);
 
                from = short_name;
-               to = g_file_get_parse_name (tab->priv->tmp_save_location);
-               str = gedit_utils_str_middle_truncate (to,
-                                                      MAX (20, MAX_MSG_LENGTH - len));
+               to = g_file_get_parse_name (location);
+               str = gedit_utils_str_middle_truncate (to, MAX (20, MAX_MSG_LENGTH - len));
                g_free (to);
 
                to = str;
@@ -854,9 +855,7 @@ show_saving_info_bar (GeditTab *tab)
 
                /* Translators: the first %s is a file name (e.g. test.txt) the second one
                   is a directory (e.g. ssh://master.gnome.org/home/users/paolo) */
-               msg = g_strdup_printf (_("Saving %s to %s"),
-                                      from_markup,
-                                      to_markup);
+               msg = g_strdup_printf (_("Saving %s to %s"), from_markup, to_markup);
                g_free (to_markup);
        }
        else
@@ -864,9 +863,7 @@ show_saving_info_bar (GeditTab *tab)
                msg = g_strdup_printf (_("Saving %s"), from_markup);
        }
 
-       bar = gedit_progress_info_bar_new ("document-save",
-                                          msg,
-                                          FALSE);
+       bar = gedit_progress_info_bar_new ("document-save", msg, FALSE);
 
        set_info_bar (tab, bar, GTK_RESPONSE_NONE);
 
@@ -931,39 +928,6 @@ scroll_to_cursor (GeditTab *tab)
 }
 
 static void
-document_saving (GeditDocument *document,
-                goffset        size,
-                goffset        total_size,
-                GeditTab      *tab)
-{
-       gdouble elapsed_time;
-       gdouble total_time;
-       gdouble remaining_time;
-
-       g_return_if_fail (tab->priv->state == GEDIT_TAB_STATE_SAVING);
-
-       if (tab->priv->timer == NULL)
-       {
-               tab->priv->timer = g_timer_new ();
-       }
-
-       elapsed_time = g_timer_elapsed (tab->priv->timer, NULL);
-
-       /* elapsed_time / total_time = size / total_size */
-       total_time = (elapsed_time * total_size) / size;
-
-       remaining_time = total_time - elapsed_time;
-
-       /* Approximately more than 3 seconds remaining. */
-       if (remaining_time > 3.0)
-       {
-               show_saving_info_bar (tab);
-       }
-
-       info_bar_set_progress (tab, size, total_size);
-}
-
-static void
 end_saving (GeditTab *tab)
 {
        /* Reset tmp data for saving */
@@ -1448,11 +1412,6 @@ gedit_tab_init (GeditTab *tab)
                          tab);
 
        g_signal_connect (doc,
-                         "saving",
-                         G_CALLBACK (document_saving),
-                         tab);
-
-       g_signal_connect (doc,
                          "saved",
                          G_CALLBACK (document_saved),
                          tab);
@@ -1758,9 +1717,9 @@ gedit_tab_get_from_document (GeditDocument *doc)
 }
 
 static void
-progress_cb (goffset   size,
-            goffset   total_size,
-            GeditTab *tab)
+loader_progress_cb (goffset   size,
+                   goffset   total_size,
+                   GeditTab *tab)
 {
        gdouble elapsed_time;
        gdouble total_time;
@@ -1854,6 +1813,7 @@ load_cb (GtkSourceFileLoader *loader,
 
        if (error != NULL)
        {
+               /* TODO remove when no longer needed. */
                g_warning ("File loading error: %s", error->message);
        }
 
@@ -2106,7 +2066,7 @@ load (GeditTab                *tab,
        gtk_source_file_loader_load_async (tab->priv->loader,
                                           G_PRIORITY_DEFAULT,
                                           tab->priv->cancellable,
-                                          (GFileProgressCallback) progress_cb,
+                                          (GFileProgressCallback) loader_progress_cb,
                                           tab,
                                           NULL,
                                           (GAsyncReadyCallback) load_cb,
@@ -2210,43 +2170,120 @@ _gedit_tab_revert (GeditTab *tab)
        load (tab, NULL, 0, 0);
 }
 
+static void
+saver_progress_cb (goffset   size,
+                  goffset   total_size,
+                  GeditTab *tab)
+{
+       gdouble elapsed_time;
+       gdouble total_time;
+       gdouble remaining_time;
+
+       g_return_if_fail (tab->priv->state == GEDIT_TAB_STATE_SAVING);
+
+       if (tab->priv->timer == NULL)
+       {
+               tab->priv->timer = g_timer_new ();
+       }
+
+       elapsed_time = g_timer_elapsed (tab->priv->timer, NULL);
+
+       /* elapsed_time / total_time = size / total_size */
+       total_time = (elapsed_time * total_size) / size;
+
+       remaining_time = total_time - elapsed_time;
+
+       /* Approximately more than 3 seconds remaining. */
+       if (remaining_time > 3.0)
+       {
+               show_saving_info_bar (tab);
+       }
+
+       info_bar_set_progress (tab, size, total_size);
+}
+
+static void
+save_cb (GtkSourceFileSaver *saver,
+        GAsyncResult       *result,
+        GeditTab           *tab)
+{
+       GError *error = NULL;
+
+       gtk_source_file_saver_save_finish (saver, result, &error);
+
+       if (error != NULL)
+       {
+               /* TODO remove when no longer needed. */
+               g_warning ("File saving error: %s", error->message);
+       }
+
+       /* Async operation finished. */
+       g_object_unref (tab);
+
+       if (error != NULL)
+       {
+               g_error_free (error);
+       }
+}
+
+static void
+save (GeditTab *tab)
+{
+       g_return_if_fail (GTK_SOURCE_IS_FILE_SAVER (tab->priv->saver));
+
+       gedit_tab_set_state (tab, GEDIT_TAB_STATE_SAVING);
+
+       /* Keep the tab alive during the async operation. */
+       g_object_ref (tab);
+
+       gtk_source_file_saver_save_async (tab->priv->saver,
+                                         G_PRIORITY_DEFAULT,
+                                         NULL, /* TODO add a cancellable */
+                                         (GFileProgressCallback) saver_progress_cb,
+                                         tab,
+                                         NULL,
+                                         (GAsyncReadyCallback) save_cb,
+                                         tab);
+}
+
 void
 _gedit_tab_save (GeditTab *tab)
 {
        GeditDocument *doc;
-       GeditDocumentSaveFlags save_flags;
+       GtkSourceFile *file;
+       GFile *location;
+       GtkSourceFileSaverFlags save_flags = tab->priv->new_save_flags;
 
        g_return_if_fail (GEDIT_IS_TAB (tab));
        g_return_if_fail (tab->priv->state == GEDIT_TAB_STATE_NORMAL ||
                          tab->priv->state == GEDIT_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION ||
                          tab->priv->state == GEDIT_TAB_STATE_SHOWING_PRINT_PREVIEW);
-       g_return_if_fail (tab->priv->tmp_save_location == NULL);
-       g_return_if_fail (tab->priv->tmp_encoding == NULL);
 
        doc = gedit_tab_get_document (tab);
        g_return_if_fail (!gedit_document_is_untitled (doc));
 
        if (tab->priv->state == GEDIT_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)
        {
-               /* We already told the user about the external
-                * modification: hide the message bar and set
-                * the save flag.
+               /* We already told the user about the external modification:
+                * hide the message bar and set the save flag.
                 */
                set_info_bar (tab, NULL, GTK_RESPONSE_NONE);
-               save_flags = tab->priv->save_flags | GEDIT_DOCUMENT_SAVE_IGNORE_MTIME;
+               save_flags |= GTK_SOURCE_FILE_SAVER_FLAGS_IGNORE_MODIFICATION_TIME;
        }
-       else
+
+       file = gedit_document_get_file (doc);
+       location = gtk_source_file_get_location (file);
+
+       if (tab->priv->saver != NULL)
        {
-               save_flags = tab->priv->save_flags;
+               g_warning ("GeditTab: file saver already exists.");
+               g_object_unref (tab->priv->saver);
        }
 
-       gedit_tab_set_state (tab, GEDIT_TAB_STATE_SAVING);
-
-       /* location used in error messages, will be freed in document_saved */
-       tab->priv->tmp_save_location = gedit_document_get_location (doc);
-       tab->priv->tmp_encoding = gedit_document_get_encoding (doc);
+       tab->priv->saver = gtk_source_file_saver_new (file, location);
+       gtk_source_file_saver_set_flags (tab->priv->saver, save_flags);
 
-       _gedit_document_save (doc, save_flags);
+       save (tab);
 }
 
 static gboolean
@@ -2303,6 +2340,7 @@ gedit_tab_auto_save (GeditTab *tab)
        return G_SOURCE_REMOVE;
 }
 
+/* TODO port to GtkSourceNewlineType and GtkSourceCompressionType */
 void
 _gedit_tab_save_as (GeditTab                     *tab,
                    GFile                        *location,
@@ -2311,7 +2349,8 @@ _gedit_tab_save_as (GeditTab                     *tab,
                    GeditDocumentCompressionType  compression_type)
 {
        GeditDocument *doc;
-       GeditDocumentSaveFlags save_flags;
+       GtkSourceFile *file;
+       GtkSourceFileSaverFlags save_flags;
 
        g_return_if_fail (GEDIT_IS_TAB (tab));
        g_return_if_fail (tab->priv->state == GEDIT_TAB_STATE_NORMAL ||
@@ -2320,41 +2359,39 @@ _gedit_tab_save_as (GeditTab                     *tab,
        g_return_if_fail (G_IS_FILE (location));
        g_return_if_fail (encoding != NULL);
 
-       g_return_if_fail (tab->priv->tmp_save_location == NULL);
-       g_return_if_fail (tab->priv->tmp_encoding == NULL);
-
        doc = gedit_tab_get_document (tab);
 
        /* reset the save flags, when saving as */
-       tab->priv->save_flags = 0;
+       tab->priv->new_save_flags = GTK_SOURCE_FILE_SAVER_FLAGS_NONE;
+       save_flags = tab->priv->new_save_flags;
 
        if (tab->priv->state == GEDIT_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)
        {
-               /* We already told the user about the external
-                * modification: hide the message bar and set
-                * the save flag.
+               /* We already told the user about the external modification:
+                * hide the message bar and set the save flag.
                 */
                set_info_bar (tab, NULL, GTK_RESPONSE_NONE);
-               save_flags = tab->priv->save_flags | GEDIT_DOCUMENT_SAVE_IGNORE_MTIME;
+               save_flags |= GTK_SOURCE_FILE_SAVER_FLAGS_IGNORE_MODIFICATION_TIME;
        }
-       else
+
+       gedit_tab_set_state (tab, GEDIT_TAB_STATE_SAVING);
+
+       file = gedit_document_get_file (doc);
+
+       if (tab->priv->saver != NULL)
        {
-               save_flags = tab->priv->save_flags;
+               g_warning ("GeditTab: file saver already exists.");
+               g_object_unref (tab->priv->saver);
        }
 
-       gedit_tab_set_state (tab, GEDIT_TAB_STATE_SAVING);
+       tab->priv->saver = gtk_source_file_saver_new (file, location);
+
+       gtk_source_file_saver_set_encoding (tab->priv->saver, encoding);
+       gtk_source_file_saver_set_newline_type (tab->priv->saver, newline_type);
+       gtk_source_file_saver_set_compression_type (tab->priv->saver, compression_type);
+       gtk_source_file_saver_set_flags (tab->priv->saver, save_flags);
 
-       /* location used in error messages... dup because errors are async
-        * and the location can go away. Will be freed in document_saved. */
-       tab->priv->tmp_save_location = g_file_dup (location);
-       tab->priv->tmp_encoding = encoding;
-
-       _gedit_document_save_as (doc,
-                                location,
-                                encoding,
-                                newline_type,
-                                compression_type,
-                                save_flags);
+       save (tab);
 }
 
 #define GEDIT_PAGE_SETUP_KEY "gedit-page-setup-key"


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]