gtranslator r3620 - trunk/src
- From: icq svn gnome org
- To: svn-commits-list gnome org
- Subject: gtranslator r3620 - trunk/src
- Date: Mon, 22 Sep 2008 09:39:24 +0000 (UTC)
Author: icq
Date: Mon Sep 22 09:39:23 2008
New Revision: 3620
URL: http://svn.gnome.org/viewvc/gtranslator?rev=3620&view=rev
Log:
Added autosave feature
Modified:
trunk/src/ChangeLog
trunk/src/po.c
trunk/src/prefs-manager-app.c
trunk/src/tab.c
trunk/src/tab.h
Modified: trunk/src/po.c
==============================================================================
--- trunk/src/po.c (original)
+++ trunk/src/po.c Mon Sep 22 09:39:23 2008
@@ -28,6 +28,7 @@
#include "po.h"
#include "msg.h"
#include "gtranslator-enum-types.h"
+#include "utils.h"
#include <string.h>
#include <errno.h>
@@ -321,7 +322,7 @@
* Get absolute filename.
*/
if (!g_path_is_absolute(filename))
- priv->filename = g_build_filename(filename);
+ priv->filename = g_build_filename (filename, NULL);
else
priv->filename = g_strdup(filename);
@@ -677,6 +678,9 @@
return;
}
+ /* If we are here everything is ok and we can set the state as saved */
+ gtranslator_po_set_state (po, GTR_PO_STATE_SAVED);
+
/*
* If the warn if fuzzy option is enabled we have to show an error
*/
Modified: trunk/src/prefs-manager-app.c
==============================================================================
--- trunk/src/prefs-manager-app.c (original)
+++ trunk/src/prefs-manager-app.c Mon Sep 22 09:39:23 2008
@@ -63,6 +63,10 @@
GConfEntry *entry,
gpointer user_data);
+static void gtranslator_prefs_manager_autosave_changed (GConfClient *client,
+ guint cnxn_id,
+ GConfEntry *entry,
+ gpointer user_data);
/* GUI state is serialized to a .desktop file, not in gconf */
@@ -435,7 +439,11 @@
GPM_GDL_STYLE,
gtranslator_prefs_manager_gdl_style_changed,
NULL, NULL, NULL);
-
+
+ gconf_client_notify_add (gtranslator_prefs_manager->gconf_client,
+ GPM_AUTOSAVE,
+ gtranslator_prefs_manager_autosave_changed,
+ NULL, NULL, NULL);
}
return gtranslator_prefs_manager != NULL;
@@ -622,3 +630,64 @@
"switcher-style", style, NULL);
}
+static void
+gtranslator_prefs_manager_autosave_changed (GConfClient *client,
+ guint cnxn_id,
+ GConfEntry *entry,
+ gpointer user_data)
+{
+ GList *tabs;
+ GList *l;
+ GtranslatorWindow *window;
+
+ g_return_if_fail (entry->key != NULL);
+ g_return_if_fail (entry->value != NULL);
+
+ window = gtranslator_application_get_active_window (GTR_APP);
+
+ if (strcmp (entry->key, GPM_AUTOSAVE) == 0)
+ {
+ gboolean autosave;
+
+ if (entry->value->type == GCONF_VALUE_BOOL)
+ autosave = gconf_value_get_bool (entry->value);
+ else
+ autosave = GPM_DEFAULT_AUTOSAVE;
+
+ tabs = gtranslator_window_get_all_tabs (window);
+
+ for (l = tabs; l != NULL; l = g_list_next (l))
+ {
+ GtranslatorTab *tab = GTR_TAB (l->data);
+
+ gtranslator_tab_set_autosave_enabled (tab, autosave);
+ }
+
+ g_list_free (tabs);
+ }
+ else if (strcmp (entry->key, GPM_AUTOSAVE_INTERVAL) == 0)
+ {
+ gint autosave_interval;
+
+ if (entry->value->type == GCONF_VALUE_INT)
+ {
+ autosave_interval = gconf_value_get_int (entry->value);
+
+ if (autosave_interval <= 0)
+ autosave_interval = GPM_DEFAULT_AUTOSAVE_INTERVAL;
+ }
+ else
+ autosave_interval = GPM_DEFAULT_AUTOSAVE_INTERVAL;
+
+ tabs = gtranslator_window_get_all_tabs (window);
+
+ for (l = tabs; l != NULL; l = g_list_next (l))
+ {
+ GtranslatorTab *tab = GTR_TAB (l->data);
+
+ gtranslator_tab_set_autosave_interval (tab, autosave_interval);
+ }
+
+ g_list_free (tabs);
+ }
+}
Modified: trunk/src/tab.c
==============================================================================
--- trunk/src/tab.c (original)
+++ trunk/src/tab.c Mon Sep 22 09:39:23 2008
@@ -79,6 +79,12 @@
GtkWidget *translated;
GtkWidget *fuzzy;
GtkWidget *untranslated;
+
+ /* Autosave */
+ GTimer *timer;
+ gint autosave_interval;
+ guint autosave_timeout;
+ gint autosave : 1;
};
enum
@@ -89,8 +95,76 @@
LAST_SIGNAL
};
+enum
+{
+ PROP_0,
+ PROP_AUTOSAVE,
+ PROP_AUTOSAVE_INTERVAL
+};
+
static guint signals[LAST_SIGNAL];
+static gboolean gtranslator_tab_autosave (GtranslatorTab *tab);
+
+static void
+install_autosave_timeout (GtranslatorTab *tab)
+{
+ gint timeout;
+
+ g_return_if_fail (tab->priv->autosave_timeout <= 0);
+ g_return_if_fail (tab->priv->autosave);
+ g_return_if_fail (tab->priv->autosave_interval > 0);
+
+ /* Add a new timeout */
+ timeout = g_timeout_add (tab->priv->autosave_interval * 1000 * 60,
+ (GSourceFunc) gtranslator_tab_autosave,
+ tab);
+
+ tab->priv->autosave_timeout = timeout;
+}
+
+static gboolean
+install_autosave_timeout_if_needed (GtranslatorTab *tab)
+{
+ g_return_val_if_fail (tab->priv->autosave_timeout <= 0, FALSE);
+
+ if (tab->priv->autosave)
+ {
+ install_autosave_timeout (tab);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+gtranslator_tab_autosave (GtranslatorTab *tab)
+{
+ GError *error = NULL;
+
+ if (!gtranslator_po_get_state (tab->priv->po) == GTR_PO_STATE_MODIFIED)
+ return TRUE;
+
+ gtranslator_po_save_file (tab->priv->po, &error);
+ if (error)
+ {
+ g_warning (error->message);
+ g_error_free (error);
+ }
+
+ return TRUE;
+}
+
+static void
+remove_autosave_timeout (GtranslatorTab *tab)
+{
+ g_return_if_fail (tab->priv->autosave_timeout > 0);
+
+ g_source_remove (tab->priv->autosave_timeout);
+ tab->priv->autosave_timeout = 0;
+}
+
/*
* Write the change back to the gettext PO instance in memory and
* mark the page dirty
@@ -541,29 +615,88 @@
static void
gtranslator_tab_init (GtranslatorTab *tab)
{
- GtkWidget *image;
-
tab->priv = GTR_TAB_GET_PRIVATE (tab);
g_signal_connect(tab, "message-changed",
G_CALLBACK(update_status), NULL);
gtranslator_tab_draw(tab);
+
+ /* Manage auto save data */
+ tab->priv->autosave = gtranslator_prefs_manager_get_autosave ();
+ tab->priv->autosave = (tab->priv->autosave != FALSE);
+
+ tab->priv->autosave_interval = gtranslator_prefs_manager_get_autosave_interval ();
+ if (tab->priv->autosave_interval <= 0)
+ tab->priv->autosave_interval = GPM_DEFAULT_AUTOSAVE_INTERVAL;
}
static void
gtranslator_tab_finalize (GObject *object)
{
- GtranslatorTab *tab = GTR_TAB(object);
- gint i;
+ GtranslatorTab *tab = GTR_TAB (object);
- if(tab->priv->po)
- g_object_unref(tab->priv->po);
+ if (tab->priv->po)
+ g_object_unref (tab->priv->po);
+
+ if (tab->priv->timer != NULL)
+ g_timer_destroy (tab->priv->timer);
+
+ if (tab->priv->autosave_timeout > 0)
+ remove_autosave_timeout (tab);
G_OBJECT_CLASS (gtranslator_tab_parent_class)->finalize (object);
}
static void
+gtranslator_tab_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GtranslatorTab *tab = GTR_TAB (object);
+
+ switch (prop_id)
+ {
+ case PROP_AUTOSAVE:
+ g_value_set_boolean (value,
+ gtranslator_tab_get_autosave_enabled (tab));
+ break;
+ case PROP_AUTOSAVE_INTERVAL:
+ g_value_set_int (value,
+ gtranslator_tab_get_autosave_interval (tab));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gtranslator_tab_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GtranslatorTab *tab = GTR_TAB (object);
+
+ switch (prop_id)
+ {
+ case PROP_AUTOSAVE:
+ gtranslator_tab_set_autosave_enabled (tab,
+ g_value_get_boolean (value));
+ break;
+ case PROP_AUTOSAVE_INTERVAL:
+ gtranslator_tab_set_autosave_interval (tab,
+ g_value_get_int (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
gtranslator_tab_class_init (GtranslatorTabClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -571,7 +704,10 @@
g_type_class_add_private (klass, sizeof (GtranslatorTabPrivate));
object_class->finalize = gtranslator_tab_finalize;
+ object_class->set_property = gtranslator_tab_set_property;
+ object_class->get_property = gtranslator_tab_get_property;
+ /* Signals */
signals[SHOWED_MESSAGE] =
g_signal_new("showed-message",
G_OBJECT_CLASS_TYPE (klass),
@@ -601,6 +737,27 @@
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1,
G_TYPE_POINTER);
+
+ /* Properties */
+ g_object_class_install_property (object_class,
+ PROP_AUTOSAVE,
+ g_param_spec_boolean ("autosave",
+ "Autosave",
+ "Autosave feature",
+ TRUE,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class,
+ PROP_AUTOSAVE_INTERVAL,
+ g_param_spec_int ("autosave-interval",
+ "AutosaveInterval",
+ "Time between two autosaves",
+ 0,
+ G_MAXINT,
+ 0,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
}
/***************************** Public funcs ***********************************/
@@ -624,6 +781,7 @@
tab->priv->po = po;
g_object_set_data (G_OBJECT (po), GTR_TAB_KEY, tab);
+ install_autosave_timeout_if_needed (tab);
/*
* Now we have to initialize the number of msgstr tabs
@@ -815,8 +973,9 @@
/*
* Emitting message-edition-finished signal
*/
- g_signal_emit (G_OBJECT (tab), signals[MESSAGE_EDITION_FINISHED],
- 0, GTR_MSG (current_msg->data));
+ if (!searching)
+ g_signal_emit (G_OBJECT (tab), signals[MESSAGE_EDITION_FINISHED],
+ 0, GTR_MSG (current_msg->data));
gtranslator_tab_show_message(tab, to_go->data);
set_message_area(tab, NULL);
@@ -872,3 +1031,105 @@
return (res != NULL) ? GTR_TAB (res) : NULL;
}
+
+/**
+ * gtranslator_tab_get_autosave_enabled:
+ * @tab: a #GtranslatorTab
+ *
+ * Gets the current state for the autosave feature
+ *
+ * Return value: TRUE if the autosave is enabled, else FALSE
+ **/
+gboolean
+gtranslator_tab_get_autosave_enabled (GtranslatorTab *tab)
+{
+ g_return_val_if_fail (GTR_IS_TAB (tab), FALSE);
+
+ return tab->priv->autosave;
+}
+
+/**
+ * gtranslator_tab_set_autosave_enabled:
+ * @tab: a #GtranslatorTab
+ * @enable: enable (TRUE) or disable (FALSE) auto save
+ *
+ * Enables or disables the autosave feature. It does not install an
+ * autosave timeout if the document is new or is read-only
+ **/
+void
+gtranslator_tab_set_autosave_enabled (GtranslatorTab *tab,
+ gboolean enable)
+{
+ g_return_if_fail (GTR_IS_TAB (tab));
+
+ if (tab->priv->autosave == enable)
+ return;
+
+ tab->priv->autosave = enable;
+
+ if (enable &&
+ (tab->priv->autosave_timeout <= 0))
+ {
+ install_autosave_timeout (tab);
+
+ return;
+ }
+
+ if (!enable && (tab->priv->autosave_timeout > 0))
+ {
+ remove_autosave_timeout (tab);
+
+ return;
+ }
+
+ g_return_if_fail (!enable && (tab->priv->autosave_timeout <= 0));
+}
+
+/**
+ * gtranslator_tab_get_autosave_interval:
+ * @tab: a #GtranslatorTab
+ *
+ * Gets the current interval for the autosaves
+ *
+ * Return value: the value of the autosave
+ **/
+gint
+gtranslator_tab_get_autosave_interval (GtranslatorTab *tab)
+{
+ g_return_val_if_fail (GTR_IS_TAB (tab), 0);
+
+ return tab->priv->autosave_interval;
+}
+
+/**
+ * gtranslator_tab_set_autosave_interval:
+ * @tab: a #GtranslatorTab
+ * @interval: the new interval
+ *
+ * Sets the interval for the autosave feature. It does nothing if the
+ * interval is the same as the one already present. It removes the old
+ * interval timeout and adds a new one with the autosave passed as
+ * argument.
+ **/
+void
+gtranslator_tab_set_autosave_interval (GtranslatorTab *tab,
+ gint interval)
+{
+ g_return_if_fail (GTR_IS_TAB (tab));
+ g_return_if_fail (interval > 0);
+
+ if (tab->priv->autosave_interval == interval)
+ return;
+
+ tab->priv->autosave_interval = interval;
+
+ if (!tab->priv->autosave)
+ return;
+
+ if (tab->priv->autosave_timeout > 0)
+ {
+ remove_autosave_timeout (tab);
+
+ install_autosave_timeout (tab);
+ }
+}
Modified: trunk/src/tab.h
==============================================================================
--- trunk/src/tab.h (original)
+++ trunk/src/tab.h Mon Sep 22 09:39:23 2008
@@ -105,6 +105,16 @@
gboolean searching);
GtranslatorTab *gtranslator_tab_get_from_document (GtranslatorPo *po);
+
+gboolean gtranslator_tab_get_autosave_enabled (GtranslatorTab *tab);
+
+void gtranslator_tab_set_autosave_enabled (GtranslatorTab *tab,
+ gboolean enable);
+
+gint gtranslator_tab_get_autosave_interval (GtranslatorTab *tab);
+
+void gtranslator_tab_set_autosave_interval (GtranslatorTab *tab,
+ gint interval);
gboolean _gtranslator_tab_can_close (GtranslatorTab *tab);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]