evolution r35007 - branches/mbarnes-composer/mail



Author: mbarnes
Date: Wed Feb 13 14:52:47 2008
New Revision: 35007
URL: http://svn.gnome.org/viewvc/evolution?rev=35007&view=rev

Log:
Fix bugs in the signature editor.  Seems to be working nicely now.


Modified:
   branches/mbarnes-composer/mail/mail-signature-editor.c

Modified: branches/mbarnes-composer/mail/mail-signature-editor.c
==============================================================================
--- branches/mbarnes-composer/mail/mail-signature-editor.c	(original)
+++ branches/mbarnes-composer/mail/mail-signature-editor.c	Wed Feb 13 14:52:47 2008
@@ -45,7 +45,7 @@
 	GtkActionGroup *action_group;
 	ESignature *signature;
 	GtkWidget *entry;
-	gboolean entry_changed;
+	gchar *original_name;
 };
 
 static const gchar *ui =
@@ -82,9 +82,14 @@
                  ESignatureEditor *editor)
 {
 	gboolean something_changed = FALSE;
+	const gchar *original_name;
+	const gchar *signature_name;
+
+	original_name = editor->priv->original_name;
+	signature_name = gtk_entry_get_text (GTK_ENTRY (editor->priv->entry));
 
 	something_changed |= gtkhtml_editor_has_undo (GTKHTML_EDITOR (editor));
-	something_changed |= editor->priv->entry_changed;
+	something_changed |= (strcmp (signature_name, original_name) != 0);
 
 	if (something_changed) {
 		gint response;
@@ -100,7 +105,8 @@
 				action_group, "save-and-close");
 			gtk_action_activate (action);
 			return;
-		}
+		} else if (response == GTK_RESPONSE_CANCEL)
+			return;
 	}
 
 	gtk_widget_destroy (GTK_WIDGET (editor));
@@ -110,7 +116,7 @@
 action_save_and_close_cb (GtkAction *action,
                           ESignatureEditor *editor)
 {
-	GtkEntry *signature_entry;
+	GtkWidget *entry;
 	ESignatureList *signature_list;
 	ESignature *signature;
 	ESignature *same_name;
@@ -119,6 +125,7 @@
 	gboolean html;
 	GError *error = NULL;
 
+	entry = editor->priv->entry;
 	html = gtkhtml_editor_get_html_mode (GTKHTML_EDITOR (editor));
 
 	if (editor->priv->signature == NULL)
@@ -142,26 +149,29 @@
 
 	signature_list = mail_config_get_signatures ();
 
-	signature_entry = GTK_ENTRY (editor->priv->entry);
-	signature_name = g_strdup (gtk_entry_get_text (signature_entry));
+	signature_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
 	g_strstrip (signature_name);
 
+	/* Make sure the signature name is not blank. */
 	if (*signature_name == '\0') {
 		e_error_run (
 			GTK_WINDOW (editor),
 			"mail:blank-signature", NULL);
+		gtk_widget_grab_focus (entry);
 		g_free (signature_name);
 		return;
 	}
 
-	/* XXX ESignatureList misuses const. */
+	/* Don't overwrite an existing signature of the same name.
+	 * XXX ESignatureList misuses const. */
 	same_name = (ESignature *) e_signature_list_find (
 		signature_list, E_SIGNATURE_FIND_NAME, signature_name);
-	if (same_name != NULL && strcmp (signature->uid, same_name->uid) == 0) {
+	if (same_name != NULL && strcmp (signature->uid, same_name->uid) != 0) {
 		e_error_run (
 			GTK_WINDOW (editor),
 			"mail:signature-already-exists",
 			signature_name, NULL);
+		gtk_widget_grab_focus (entry);
 		g_free (signature_name);
 		return;
 	}
@@ -216,13 +226,6 @@
 }
 
 static void
-signature_editor_entry_changed_cb (ESignatureEditor *editor,
-                                   GtkEntry *entry)
-{
-	editor->priv->entry_changed = TRUE;
-}
-
-static void
 signature_editor_set_property (GObject *object,
                                guint property_id,
                                const GValue *value,
@@ -283,6 +286,19 @@
 }
 
 static void
+signature_editor_finalize (GObject *object)
+{
+	ESignatureEditorPrivate *priv;
+
+	priv = E_SIGNATURE_EDITOR_GET_PRIVATE (object);
+
+	g_free (priv->original_name);
+
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
 signature_editor_class_init (ESignatureEditorClass *class)
 {
 	GObjectClass *object_class;
@@ -294,6 +310,7 @@
 	object_class->set_property = signature_editor_set_property;
 	object_class->get_property = signature_editor_get_property;
 	object_class->dispose = signature_editor_dispose;
+	object_class->finalize = signature_editor_finalize;
 
 	g_object_class_install_property (
 		object_class,
@@ -347,11 +364,8 @@
 
 	widget = gtk_entry_new ();
 	gtk_box_pack_end (GTK_BOX (container), widget, TRUE, TRUE, 0);
-	g_signal_connect_swapped (
-		widget, "changed",
-		G_CALLBACK (signature_editor_entry_changed_cb), editor);
-	gtk_widget_show (widget);
 	editor->priv->entry = g_object_ref_sink (widget);
+	gtk_widget_show (widget);
 
 	widget = gtk_label_new_with_mnemonic (_("_Signature Name:"));
 	gtk_label_set_mnemonic_widget (GTK_LABEL (widget), editor->priv->entry);
@@ -361,6 +375,8 @@
 	g_signal_connect (
 		editor, "delete-event",
 		G_CALLBACK (signature_editor_delete_event_cb), NULL);
+
+	e_signature_editor_set_signature (editor, NULL);
 }
 
 GType
@@ -409,6 +425,7 @@
                                   ESignature *signature)
 {
 	const gchar *filename;
+	const gchar *signature_name;
 	gchar *contents;
 	gsize length;
 	GError *error = NULL;
@@ -426,6 +443,10 @@
 	if (signature == NULL)
 		goto exit;
 
+	editor->priv->signature = g_object_ref (signature);
+
+	/* Load signature content. */
+
 	filename = signature->filename;
 
 	if (signature->html)
@@ -451,8 +472,27 @@
 	}
 
 exit:
-	gtk_entry_set_text (
-		GTK_ENTRY (editor->priv->entry),
-		(signature != NULL) ? signature->name : "");
+	if (signature != NULL)
+		signature_name = signature->name;
+	else
+		signature_name = _("Unnamed");
+
+	/* Set the entry text before we grab focus. */
+	g_free (editor->priv->original_name);
+	editor->priv->original_name = g_strdup (signature_name);
+	gtk_entry_set_text (GTK_ENTRY (editor->priv->entry), signature_name);
+
+	/* Set the focus appropriately.  If this is a new signature, draw
+	 * the user's attention to the signature name entry.  Otherwise go
+	 * straight to the editing area. */
+	if (signature == NULL)
+		gtk_widget_grab_focus (editor->priv->entry);
+	else {
+		GtkHTML *html;
+
+		html = gtkhtml_editor_get_html (GTKHTML_EDITOR (editor));
+		gtk_widget_grab_focus (GTK_WIDGET (html));
+	}
+
 	g_object_notify (G_OBJECT (editor), "signature");
 }



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