diff options
Diffstat (limited to 'composer/e-msg-composer.c')
-rw-r--r-- | composer/e-msg-composer.c | 279 |
1 files changed, 249 insertions, 30 deletions
diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c index d939a7592e..c6437b6d93 100644 --- a/composer/e-msg-composer.c +++ b/composer/e-msg-composer.c @@ -22,6 +22,7 @@ * Ettore Perazzoli (ettore@ximian.com) * Jeffrey Stedfast (fejj@ximian.com) * Miguel de Icaza (miguel@ximian.com) + * Radek Doulik (rodo@ximian.com) * */ @@ -47,9 +48,11 @@ #include <sys/time.h> #include <sys/types.h> #include <sys/stat.h> +#include <sys/wait.h> #include <unistd.h> #include <gal/unicode/gunicode.h> #include <libgnome/gnome-defs.h> +#include <libgnome/gnome-exec.h> #include <libgnomeui/gnome-app.h> #include <libgnomeui/gnome-uidefs.h> #include <libgnomeui/gnome-dialog.h> @@ -143,6 +146,7 @@ static void handle_multipart_alternative (EMsgComposer *composer, CamelMultipart static void handle_multipart (EMsgComposer *composer, CamelMultipart *multipart, int depth); +static void set_editor_signature (EMsgComposer *composer); @@ -692,7 +696,7 @@ build_message (EMsgComposer *composer) static char * -get_file_content (EMsgComposer *composer, const char *file_name, gboolean want_html, guint flags) +get_file_content (EMsgComposer *composer, const char *file_name, gboolean want_html, guint flags, gboolean warn) { CamelStreamFilter *filtered_stream; CamelStreamMem *memstream; @@ -706,11 +710,13 @@ get_file_content (EMsgComposer *composer, const char *file_name, gboolean want_h fd = open (file_name, O_RDONLY | O_CREAT, 0644); if (fd == -1) { char *msg; - - msg = g_strdup_printf (_("Error while reading file %s:\n%s"), - file_name, g_strerror (errno)); - gnome_error_dialog (msg); - g_free (msg); + + if (warn) { + msg = g_strdup_printf (_("Error while reading file %s:\n%s"), + file_name, g_strerror (errno)); + gnome_error_dialog (msg); + g_free (msg); + } return g_strdup (""); } @@ -751,7 +757,7 @@ e_msg_composer_get_sig_file_content (const char *sigfile, gboolean in_html) return NULL; } - return get_file_content (NULL, sigfile, !in_html, 0); + return get_file_content (NULL, sigfile, !in_html, 0, FALSE); } static void @@ -773,10 +779,11 @@ prepare_engine (EMsgComposer *composer) composer->editor_listener = BONOBO_OBJECT (listener_new (composer)); if (composer->editor_listener != NULL) GNOME_GtkHTML_Editor_Engine__set_listener (composer->editor_engine, - (GNOME_GtkHTML_Editor_Listener) - bonobo_object_dup_ref - (bonobo_object_corba_objref (composer->editor_listener), &ev), - &ev); + (GNOME_GtkHTML_Editor_Listener) + bonobo_object_dup_ref + (bonobo_object_corba_objref (composer->editor_listener), + &ev), + &ev); if ((ev._major != CORBA_NO_EXCEPTION) || (composer->editor_listener == NULL)) { CORBA_Environment err_ev; @@ -803,26 +810,47 @@ static gchar * get_signature_html (EMsgComposer *composer) { gboolean format_html = FALSE; - char *text, *html = NULL, *sig_file = NULL; - - if (E_MSG_COMPOSER_HDRS (composer->hdrs)->account->id) { - MailConfigIdentity *id; - - id = E_MSG_COMPOSER_HDRS (composer->hdrs)->account->id; - if (composer->send_html) { - if (id->has_html_signature) { - sig_file = id->html_signature; - format_html = TRUE; - } else - sig_file = id->signature; - } else - sig_file = id->signature; + char *text, *html = NULL, *sig_file = NULL, *script = NULL; + static gboolean random_initialized = FALSE; + + if (composer->signature) { + sig_file = composer->signature->filename; + format_html = composer->signature->html; + script = composer->signature->script; + } else if (composer->random_signature) { + GList *l; + gint pos; + + if (!random_initialized) { + printf ("initialize random generator\n"); + srand (time (NULL)); + random_initialized = TRUE; + } + pos = (int) (((gdouble) mail_config_get_signatures_random ())*rand()/(RAND_MAX+1.0)); + printf ("using %d sig\n", pos); + + for (l = mail_config_get_signature_list (); l; l = l->next) { + MailConfigSignature *sig = (MailConfigSignature *) l->data; + + if (sig->random) { + if (pos == 0) { + printf ("using %s\n", sig->name); + sig_file = sig->filename; + script = sig->script; + format_html = sig->html; + break; + } + pos --; + } + } } - if (!sig_file) return NULL; - + printf ("sig file: %s\n", sig_file); + + mail_config_signature_run_script (script); text = e_msg_composer_get_sig_file_content (sig_file, format_html); + /* printf ("text: %s\n", text); */ if (text) { /* The signature dash convention ("-- \n") is specified in the * "Son of RFC 1036": http://www.chemie.fu-berlin.de/outerspace/netnews/son-of-1036.html, @@ -1483,7 +1511,7 @@ menu_file_insert_file_cb (BonoboUIComponent *uic, if (file_name == NULL) return; - html = get_file_content (composer, file_name, TRUE, E_TEXT_TO_HTML_PRE); + html = get_file_content (composer, file_name, TRUE, E_TEXT_TO_HTML_PRE, TRUE); if (html == NULL) return; @@ -1676,6 +1704,151 @@ static EPixmap pixcache [] = { }; static void +signature_regenerate_cb (BonoboUIComponent *uic, gpointer user_data, const char *path) +{ + printf ("signature_regenerate_cb: %s\n", path); + + e_msg_composer_show_sig_file (E_MSG_COMPOSER (user_data)); +} + +static void +signature_cb (BonoboUIComponent *uic, const char *path, Bonobo_UIComponent_EventType type, + const char *state, gpointer user_data) +{ + EMsgComposer *composer = (EMsgComposer *) user_data; + + printf ("signature_cb: %s (%s)\n", path, state); + + if (state && *state == '1') { + if (path && !strncmp (path, "Signature", 9)) { + MailConfigSignature *old_sig; + gboolean old_random; + + old_sig = composer->signature; + old_random = composer->random_signature; + + printf ("I'm going to set signature (%d)\n", atoi (path + 9)); + if (path [9] == 'N') { + composer->signature = NULL; + composer->random_signature = FALSE; + } else if (path [9] == 'R') { + composer->signature = NULL; + composer->random_signature = TRUE; + } else { + composer->signature = g_list_nth_data (mail_config_get_signature_list (), atoi (path + 9)); + composer->random_signature = FALSE; + } + if (old_sig != composer->signature || old_random != composer->random_signature) + e_msg_composer_show_sig_file (composer); + } + } + + printf ("signature_cb end\n"); +} + +static void setup_signatures_menu (EMsgComposer *composer); + +static void +remove_signature_list (EMsgComposer *composer) +{ + gchar path [64]; + gint len = g_list_length (mail_config_get_signature_list ()); + + bonobo_ui_component_rm (composer->uic, "/menu/Edit/EditMisc/EditSignaturesSubmenu/SeparatorList", NULL); + bonobo_ui_component_rm (composer->uic, "/menu/Edit/EditMisc/EditSignaturesSubmenu/SeparatorRegenerate", NULL); + bonobo_ui_component_rm (composer->uic, "/menu/Edit/EditMisc/EditSignaturesSubmenu/SignatureRegenerate", NULL); + for (; len; len --) { + g_snprintf (path, 64, "/menu/Edit/EditMisc/EditSignaturesSubmenu/Signature%d", len - 1); + bonobo_ui_component_rm (composer->uic, path, NULL); + } +} + +static void +sig_event_client (MailConfigSigEvent event, MailConfigSignature *sig, EMsgComposer *composer) +{ + gchar *path; + + bonobo_ui_component_freeze (composer->uic, NULL); + switch (event) { + case MAIL_CONFIG_SIG_EVENT_DELETED: + if (sig == composer->signature) + composer->signature = NULL; + path = g_strdup_printf ("/menu/Edit/EditMisc/EditSignaturesSubmenu/Signature%d", + g_list_length (mail_config_get_signature_list ())); + bonobo_ui_component_rm (composer->uic, path, NULL); + g_free (path); + setup_signatures_menu (composer); + break; + case MAIL_CONFIG_SIG_EVENT_RANDOM_OFF: + composer->random_signature = FALSE; + bonobo_ui_component_rm (composer->uic, "/menu/Edit/EditMisc/EditSignaturesSubmenu/SignatureRandom", NULL); + bonobo_ui_component_rm (composer->uic, "/menu/Edit/EditMisc/EditSignaturesSubmenu/SeparatorRandom", NULL); + setup_signatures_menu (composer); + break; + case MAIL_CONFIG_SIG_EVENT_RANDOM_ON: + remove_signature_list (composer); + setup_signatures_menu (composer); + break; + case MAIL_CONFIG_SIG_EVENT_ADDED: + case MAIL_CONFIG_SIG_EVENT_NAME_CHANGED: + setup_signatures_menu (composer); + } + bonobo_ui_component_thaw (composer->uic, NULL); +} + +static void +setup_signatures_menu (EMsgComposer *composer) +{ + GList *l, *list; + GString *str; + gchar *line; + gint i, len = 0; + + str = g_string_new ("<submenu name=\"EditSignaturesSubmenu\" _label=\"Signatures\">\n" + "<menuitem name=\"SignatureNone\" _label=\"None\" verb=\"SignatureNone\"" + " type=\"radio\" group=\"signatures_group\"/>\n"); + if (mail_config_get_signatures_random ()) { + g_string_append (str, + "<separator name=\"SeparatorRandom\"/>\n" + "<menuitem name=\"SignatureRandom\" _label=\"Random\" verb=\"SignatureRandom\"" + " type=\"radio\" group=\"signatures_group\"/>\n"); + } + + list = mail_config_get_signature_list (); + if (list) { + + g_string_append (str, "<separator name=\"SeparatorList\"/>"); + + for (l = list; l; len ++, l = l->next) { + line = g_strdup_printf ("<menuitem name=\"Signature%d\" _label=\"%s\"" + " verb=\"Signature%d\" type=\"radio\" group=\"signatures_group\"/>\n", + len, ((MailConfigSignature *)l->data)->name, len); + g_string_append (str, line); + g_free (line); + } + } + + g_string_append (str, + "<separator name=\"SeparatorRegenerate\"/>\n" + "<menuitem name=\"SignatureRegenerate\" _label=\"_Regenerate\"" + " verb=\"SignatureRegenerate\" accel=\"*Ctrl**Shift*G\"/>"); + g_string_append (str, "</submenu>\n"); + + bonobo_ui_component_set_translate (composer->uic, "/menu/Edit/EditMisc/", str->str, NULL); + bonobo_ui_component_set (composer->uic, "/menu/Edit/EditMisc/", "<separator/>", NULL); + + bonobo_ui_component_add_listener (composer->uic, "SignatureNone", signature_cb, composer); + bonobo_ui_component_add_listener (composer->uic, "SignatureRandom", signature_cb, composer); + bonobo_ui_component_add_verb (composer->uic, "SignatureRegenerate", signature_regenerate_cb, composer); + + for (i = 0; i < len; i ++) { + g_string_sprintf (str, "Signature%d", i + 1); + bonobo_ui_component_add_listener (composer->uic, str->str, signature_cb, composer); + } + g_string_free (str, TRUE); +} + +static void setup_ui (EMsgComposer *composer) { BonoboUIContainer *container; @@ -1826,6 +1999,9 @@ setup_ui (EMsgComposer *composer) bonobo_ui_component_add_listener ( composer->uic, "ViewAttach", menu_view_attachments_activate_cb, composer); + + setup_signatures_menu (composer); + mail_config_signature_register_client ((MailConfigSignatureClient) sig_event_client, composer); bonobo_ui_component_thaw (composer->uic, NULL); } @@ -2003,7 +2179,8 @@ from_changed_cb (EMsgComposerHdrs *hdrs, void *data) update_auto_recipients (hdrs, UPDATE_AUTO_CC, NULL); update_auto_recipients (hdrs, UPDATE_AUTO_BCC, NULL); } - + + set_editor_signature (composer); e_msg_composer_show_sig_file (composer); } @@ -2030,6 +2207,8 @@ destroy (GtkObject *object) composer = E_MSG_COMPOSER (object); + mail_config_signature_register_client ((MailConfigSignatureClient) sig_event_client, composer); + CORBA_exception_init (&ev); if (composer->config_db) { @@ -2572,6 +2751,38 @@ create_composer (void) return composer; } +static void +set_editor_signature (EMsgComposer *composer) +{ + printf ("set_editor_signature\n"); + if (E_MSG_COMPOSER_HDRS (composer->hdrs)->account->id) { + MailConfigIdentity *id; + gchar *verb, *name; + + id = E_MSG_COMPOSER_HDRS (composer->hdrs)->account->id; + + composer->random_signature = composer->send_html ? id->html_random : id->text_random; + if (composer->random_signature) + composer->signature = NULL; + else + composer->signature = composer->send_html ? id->html_signature : id->text_signature; + + if (composer->random_signature) { + verb = g_strdup ("/commands/SignatureRandom"); + name = g_strdup ("SignatureRandom"); + } else if (composer->signature == NULL) { + verb = g_strdup ("/commands/SignatureNone"); + name = g_strdup ("SignatureNone"); + } else { + verb = g_strdup_printf ("/commands/Signature%d", composer->signature->id); + name = g_strdup_printf ("Signature%d", composer->signature->id); + } + bonobo_ui_component_set_prop (composer->uic, verb, "state", "1", NULL); + g_free (verb); + } + printf ("set_editor_signature end\n"); +} + /** * e_msg_composer_new: * @@ -2588,6 +2799,7 @@ e_msg_composer_new (void) if (new) { e_msg_composer_set_send_html (new, mail_config_get_send_html ()); set_editor_text (new, ""); + set_editor_signature (new); } return new; @@ -2969,8 +3181,10 @@ e_msg_composer_new_with_message (CamelMimeMessage *message) /* We wait until now to set the body text because we need to ensure that * the attachment bar has all the attachments, before we request them. - */ + */ e_msg_composer_flush_pending_body (new, TRUE); + + set_editor_signature (new); return new; } @@ -3474,6 +3688,7 @@ e_msg_composer_show_sig_file (EMsgComposer *composer) g_return_if_fail (composer != NULL); g_return_if_fail (E_IS_MSG_COMPOSER (composer)); + printf ("e_msg_composer_show_sig_file\n"); /* printf ("set sig '%s' '%s'\n", sig_file, composer->sig_file); */ composer->in_signature_insert = TRUE; @@ -3497,11 +3712,14 @@ e_msg_composer_show_sig_file (EMsgComposer *composer) GNOME_GtkHTML_Editor_Engine_insertHTML (composer->editor_engine, html, &ev); g_free (html); } + GNOME_GtkHTML_Editor_Engine_undoEnd (composer->editor_engine, &ev); GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "cursor-position-restore", &ev); GNOME_GtkHTML_Editor_Engine_thaw (composer->editor_engine, &ev); CORBA_exception_free (&ev); composer->in_signature_insert = FALSE; + + printf ("e_msg_composer_show_sig_file end\n"); } /** @@ -3538,6 +3756,7 @@ e_msg_composer_set_send_html (EMsgComposer *composer, composer->send_html, NULL); set_config (composer, "FormatHTML", composer->send_html); + set_editor_signature (composer); e_msg_composer_show_sig_file (composer); GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "unblock-redraw", &ev); CORBA_exception_free (&ev); |