gtranslator r3620 - trunk/src



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]