sync with sylpheed 0.6.6cvs1
[claws.git] / src / prefs_template.c
index b4a1d745ceeca5d75f6d272fc3d4ebef975556d9..6e5d726699d2fc3978ae6cb8e2f29165acffa699 100644 (file)
@@ -23,6 +23,7 @@
 #include <glib.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
+#include <string.h>
 #include <dirent.h>
 #include <sys/stat.h>
 
@@ -36,6 +37,8 @@
 #include "manage_window.h"
 #include "prefs_common.h"
 #include "compose.h"
+#include "addr_compl.h"
+#include "quote_fmt.h"
 
 static struct Templates {
        GtkWidget *window;
@@ -83,20 +86,18 @@ void prefs_template_open(void)
        gtk_widget_show(templates.window);
 }
 
-#define ADD_ENTRY(vbox, entry, str) \
+#define ADD_ENTRY(entry, str, row) \
 { \
-       hbox1 = gtk_hbox_new(FALSE, 8); \
-       gtk_widget_show(hbox1); \
-       gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 0); \
-       gtk_container_set_border_width(GTK_CONTAINER(hbox1), 2); \
- \
        label1 = gtk_label_new(str); \
        gtk_widget_show(label1); \
-       gtk_box_pack_start(GTK_BOX(hbox1), label1, FALSE, FALSE, 0); \
+       gtk_table_attach(GTK_TABLE(table), label1, 0, 1, row, (row + 1), \
+                        GTK_FILL, 0, 0, 0); \
+       gtk_misc_set_alignment(GTK_MISC(label1), 1, 0.5); \
  \
        entry = gtk_entry_new(); \
        gtk_widget_show(entry); \
-       gtk_box_pack_start(GTK_BOX(hbox1), entry, TRUE, TRUE, 0); \
+       gtk_table_attach(GTK_TABLE(table), entry, 1, 2, row, (row + 1), \
+                        GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0); \
 }
 
 static void prefs_template_window_create(void)
@@ -108,9 +109,9 @@ static void prefs_template_window_create(void)
        GtkWidget       *hbox1;
        GtkWidget         *label1;
        GtkWidget         *entry_name;
-       GtkWidget         *vbox_hdr;
-       GtkWidget           *entry_to;
-       GtkWidget           *entry_subject;
+       GtkWidget       *table;
+       GtkWidget         *entry_to;
+       GtkWidget         *entry_subject;
        GtkWidget       *scroll2;
        GtkWidget         *text_value;
        GtkWidget     *vbox2;
@@ -147,15 +148,28 @@ static void prefs_template_window_create(void)
        gtk_container_set_border_width(GTK_CONTAINER(vbox1), 8);
        gtk_paned_pack1(GTK_PANED(vpaned), vbox1, FALSE, FALSE);
 
-       ADD_ENTRY(vbox1, entry_name, _("Template name"));
+       hbox1 = gtk_hbox_new(FALSE, 8);
+       gtk_widget_show(hbox1);
+       gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, FALSE, 0);
+
+       label1 = gtk_label_new(_("Template name"));
+       gtk_widget_show(label1);
+       gtk_box_pack_start(GTK_BOX(hbox1), label1, FALSE, FALSE, 0);
 
-       /* vbox to handle headers */
-       vbox_hdr = gtk_vbox_new(FALSE, 2);
-       gtk_widget_show(vbox_hdr);
-       gtk_box_pack_start(GTK_BOX(vbox1), vbox_hdr, FALSE, FALSE, 0);
+       entry_name = gtk_entry_new();
+       gtk_widget_show(entry_name);
+       gtk_box_pack_start(GTK_BOX(hbox1), entry_name, TRUE, TRUE, 0);
 
-       ADD_ENTRY(vbox_hdr, entry_to, _("To:"));
-       ADD_ENTRY(vbox_hdr, entry_subject, _("Subject:"));
+       /* table for headers */
+       table = gtk_table_new(2, 2, FALSE);
+       gtk_widget_show(table);
+       gtk_box_pack_start(GTK_BOX(vbox1), table, FALSE, FALSE, 0);
+       gtk_table_set_row_spacings(GTK_TABLE(table), 4);
+       gtk_table_set_col_spacings(GTK_TABLE(table), 4);
+
+       ADD_ENTRY(entry_to, _("To:"), 0);
+       address_completion_register_entry(GTK_ENTRY(entry_to));
+       ADD_ENTRY(entry_subject, _("Subject:"), 1);
 
 #undef ADD_ENTRY
 
@@ -262,6 +276,8 @@ static void prefs_template_window_create(void)
        gtk_signal_connect(GTK_OBJECT(cancel_btn), "clicked",
                            GTK_SIGNAL_FUNC(prefs_template_cancel_cb), NULL);
 
+       address_completion_start(window);
+
        templates.window = window;
        templates.ok_btn = ok_btn;
        templates.clist_tmpls = clist_tmpls;
@@ -359,12 +375,15 @@ static void prefs_template_select_cb(GtkCList *clist, gint row, gint column,
 
        tmpl_def.name = _("Template");
        tmpl_def.subject = "";
+       tmpl_def.to = "";
        tmpl_def.value = "";
 
        if (!(tmpl = gtk_clist_get_row_data(clist, row)))
                tmpl = &tmpl_def;
 
        gtk_entry_set_text(GTK_ENTRY(templates.entry_name), tmpl->name);
+       gtk_entry_set_text(GTK_ENTRY(templates.entry_to),
+                          tmpl->to ? tmpl->to : "");
        gtk_entry_set_text(GTK_ENTRY(templates.entry_subject),
                           tmpl->subject ? tmpl->subject : "");
        
@@ -406,14 +425,40 @@ static gint prefs_template_clist_set_row(gint row)
 
        g_return_val_if_fail(row != 0, -1);
 
+       value = gtk_editable_get_chars(GTK_EDITABLE(templates.text_value),
+                                      0, -1);
+
+       if (value && *value != '\0') {
+               gchar *parsed_buf;
+               MsgInfo dummyinfo;
+
+               memset(&dummyinfo, 0, sizeof(MsgInfo));
+               quote_fmt_init(&dummyinfo, NULL);
+               quote_fmt_scan_string(value);
+               quote_fmt_parse();
+               parsed_buf = quote_fmt_get_buffer();
+               if (!parsed_buf) {
+                       alertpanel_error(_("Template format error."));
+                       g_free(value);
+                       return -1;
+               }
+       }
+
        name = gtk_editable_get_chars(GTK_EDITABLE(templates.entry_name),
                                      0, -1);
        subject = gtk_editable_get_chars(GTK_EDITABLE(templates.entry_subject),
-                                     0, -1);
+                                        0, -1);
        to = gtk_editable_get_chars(GTK_EDITABLE(templates.entry_to),
                                    0, -1);
-       value = gtk_editable_get_chars(GTK_EDITABLE(templates.text_value),
-                                      0, -1);
+
+       if (subject && *subject == '\0') {
+               g_free(subject);
+               subject = NULL;
+       }
+       if (to && *to == '\0') {
+               g_free(to);
+               to = NULL;
+       }
 
        tmpl = g_new(Template, 1);
        tmpl->name = name;