#include <bonobo.h>
#include <bonobo/bonobo-stream-memory.h>
#include <gal/widgets/e-gui-utils.h>
#include <gal/widgets/e-unicode.h>
#include "e-msg-composer.h"
#include "mail-signature-editor.h"
/*
* Signature editor
*
*/
struct _ESignatureEditor {
GtkWidget *win;
GtkWidget *control;
GtkWidget *name_entry;
MailConfigSignature *sig;
gboolean html;
GNOME_GtkHTML_Editor_Engine engine;
};
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);
}
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->sig->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->sig->filename,
Bonobo_Storage_CREATE, 0);
BONOBO_STREAM_CLASS (GTK_OBJECT (stream)->klass)->truncate (stream, 0, &ev);
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));
}
mail_config_signature_set_html (editor->sig, editor->html);
mail_config_signature_emit_event (MAIL_CONFIG_SIG_EVENT_CONTENT_CHANGED, editor->sig);
}
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)
{
CORBA_Environment ev;
CORBA_exception_init (&ev);
if (GNOME_GtkHTML_Editor_Engine_hasUndo (editor->engine, &ev)) {
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);
CORBA_exception_free (&ev);
}
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->sig->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->sig->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
sig_name_changed (GtkWidget *w, ESignatureEditor *editor)
{
mail_config_signature_set_name (editor->sig, e_utf8_gtk_entry_get_text (GTK_ENTRY (editor->name_entry)));
}
static void
format_html_cb (BonoboUIComponent *component,
const char *path,
Bonobo_UIComponent_EventType type,
const char *state,
gpointer data)
{
ESignatureEditor *editor = (ESignatureEditor *) data;
if (type != Bonobo_UIComponent_STATE_CHANGED)
return;
editor->html = atoi (state);
bonobo_widget_set_property (BONOBO_WIDGET (editor->control), "FormatHTML", editor->html, NULL);
}
void
mail_signature_editor (MailConfigSignature *sig)
{
CORBA_Environment ev;
ESignatureEditor *editor;
BonoboUIComponent *component;
BonoboUIContainer *container;
GtkWidget *vbox, *hbox, *label;
gchar *title;
if (!sig->filename || !*sig->filename)
return;
editor = g_new0 (ESignatureEditor, 1);
editor->sig = sig;
editor->html = sig->html;
title = g_strdup_printf ("Edit signature (%s)", sig->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;
}
editor->engine = (GNOME_GtkHTML_Editor_Engine) bonobo_object_client_query_interface
(bonobo_widget_get_server (BONOBO_WIDGET (editor->control)), "IDL:GNOME/GtkHTML/Editor/Engine:1.0", NULL);
load_signature (editor);
bonobo_ui_component_set_prop (component, "/commands/FormatHtml", "state", editor->html ? "1" : "0", NULL);
bonobo_ui_component_add_listener (component, "FormatHtml", format_html_cb, editor);
gtk_signal_connect (GTK_OBJECT (editor->win), "delete_event",
GTK_SIGNAL_FUNC (delete_event_cb), editor);
vbox = gtk_vbox_new (FALSE, 0);
hbox = gtk_hbox_new (FALSE, 0);
label = gtk_label_new (_("Signature name:"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 4);
editor->name_entry = gtk_entry_new ();
e_utf8_gtk_entry_set_text (GTK_ENTRY (editor->name_entry), sig->name);
gtk_signal_connect (GTK_OBJECT (editor->name_entry), "changed", GTK_SIGNAL_FUNC (sig_name_changed), editor);
gtk_box_pack_start_defaults (GTK_BOX (hbox), editor->name_entry);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 3);
gtk_widget_show_all (vbox);
gtk_box_pack_start_defaults (GTK_BOX (vbox), editor->control);
bonobo_window_set_contents (BONOBO_WINDOW (editor->win), vbox);
bonobo_widget_set_property (BONOBO_WIDGET (editor->control), "FormatHTML", editor->html, NULL);
gtk_widget_show (GTK_WIDGET (editor->win));
gtk_widget_show (GTK_WIDGET (editor->control));
CORBA_exception_init (&ev);
GNOME_GtkHTML_Editor_Engine_runCommand (editor->engine, "grab-focus", &ev);
CORBA_exception_free (&ev);
}