merge new signature handling

svn path=/trunk/; revision=15960
This commit is contained in:
Radek Doulik
2002-03-07 00:21:59 +00:00
parent fb1819e374
commit a1bb1ba0fe
18 changed files with 2587 additions and 502 deletions

View File

@ -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;
char *text, *html = NULL, *sig_file = NULL, *script = NULL;
static gboolean random_initialized = FALSE;
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;
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;
@ -1675,6 +1703,151 @@ static EPixmap pixcache [] = {
E_PIXMAP_END
};
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)
{
@ -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);

View File

@ -99,6 +99,9 @@ struct _EMsgComposer {
gboolean enable_autosave : 1;
CamelMimeMessage *redirect;
MailConfigSignature *signature;
gboolean random_signature;
};
struct _EMsgComposerClass {

View File

@ -45,9 +45,6 @@ module Evolution {
string name;
string address;
string organization;
string signature;
string html_signature;
boolean has_html_signature;
};
struct Service {

View File

@ -94,6 +94,8 @@ evolution_mail_SOURCES = \
mail-send-recv.h \
mail-session.c \
mail-session.h \
mail-signature-editor.c \
mail-signature-editor.h \
mail-stream-gtkhtml.c \
mail-stream-gtkhtml.h \
mail-tools.c \

View File

@ -146,11 +146,11 @@ cancel_clicked (GtkWidget *widget, gpointer data)
}
static void
construct (MailAccountEditor *editor, MailConfigAccount *account)
construct (MailAccountEditor *editor, MailConfigAccount *account, MailAccountsDialog *dialog)
{
MailConfigService *source = account->source;
editor->gui = mail_account_gui_new (account);
editor->gui = mail_account_gui_new (account, dialog);
/* get our toplevel widget and reparent it */
editor->notebook = GTK_NOTEBOOK (glade_xml_get_widget (editor->gui->xml, "account_editor_notebook"));
@ -182,13 +182,13 @@ construct (MailAccountEditor *editor, MailConfigAccount *account)
}
MailAccountEditor *
mail_account_editor_new (MailConfigAccount *account, GtkWindow *parent)
mail_account_editor_new (MailConfigAccount *account, GtkWindow *parent, MailAccountsDialog *dialog)
{
MailAccountEditor *new;
new = (MailAccountEditor *) gtk_type_new (mail_account_editor_get_type ());
gnome_dialog_set_parent (GNOME_DIALOG (new), parent);
construct (new, account);
construct (new, account, dialog);
return new;
}

View File

@ -32,6 +32,7 @@ extern "C" {
#include <libgnomeui/gnome-dialog.h>
#include <libgnomeui/gnome-file-entry.h>
#include "mail-account-gui.h"
#include "mail-accounts.h"
#define MAIL_ACCOUNT_EDITOR_TYPE (mail_account_editor_get_type ())
#define MAIL_ACCOUNT_EDITOR(o) (GTK_CHECK_CAST ((o), MAIL_ACCOUNT_EDITOR_TYPE, MailAccountEditor))
@ -57,7 +58,7 @@ typedef struct {
GtkType mail_account_editor_get_type (void);
MailAccountEditor *mail_account_editor_new (MailConfigAccount *account, GtkWindow *parent);
MailAccountEditor *mail_account_editor_new (MailConfigAccount *account, GtkWindow *parent, MailAccountsDialog *dialog);
#ifdef __cplusplus
}

View File

@ -29,8 +29,6 @@
#include <string.h>
#include <stdarg.h>
#include <bonobo.h>
#include <bonobo/bonobo-stream-memory.h>
#include <gal/widgets/e-unicode.h>
#include <gal/widgets/e-gui-utils.h>
@ -38,7 +36,7 @@
#include "mail-account-gui.h"
#include "mail-session.h"
#include "mail-send-recv.h"
#include "e-msg-composer.h"
#include "mail-signature-editor.h"
#define d(x)
@ -961,303 +959,6 @@ provider_compare (const CamelProvider *p1, const CamelProvider *p2)
}
}
/*
* Signature editor
*
*/
struct _ESignatureEditor {
MailAccountGui *gui;
GtkWidget *win;
GtkWidget *control;
gchar *filename;
gboolean html;
gboolean has_changed;
};
typedef struct _ESignatureEditor ESignatureEditor;
#define E_SIGNATURE_EDITOR(o) ((ESignatureEditor *) o)
#define DEFAULT_WIDTH 600
#define DEFAULT_HEIGHT 500
enum { REPLY_YES = 0, REPLY_NO, REPLY_CANCEL };
static void
destroy_editor (ESignatureEditor *editor)
{
gtk_widget_destroy (editor->win);
g_free (editor->filename);
g_free (editor);
}
static void
menu_file_save_error (BonoboUIComponent *uic, CORBA_Environment *ev) {
e_notice (GTK_WINDOW (uic), GNOME_MESSAGE_BOX_ERROR,
_("Could not save signature file."));
g_warning ("Exception while saving signature (%s)",
bonobo_exception_get_text (ev));
}
static void
menu_file_save_cb (BonoboUIComponent *uic,
void *data,
const char *path)
{
ESignatureEditor *editor;
Bonobo_PersistFile pfile_iface;
CORBA_Environment ev;
editor = E_SIGNATURE_EDITOR (data);
if (editor->html) {
CORBA_exception_init (&ev);
pfile_iface = bonobo_object_client_query_interface (bonobo_widget_get_server (BONOBO_WIDGET (editor->control)),
"IDL:Bonobo/PersistFile:1.0", NULL);
Bonobo_PersistFile_save (pfile_iface, editor->filename, &ev);
if (ev._major != CORBA_NO_EXCEPTION)
menu_file_save_error (uic, &ev);
CORBA_exception_free (&ev);
} else {
BonoboStream *stream;
CORBA_Environment ev;
Bonobo_PersistStream pstream_iface;
CORBA_exception_init (&ev);
stream = bonobo_stream_open (BONOBO_IO_DRIVER_FS, editor->filename,
Bonobo_Storage_WRITE | Bonobo_Storage_CREATE, 0);
pstream_iface = bonobo_object_client_query_interface
(bonobo_widget_get_server (BONOBO_WIDGET (editor->control)),
"IDL:Bonobo/PersistStream:1.0", NULL);
Bonobo_PersistStream_save (pstream_iface,
(Bonobo_Stream) bonobo_object_corba_objref (BONOBO_OBJECT (stream)),
"text/plain", &ev);
if (ev._major != CORBA_NO_EXCEPTION)
menu_file_save_error (uic, &ev);
CORBA_exception_free (&ev);
bonobo_object_unref (BONOBO_OBJECT (stream));
}
}
static void
exit_dialog_cb (int reply, ESignatureEditor *editor)
{
switch (reply) {
case REPLY_YES:
menu_file_save_cb (NULL, editor, NULL);
destroy_editor (editor);
break;
case REPLY_NO:
destroy_editor (editor);
break;
case REPLY_CANCEL:
default:
}
}
static void
do_exit (ESignatureEditor *editor)
{
if (editor->has_changed) {
GtkWidget *dialog;
GtkWidget *label;
gint button;
dialog = gnome_dialog_new (_("Save signature"),
GNOME_STOCK_BUTTON_YES, /* Save */
GNOME_STOCK_BUTTON_NO, /* Don't save */
GNOME_STOCK_BUTTON_CANCEL, /* Cancel */
NULL);
label = gtk_label_new (_("This signature has been changed, but hasn't been saved.\n"
"\nDo you wish to save your changes?"));
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), label, TRUE, TRUE, 0);
gtk_widget_show (label);
gnome_dialog_set_parent (GNOME_DIALOG (dialog), GTK_WINDOW (editor->win));
gnome_dialog_set_default (GNOME_DIALOG (dialog), 0);
button = gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
exit_dialog_cb (button, editor);
} else
destroy_editor (editor);
}
static int
delete_event_cb (GtkWidget *w, GdkEvent *event, ESignatureEditor *editor)
{
do_exit (editor);
return FALSE;
}
static void
menu_file_close_cb (BonoboUIComponent *uic, gpointer data, const gchar *path)
{
ESignatureEditor *editor;
editor = E_SIGNATURE_EDITOR (data);
do_exit (editor);
}
static void
menu_file_save_close_cb (BonoboUIComponent *uic, gpointer data, const gchar *path)
{
ESignatureEditor *editor;
editor = E_SIGNATURE_EDITOR (data);
menu_file_save_cb (uic, editor, path);
destroy_editor (editor);
}
static BonoboUIVerb verbs [] = {
BONOBO_UI_VERB ("FileSave", menu_file_save_cb),
BONOBO_UI_VERB ("FileClose", menu_file_close_cb),
BONOBO_UI_VERB ("FileSaveClose", menu_file_save_close_cb),
BONOBO_UI_VERB_END
};
static void
load_signature (ESignatureEditor *editor)
{
CORBA_Environment ev;
if (editor->html) {
Bonobo_PersistFile pfile_iface;
pfile_iface = bonobo_object_client_query_interface (bonobo_widget_get_server (BONOBO_WIDGET (editor->control)),
"IDL:Bonobo/PersistFile:1.0", NULL);
CORBA_exception_init (&ev);
Bonobo_PersistFile_load (pfile_iface, editor->filename, &ev);
CORBA_exception_free (&ev);
} else {
Bonobo_PersistStream pstream_iface;
BonoboStream *stream;
gchar *data, *html;
data = e_msg_composer_get_sig_file_content (editor->filename, FALSE);
html = g_strdup_printf ("<PRE>\n%s", data);
g_free (data);
pstream_iface = bonobo_object_client_query_interface
(bonobo_widget_get_server (BONOBO_WIDGET (editor->control)),
"IDL:Bonobo/PersistStream:1.0", NULL);
CORBA_exception_init (&ev);
stream = bonobo_stream_mem_create (html, strlen (html), TRUE, FALSE);
if (stream == NULL) {
g_warning ("Couldn't create memory stream\n");
} else {
BonoboObject *stream_object;
Bonobo_Stream corba_stream;
stream_object = BONOBO_OBJECT (stream);
corba_stream = bonobo_object_corba_objref (stream_object);
Bonobo_PersistStream_load (pstream_iface, corba_stream,
"text/html", &ev);
}
Bonobo_Unknown_unref (pstream_iface, &ev);
CORBA_Object_release (pstream_iface, &ev);
CORBA_exception_free (&ev);
bonobo_object_unref (BONOBO_OBJECT (stream));
g_free (html);
}
}
static void
launch_signature_editor (MailAccountGui *gui, const gchar *filename, gboolean html)
{
ESignatureEditor *editor;
BonoboUIComponent *component;
BonoboUIContainer *container;
gchar *title;
if (!filename || !*filename)
return;
editor = g_new0 (ESignatureEditor, 1);
editor->html = html;
editor->filename = g_strdup (filename);
editor->has_changed = TRUE;
title = g_strdup_printf ("Edit %ssignature (%s)", html ? "HTML " : "", filename);
editor->win = bonobo_window_new ("e-sig-editor", title);
editor->gui = gui;
gtk_window_set_default_size (GTK_WINDOW (editor->win), DEFAULT_WIDTH, DEFAULT_HEIGHT);
gtk_window_set_policy (GTK_WINDOW (editor->win), FALSE, TRUE, FALSE);
gtk_window_set_modal (GTK_WINDOW (editor->win), TRUE);
g_free (title);
container = bonobo_ui_container_new ();
bonobo_ui_container_set_win (container, BONOBO_WINDOW (editor->win));
component = bonobo_ui_component_new_default ();
bonobo_ui_component_set_container (component, bonobo_object_corba_objref (BONOBO_OBJECT (container)));
bonobo_ui_component_add_verb_list_with_data (component, verbs, editor);
bonobo_ui_util_set_ui (component, EVOLUTION_DATADIR, "evolution-signature-editor.xml", "evolution-signature-editor");
editor->control = bonobo_widget_new_control ("OAFIID:GNOME_GtkHTML_Editor",
bonobo_ui_component_get_container (component));
if (editor->control == NULL) {
g_warning ("Cannot get 'OAFIID:GNOME_GtkHTML_Editor'.");
destroy_editor (editor);
return;
}
load_signature (editor);
gtk_signal_connect (GTK_OBJECT (editor->win), "delete_event",
GTK_SIGNAL_FUNC (delete_event_cb), editor);
bonobo_window_set_contents (BONOBO_WINDOW (editor->win), editor->control);
bonobo_widget_set_property (BONOBO_WIDGET (editor->control), "FormatHTML", html, NULL);
gtk_widget_show (GTK_WIDGET (editor->win));
gtk_widget_show (GTK_WIDGET (editor->control));
gtk_widget_grab_focus (editor->control);
}
static void
edit_signature (GtkWidget *w, MailAccountGui *gui)
{
launch_signature_editor (gui, gtk_entry_get_text (GTK_ENTRY (gnome_file_entry_gtk_entry (gui->signature))), FALSE);
}
static void
edit_html_signature (GtkWidget *w, MailAccountGui *gui)
{
launch_signature_editor (gui, gtk_entry_get_text (GTK_ENTRY (gnome_file_entry_gtk_entry (gui->html_signature))), TRUE);
}
static void
signature_changed (GtkWidget *entry, MailAccountGui *gui)
{
gtk_widget_set_sensitive (GTK_WIDGET (gui->edit_signature),
*gtk_entry_get_text (GTK_ENTRY (gnome_file_entry_gtk_entry (gui->signature))) != 0);
}
static void
html_signature_changed (GtkWidget *entry, MailAccountGui *gui)
{
gtk_widget_set_sensitive (GTK_WIDGET (gui->edit_html_signature),
*gtk_entry_get_text (GTK_ENTRY (gnome_file_entry_gtk_entry (gui->html_signature))) != 0);
}
static void
ssl_option_activate (GtkWidget *widget, gpointer user_data)
{
@ -1290,13 +991,377 @@ construct_ssl_menu (MailAccountGuiService *service)
gtk_signal_emit_by_name (GTK_OBJECT (item), "activate", service);
}
static void
clear_menu (GtkWidget *menu)
{
while (GTK_MENU_SHELL (menu)->children)
gtk_container_remove (GTK_CONTAINER (menu), GTK_MENU_SHELL (menu)->children->data);
}
static inline gint
sig_get_index (MailConfigSignature *sig)
{
return sig->id + (mail_config_get_signatures_random () ? 2 : 1);
}
static gint
sig_get_gui_index (MailAccountGui *gui, gboolean text)
{
MailConfigSignature *sig = text ? gui->text_signature : gui->html_signature;
gboolean random = text ? gui->text_random : gui->html_random;
if (random)
return 1;
else if (!sig)
return 0;
else
return sig_get_index (sig);
}
static void
sig_fill_options (MailAccountGui *gui)
{
GtkWidget *menu_text, *menu_html;
GtkWidget *mi;
GList *l;
MailConfigSignature *sig;
menu_text = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text));
menu_html = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html));
clear_menu (menu_text);
clear_menu (menu_html);
gtk_menu_append (GTK_MENU (menu_text), gtk_menu_item_new_with_label (_("None")));
gtk_menu_append (GTK_MENU (menu_html), gtk_menu_item_new_with_label (_("None")));
if (mail_config_get_signatures_random ()) {
gtk_menu_append (GTK_MENU (menu_text), gtk_menu_item_new_with_label (_("Random")));
gtk_menu_append (GTK_MENU (menu_html), gtk_menu_item_new_with_label (_("Random")));
}
for (l = mail_config_get_signature_list (); l; l = l->next) {
sig = l->data;
mi = gtk_menu_item_new_with_label (sig->name);
gtk_object_set_data (GTK_OBJECT (mi), "sig", sig);
gtk_menu_append (GTK_MENU (menu_text), mi);
mi = gtk_menu_item_new_with_label (sig->name);
gtk_object_set_data (GTK_OBJECT (mi), "sig", sig);
gtk_menu_append (GTK_MENU (menu_html), mi);
}
}
static void
sig_select_text_sig (MailAccountGui *gui)
{
gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_text), sig_get_gui_index (gui, TRUE));
}
static void
sig_select_html_sig (MailAccountGui *gui)
{
gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_html), sig_get_gui_index (gui, FALSE));
}
static void
sig_changed_text (GtkWidget *w, MailAccountGui *gui)
{
GtkWidget *active;
gint index;
active = gtk_menu_get_active (GTK_MENU (w));
index = g_list_index (GTK_MENU_SHELL (w)->children, active);
gui->text_signature = (MailConfigSignature *) gtk_object_get_data (GTK_OBJECT (active), "sig");
gui->text_random = index == 1;
gtk_widget_set_sensitive (GTK_WIDGET (gui->sig_edit_text), gui->text_signature != NULL);
}
static void
sig_changed_html (GtkWidget *w, MailAccountGui *gui)
{
GtkWidget *active;
gint index;
active = gtk_menu_get_active (GTK_MENU (w));
index = g_list_index (GTK_MENU_SHELL (w)->children, active);
gui->html_signature = (MailConfigSignature *) gtk_object_get_data (GTK_OBJECT (active), "sig");
gui->html_random = index == 1;
gtk_widget_set_sensitive (GTK_WIDGET (gui->sig_edit_html), gui->html_signature != NULL);
}
static void
sig_edit_text (GtkWidget *w, MailAccountGui *gui)
{
MailConfigSignature *sig = gui->text_signature;
if (!sig)
return;
if (sig->filename && *sig->filename)
mail_signature_editor (sig->filename, sig->html);
else
e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
_("Please specify signature filename\nin Andvanced section of signature settings."));
}
static void
sig_edit_html (GtkWidget *w, MailAccountGui *gui)
{
MailConfigSignature *sig = gui->html_signature;
if (!sig)
return;
if (sig->filename && *sig->filename)
mail_signature_editor (sig->filename, sig->html);
else
e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
_("Please specify signature filename\nin Andvanced section of signature settings."));
}
static void
sig_switch_to_list (GtkWidget *w, MailAccountGui *gui)
{
gtk_window_set_transient_for (GTK_WINDOW (gtk_widget_get_toplevel (w)), NULL);
gdk_window_raise (GTK_WIDGET (gui->dialog)->window);
gtk_notebook_set_page (GTK_NOTEBOOK (glade_xml_get_widget (gui->dialog->gui, "notebook")), 3);
}
static void
sig_set_and_write (MailAccountGui *gui)
{
gui->account->id->text_signature = gui->text_signature;
gui->account->id->text_random = gui->text_random;
gui->account->id->html_signature = gui->html_signature;
gui->account->id->html_random = gui->html_random;
mail_config_write_account_sig (gui->account, -1);
}
static void
sig_new_text (GtkWidget *w, MailAccountGui *gui)
{
if (!gui->dialog)
return;
sig_switch_to_list (w, gui);
gui->text_signature = mail_accounts_dialog_new_signature (gui->dialog, FALSE);
gui->text_random = FALSE;
gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_text), sig_get_index (gui->text_signature));
sig_set_and_write (gui);
}
static void
sig_new_html (GtkWidget *w, MailAccountGui *gui)
{
if (!gui->dialog)
return;
sig_switch_to_list (w, gui);
gui->html_signature = mail_accounts_dialog_new_signature (gui->dialog, TRUE);
gui->html_random = FALSE;
gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_html), sig_get_index (gui->html_signature));
sig_set_and_write (gui);
}
static void
setup_signatures (MailAccountGui *gui)
{
gui->text_signature = gui->account->id->text_signature;
gui->text_random = gui->account->id->text_random;
gui->html_signature = gui->account->id->html_signature;
gui->html_random = gui->account->id->html_random;
sig_select_text_sig (gui);
sig_select_html_sig (gui);
gtk_widget_set_sensitive (GTK_WIDGET (gui->sig_edit_text), gui->text_signature != NULL);
gtk_widget_set_sensitive (GTK_WIDGET (gui->sig_edit_html), gui->html_signature != NULL);
}
static void
sig_event_client (MailConfigSigEvent event, MailConfigSignature *sig, MailAccountGui *gui)
{
switch (event) {
case MAIL_CONFIG_SIG_EVENT_ADDED: {
GtkWidget *menu;
GtkWidget *mi;
printf ("accounts ADDED\n");
mi = gtk_menu_item_new_with_label (sig->name);
gtk_object_set_data (GTK_OBJECT (mi), "sig", sig);
gtk_widget_show (mi);
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text));
gtk_menu_append (GTK_MENU (menu), mi);
mi = gtk_menu_item_new_with_label (sig->name);
gtk_object_set_data (GTK_OBJECT (mi), "sig", sig);
gtk_widget_show (mi);
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html));
gtk_menu_append (GTK_MENU (GTK_MENU (menu)), mi);
break;
}
case MAIL_CONFIG_SIG_EVENT_NAME_CHANGED: {
GtkWidget *menu;
GtkWidget *mi;
printf ("gui NAME CHANGED\n");
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text));
gtk_widget_ref (menu);
gtk_option_menu_remove_menu (GTK_OPTION_MENU (gui->sig_option_text));
mi = g_list_nth_data (GTK_MENU_SHELL (menu)->children, sig_get_index (sig));
gtk_label_set_text (GTK_LABEL (GTK_BIN (mi)->child), sig->name);
gtk_option_menu_set_menu (GTK_OPTION_MENU (gui->sig_option_text), menu);
gtk_widget_unref (menu);
gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_text), sig_get_gui_index (gui, TRUE));
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html));
gtk_widget_ref (menu);
gtk_option_menu_remove_menu (GTK_OPTION_MENU (gui->sig_option_html));
mi = g_list_nth_data (GTK_MENU_SHELL (menu)->children, sig_get_index (sig));
gtk_label_set_text (GTK_LABEL (GTK_BIN (mi)->child), sig->name);
gtk_option_menu_set_menu (GTK_OPTION_MENU (gui->sig_option_html), menu);
gtk_widget_unref (menu);
gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_html), sig_get_gui_index (gui, FALSE));
break;
}
case MAIL_CONFIG_SIG_EVENT_DELETED: {
GtkWidget *menu;
GtkWidget *mi;
printf ("gui DELETED\n");
if (sig == gui->text_signature) {
gui->text_signature = NULL;
gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_text), sig_get_gui_index (gui, TRUE));
}
if (sig == gui->html_signature) {
gui->html_signature = NULL;
gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_html), sig_get_gui_index (gui, FALSE));
}
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text));
mi = g_list_nth_data (GTK_MENU_SHELL (menu)->children, sig_get_index (sig));
gtk_container_remove (GTK_CONTAINER (menu), mi);
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html));
mi = g_list_nth_data (GTK_MENU_SHELL (menu)->children, sig_get_index (sig));
gtk_container_remove (GTK_CONTAINER (menu), mi);
break;
}
case MAIL_CONFIG_SIG_EVENT_RANDOM_ON: {
GtkWidget *menu;
GtkWidget *mi;
printf ("gui RANDOM ON\n");
mi = gtk_menu_item_new_with_label (_("Random"));
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text));
gtk_menu_insert (GTK_MENU (menu), mi, 1);
gtk_widget_show (mi);
mi = gtk_menu_item_new_with_label (_("Random"));
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html));
gtk_menu_insert (GTK_MENU (menu), mi, 1);
gtk_widget_show (mi);
break;
}
case MAIL_CONFIG_SIG_EVENT_RANDOM_OFF: {
GtkWidget *menu;
GtkWidget *mi;
printf ("gui RANDOM OFF\n");
if (gui->text_random) {
gui->text_random = FALSE;
gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_text), sig_get_gui_index (gui, TRUE));
}
if (gui->html_random) {
gui->html_random = FALSE;
gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_html), sig_get_gui_index (gui, FALSE));
}
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text));
mi = g_list_nth_data (GTK_MENU_SHELL (menu)->children, 1);
gtk_container_remove (GTK_CONTAINER (menu), mi);
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html));
mi = g_list_nth_data (GTK_MENU_SHELL (menu)->children, 1);
gtk_container_remove (GTK_CONTAINER (menu), mi);
break;
}
default:
;
}
}
static void
prepare_signatures (MailAccountGui *gui)
{
gui->sig_option_text = glade_xml_get_widget (gui->xml, "option-sig-text");
gui->sig_option_html = glade_xml_get_widget (gui->xml, "option-sig-html");
sig_fill_options (gui);
gtk_signal_connect (GTK_OBJECT (gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_text))),
"selection-done", sig_changed_text, gui);
gtk_signal_connect (GTK_OBJECT (gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_html))),
"selection-done", sig_changed_html, gui);
gui->sig_new_text = glade_xml_get_widget (gui->xml, "button-sig-new-text");
gtk_signal_connect (GTK_OBJECT (gui->sig_new_text), "clicked", GTK_SIGNAL_FUNC (sig_new_text), gui);
gui->sig_new_html = glade_xml_get_widget (gui->xml, "button-sig-new-html");
gtk_signal_connect (GTK_OBJECT (gui->sig_new_html), "clicked", GTK_SIGNAL_FUNC (sig_new_html), gui);
gui->sig_edit_text = glade_xml_get_widget (gui->xml, "button-sig-edit-text");
gtk_signal_connect (GTK_OBJECT (gui->sig_edit_text), "clicked", GTK_SIGNAL_FUNC (sig_edit_text), gui);
gui->sig_edit_html = glade_xml_get_widget (gui->xml, "button-sig-edit-html");
gtk_signal_connect (GTK_OBJECT (gui->sig_edit_html), "clicked", GTK_SIGNAL_FUNC (sig_edit_html), gui);
if (!gui->dialog) {
gtk_widget_hide (glade_xml_get_widget (gui->xml, "label-sig-text"));
gtk_widget_hide (glade_xml_get_widget (gui->xml, "label-sig-html"));
gtk_widget_hide (gui->sig_option_text);
gtk_widget_hide (gui->sig_option_html);
gtk_widget_hide (gui->sig_new_text);
gtk_widget_hide (gui->sig_new_html);
gtk_widget_hide (gui->sig_edit_text);
gtk_widget_hide (gui->sig_edit_html);
} else {
mail_config_signature_register_client ((MailConfigSignatureClient) sig_event_client, gui);
}
}
MailAccountGui *
mail_account_gui_new (MailConfigAccount *account)
mail_account_gui_new (MailConfigAccount *account, MailAccountsDialog *dialog)
{
MailAccountGui *gui;
gui = g_new0 (MailAccountGui, 1);
gui->account = account;
gui->dialog = dialog;
gui->xml = glade_xml_new (EVOLUTION_GLADEDIR "/mail-config.glade", NULL);
/* Management */
@ -1312,21 +1377,8 @@ mail_account_gui_new (MailConfigAccount *account)
gui->full_name = GTK_ENTRY (glade_xml_get_widget (gui->xml, "identity_full_name"));
gui->email_address = GTK_ENTRY (glade_xml_get_widget (gui->xml, "identity_address"));
gui->organization = GTK_ENTRY (glade_xml_get_widget (gui->xml, "identity_organization"));
gui->signature = GNOME_FILE_ENTRY (glade_xml_get_widget (gui->xml, "fileentry_signature"));
gui->html_signature = GNOME_FILE_ENTRY (glade_xml_get_widget (gui->xml, "fileentry_html_signature"));
gui->has_html_signature = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "check_html_signature"));
gnome_file_entry_set_default_path (gui->signature, g_get_home_dir ());
gnome_file_entry_set_default_path (gui->html_signature, g_get_home_dir ());
gui->edit_signature = GTK_BUTTON (glade_xml_get_widget (gui->xml, "button_edit_signature"));
gtk_widget_set_sensitive (GTK_WIDGET (gui->edit_signature), FALSE);
gui->edit_html_signature = GTK_BUTTON (glade_xml_get_widget (gui->xml, "button_edit_html_signature"));
gtk_widget_set_sensitive (GTK_WIDGET (gui->edit_html_signature), FALSE);
gtk_signal_connect (GTK_OBJECT (gnome_file_entry_gtk_entry (gui->signature)), "changed", signature_changed, gui);
gtk_signal_connect (GTK_OBJECT (gnome_file_entry_gtk_entry (gui->html_signature)), "changed",
html_signature_changed, gui);
gtk_signal_connect (GTK_OBJECT (gui->edit_signature), "clicked", edit_signature, gui);
gtk_signal_connect (GTK_OBJECT (gui->edit_html_signature), "clicked", edit_html_signature, gui);
prepare_signatures (gui);
if (account->id) {
if (account->id->name)
@ -1335,17 +1387,8 @@ mail_account_gui_new (MailConfigAccount *account)
gtk_entry_set_text (gui->email_address, account->id->address);
if (account->id->organization)
e_utf8_gtk_entry_set_text (gui->organization, account->id->organization);
if (account->id->signature) {
gnome_file_entry_set_default_path (gui->signature, account->id->signature);
gtk_entry_set_text (GTK_ENTRY (gnome_file_entry_gtk_entry (gui->signature)),
account->id->signature);
}
if (account->id->html_signature) {
gnome_file_entry_set_default_path (gui->html_signature, account->id->html_signature);
gtk_entry_set_text (GTK_ENTRY (gnome_file_entry_gtk_entry (gui->html_signature)),
account->id->html_signature);
}
gtk_toggle_button_set_active (gui->has_html_signature, account->id->has_html_signature);
setup_signatures (gui);
}
/* Source */
@ -1755,10 +1798,9 @@ mail_account_gui_save (MailAccountGui *gui)
account->id->name = e_utf8_gtk_entry_get_text (gui->full_name);
account->id->address = e_utf8_gtk_entry_get_text (gui->email_address);
account->id->organization = e_utf8_gtk_entry_get_text (gui->organization);
account->id->signature = gnome_file_entry_get_full_path (gui->signature, TRUE);
account->id->html_signature = gnome_file_entry_get_full_path (gui->html_signature, TRUE);
account->id->has_html_signature = gtk_toggle_button_get_active (gui->has_html_signature);
sig_set_and_write (gui);
old_enabled = account->source && account->source->enabled;
service_destroy (account->source);
account->source = g_new0 (MailConfigService, 1);
@ -1849,6 +1891,9 @@ mail_account_gui_save (MailAccountGui *gui)
void
mail_account_gui_destroy (MailAccountGui *gui)
{
if (gui->dialog)
mail_config_signature_unregister_client ((MailConfigSignatureClient) sig_event_client, gui);
gtk_object_unref (GTK_OBJECT (gui->xml));
if (gui->extra_config)
g_hash_table_destroy (gui->extra_config);

View File

@ -36,6 +36,7 @@ extern "C" {
#include <camel/camel-provider.h>
#include "mail-config.h"
#include "mail-accounts.h"
typedef struct {
GtkOptionMenu *type;
@ -63,18 +64,26 @@ typedef struct {
typedef struct {
GtkWidget *top;
MailConfigAccount *account;
MailAccountsDialog *dialog;
GladeXML *xml;
/* identity */
GtkEntry *full_name;
GtkEntry *email_address;
GtkEntry *organization;
GnomeFileEntry *signature;
GnomeFileEntry *html_signature;
GtkToggleButton *has_html_signature;
GtkButton *edit_signature;
GtkButton *edit_html_signature;
/* signatures */
GtkWidget *sig_option_text;
GtkWidget *sig_option_html;
GtkWidget *sig_new_text;
GtkWidget *sig_new_html;
GtkWidget *sig_edit_text;
GtkWidget *sig_edit_html;
MailConfigSignature *text_signature;
gboolean text_random;
MailConfigSignature *html_signature;
gboolean html_random;
/* incoming mail */
MailAccountGuiService source;
GtkToggleButton *source_auto_check;
@ -113,7 +122,7 @@ typedef struct {
} MailAccountGui;
MailAccountGui *mail_account_gui_new (MailConfigAccount *account);
MailAccountGui *mail_account_gui_new (MailConfigAccount *account, MailAccountsDialog *dialog);
void mail_account_gui_setup (MailAccountGui *gui, GtkWidget *top);
gboolean mail_account_gui_save (MailAccountGui *gui);
void mail_account_gui_destroy (MailAccountGui *gui);

View File

@ -33,6 +33,7 @@
#include <camel/camel-pgp-context.h>
#include <gal/widgets/e-unicode.h>
#include <gal/widgets/e-gui-utils.h>
#include "widgets/misc/e-charset-picker.h"
@ -46,6 +47,7 @@
#endif
#include "mail-send-recv.h"
#include "mail-session.h"
#include "mail-signature-editor.h"
#include "art/mark.xpm"
@ -268,7 +270,7 @@ mail_edit (GtkButton *button, gpointer data)
MailConfigAccount *account;
account = gtk_clist_get_row_data (dialog->mail_accounts, dialog->accounts_row);
editor = mail_account_editor_new (account, GTK_WINDOW (dialog));
editor = mail_account_editor_new (account, GTK_WINDOW (dialog), dialog);
gtk_signal_connect (GTK_OBJECT (editor), "destroy",
GTK_SIGNAL_FUNC (mail_editor_destroyed),
dialog);
@ -797,6 +799,8 @@ charset_menu_deactivate (GtkWidget *menu, gpointer data)
}
}
static void sig_event_client (MailConfigSigEvent event, MailConfigSignature *sig, MailAccountsDialog *dialog);
static void
dialog_destroy (GtkWidget *dialog, gpointer user_data)
{
@ -810,6 +814,372 @@ dialog_destroy (GtkWidget *dialog, gpointer user_data)
if (news_editor)
gtk_widget_destroy (GTK_WIDGET (news_editor));
#endif
mail_config_signature_unregister_client ((MailConfigSignatureClient) sig_event_client, dialog);
gtk_widget_unref (((MailAccountsDialog *) dialog)->sig_advanced_button);
gtk_widget_unref (((MailAccountsDialog *) dialog)->sig_simple_button);
}
/* Signatures */
static void
sig_load_preview (MailAccountsDialog *dialog, MailConfigSignature *sig)
{
gchar *str;
if (!sig) {
gtk_html_load_from_string (GTK_HTML (dialog->sig_gtk_html), " ", 1);
return;
}
mail_config_signature_run_script (sig->script);
str = e_msg_composer_get_sig_file_content (sig->filename, sig->html);
if (!str)
str = g_strdup (" ");
/* printf ("HTML: %s\n", str); */
if (sig->html)
gtk_html_load_from_string (GTK_HTML (dialog->sig_gtk_html), str, strlen (str));
else {
GtkHTMLStream *stream;
gint len;
len = strlen (str);
stream = gtk_html_begin (GTK_HTML (dialog->sig_gtk_html));
gtk_html_write (GTK_HTML (dialog->sig_gtk_html), stream, "<PRE>", 5);
if (len)
gtk_html_write (GTK_HTML (dialog->sig_gtk_html), stream, str, len);
gtk_html_write (GTK_HTML (dialog->sig_gtk_html), stream, "</PRE>", 6);
gtk_html_end (GTK_HTML (dialog->sig_gtk_html), stream, GTK_HTML_STREAM_OK);
}
g_free (str);
}
static inline void
sig_write_and_update_preview (MailAccountsDialog *dialog, MailConfigSignature *sig)
{
sig_load_preview (dialog, sig);
mail_config_signature_write (sig);
}
static MailConfigSignature *
sig_current_sig (MailAccountsDialog *dialog)
{
return gtk_clist_get_row_data (GTK_CLIST (dialog->sig_clist), dialog->sig_row);
}
static void
sig_edit (GtkWidget *w, MailAccountsDialog *dialog)
{
MailConfigSignature *sig = sig_current_sig (dialog);
if (sig->filename && *sig->filename)
mail_signature_editor (sig->filename, sig->html);
else
e_notice (GTK_WINDOW (dialog), GNOME_MESSAGE_BOX_ERROR,
_("Please specify signature filename\nin Andvanced section of signature settings."));
}
MailConfigSignature *
mail_accounts_dialog_new_signature (MailAccountsDialog *dialog, gboolean html)
{
MailConfigSignature *sig;
gchar *name [1];
gint row;
sig = mail_config_signature_add (html);
name [0] = sig->name;
row = gtk_clist_append (GTK_CLIST (dialog->sig_clist), name);
gtk_clist_set_row_data (GTK_CLIST (dialog->sig_clist), row, sig);
gtk_clist_select_row (GTK_CLIST (dialog->sig_clist), row, 0);
gtk_widget_grab_focus (dialog->sig_name);
sig_edit (NULL, dialog);
return sig;
}
static void sig_row_unselect (GtkWidget *w, gint row, gint col, GdkEvent *event, MailAccountsDialog *dialog);
static void
sig_delete (GtkWidget *w, MailAccountsDialog *dialog)
{
MailConfigSignature *sig = sig_current_sig (dialog);
gtk_clist_remove (GTK_CLIST (dialog->sig_clist), dialog->sig_row);
mail_config_signature_delete (sig);
if (dialog->sig_row < GTK_CLIST (dialog->sig_clist)->rows)
gtk_clist_select_row (GTK_CLIST (dialog->sig_clist), dialog->sig_row, 0);
else if (dialog->sig_row)
gtk_clist_select_row (GTK_CLIST (dialog->sig_clist), dialog->sig_row - 1, 0);
else
sig_row_unselect (dialog->sig_clist, dialog->sig_row, 0, NULL, dialog);
}
static void
sig_add (GtkWidget *w, MailAccountsDialog *dialog)
{
mail_accounts_dialog_new_signature (dialog, FALSE);
}
static void
sig_level (GtkWidget *w, MailAccountsDialog *dialog)
{
GtkWidget *button;
gboolean level;
if (!GTK_WIDGET_VISIBLE (w))
return;
level = w == dialog->sig_advanced_button;
button = level ? dialog->sig_simple_button : dialog->sig_advanced_button;
gtk_widget_hide (w);
gtk_container_remove (GTK_CONTAINER (dialog->sig_level_bbox), w);
gtk_box_pack_start (GTK_BOX (dialog->sig_level_bbox), button, FALSE, 0, FALSE);
gtk_widget_show (button);
level ? gtk_widget_hide (dialog->sig_preview) : gtk_widget_show (dialog->sig_preview);
level ? gtk_widget_show (dialog->sig_advanced_table) : gtk_widget_hide (dialog->sig_advanced_table);
}
static void
sig_row_select (GtkWidget *w, gint row, gint col, GdkEvent *event, MailAccountsDialog *dialog)
{
MailConfigSignature *sig;
printf ("sig_row_select\n");
gtk_widget_set_sensitive (dialog->sig_add, TRUE);
gtk_widget_set_sensitive (dialog->sig_delete, TRUE);
gtk_widget_set_sensitive (dialog->sig_edit, TRUE);
gtk_widget_set_sensitive (dialog->sig_name, TRUE);
gtk_widget_set_sensitive (dialog->sig_random, TRUE);
gtk_widget_set_sensitive (dialog->sig_filename, TRUE);
gtk_widget_set_sensitive (dialog->sig_script, TRUE);
gtk_widget_set_sensitive (dialog->sig_html, TRUE);
dialog->sig_switch = TRUE;
sig = gtk_clist_get_row_data (GTK_CLIST (dialog->sig_clist), row);
if (sig) {
if (sig->name)
gtk_entry_set_text (GTK_ENTRY (dialog->sig_name), sig->name);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->sig_random), sig->random);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->sig_html), sig->html);
if (sig->filename)
gtk_entry_set_text (GTK_ENTRY (gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (dialog->sig_filename))),
sig->filename);
if (sig->script)
gtk_entry_set_text (GTK_ENTRY (gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (dialog->sig_script))),
sig->script);
}
dialog->sig_switch = FALSE;
dialog->sig_row = row;
sig_load_preview (dialog, sig);
}
static void
sig_row_unselect (GtkWidget *w, gint row, gint col, GdkEvent *event, MailAccountsDialog *dialog)
{
printf ("sig_row_unselect\n");
gtk_widget_set_sensitive (dialog->sig_add, FALSE);
gtk_widget_set_sensitive (dialog->sig_delete, FALSE);
gtk_widget_set_sensitive (dialog->sig_edit, FALSE);
gtk_widget_set_sensitive (dialog->sig_name, FALSE);
gtk_widget_set_sensitive (dialog->sig_random, FALSE);
gtk_widget_set_sensitive (dialog->sig_filename, FALSE);
gtk_widget_set_sensitive (dialog->sig_script, FALSE);
dialog->sig_switch = TRUE;
gtk_entry_set_text (GTK_ENTRY (dialog->sig_name), "");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->sig_random), FALSE);
gtk_entry_set_text (GTK_ENTRY (gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (dialog->sig_filename))), "");
gtk_entry_set_text (GTK_ENTRY (gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (dialog->sig_script))), "");
dialog->sig_switch = FALSE;
}
static void
sig_fill_clist (GtkWidget *clist)
{
GList *l;
gchar *name [1];
gint row;
gtk_clist_freeze (GTK_CLIST (clist));
for (l = mail_config_get_signature_list (); l; l = l->next) {
name [0] = ((MailConfigSignature *) l->data)->name;
row = gtk_clist_append (GTK_CLIST (clist), name);
gtk_clist_set_row_data (GTK_CLIST (clist), row, l->data);
}
gtk_clist_thaw (GTK_CLIST (clist));
}
static void
sig_name_changed (GtkWidget *w, MailAccountsDialog *dialog)
{
MailConfigSignature *sig = sig_current_sig (dialog);
if (dialog->sig_switch)
return;
mail_config_signature_set_name (sig, gtk_entry_get_text (GTK_ENTRY (dialog->sig_name)));
gtk_clist_set_text (GTK_CLIST (dialog->sig_clist), dialog->sig_row, 0, sig->name);
sig_write_and_update_preview (dialog, sig);
}
static void
sig_random_toggled (GtkWidget *w, MailAccountsDialog *dialog)
{
MailConfigSignature *sig = sig_current_sig (dialog);
if (dialog->sig_switch)
return;
mail_config_signature_set_random (sig, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->sig_random)));
sig_write_and_update_preview (dialog, sig);
}
static void
sig_html_toggled (GtkWidget *w, MailAccountsDialog *dialog)
{
MailConfigSignature *sig = sig_current_sig (dialog);
if (dialog->sig_switch)
return;
sig->html = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->sig_html));
sig_write_and_update_preview (dialog, sig);
}
static void
sig_filename_changed (GtkWidget *w, MailAccountsDialog *dialog)
{
MailConfigSignature *sig = sig_current_sig (dialog);
if (dialog->sig_switch)
return;
mail_config_signature_set_filename (sig, gnome_file_entry_get_full_path (GNOME_FILE_ENTRY (dialog->sig_filename),
FALSE));
sig_write_and_update_preview (dialog, sig);
}
static void
sig_script_changed (GtkWidget *w, MailAccountsDialog *dialog)
{
MailConfigSignature *sig = sig_current_sig (dialog);
if (dialog->sig_switch)
return;
g_free (sig->script);
sig->script = g_strdup (gnome_file_entry_get_full_path (GNOME_FILE_ENTRY (dialog->sig_script), FALSE));
sig_write_and_update_preview (dialog, sig);
}
static void
url_requested (GtkHTML *html, const gchar *url, GtkHTMLStream *handle)
{
GtkHTMLStreamStatus status;
gint fd;
if (!strncmp (url, "file:", 5))
url += 5;
fd = open (url, O_RDONLY);
status = GTK_HTML_STREAM_OK;
if (fd != -1) {
ssize_t size;
void *buf = alloca (1 << 7);
while ((size = read (fd, buf, 1 << 7))) {
if (size == -1) {
status = GTK_HTML_STREAM_ERROR;
break;
} else
gtk_html_write (html, handle, (const gchar *) buf, size);
}
} else
status = GTK_HTML_STREAM_ERROR;
gtk_html_end (html, handle, status);
}
static void
sig_event_client (MailConfigSigEvent event, MailConfigSignature *sig, MailAccountsDialog *dialog)
{
switch (event) {
case MAIL_CONFIG_SIG_EVENT_NAME_CHANGED:
printf ("accounts NAME CHANGED\n");
break;
default:
;
}
}
static void
signatures_page_construct (MailAccountsDialog *dialog, GladeXML *gui)
{
dialog->sig_add = glade_xml_get_widget (gui, "button-sig-add");
gtk_signal_connect (GTK_OBJECT (dialog->sig_add), "clicked", GTK_SIGNAL_FUNC (sig_add), dialog);
dialog->sig_delete = glade_xml_get_widget (gui, "button-sig-delete");
gtk_signal_connect (GTK_OBJECT (dialog->sig_delete), "clicked", GTK_SIGNAL_FUNC (sig_delete), dialog);
dialog->sig_edit = glade_xml_get_widget (gui, "button-sig-edit");
gtk_signal_connect (GTK_OBJECT (dialog->sig_edit), "clicked", GTK_SIGNAL_FUNC (sig_edit), dialog);
dialog->sig_advanced_button = glade_xml_get_widget (gui, "button-sig-advanced");
gtk_signal_connect (GTK_OBJECT (dialog->sig_advanced_button), "clicked", GTK_SIGNAL_FUNC (sig_level), dialog);
dialog->sig_simple_button = glade_xml_get_widget (gui, "button-sig-simple");
gtk_signal_connect (GTK_OBJECT (dialog->sig_simple_button), "clicked", GTK_SIGNAL_FUNC (sig_level), dialog);
dialog->sig_level_bbox = glade_xml_get_widget (gui, "vbbox-sig-level");
gtk_widget_ref (dialog->sig_advanced_button);
gtk_widget_ref (dialog->sig_simple_button);
gtk_widget_hide (dialog->sig_simple_button);
gtk_container_remove (GTK_CONTAINER (dialog->sig_level_bbox), dialog->sig_simple_button);
dialog->sig_clist = glade_xml_get_widget (gui, "clist-sig");
sig_fill_clist (dialog->sig_clist);
gtk_signal_connect (GTK_OBJECT (dialog->sig_clist), "select_row", GTK_SIGNAL_FUNC (sig_row_select), dialog);
gtk_signal_connect (GTK_OBJECT (dialog->sig_clist), "unselect_row", GTK_SIGNAL_FUNC (sig_row_unselect), dialog);
dialog->sig_name = glade_xml_get_widget (gui, "entry-sig-name");
gtk_signal_connect (GTK_OBJECT (dialog->sig_name), "changed", GTK_SIGNAL_FUNC (sig_name_changed), dialog);
dialog->sig_html = glade_xml_get_widget (gui, "check-sig-html");
gtk_signal_connect (GTK_OBJECT (dialog->sig_html), "toggled", GTK_SIGNAL_FUNC (sig_html_toggled), dialog);
dialog->sig_random = glade_xml_get_widget (gui, "check-sig-random");
gtk_signal_connect (GTK_OBJECT (dialog->sig_random), "toggled", GTK_SIGNAL_FUNC (sig_random_toggled), dialog);
dialog->sig_filename = glade_xml_get_widget (gui, "file-sig-filename");
gtk_signal_connect (GTK_OBJECT (gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (dialog->sig_filename))),
"changed", GTK_SIGNAL_FUNC (sig_filename_changed), dialog);
dialog->sig_script = glade_xml_get_widget (gui, "file-sig-script");
gtk_signal_connect (GTK_OBJECT (gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (dialog->sig_script))),
"changed", GTK_SIGNAL_FUNC (sig_script_changed), dialog);
dialog->sig_advanced_table = glade_xml_get_widget (gui, "table-sig-advanced");
dialog->sig_preview = glade_xml_get_widget (gui, "frame-sig-preview");
/* preview GtkHTML widget */
dialog->sig_scrolled = glade_xml_get_widget (gui, "scrolled-sig");
dialog->sig_gtk_html = gtk_html_new ();
gtk_signal_connect (GTK_OBJECT (dialog->sig_gtk_html), "url_requested", GTK_SIGNAL_FUNC (url_requested), NULL);
gtk_widget_show (dialog->sig_gtk_html);
gtk_container_add (GTK_CONTAINER (dialog->sig_scrolled), dialog->sig_gtk_html);
if (GTK_CLIST (dialog->sig_clist)->rows)
gtk_clist_select_row (GTK_CLIST (dialog->sig_clist), 0, 0);
mail_config_signature_register_client ((MailConfigSignatureClient) sig_event_client, dialog);
}
static void
@ -954,6 +1324,9 @@ construct (MailAccountsDialog *dialog)
gtk_toggle_button_set_active (dialog->prompt_unwanted_html, mail_config_get_confirm_unwanted_html ());
gtk_signal_connect (GTK_OBJECT (dialog->prompt_unwanted_html), "toggled",
GTK_SIGNAL_FUNC (prompt_unwanted_html_toggled), dialog);
/* Signatures page */
signatures_page_construct (dialog, gui);
/* Other page */
dialog->pgp_path = GNOME_FILE_ENTRY (glade_xml_get_widget (gui, "filePgpPath"));

View File

@ -88,6 +88,29 @@ struct _MailAccountsDialog {
GtkToggleButton *prompt_bcc_only;
GtkToggleButton *prompt_unwanted_html;
/* Signatures page */
GtkWidget *sig_clist;
GtkWidget *sig_name;
GtkWidget *sig_random;
GtkWidget *sig_filename;
GtkWidget *sig_script;
GtkWidget *sig_html;
GtkWidget *sig_scrolled;
GtkWidget *sig_gtk_html;
GtkWidget *sig_preview;
GtkWidget *sig_add;
GtkWidget *sig_delete;
GtkWidget *sig_edit;
GtkWidget *sig_simple_button;
GtkWidget *sig_advanced_button;
GtkWidget *sig_level_bbox;
GtkWidget *sig_advanced_table;
gboolean sig_switch;
gint sig_row;
/* Other page */
GtkToggleButton *empty_trash;
GtkToggleButton *filter_log;
@ -118,6 +141,7 @@ typedef struct {
GtkType mail_accounts_dialog_get_type (void);
MailAccountsDialog *mail_accounts_dialog_new (GNOME_Evolution_Shell shell);
MailConfigSignature *mail_accounts_dialog_new_signature (MailAccountsDialog *dialog, gboolean html);
#ifdef __cplusplus
}

View File

@ -696,7 +696,7 @@ get_fn (EvolutionWizard *wizard,
gui->account);
}
gui->gui = mail_account_gui_new (gui->account);
gui->gui = mail_account_gui_new (gui->account, NULL);
/* set up signals, etc */
gtk_signal_connect (GTK_OBJECT (gui->gui->account_name),

View File

@ -1,6 +1,7 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Authors: Jeffrey Stedfast <fejj@ximian.com>
* Radek Doulik <rodo@ximian.com>
*
* Copyright 2001 Ximian, Inc. (www.ximian.com)
*
@ -113,6 +114,10 @@ typedef struct {
char *notify_filename;
char *last_filesel_dir;
GList *signature_list;
gint signatures;
gint signatures_random;
} MailConfig;
static MailConfig *config = NULL;
@ -123,6 +128,34 @@ static MailConfig *config = NULL;
static void config_read (void);
static void mail_config_set_default_account_num (int new_default);
/* signatures */
MailConfigSignature *
signature_copy (const MailConfigSignature *sig)
{
MailConfigSignature *ns;
g_return_val_if_fail (sig != NULL, NULL);
ns = g_new (MailConfigSignature, 1);
ns->id = sig->id;
ns->name = g_strdup (sig->name);
ns->filename = g_strdup (sig->filename);
ns->script = g_strdup (sig->script);
ns->random = sig->random;
ns->html = sig->html;
return ns;
}
void
signature_destroy (MailConfigSignature *sig)
{
g_free (sig->name);
g_free (sig->filename);
g_free (sig->script);
g_free (sig);
}
/* Identity */
MailConfigIdentity *
@ -136,10 +169,11 @@ identity_copy (const MailConfigIdentity *id)
new->name = g_strdup (id->name);
new->address = g_strdup (id->address);
new->organization = g_strdup (id->organization);
new->signature = g_strdup (id->signature);
new->html_signature = g_strdup (id->html_signature);
new->has_html_signature = id->has_html_signature;
new->text_signature = id->text_signature;
new->text_random = id->text_random;
new->html_signature = id->html_signature;
new->html_random = id->html_random;
return new;
}
@ -152,8 +186,6 @@ identity_destroy (MailConfigIdentity *id)
g_free (id->name);
g_free (id->address);
g_free (id->organization);
g_free (id->signature);
g_free (id->html_signature);
g_free (id);
}
@ -328,12 +360,238 @@ mail_config_clear (void)
config->last_filesel_dir = NULL;
}
static MailConfigSignature *
config_read_signature (gint i)
{
MailConfigSignature *sig;
gchar *path, *val;
sig = g_new0 (MailConfigSignature, 1);
sig->id = i;
path = g_strdup_printf ("/Mail/Signatures/name_%d", i);
val = bonobo_config_get_string (config->db, path, NULL);
g_free (path);
if (val && *val)
sig->name = val;
else
g_free (val);
path = g_strdup_printf ("/Mail/Signatures/filename_%d", i);
val = bonobo_config_get_string (config->db, path, NULL);
g_free (path);
if (val && *val)
sig->filename = val;
else
g_free (val);
path = g_strdup_printf ("/Mail/Signatures/script_%d", i);
val = bonobo_config_get_string (config->db, path, NULL);
g_free (path);
if (val && *val)
sig->script = val;
else
g_free (val);
path = g_strdup_printf ("/Mail/Signatures/random_%d", i);
sig->random = bonobo_config_get_boolean_with_default (config->db, path, FALSE, NULL);
path = g_strdup_printf ("/Mail/Signatures/html_%d", i);
sig->html = bonobo_config_get_boolean_with_default (config->db, path, FALSE, NULL);
return sig;
}
static void
config_read_signatures ()
{
MailConfigSignature *sig;
gint i;
config->signature_list = NULL;
config->signatures_random = 0;
config->signatures = bonobo_config_get_long_with_default (config->db, "/Mail/Signatures/num", 0, NULL);
for (i = 0; i < config->signatures; i ++) {
sig = config_read_signature (i);
config->signature_list = g_list_append (config->signature_list, sig);
if (sig->random)
config->signatures_random ++;
}
}
static void
config_write_signature (MailConfigSignature *sig, gint i)
{
gchar *path;
printf ("config_write_signature i: %d id: %d\n", i, sig->id);
path = g_strdup_printf ("/Mail/Signatures/name_%d", i);
bonobo_config_set_string (config->db, path, sig->name ? sig->name : "", NULL);
g_free (path);
path = g_strdup_printf ("/Mail/Signatures/filename_%d", i);
bonobo_config_set_string (config->db, path, sig->filename ? sig->filename : "", NULL);
g_free (path);
path = g_strdup_printf ("/Mail/Signatures/script_%d", i);
bonobo_config_set_string (config->db, path, sig->script ? sig->script : "", NULL);
g_free (path);
path = g_strdup_printf ("/Mail/Signatures/random_%d", i);
bonobo_config_set_boolean (config->db, path, sig->random, NULL);
path = g_strdup_printf ("/Mail/Signatures/html_%d", i);
bonobo_config_set_boolean (config->db, path, sig->html, NULL);
}
static void
config_write_signatures_num ()
{
bonobo_config_set_long (config->db, "/Mail/Signatures/num", config->signatures, NULL);
}
static void
config_write_signatures ()
{
GList *l;
gint id;
for (id = 0, l = config->signature_list; l; l = l->next, id ++) {
config_write_signature ((MailConfigSignature *) l->data, id);
}
config_write_signatures_num ();
}
static MailConfigSignature *
lookup_signature (gint i)
{
MailConfigSignature *sig;
GList *l;
if (i == -1)
return NULL;
for (l = config->signature_list; l; l = l->next) {
sig = (MailConfigSignature *) l->data;
if (sig->id == i)
return sig;
}
return NULL;
}
static void
config_write_imported_signature (gchar *filename, gint i, gboolean html)
{
MailConfigSignature *sig = g_new0 (MailConfigSignature, 1);
gchar *name;
name = strrchr (filename, '/');
if (!name)
name = filename;
else
name ++;
sig->name = g_strdup (name);
sig->filename = filename;
sig->html = html;
config_write_signature (sig, i);
signature_destroy (sig);
}
static void
config_import_old_signatures ()
{
gint num;
num = bonobo_config_get_long_with_default (config->db, "/Mail/Signatures/num", -1, NULL);
if (num == -1) {
/* there are no signatures defined
* look for old config to create new ones from old ones
*/
GHashTable *cache;
gint i, accounts;
cache = g_hash_table_new (g_str_hash, g_str_equal);
accounts = bonobo_config_get_long_with_default (config->db, "/Mail/Accounts/num", 0, NULL);
num = 0;
for (i = 0; i < accounts; i ++) {
gchar *path, *val;
/* read text signature file */
path = g_strdup_printf ("/Mail/Accounts/identity_signature_%d", i);
val = bonobo_config_get_string (config->db, path, NULL);
g_free (path);
if (val && *val) {
gint id;
gpointer orig_key, node_val;
if (g_hash_table_lookup_extended (cache, val, &orig_key, &node_val)) {
id = GPOINTER_TO_INT (node_val);
} else {
g_hash_table_insert (cache, g_strdup (val), GINT_TO_POINTER (id));
config_write_imported_signature (val, num, FALSE);
id = num;
num ++;
}
/* set new text signature to this identity */
path = g_strdup_printf ("/Mail/Accounts/identity_signature_text_%d", i);
bonobo_config_set_long (config->db, path, id, NULL);
g_free (path);
} else
g_free (val);
path = g_strdup_printf ("/Mail/Accounts/identity_has_html_signature_%d", i);
if (bonobo_config_get_boolean_with_default (config->db, path, FALSE, NULL)) {
g_free (path);
path = g_strdup_printf ("/Mail/Accounts/identity_html_signature_%d", i);
val = bonobo_config_get_string (config->db, path, NULL);
if (val && *val) {
gint id;
gpointer orig_key, node_val;
if (g_hash_table_lookup_extended (cache, val, &orig_key, &node_val)) {
id = GPOINTER_TO_INT (node_val);
} else {
g_hash_table_insert (cache, g_strdup (val), GINT_TO_POINTER (id));
config_write_imported_signature (val, num, TRUE);
id = num;
num ++;
}
/* set new html signature to this identity */
g_free (path);
path = g_strdup_printf ("/Mail/Accounts/identity_signature_html_%d", i);
bonobo_config_set_long (config->db, path, id, NULL);
} else
g_free (val);
}
g_free (path);
}
bonobo_config_set_long (config->db, "/Mail/Signatures/num", num, NULL);
g_hash_table_destroy (cache);
}
}
static void
config_read (void)
{
int len, i, default_num;
mail_config_clear ();
config_import_old_signatures ();
config_read_signatures ();
len = bonobo_config_get_long_with_default (config->db,
"/Mail/Accounts/num", 0, NULL);
@ -467,17 +725,23 @@ config_read (void)
id->organization = bonobo_config_get_string (config->db, path, NULL);
g_free (path);
path = g_strdup_printf ("/Mail/Accounts/identity_signature_%d", i);
id->signature = bonobo_config_get_string (config->db, path, NULL);
/* id signatures */
path = g_strdup_printf ("/Mail/Accounts/identity_signature_text_%d", i);
id->text_signature = lookup_signature (bonobo_config_get_long_with_default (config->db, path, -1, NULL));
g_free (path);
path = g_strdup_printf ("/Mail/Accounts/identity_html_signature_%d", i);
id->html_signature = bonobo_config_get_string (config->db, path, NULL);
path = g_strdup_printf ("/Mail/Accounts/identity_signature_html_%d", i);
id->html_signature = lookup_signature (bonobo_config_get_long_with_default (config->db, path, -1, NULL));
g_free (path);
path = g_strdup_printf ("/Mail/Accounts/identity_has_html_signature_%d", i);
id->has_html_signature = bonobo_config_get_boolean_with_default (
config->db, path, FALSE, NULL);
path = g_strdup_printf ("/Mail/Accounts/identity_signature_text_random_%d", i);
id->text_random = bonobo_config_get_boolean_with_default (config->db, path, FALSE, NULL);
g_free (path);
path = g_strdup_printf ("/Mail/Accounts/identity_signature_html_random_%d", i);
id->html_random = bonobo_config_get_boolean_with_default (config->db, path, FALSE, NULL);
g_free (path);
/* get the source */
source = g_new0 (MailConfigService, 1);
@ -687,6 +951,42 @@ config_read (void)
#define bonobo_config_set_string_wrapper(db, path, val, ev) bonobo_config_set_string (db, path, val ? val : "", ev)
void
mail_config_write_account_sig (MailConfigAccount *account, gint i)
{
char *path;
if (i == -1) {
GSList *link;
link = g_slist_find (config->accounts, account);
if (!link) {
g_warning ("Can't find account in accounts list");
return;
}
i = g_slist_position (config->accounts, link);
}
/* id signatures */
path = g_strdup_printf ("/Mail/Accounts/identity_signature_text_%d", i);
bonobo_config_set_long (config->db, path, account->id->text_signature
? account->id->text_signature->id : -1, NULL);
g_free (path);
path = g_strdup_printf ("/Mail/Accounts/identity_signature_html_%d", i);
bonobo_config_set_long (config->db, path, account->id->html_signature
? account->id->html_signature->id : -1, NULL);
g_free (path);
path = g_strdup_printf ("/Mail/Accounts/identity_signature_text_random_%d", i);
bonobo_config_set_boolean (config->db, path, account->id->text_random, NULL);
g_free (path);
path = g_strdup_printf ("/Mail/Accounts/identity_signature_html_random_%d", i);
bonobo_config_set_boolean (config->db, path, account->id->html_random, NULL);
g_free (path);
}
void
mail_config_write (void)
{
@ -705,6 +1005,8 @@ mail_config_write (void)
CORBA_exception_init (&ev);
Bonobo_ConfigDatabase_sync (config->db, &ev);
config_write_signatures ();
len = g_slist_length (config->accounts);
bonobo_config_set_long (config->db,
"/Mail/Accounts/num", len, NULL);
@ -802,18 +1104,8 @@ mail_config_write (void)
bonobo_config_set_string_wrapper (config->db, path, account->id->organization, NULL);
g_free (path);
path = g_strdup_printf ("/Mail/Accounts/identity_signature_%d", i);
bonobo_config_set_string_wrapper (config->db, path, account->id->signature, NULL);
g_free (path);
path = g_strdup_printf ("/Mail/Accounts/identity_html_signature_%d", i);
bonobo_config_set_string_wrapper (config->db, path, account->id->html_signature, NULL);
g_free (path);
path = g_strdup_printf ("/Mail/Accounts/identity_has_html_signature_%d", i);
bonobo_config_set_boolean (config->db, path, account->id->has_html_signature, NULL);
g_free (path);
mail_config_write_account_sig (account, i);
/* source info */
path = g_strdup_printf ("/Mail/Accounts/source_url_%d", i);
bonobo_config_set_string_wrapper (config->db, path, account->source->url, NULL);
@ -2438,9 +2730,6 @@ impl_GNOME_Evolution_MailConfig_addAccount (PortableServer_Servant servant,
mail_id->name = g_strdup (id.name);
mail_id->address = g_strdup (id.address);
mail_id->organization = g_strdup (id.organization);
mail_id->signature = g_strdup (id.signature);
mail_id->html_signature = g_strdup (id.html_signature);
mail_id->has_html_signature = id.has_html_signature;
mail_account->id = mail_id;
@ -2526,3 +2815,225 @@ evolution_mail_config_factory_init (void)
bonobo_running_context_auto_exit_unref (BONOBO_OBJECT (factory));
return TRUE;
}
GList *
mail_config_get_signature_list (void)
{
return config->signature_list;
}
static gchar *
get_new_signature_filename ()
{
struct stat st_buf;
gchar *filename;
gint i;
filename = g_strconcat (evolution_dir, "/signatures", NULL);
if (lstat (filename, &st_buf)) {
if (errno == ENOENT) {
if (mkdir (filename, 0700))
g_warning ("Fatal problem creating %s/signatures directory.", evolution_dir);
} else
g_warning ("Fatal problem with %s/signatures directory.", evolution_dir);
}
g_free (filename);
for (i = 0; ; i ++) {
filename = g_strdup_printf ("%s/signatures/signature-%d", evolution_dir, i);
if (lstat (filename, &st_buf) == - 1 && errno == ENOENT) {
return filename;
}
g_free (filename);
}
return NULL;
}
MailConfigSignature *
mail_config_signature_add (gboolean html)
{
MailConfigSignature *sig;
sig = g_new0 (MailConfigSignature, 1);
/* printf ("mail_config_signature_add %d\n", config->signatures); */
sig->id = config->signatures;
sig->name = g_strdup (_("Unnamed"));
sig->filename = get_new_signature_filename ();
sig->html = html;
config->signature_list = g_list_append (config->signature_list, sig);
config->signatures ++;
config_write_signature (sig, sig->id);
config_write_signatures_num ();
mail_config_signature_emit_event (MAIL_CONFIG_SIG_EVENT_ADDED, sig);
/* printf ("mail_config_signature_add end\n"); */
return sig;
}
static void
delete_unused_signature_file (const gchar *filename)
{
gint len;
/* remove signature file if it's in evolution dir and no other signature uses it */
len = strlen (evolution_dir);
if (filename && !strncmp (filename, evolution_dir, len)) {
GList *l;
gboolean only_one = TRUE;
for (l = config->signature_list; l; l = l->next) {
if (((MailConfigSignature *)l->data)->filename
&& !strcmp (filename, ((MailConfigSignature *)l->data)->filename)) {
only_one = FALSE;
break;
}
}
if (only_one) {
unlink (filename);
}
}
}
void
mail_config_signature_delete (MailConfigSignature *sig)
{
GList *l, *next;
GSList *al;
gboolean after = FALSE;
/* FIXME remove it from all accounts */
for (al = config->accounts; al; al = al->next) {
MailConfigAccount *account;
account = (MailConfigAccount *) al->data;
if (account->id->text_signature == sig)
account->id->text_signature = NULL;
if (account->id->html_signature == sig)
account->id->html_signature = NULL;
}
for (l = config->signature_list; l; l = next) {
next = l->next;
if (after)
((MailConfigSignature *) l->data)->id --;
else if (l->data == sig) {
config->signature_list = g_list_remove_link (config->signature_list, l);
after = TRUE;
config->signatures --;
if (sig->random)
config->signatures_random --;
}
}
config_write_signatures ();
delete_unused_signature_file (sig->filename);
/* printf ("signatures: %d\n", config->signatures); */
mail_config_signature_emit_event (MAIL_CONFIG_SIG_EVENT_DELETED, sig);
signature_destroy (sig);
}
void
mail_config_signature_write (MailConfigSignature *sig)
{
config_write_signature (sig, sig->id);
}
void
mail_config_signature_set_filename (MailConfigSignature *sig, const gchar *filename)
{
gchar *old_filename = sig->filename;
sig->filename = g_strdup (filename);
if (old_filename) {
delete_unused_signature_file (old_filename);
g_free (old_filename);
}
}
void
mail_config_signature_set_name (MailConfigSignature *sig, const gchar *name)
{
g_free (sig->name);
sig->name = g_strdup (name);
mail_config_signature_emit_event (MAIL_CONFIG_SIG_EVENT_NAME_CHANGED, sig);
}
void
mail_config_signature_set_random (MailConfigSignature *sig, gboolean random)
{
if (random != sig->random) {
if (random && !sig->random) {
config->signatures_random ++;
if (config->signatures_random == 1)
mail_config_signature_emit_event (MAIL_CONFIG_SIG_EVENT_RANDOM_ON, sig);
} else if (!random && sig->random) {
config->signatures_random --;
if (config->signatures_random == 0)
mail_config_signature_emit_event (MAIL_CONFIG_SIG_EVENT_RANDOM_OFF, sig);
}
sig->random = random;
}
}
gint
mail_config_get_signatures_random (void)
{
return config->signatures_random;
}
static GList *clients = NULL;
void
mail_config_signature_register_client (MailConfigSignatureClient client, gpointer data)
{
clients = g_list_append (clients, client);
clients = g_list_append (clients, data);
}
void
mail_config_signature_unregister_client (MailConfigSignatureClient client, gpointer data)
{
GList *link;
link = g_list_find (clients, data);
clients = g_list_remove_link (clients, link->prev);
clients = g_list_remove_link (clients, link);
}
void
mail_config_signature_emit_event (MailConfigSigEvent event, MailConfigSignature *sig)
{
GList *l, *next;
for (l = clients; l; l = next) {
next = l->next->next;
(*((MailConfigSignatureClient) l->data)) (event, sig, l->next->data);
}
}
void
mail_config_signature_run_script (gchar *script)
{
if (script) {
gchar *argv[2];
gint pid, status;
printf ("running script %s\n", script);
argv [0] = script;
argv [1] = NULL;
pid = gnome_execute_async (NULL, 1, argv);
if (pid < 0)
gnome_error_dialog (_("Cannot execute signature script"));
else
waitpid (pid, &status, 0);
}
}

View File

@ -391,7 +391,7 @@ Click &quot;Finish&quot; to save your settings.</text>
<widget>
<class>GtkLabel</class>
<name>identity_address_label</name>
<label>_Email address:</label>
<label>E_mail address:</label>
<justify>GTK_JUSTIFY_LEFT</justify>
<wrap>False</wrap>
<xalign>0</xalign>
@ -462,46 +462,11 @@ Click &quot;Finish&quot; to save your settings.</text>
<name>table2</name>
<border_width>3</border_width>
<rows>3</rows>
<columns>3</columns>
<columns>4</columns>
<homogeneous>False</homogeneous>
<row_spacing>3</row_spacing>
<column_spacing>3</column_spacing>
<widget>
<class>GnomeFileEntry</class>
<name>fileentry_signature</name>
<history_id>sig-file-gnome-entry</history_id>
<max_saved>10</max_saved>
<title>Signature file:</title>
<directory>False</directory>
<modal>False</modal>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
<widget>
<class>GtkEntry</class>
<child_name>GnomeEntry:entry</child_name>
<name>entry_signature</name>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
</widget>
</widget>
<widget>
<class>GtkLabel</class>
<name>identity_organization_label</name>
@ -530,17 +495,21 @@ Click &quot;Finish&quot; to save your settings.</text>
</widget>
<widget>
<class>GtkCheckButton</class>
<name>check_html_signature</name>
<can_focus>True</can_focus>
<label>_HTML signature:</label>
<active>False</active>
<draw_indicator>True</draw_indicator>
<class>GtkLabel</class>
<name>label-sig-text</name>
<label>Text _Signature:</label>
<justify>GTK_JUSTIFY_LEFT</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<default_focus_target>option-sig-text</default_focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>2</top_attach>
<bottom_attach>3</bottom_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
@ -552,57 +521,22 @@ Click &quot;Finish&quot; to save your settings.</text>
</child>
</widget>
<widget>
<class>GnomeFileEntry</class>
<name>fileentry_html_signature</name>
<history_id>html-sig-file-gnome-entry</history_id>
<max_saved>10</max_saved>
<title>HTML signature file:</title>
<directory>False</directory>
<modal>False</modal>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>2</top_attach>
<bottom_attach>3</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
<widget>
<class>GtkEntry</class>
<child_name>GnomeEntry:entry</child_name>
<name>entry_html_signature</name>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
</widget>
</widget>
<widget>
<class>GtkLabel</class>
<name>identity_signature_label</name>
<label>_Signature file:</label>
<name>label-sig-html</name>
<label>_HTML Signature:</label>
<justify>GTK_JUSTIFY_LEFT</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<focus_target>entry_signature</focus_target>
<default_focus_target>option-sig-html</default_focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<top_attach>2</top_attach>
<bottom_attach>3</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
@ -624,7 +558,7 @@ Click &quot;Finish&quot; to save your settings.</text>
<text></text>
<child>
<left_attach>1</left_attach>
<right_attach>3</right_attach>
<right_attach>4</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
@ -640,9 +574,53 @@ Click &quot;Finish&quot; to save your settings.</text>
<widget>
<class>GtkButton</class>
<name>button_edit_signature</name>
<name>button-sig-edit-text</name>
<can_focus>True</can_focus>
<label>Edit...</label>
<label>Ed_it...</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<left_attach>3</left_attach>
<right_attach>4</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkButton</class>
<name>button-sig-edit-html</name>
<can_focus>True</can_focus>
<label>Edi_t...</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<left_attach>3</left_attach>
<right_attach>4</right_attach>
<top_attach>2</top_attach>
<bottom_attach>3</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkButton</class>
<name>button-sig-new-text</name>
<can_focus>True</can_focus>
<label>N_ew...</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<left_attach>2</left_attach>
@ -662,9 +640,9 @@ Click &quot;Finish&quot; to save your settings.</text>
<widget>
<class>GtkButton</class>
<name>button_edit_html_signature</name>
<name>button-sig-new-html</name>
<can_focus>True</can_focus>
<label>Edit...</label>
<label>Ne_w...</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<left_attach>2</left_attach>
@ -681,6 +659,55 @@ Click &quot;Finish&quot; to save your settings.</text>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkOptionMenu</class>
<name>option-sig-html</name>
<can_focus>True</can_focus>
<items>None
Same as text
Random
</items>
<initial_choice>0</initial_choice>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>2</top_attach>
<bottom_attach>3</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkOptionMenu</class>
<name>option-sig-text</name>
<can_focus>True</can_focus>
<items>None
Random
</items>
<initial_choice>0</initial_choice>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
</widget>
</widget>
</widget>
@ -3131,6 +3158,520 @@ Quoted
<ypad>0</ypad>
</widget>
<widget>
<class>GtkTable</class>
<name>table10</name>
<rows>4</rows>
<columns>2</columns>
<homogeneous>False</homogeneous>
<row_spacing>0</row_spacing>
<column_spacing>0</column_spacing>
<widget>
<class>GtkScrolledWindow</class>
<name>scrolledwindow3</name>
<border_width>4</border_width>
<hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
<vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
<vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>True</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>True</yfill>
</child>
<widget>
<class>GtkCList</class>
<name>clist-sig</name>
<tooltip>List of signatures</tooltip>
<can_focus>True</can_focus>
<columns>1</columns>
<column_widths>80</column_widths>
<selection_mode>GTK_SELECTION_BROWSE</selection_mode>
<show_titles>False</show_titles>
<shadow_type>GTK_SHADOW_IN</shadow_type>
<widget>
<class>GtkLabel</class>
<child_name>CList:title</child_name>
<name>label56</name>
<label>_Signatures</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
</widget>
</widget>
</widget>
<widget>
<class>GtkTable</class>
<name>table-sig-advanced</name>
<border_width>4</border_width>
<height>90</height>
<visible>False</visible>
<rows>3</rows>
<columns>2</columns>
<homogeneous>False</homogeneous>
<row_spacing>3</row_spacing>
<column_spacing>3</column_spacing>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>2</top_attach>
<bottom_attach>3</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>True</yfill>
</child>
<widget>
<class>GtkLabel</class>
<name>label62</name>
<label>_Script</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<default_focus_target>entry-sig-script</default_focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GnomeFileEntry</class>
<name>file-sig-script</name>
<sensitive>False</sensitive>
<history_id>sig-script</history_id>
<max_saved>10</max_saved>
<directory>False</directory>
<modal>False</modal>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
<widget>
<class>GtkEntry</class>
<child_name>GnomeEntry:entry</child_name>
<name>entry-sig-script</name>
<tooltip>Script which is run before signature loading from specified filename</tooltip>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
</widget>
</widget>
<widget>
<class>GnomeFileEntry</class>
<name>file-sig-filename</name>
<sensitive>False</sensitive>
<history_id>sig-filename</history_id>
<max_saved>10</max_saved>
<directory>False</directory>
<modal>False</modal>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
<widget>
<class>GtkEntry</class>
<child_name>GnomeEntry:entry</child_name>
<name>entry-sig-filename</name>
<tooltip>File containing signature</tooltip>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text>/home/rodo/cvs/evolution/mail/</text>
</widget>
</widget>
<widget>
<class>GtkLabel</class>
<name>label63</name>
<label>_Filename</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<default_focus_target>entry-sig-filename</default_focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkCheckButton</class>
<name>check-sig-random</name>
<sensitive>False</sensitive>
<tooltip>If selected signature will be included in random signature list</tooltip>
<can_focus>True</can_focus>
<label>Include in _random signatures list</label>
<active>False</active>
<draw_indicator>True</draw_indicator>
<child>
<left_attach>0</left_attach>
<right_attach>2</right_attach>
<top_attach>2</top_attach>
<bottom_attach>3</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
</widget>
<widget>
<class>GtkTable</class>
<name>table9</name>
<border_width>4</border_width>
<rows>2</rows>
<columns>2</columns>
<homogeneous>False</homogeneous>
<row_spacing>3</row_spacing>
<column_spacing>3</column_spacing>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
<widget>
<class>GtkLabel</class>
<name>label57</name>
<label>_Name</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<default_focus_target>entry-sig-name</default_focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkEntry</class>
<name>entry-sig-name</name>
<sensitive>False</sensitive>
<tooltip>Name of selected signature</tooltip>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkCheckButton</class>
<name>check-sig-html</name>
<sensitive>False</sensitive>
<can_focus>True</can_focus>
<label>use _HTML for this signature</label>
<active>False</active>
<draw_indicator>True</draw_indicator>
<child>
<left_attach>0</left_attach>
<right_attach>2</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
</widget>
<widget>
<class>GtkFrame</class>
<name>frame-sig-preview</name>
<border_width>4</border_width>
<height>90</height>
<label_xalign>0</label_xalign>
<shadow_type>GTK_SHADOW_IN</shadow_type>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>3</top_attach>
<bottom_attach>4</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>True</yfill>
</child>
<widget>
<class>GtkScrolledWindow</class>
<name>scrolled-sig</name>
<hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
<vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
<vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
<widget>
<class>Placeholder</class>
</widget>
</widget>
</widget>
<widget>
<class>GtkVButtonBox</class>
<name>vbuttonbox4</name>
<layout_style>GTK_BUTTONBOX_START</layout_style>
<spacing>0</spacing>
<child_min_width>85</child_min_width>
<child_min_height>0</child_min_height>
<child_ipad_x>7</child_ipad_x>
<child_ipad_y>0</child_ipad_y>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>True</yfill>
</child>
<widget>
<class>GtkButton</class>
<name>button-sig-add</name>
<tooltip>Add new signature</tooltip>
<can_default>True</can_default>
<can_focus>True</can_focus>
<label>_Add</label>
<relief>GTK_RELIEF_NORMAL</relief>
</widget>
<widget>
<class>GtkButton</class>
<name>button-sig-edit</name>
<sensitive>False</sensitive>
<tooltip>Edit signature content in editor</tooltip>
<can_default>True</can_default>
<can_focus>True</can_focus>
<label>_Edit...</label>
<relief>GTK_RELIEF_NORMAL</relief>
</widget>
<widget>
<class>GtkButton</class>
<name>button-sig-delete</name>
<sensitive>False</sensitive>
<tooltip>Delete selected signature</tooltip>
<can_default>True</can_default>
<can_focus>True</can_focus>
<label>_Delete</label>
<relief>GTK_RELIEF_NORMAL</relief>
</widget>
</widget>
<widget>
<class>GtkVBox</class>
<name>vbbox-sig-level</name>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>1</top_attach>
<bottom_attach>4</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>True</yfill>
</child>
<widget>
<class>GtkButton</class>
<name>button-sig-advanced</name>
<tooltip>Show advanced settings</tooltip>
<can_default>True</can_default>
<can_focus>True</can_focus>
<label>Ad_vanced</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkButton</class>
<name>button-sig-simple</name>
<tooltip>Hide advanced settings</tooltip>
<can_default>True</can_default>
<can_focus>True</can_focus>
<label>S_imple</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>label65</name>
<label> </label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
<pack>GTK_PACK_END</pack>
</child>
</widget>
</widget>
</widget>
<widget>
<class>GtkLabel</class>
<child_name>Notebook:tab</child_name>
<name>other_config_label</name>
<label>Signatures</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
</widget>
<widget>
<class>GtkVBox</class>
<name>vbox64</name>
@ -3438,7 +3979,7 @@ Quoted
<widget>
<class>GtkLabel</class>
<child_name>Notebook:tab</child_name>
<name>other_config_label</name>
<name>label55</name>
<label>Other</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>

View File

@ -31,13 +31,24 @@ extern "C" {
#pragma }
#endif /* __cplusplus */
typedef struct {
gint id;
gchar *name;
gchar *filename;
gchar *script;
gboolean random;
gboolean html;
} MailConfigSignature;
typedef struct {
char *name;
char *address;
char *organization;
char *signature;
char *html_signature;
gboolean has_html_signature;
MailConfigSignature *text_signature;
gboolean text_random;
MailConfigSignature *html_signature;
gboolean html_random;
} MailConfigIdentity;
typedef struct {
@ -98,6 +109,10 @@ typedef enum {
MAIL_CONFIG_NOTIFY_PLAY_SOUND,
} MailConfigNewMailNotify;
/* signatures */
MailConfigSignature *signature_copy (const MailConfigSignature *sig);
void signature_destroy (MailConfigSignature *sig);
/* Identities */
MailConfigIdentity *identity_copy (const MailConfigIdentity *id);
void identity_destroy (MailConfigIdentity *id);
@ -238,6 +253,33 @@ gboolean mail_config_check_service (const char *url, CamelProviderType type, GLi
gboolean evolution_mail_config_factory_init (void);
GList * mail_config_get_signature_list (void);
gint mail_config_get_signatures_random (void);
MailConfigSignature *mail_config_signature_add (gboolean html);
void mail_config_signature_delete (MailConfigSignature *sig);
void mail_config_signature_write (MailConfigSignature *sig);
void mail_config_signature_set_name (MailConfigSignature *sig, const gchar *name);
void mail_config_signature_set_filename (MailConfigSignature *sig, const gchar *filename);
void mail_config_signature_set_random (MailConfigSignature *sig, gboolean random);
typedef enum {
MAIL_CONFIG_SIG_EVENT_NAME_CHANGED,
MAIL_CONFIG_SIG_EVENT_RANDOM_ON,
MAIL_CONFIG_SIG_EVENT_RANDOM_OFF,
MAIL_CONFIG_SIG_EVENT_ADDED,
MAIL_CONFIG_SIG_EVENT_DELETED
} MailConfigSigEvent;
typedef void (*MailConfigSignatureClient)(MailConfigSigEvent, MailConfigSignature *sig, gpointer data);
void mail_config_signature_register_client (MailConfigSignatureClient client, gpointer data);
void mail_config_signature_unregister_client (MailConfigSignatureClient client, gpointer data);
void mail_config_signature_emit_event (MailConfigSigEvent event, MailConfigSignature *sig);
void mail_config_write_account_sig (MailConfigAccount *account, gint i);
void mail_config_signature_run_script (gchar *script);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -31,7 +31,8 @@
#include <fcntl.h>
#include <liboaf/liboaf.h>
#include <libgnome/libgnome.h>
#include <libgnome/gnome-defs.h>
#include <libgnome/gnome-util.h>
#include <libgnomevfs/gnome-vfs-mime-info.h>
#include <libgnomevfs/gnome-vfs-mime-handlers.h>
#include <gal/widgets/e-unicode.h>

View File

@ -30,7 +30,8 @@
/* #include <ctype.h> */
#include <errno.h>
#include <gnome.h>
#include <libgnome/gnome-defs.h>
#include <libgnome/gnome-exec.h>
#include <gal/util/e-util.h>
#include <gal/widgets/e-unicode.h>
#include <gal/util/e-unicode-i18n.h>

View File

@ -0,0 +1,276 @@
#include <bonobo.h>
#include <bonobo/bonobo-stream-memory.h>
#include <gal/widgets/e-gui-utils.h>
#include "e-msg-composer.h"
#include "mail-signature-editor.h"
/*
* Signature editor
*
*/
struct _ESignatureEditor {
GtkWidget *win;
GtkWidget *control;
gchar *filename;
gboolean html;
gboolean has_changed;
};
typedef struct _ESignatureEditor ESignatureEditor;
#define E_SIGNATURE_EDITOR(o) ((ESignatureEditor *) o)
#define DEFAULT_WIDTH 600
#define DEFAULT_HEIGHT 500
enum { REPLY_YES = 0, REPLY_NO, REPLY_CANCEL };
static void
destroy_editor (ESignatureEditor *editor)
{
gtk_widget_destroy (editor->win);
g_free (editor->filename);
g_free (editor);
}
static void
menu_file_save_error (BonoboUIComponent *uic, CORBA_Environment *ev) {
e_notice (GTK_WINDOW (uic), GNOME_MESSAGE_BOX_ERROR,
_("Could not save signature file."));
g_warning ("Exception while saving signature (%s)",
bonobo_exception_get_text (ev));
}
static void
menu_file_save_cb (BonoboUIComponent *uic,
void *data,
const char *path)
{
ESignatureEditor *editor;
Bonobo_PersistFile pfile_iface;
CORBA_Environment ev;
editor = E_SIGNATURE_EDITOR (data);
if (editor->html) {
CORBA_exception_init (&ev);
pfile_iface = bonobo_object_client_query_interface (bonobo_widget_get_server (BONOBO_WIDGET (editor->control)),
"IDL:Bonobo/PersistFile:1.0", NULL);
Bonobo_PersistFile_save (pfile_iface, editor->filename, &ev);
if (ev._major != CORBA_NO_EXCEPTION)
menu_file_save_error (uic, &ev);
CORBA_exception_free (&ev);
} else {
BonoboStream *stream;
CORBA_Environment ev;
Bonobo_PersistStream pstream_iface;
CORBA_exception_init (&ev);
stream = bonobo_stream_open (BONOBO_IO_DRIVER_FS, editor->filename,
Bonobo_Storage_WRITE | Bonobo_Storage_CREATE, 0);
pstream_iface = bonobo_object_client_query_interface
(bonobo_widget_get_server (BONOBO_WIDGET (editor->control)),
"IDL:Bonobo/PersistStream:1.0", NULL);
Bonobo_PersistStream_save (pstream_iface,
(Bonobo_Stream) bonobo_object_corba_objref (BONOBO_OBJECT (stream)),
"text/plain", &ev);
if (ev._major != CORBA_NO_EXCEPTION)
menu_file_save_error (uic, &ev);
CORBA_exception_free (&ev);
bonobo_object_unref (BONOBO_OBJECT (stream));
}
}
static void
exit_dialog_cb (int reply, ESignatureEditor *editor)
{
switch (reply) {
case REPLY_YES:
menu_file_save_cb (NULL, editor, NULL);
destroy_editor (editor);
break;
case REPLY_NO:
destroy_editor (editor);
break;
case REPLY_CANCEL:
default:
}
}
static void
do_exit (ESignatureEditor *editor)
{
if (editor->has_changed) {
GtkWidget *dialog;
GtkWidget *label;
gint button;
dialog = gnome_dialog_new (_("Save signature"),
GNOME_STOCK_BUTTON_YES, /* Save */
GNOME_STOCK_BUTTON_NO, /* Don't save */
GNOME_STOCK_BUTTON_CANCEL, /* Cancel */
NULL);
label = gtk_label_new (_("This signature has been changed, but hasn't been saved.\n"
"\nDo you wish to save your changes?"));
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), label, TRUE, TRUE, 0);
gtk_widget_show (label);
gnome_dialog_set_parent (GNOME_DIALOG (dialog), GTK_WINDOW (editor->win));
gnome_dialog_set_default (GNOME_DIALOG (dialog), 0);
button = gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
exit_dialog_cb (button, editor);
} else
destroy_editor (editor);
}
static int
delete_event_cb (GtkWidget *w, GdkEvent *event, ESignatureEditor *editor)
{
do_exit (editor);
return FALSE;
}
static void
menu_file_close_cb (BonoboUIComponent *uic, gpointer data, const gchar *path)
{
ESignatureEditor *editor;
editor = E_SIGNATURE_EDITOR (data);
do_exit (editor);
}
static void
menu_file_save_close_cb (BonoboUIComponent *uic, gpointer data, const gchar *path)
{
ESignatureEditor *editor;
editor = E_SIGNATURE_EDITOR (data);
menu_file_save_cb (uic, editor, path);
destroy_editor (editor);
}
static BonoboUIVerb verbs [] = {
BONOBO_UI_VERB ("FileSave", menu_file_save_cb),
BONOBO_UI_VERB ("FileClose", menu_file_close_cb),
BONOBO_UI_VERB ("FileSaveClose", menu_file_save_close_cb),
BONOBO_UI_VERB_END
};
static void
load_signature (ESignatureEditor *editor)
{
CORBA_Environment ev;
if (editor->html) {
Bonobo_PersistFile pfile_iface;
pfile_iface = bonobo_object_client_query_interface (bonobo_widget_get_server (BONOBO_WIDGET (editor->control)),
"IDL:Bonobo/PersistFile:1.0", NULL);
CORBA_exception_init (&ev);
Bonobo_PersistFile_load (pfile_iface, editor->filename, &ev);
CORBA_exception_free (&ev);
} else {
Bonobo_PersistStream pstream_iface;
BonoboStream *stream;
gchar *data, *html;
data = e_msg_composer_get_sig_file_content (editor->filename, FALSE);
html = g_strdup_printf ("<PRE>\n%s", data);
g_free (data);
pstream_iface = bonobo_object_client_query_interface
(bonobo_widget_get_server (BONOBO_WIDGET (editor->control)),
"IDL:Bonobo/PersistStream:1.0", NULL);
CORBA_exception_init (&ev);
stream = bonobo_stream_mem_create (html, strlen (html), TRUE, FALSE);
if (stream == NULL) {
g_warning ("Couldn't create memory stream\n");
} else {
BonoboObject *stream_object;
Bonobo_Stream corba_stream;
stream_object = BONOBO_OBJECT (stream);
corba_stream = bonobo_object_corba_objref (stream_object);
Bonobo_PersistStream_load (pstream_iface, corba_stream,
"text/html", &ev);
}
Bonobo_Unknown_unref (pstream_iface, &ev);
CORBA_Object_release (pstream_iface, &ev);
CORBA_exception_free (&ev);
bonobo_object_unref (BONOBO_OBJECT (stream));
g_free (html);
}
}
void
mail_signature_editor (const gchar *filename, gboolean html)
{
ESignatureEditor *editor;
BonoboUIComponent *component;
BonoboUIContainer *container;
gchar *title;
if (!filename || !*filename)
return;
editor = g_new0 (ESignatureEditor, 1);
editor->html = html;
editor->filename = g_strdup (filename);
editor->has_changed = TRUE;
title = g_strdup_printf ("Edit %ssignature (%s)", html ? "HTML " : "", filename);
editor->win = bonobo_window_new ("e-sig-editor", title);
gtk_window_set_default_size (GTK_WINDOW (editor->win), DEFAULT_WIDTH, DEFAULT_HEIGHT);
gtk_window_set_policy (GTK_WINDOW (editor->win), FALSE, TRUE, FALSE);
gtk_window_set_modal (GTK_WINDOW (editor->win), TRUE);
g_free (title);
container = bonobo_ui_container_new ();
bonobo_ui_container_set_win (container, BONOBO_WINDOW (editor->win));
component = bonobo_ui_component_new_default ();
bonobo_ui_component_set_container (component, bonobo_object_corba_objref (BONOBO_OBJECT (container)));
bonobo_ui_component_add_verb_list_with_data (component, verbs, editor);
bonobo_ui_util_set_ui (component, EVOLUTION_DATADIR, "evolution-signature-editor.xml", "evolution-signature-editor");
editor->control = bonobo_widget_new_control ("OAFIID:GNOME_GtkHTML_Editor",
bonobo_ui_component_get_container (component));
if (editor->control == NULL) {
g_warning ("Cannot get 'OAFIID:GNOME_GtkHTML_Editor'.");
destroy_editor (editor);
return;
}
load_signature (editor);
gtk_signal_connect (GTK_OBJECT (editor->win), "delete_event",
GTK_SIGNAL_FUNC (delete_event_cb), editor);
bonobo_window_set_contents (BONOBO_WINDOW (editor->win), editor->control);
bonobo_widget_set_property (BONOBO_WIDGET (editor->control), "FormatHTML", html, NULL);
gtk_widget_show (GTK_WIDGET (editor->win));
gtk_widget_show (GTK_WIDGET (editor->control));
gtk_widget_grab_focus (editor->control);
}

View File

@ -0,0 +1,40 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Authors:
* Radek Doulik <rodo@ximian.com>
*
* Copyright 2001, 2002 Ximian, Inc. (www.ximian.com)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
* License as published by the Free Software Foundation.
*
* 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, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
*/
#ifndef MAIL_SIGNATURE_EDITOR_H
#define MAIL_SIGNATURE_EDITOR_H
#ifdef __cplusplus
extern "C" {
#pragma }
#endif /* __cplusplus */
#include <glib.h>
void mail_signature_editor (const gchar *filename, gboolean html);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif