r16252 - gnucash/trunk/src/gnome-utils - Refactor autosave code into separate file.
Christian Stimming
cstim at cvs.gnucash.org
Fri Jul 6 16:41:12 EDT 2007
Author: cstim
Date: 2007-07-06 16:41:09 -0400 (Fri, 06 Jul 2007)
New Revision: 16252
Trac: http://svn.gnucash.org/trac/changeset/16252
Added:
gnucash/trunk/src/gnome-utils/gnc-autosave.c
gnucash/trunk/src/gnome-utils/gnc-autosave.h
Modified:
gnucash/trunk/src/gnome-utils/Makefile.am
gnucash/trunk/src/gnome-utils/gnc-main-window.c
Log:
Refactor autosave code into separate file.
Modified: gnucash/trunk/src/gnome-utils/Makefile.am
===================================================================
--- gnucash/trunk/src/gnome-utils/Makefile.am 2007-07-06 00:04:23 UTC (rev 16251)
+++ gnucash/trunk/src/gnome-utils/Makefile.am 2007-07-06 20:41:09 UTC (rev 16252)
@@ -40,6 +40,7 @@
druid-gnc-xml-import.c \
gnc-account-sel.c \
gnc-amount-edit.c \
+ gnc-autosave.c \
gnc-commodity-edit.c \
gnc-currency-edit.c \
gnc-date-delta.c \
Added: gnucash/trunk/src/gnome-utils/gnc-autosave.c
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-autosave.c 2007-07-06 00:04:23 UTC (rev 16251)
+++ gnucash/trunk/src/gnome-utils/gnc-autosave.c 2007-07-06 20:41:09 UTC (rev 16252)
@@ -0,0 +1,199 @@
+/*
+ * gnc-autosave.c -- Functions related to the auto-save feature.
+ *
+ * Copyright (C) 2007 Christian Stimming <stimming at tuhh.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, contact:
+ *
+ * Free Software Foundation Voice: +1-617-542-5942
+ * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
+ * Boston, MA 02110-1301, USA gnu at gnu.org
+ */
+
+#include "config.h"
+
+#include "gnc-autosave.h"
+
+#include <glib/gi18n.h>
+#include "gnc-engine.h"
+#include "gnc-session.h"
+#include "gnc-ui.h"
+#include "gnc-file.h"
+#include "gnc-window.h"
+#include "gnc-gconf-utils.h"
+#include "gnc-main-window.h"
+#include "gnc-gui-query.h"
+
+#define KEY_AUTOSAVE_SHOW_EXPLANATION "autosave_show_explanation"
+#define KEY_AUTOSAVE_INTERVAL "autosave_interval_minutes"
+#define AUTOSAVE_SOURCE_ID "autosave_source_id"
+
+static void
+autosave_remove_timer_cb(QofBook *book, gpointer key, gpointer user_data);
+
+/* Here's how autosave works:
+ *
+ * Initially, the book is in state "undirty". Once the book changes
+ * state to "dirty", hence calling
+ * gnc_main_window_autosave_dirty(true), the auto-save timer is added
+ * and started. Now one out of two state changes can occur (well,
+ * three actually), depending on which event occurs first:
+ *
+ * - Either the book changes state to "undirty", hence calling
+ * gnc_main_window_autosave_dirty(false). In this case the auto-save
+ * timer is removed and all returns to the initial state with the book
+ * "undirty".
+ *
+ * - Or the auto-save timer hits its timeout, hence calling
+ * autosave_timeout_cb(). In this case gnc_file_save() is invoked, the
+ * auto-save timer is removed, and all returns to the initial state
+ * with the book "undirty". (As an exceptional addition to this, on
+ * the very first call to autosave_timeout_cb, if the key
+ * autosave_show_explanation is true, an explanation dialog of this
+ * feature is shown to the user, and the key autosave_show_explanation
+ * is set to false to not show this dialog again.)
+ *
+ * - As a third possibility, the book can also change state to
+ * "closing", in which case the autosave_remove_timer_cb is called
+ * that removes the auto-save timer and all returns to the initial
+ * state with the book "undirty".
+ */
+
+static gboolean autosave_timeout_cb(gpointer user_data)
+{
+ QofBook *book = user_data;
+ gboolean show_explanation;
+ GtkWidget *toplevel;
+
+ g_debug("autosave_timeout_cb called\n");
+
+ /* Is there already a save in progress? If yes, return FALSE so that
+ the timeout is automatically destroyed and the function will not
+ be called again. */
+ if (gnc_file_save_in_progress() || !gnc_current_session_exist())
+ return FALSE;
+
+ /* Store the current toplevel window for later use. */
+ toplevel = gnc_ui_get_toplevel();
+
+ /* Lookup gconf key to show an explanatory dialog the very first
+ time this becomes active. */
+ show_explanation =
+ gnc_gconf_get_bool(GCONF_GENERAL, KEY_AUTOSAVE_SHOW_EXPLANATION, NULL);
+ if (show_explanation) {
+ guint interval_mins =
+ gnc_gconf_get_float(GCONF_GENERAL, KEY_AUTOSAVE_INTERVAL, NULL);
+ /* The autosave timeout has occurred for the very first
+ time. Explain this feature. */
+ gnc_info_dialog(NULL,
+ _("Your data file needs to be saved to your harddisk to save your changes. GnuCash has a feature to save the file automatically every %d minutes. This feature is being activated the very first time right now. \n\n"
+ "If you like to change the time interval, you can do so under Edit -> Preferences -> General -> Auto-save time interval. If you like to switch off this feature, set the time interval to zero and no auto-save will occur anymore.\n\n"
+ "Press \"Close\" now so that your file will be saved."),
+ interval_mins);
+ /* Don't show this explanation again. */
+ gnc_gconf_set_bool(GCONF_GENERAL, KEY_AUTOSAVE_SHOW_EXPLANATION, FALSE, NULL);
+ }
+
+ /* Timeout has passed - save the file. */
+ g_debug("autosave_timeout_cb: Really trigger auto-save now.\n");
+ if (GNC_IS_MAIN_WINDOW(toplevel))
+ gnc_main_window_set_progressbar_window( GNC_MAIN_WINDOW( toplevel ) );
+ else
+ g_debug("autosave_timeout_cb: toplevel is not a GNC_MAIN_WINDOW\n");
+ if (GNC_IS_WINDOW(toplevel))
+ gnc_window_set_progressbar_window( GNC_WINDOW( toplevel ) );
+ else
+ g_debug("autosave_timeout_cb: toplevel is not a GNC_WINDOW\n");
+
+ gnc_file_save();
+
+ gnc_main_window_set_progressbar_window(NULL);
+
+ /* Return FALSE so that the timeout is automatically destroyed and
+ the function will not be called again. */
+ return FALSE;
+}
+
+static void
+autosave_remove_timer_cb(QofBook *book, gpointer key, gpointer user_data)
+{
+ guint autosave_source_id = GPOINTER_TO_UINT(user_data);
+ gboolean res;
+ /* Remove the timer that would have triggered the next autosave */
+ if (autosave_source_id > 0) {
+ res = g_source_remove (autosave_source_id);
+ g_debug("Removing auto save timer with id %d, result=%s\n",
+ autosave_source_id, (res ? "TRUE" : "FALSE"));
+
+ /* Set the event source id to zero. */
+ qof_book_set_data_fin(book, AUTOSAVE_SOURCE_ID,
+ GUINT_TO_POINTER(0), autosave_remove_timer_cb);
+ }
+}
+
+static void autosave_remove_timer(QofBook *book)
+{
+ autosave_remove_timer_cb(book, AUTOSAVE_SOURCE_ID,
+ qof_book_get_data(book, AUTOSAVE_SOURCE_ID));
+}
+
+static void autosave_add_timer(QofBook *book)
+{
+ guint interval_mins =
+ gnc_gconf_get_float(GCONF_GENERAL, KEY_AUTOSAVE_INTERVAL, NULL);
+
+ /* Interval zero means auto-save is turned off. */
+ if ( interval_mins > 0
+ && ( ! gnc_file_save_in_progress() )
+ && gnc_current_session_exist() ) {
+ /* Add a new timer (timeout) that runs until the next autosave
+ timeout. */
+ guint autosave_source_id =
+#if GLIB_CHECK_VERSION(2, 14, 0)
+ /* g_timeout_add_seconds is much more suitable here, but is new in
+ glib-2.14. */
+ g_timeout_add_seconds(interval_mins * 60,
+ autosave_timeout_cb, book);
+#else
+ g_timeout_add(interval_mins * 60 * 1000,
+ autosave_timeout_cb, book);
+#endif
+ g_debug("Adding new auto-save timer with id %d\n", autosave_source_id);
+
+ /* Save the event source id for a potential removal, and also
+ set the callback upon book closing */
+ qof_book_set_data_fin(book, AUTOSAVE_SOURCE_ID,
+ GUINT_TO_POINTER(autosave_source_id),
+ autosave_remove_timer_cb);
+ }
+}
+
+void gnc_main_window_autosave_dirty (QofBook *book, gboolean dirty)
+{
+ g_debug("gnc_main_window_autosave_dirty(dirty = %s)\n",
+ (dirty ? "TRUE" : "FALSE"));
+ if (dirty) {
+ /* Book state changed from non-dirty to dirty. Start the autosave
+ timer. */
+ /* First stop a potentially running old timer. */
+ autosave_remove_timer(book);
+ /* Add a new timer (timeout) that runs until the next autosave
+ timeout. */
+ autosave_add_timer(book);
+ } else {
+ /* Book state changed from dirty to non-dirty (probably due to
+ saving). Delete the running autosave timer. */
+ autosave_remove_timer(book);
+ }
+}
Added: gnucash/trunk/src/gnome-utils/gnc-autosave.h
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-autosave.h 2007-07-06 00:04:23 UTC (rev 16251)
+++ gnucash/trunk/src/gnome-utils/gnc-autosave.h 2007-07-06 20:41:09 UTC (rev 16252)
@@ -0,0 +1,34 @@
+/*
+ * gnc-autosave.h -- Functions related to the auto-save feature.
+ *
+ * Copyright (C) 2007 Christian Stimming <stimming at tuhh.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, contact:
+ *
+ * Free Software Foundation Voice: +1-617-542-5942
+ * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
+ * Boston, MA 02110-1301, USA gnu at gnu.org
+ */
+
+#ifndef _GNC_AUTOSAVE_H
+#define _GNC_AUTOSAVE_H
+
+#include <gtk/gtk.h>
+#include "qof.h"
+
+/** Callback that is used to notify the autosave subsystem when the
+ QofBook changed its dirty state. */
+void gnc_main_window_autosave_dirty (QofBook *book, gboolean dirty);
+
+#endif
Modified: gnucash/trunk/src/gnome-utils/gnc-main-window.c
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-main-window.c 2007-07-06 00:04:23 UTC (rev 16251)
+++ gnucash/trunk/src/gnome-utils/gnc-main-window.c 2007-07-06 20:41:09 UTC (rev 16252)
@@ -66,6 +66,7 @@
#include "gnc-gconf-utils.h"
// +JSLED
#include "gnc-html.h"
+#include "gnc-autosave.h"
/** Names of signals generated by the main window. */
enum {
@@ -1271,163 +1272,6 @@
NULL);
}
-
-#define KEY_AUTOSAVE_SHOW_EXPLANATION "autosave_show_explanation"
-#define KEY_AUTOSAVE_INTERVAL "autosave_interval_minutes"
-#define AUTOSAVE_SOURCE_ID "autosave_source_id"
-static void
-autosave_remove_timer_cb(QofBook *book, gpointer key, gpointer user_data);
-/* Here's how autosave works:
- *
- * Initially, the book is in state "undirty". Once the book changes
- * state to "dirty", hence calling
- * gnc_main_window_autosave_dirty(true), the auto-save timer is added
- * and started. Now one out of two state changes can occur (well,
- * three actually), depending on which event occurs first:
- *
- * - Either the book changes state to "undirty", hence calling
- * gnc_main_window_autosave_dirty(false). In this case the auto-save
- * timer is removed and all returns to the initial state with the book
- * "undirty".
- *
- * - Or the auto-save timer hits its timeout, hence calling
- * autosave_timeout_cb(). In this case gnc_file_save() is invoked, the
- * auto-save timer is removed, and all returns to the initial state
- * with the book "undirty". (As an exceptional addition to this, on
- * the very first call to autosave_timeout_cb, if the key
- * autosave_show_explanation is true, an explanation dialog of this
- * feature is shown to the user, and the key autosave_show_explanation
- * is set to false to not show this dialog again.)
- *
- * - As a third possibility, the book can also change state to
- * "closing", in which case the autosave_remove_timer_cb is called
- * that removes the auto-save timer and all returns to the initial
- * state with the book "undirty".
- */
-static gboolean autosave_timeout_cb(gpointer user_data)
-{
- QofBook *book = user_data;
- gboolean show_explanation;
- GtkWidget *toplevel;
-
- g_debug("autosave_timeout_cb called\n");
-
- /* Is there already a save in progress? If yes, return FALSE so that
- the timeout is automatically destroyed and the function will not
- be called again. */
- if (gnc_file_save_in_progress() || !gnc_current_session_exist())
- return FALSE;
-
- /* Store the current toplevel window for later use. */
- toplevel = gnc_ui_get_toplevel();
-
- /* Lookup gconf key to show an explanatory dialog the very first
- time this becomes active. */
- show_explanation =
- gnc_gconf_get_bool(GCONF_GENERAL, KEY_AUTOSAVE_SHOW_EXPLANATION, NULL);
- if (show_explanation) {
- guint interval_mins =
- gnc_gconf_get_float(GCONF_GENERAL, KEY_AUTOSAVE_INTERVAL, NULL);
- /* The autosave timeout has occurred for the very first
- time. Explain this feature. */
- gnc_info_dialog(NULL,
- _("Your data file needs to be saved to your harddisk to save your changes. GnuCash has a feature to save the file automatically every %d minutes. This feature is being activated the very first time right now. \n\n"
- "If you like to change the time interval, you can do so under Edit -> Preferences -> General -> Auto-save time interval. If you like to switch off this feature, set the time interval to zero and no auto-save will occur anymore.\n\n"
- "Press \"Close\" now so that your file will be saved."),
- interval_mins);
- /* Don't show this explanation again. */
- gnc_gconf_set_bool(GCONF_GENERAL, KEY_AUTOSAVE_SHOW_EXPLANATION, FALSE, NULL);
- }
-
- /* Timeout has passed - save the file. */
- g_debug("autosave_timeout_cb: Really trigger auto-save now.\n");
- if (GNC_IS_MAIN_WINDOW(toplevel))
- gnc_main_window_set_progressbar_window( GNC_MAIN_WINDOW( toplevel ) );
- else
- g_debug("autosave_timeout_cb: toplevel is not a GNC_MAIN_WINDOW\n");
- if (GNC_IS_WINDOW(toplevel))
- gnc_window_set_progressbar_window( GNC_WINDOW( toplevel ) );
- else
- g_debug("autosave_timeout_cb: toplevel is not a GNC_WINDOW\n");
-
- gnc_file_save();
-
- gnc_main_window_set_progressbar_window(NULL);
-
- /* Return FALSE so that the timeout is automatically destroyed and
- the function will not be called again. */
- return FALSE;
-}
-static void
-autosave_remove_timer_cb(QofBook *book, gpointer key, gpointer user_data)
-{
- guint autosave_source_id = GPOINTER_TO_UINT(user_data);
- gboolean res;
- /* Remove the timer that would have triggered the next autosave */
- if (autosave_source_id > 0) {
- res = g_source_remove (autosave_source_id);
- g_debug("Removing auto save timer with id %d, result=%s\n",
- autosave_source_id, (res ? "TRUE" : "FALSE"));
-
- /* Set the event source id to zero. */
- qof_book_set_data_fin(book, AUTOSAVE_SOURCE_ID,
- GUINT_TO_POINTER(0), autosave_remove_timer_cb);
- }
-}
-static void autosave_remove_timer(QofBook *book)
-{
- autosave_remove_timer_cb(book, AUTOSAVE_SOURCE_ID,
- qof_book_get_data(book, AUTOSAVE_SOURCE_ID));
-}
-static void autosave_add_timer(QofBook *book)
-{
- guint interval_mins =
- gnc_gconf_get_float(GCONF_GENERAL, KEY_AUTOSAVE_INTERVAL, NULL);
-
- /* Interval zero means auto-save is turned off. */
- if ( interval_mins > 0
- && ( ! gnc_file_save_in_progress() )
- && gnc_current_session_exist() ) {
- /* Add a new timer (timeout) that runs until the next autosave
- timeout. */
- guint autosave_source_id =
-#if GLIB_CHECK_VERSION(2, 14, 0)
- /* g_timeout_add_seconds is much more suitable here, but is new in
- glib-2.14. */
- g_timeout_add_seconds(interval_mins * 60,
- autosave_timeout_cb, book);
-#else
- g_timeout_add(interval_mins * 60 * 1000,
- autosave_timeout_cb, book);
-#endif
- g_debug("Adding new auto-save timer with id %d\n", autosave_source_id);
-
- /* Save the event source id for a potential removal, and also
- set the callback upon book closing */
- qof_book_set_data_fin(book, AUTOSAVE_SOURCE_ID,
- GUINT_TO_POINTER(autosave_source_id),
- autosave_remove_timer_cb);
- }
-}
-static void gnc_main_window_autosave_dirty (QofBook *book, gboolean dirty)
-{
- g_debug("gnc_main_window_autosave_dirty(dirty = %s)\n",
- (dirty ? "TRUE" : "FALSE"));
- if (dirty) {
- /* Book state changed from non-dirty to dirty. Start the autosave
- timer. */
- /* First stop a potentially running old timer. */
- autosave_remove_timer(book);
- /* Add a new timer (timeout) that runs until the next autosave
- timeout. */
- autosave_add_timer(book);
- } else {
- /* Book state changed from dirty to non-dirty (probably due to
- saving). Delete the running autosave timer. */
- autosave_remove_timer(book);
- }
-}
-
static void
gnc_main_window_book_dirty_cb (QofBook *book,
gboolean dirty,
More information about the gnucash-changes
mailing list