2008-04-23 [colin] 3.4.0cvs9
[claws.git] / src / quote_fmt.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2007 Hiroyuki Yamamoto and the Claws Mail team
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  * 
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #  include "config.h"
22 #endif
23
24 #include <glib.h>
25 #include <glib/gi18n.h>
26 #include <gtk/gtk.h>
27 #include <gdk/gdkkeysyms.h>
28
29 #include "manage_window.h"
30 #include "description_window.h"
31 #include "gtkutils.h"
32
33 #include "prefs_gtk.h"
34 #include "prefs_common.h"
35 #include "quote_fmt.h"
36 #include "alertpanel.h"
37 #include "prefs_template.h"
38
39
40 /*
41  * Strings describing quote format strings
42  * 
43  * When adding new lines, remember to put 2 strings for each line
44  */
45 static gchar *quote_desc_strings[] = {
46         N_("<span weight=\"bold\">symbols:</span>"),                            NULL,
47         "%date_fmt{<span style=\"oblique\">fmt</span>} (%D{<span style=\"oblique\">fmt</span>})",       N_("customized date format (see 'man strftime')"), /* date expression */
48         "%date (%d)",                           N_("Date"), /* date */
49         "%from (%f)",                           N_("From"), /* from */
50         "%email (%A)",                          N_("email address of sender"), /* email address */
51         "%fullname (%N)",                       N_("full name of sender"), /* full name */
52         "%firstname (%F)",                      N_("first name of sender"), /* first name */
53         "%lastname (%L)",                       N_("last name of sender"), /* last name */
54         "%initials (%I)",                       N_("initials of sender"), /* initial of sender */
55         "%subject (%s)",                        N_("Subject"), /* subject */ 
56         "%to (%t)",                                     N_("To"), /* to */ 
57         "%cc (%c)",                                     N_("Cc"), /* cc */ 
58         "%newsgroups (%n)",                     N_("Newsgroups"), /* newsgroups */ 
59         "%references (%r)",                     N_("References"), /* references */ 
60         "%messageid (%i)",                      N_("Message-ID"), /* message-id */ 
61         "%msg (%M)",                            N_("message body"), /* message */
62         "%quoted_msg (%Q)",                     N_("quoted message body"), /* quoted message */
63         "%msg_no_sig (%m)",                     N_("message body without signature"), /* message with no signature */
64         "%quoted_msg_no_sig (%q)",      N_("quoted message body without signature"), /* quoted message with no signature */
65         "%tags",                                N_("message tags"), /* message tags */
66         "%dict (%T)",                           N_("current dictionary"), /* current dictionary */
67         "%cursor (%X)",                         N_("cursor position"), /* X marks the cursor spot */
68         "%account_fullname (%af)",      N_("account property: your name"), /* full name in compose account */
69         "%account_email (%am)",         N_("account property: your email address"), /* mail address in compose account */
70         "%account_name (%an)",          N_("account property: account name"), /* compose account name itself */
71         "%account_org (%ao)",           N_("account property: organization"), /* organization in compose account */
72         "%account_dict (%aT)",          N_("account property: default dictionary"), /* main dict (if enabled) in account */
73         "%addrbook_cc (%ABc)",          N_("address book <span style=\"oblique\">completion</span>: Cc"), /* completion of 'Cc' from address book */
74         "%addrbook_from (%ABf)",        N_("address book <span style=\"oblique\">completion</span>: From"), /* completion of 'From' from address book */
75         "%addrbook_to (%ABt)",          N_("address book <span style=\"oblique\">completion</span>: To"), /* completion of 'To' from address book */
76         "\\%",                          N_("literal %"),
77         "\\\\",                         N_("literal backslash"),
78         "\\?",                          N_("literal question mark"),
79         "\\!",                          N_("literal exclamation mark"),
80         "\\|",                          N_("literal pipe"),
81         "\\{",                          N_("literal opening curly brace"),
82         "\\}",                          N_("literal closing curly brace"),
83         "\\t",                          N_("tab"),
84         "\\n",                          N_("new line"),
85         "",                                     NULL,
86         N_("<span weight=\"bold\">commands:</span>"),           NULL,
87         "?x{<span style=\"oblique\">expr</span>}\n\n",          N_("insert <span style=\"oblique\">expr</span> if x is set, where x is one of\nthe [dfNFLIstcnriT, ad, af, ao, aT, ABc, ABf, ABt]\nsymbols (or their long equivalent)"),
88         "!x{<span style=\"oblique\">expr</span>}\n\n",          N_("insert <span style=\"oblique\">expr</span> if x is not set, where x is one of\nthe [dfNFLIstcnriT, ad, af, ao, aT, ABc, ABf, ABt]\nsymbols (or their long equivalent)"),
89         "|file{<span style=\"oblique\">sub_expr</span>}\n(|f{<span style=\"oblique\">sub_expr</span>})",                N_("insert file:\n<span style=\"oblique\">sub_expr</span> is evaluated as the path of the file to insert"), /* insert file */
90         "|program{<span style=\"oblique\">sub_expr</span>}\n(|p{<span style=\"oblique\">sub_expr</span>})\n",   N_("insert program output:\n<span style=\"oblique\">sub_expr</span> is evaluated as a command-line to get\nthe output from"), /* insert program output */
91         "|input{<span style=\"oblique\">sub_expr</span>}\n(|i{<span style=\"oblique\">sub_expr</span>})\n",             N_("insert user input:\n<span style=\"oblique\">sub_expr</span> is a variable to be replaced by\nuser-entered text"), /* insert user input */
92         "|attach{<span style=\"oblique\">sub_expr</span>}\n(|a{<span style=\"oblique\">sub_expr</span>})",              N_("attach file:\n<span style=\"oblique\">sub_expr</span> is evaluated as the path of the file to attach"), /* attach file */
93         "",                                     NULL,
94         N_("<span weight=\"bold\">definition of terms:</span>"),        NULL,
95         "<span style=\"oblique\">expr</span>\n",                        N_("text that can contain any of the symbols or\ncommands above"),
96         "<span style=\"oblique\">sub_expr</span>\n",            N_("text that can contain any of the symbols (no\ncommands) above"),
97         "<span style=\"oblique\">completion</span>\n\n\n",      N_("completion from address book only works with the first\naddress of the header, it outputs the full name\nof the contact if that address matches exactly\none contact in the address book"),
98         NULL,NULL
99 };
100
101 static DescriptionWindow quote_desc_win = { 
102         NULL,
103         NULL,
104         2,
105         N_("Description of symbols"),
106         N_("The following symbols and commands can be used:"),
107         quote_desc_strings
108 };
109
110
111 void quote_fmt_quote_description(GtkWidget *widget, GtkWidget *pref_window)
112 {
113         quote_desc_win.parent = pref_window;
114         description_window_create(&quote_desc_win);
115 }
116
117 void quotefmt_create_new_msg_fmt_widgets(GtkWindow *parent_window,
118                                                 GtkWidget *parent_box,
119                                                 GtkWidget **checkbtn_compose_with_format,
120                                                 GtkWidget **override_from_format,
121                                                 GtkWidget **edit_subject_format,
122                                                 GtkWidget **edit_body_format,
123                                                 gboolean add_info_button,
124                                                 void(*set_defaults_func)(void))
125 {
126         GtkWidget *checkbtn_use_format = NULL;
127         GtkWidget *vbox_format;
128         GtkWidget *hbox_format;
129         GtkWidget *hbox2_format;
130         GtkWidget *label_from;
131         GtkWidget *entry_from = NULL;
132         GtkWidget *label_subject;
133         GtkWidget *entry_subject;
134         GtkWidget *scrolledwin_format;
135         GtkWidget *text_format;
136
137         if (add_info_button)
138                 g_return_if_fail(parent_window != NULL);
139         g_return_if_fail(parent_box != NULL);
140         if (checkbtn_compose_with_format)
141                 g_return_if_fail(checkbtn_compose_with_format != NULL);
142
143         g_return_if_fail(edit_subject_format != NULL);
144         g_return_if_fail(edit_body_format != NULL);
145
146         if (checkbtn_compose_with_format)
147                 PACK_CHECK_BUTTON (parent_box, checkbtn_use_format, 
148                                    _("Use template when composing new messages"));
149
150         vbox_format = gtk_vbox_new (FALSE, 4);
151         gtk_widget_show(vbox_format);
152         gtk_container_add(GTK_CONTAINER (parent_box), vbox_format);
153         gtk_container_set_border_width (GTK_CONTAINER (vbox_format), 8);
154
155         if (override_from_format) {
156                 hbox2_format = gtk_hbox_new (FALSE, 8);
157                 gtk_widget_show (hbox2_format);
158                 gtk_box_pack_start (GTK_BOX (vbox_format), hbox2_format, FALSE, FALSE, 0);
159
160                 label_from = gtk_label_new (_("From"));
161                 gtk_widget_show (label_from);
162                 gtk_box_pack_start (GTK_BOX (hbox2_format), label_from, FALSE, FALSE, 0);
163
164                 entry_from = gtk_entry_new ();
165                 gtk_widget_show (entry_from);
166                 gtk_box_pack_start (GTK_BOX (hbox2_format), entry_from, TRUE, TRUE, 0);
167                 gtk_widget_set_size_request (entry_from, 100, -1);
168
169                 gtk_tooltips_set_tip(gtk_tooltips_new(), entry_from,
170                                 _("Override From header. This doesn't change the account used to compose the new message."),
171                                 NULL);
172         }
173
174         hbox_format = gtk_hbox_new (FALSE, 8);
175         gtk_widget_show (hbox_format);
176         gtk_box_pack_start (GTK_BOX (vbox_format), hbox_format, FALSE, FALSE, 0);
177
178         label_subject = gtk_label_new (_("Subject"));
179         gtk_widget_show (label_subject);
180         gtk_box_pack_start (GTK_BOX (hbox_format), label_subject, FALSE, FALSE, 0);
181
182         entry_subject = gtk_entry_new ();
183         gtk_widget_show (entry_subject);
184         gtk_box_pack_start (GTK_BOX (hbox_format), entry_subject, TRUE, TRUE, 0);
185         gtk_widget_set_size_request (entry_subject, 100, -1);
186
187         scrolledwin_format = gtk_scrolled_window_new (NULL, NULL);
188         gtk_widget_show (scrolledwin_format);
189         gtk_box_pack_start (GTK_BOX (vbox_format), scrolledwin_format,
190                             TRUE, TRUE, 0);
191         gtk_scrolled_window_set_policy
192                 (GTK_SCROLLED_WINDOW (scrolledwin_format),
193                  GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
194         gtk_scrolled_window_set_shadow_type
195                 (GTK_SCROLLED_WINDOW (scrolledwin_format), GTK_SHADOW_IN);
196
197         text_format = gtk_text_view_new ();
198         if (prefs_common.textfont) {
199                 PangoFontDescription *font_desc;
200
201                 font_desc = pango_font_description_from_string
202                                                 (prefs_common.textfont);
203                 if (font_desc) {
204                         gtk_widget_modify_font(text_format, font_desc);
205                         pango_font_description_free(font_desc);
206                 }
207         }
208         gtk_widget_show(text_format);
209         gtk_container_add(GTK_CONTAINER(scrolledwin_format), text_format);
210         gtk_text_view_set_editable (GTK_TEXT_VIEW (text_format), TRUE);
211         gtk_widget_set_size_request(text_format, -1, 100);
212
213         if (checkbtn_compose_with_format) {
214                 SET_TOGGLE_SENSITIVITY(checkbtn_use_format, label_subject);
215                 if (override_from_format)
216                         SET_TOGGLE_SENSITIVITY(checkbtn_use_format, entry_from);
217                 SET_TOGGLE_SENSITIVITY(checkbtn_use_format, entry_subject);
218                 SET_TOGGLE_SENSITIVITY(checkbtn_use_format, text_format);
219         }
220
221         if (add_info_button)
222                 quotefmt_add_info_button(parent_window, vbox_format);
223         if (set_defaults_func)
224                 quotefmt_add_defaults_button(parent_window, vbox_format, set_defaults_func);
225
226         if (checkbtn_compose_with_format)
227                 *checkbtn_compose_with_format = checkbtn_use_format;
228         if (override_from_format)
229                 *override_from_format = entry_from;
230         *edit_subject_format = entry_subject;
231         *edit_body_format = text_format;
232 }
233
234 void quotefmt_create_reply_fmt_widgets(GtkWindow *parent_window,
235                                                 GtkWidget *parent_box,
236                                                 GtkWidget **checkbtn_reply_with_format,
237                                                 GtkWidget **override_from_format,
238                                                 GtkWidget **edit_reply_quotemark,
239                                                 GtkWidget **edit_reply_format,
240                                                 gboolean add_info_button,
241                                                 void(*set_defaults_func)(void))
242 {
243         GtkWidget *checkbtn_use_format = NULL;
244         GtkWidget *vbox_quote;
245         GtkWidget *hbox1;
246         GtkWidget *hbox2;
247         GtkWidget *hbox3;
248         GtkWidget *label_quotemark;
249         GtkWidget *entry_quotemark;
250         GtkWidget *label_from;
251         GtkWidget *entry_from = NULL;
252         GtkWidget *scrolledwin_quotefmt;
253         GtkWidget *text_quotefmt;
254
255         if (add_info_button)
256                 g_return_if_fail(parent_window != NULL);
257         g_return_if_fail(parent_box != NULL);
258         if (checkbtn_reply_with_format)
259                 g_return_if_fail(checkbtn_reply_with_format != NULL);
260
261         g_return_if_fail(edit_reply_quotemark != NULL);
262         g_return_if_fail(edit_reply_format != NULL);
263
264         if (checkbtn_reply_with_format)
265                 PACK_CHECK_BUTTON (parent_box, checkbtn_use_format,
266                                    _("Use template when replying to messages"));
267
268         vbox_quote = gtk_vbox_new (FALSE, 4);
269         gtk_widget_show(vbox_quote);
270         gtk_container_add(GTK_CONTAINER (parent_box), vbox_quote);
271         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
272
273         if (override_from_format) {
274                 hbox3 = gtk_hbox_new (FALSE, 8);
275                 gtk_widget_show (hbox3);
276                 gtk_box_pack_start (GTK_BOX (vbox_quote), hbox3, FALSE, FALSE, 0);
277
278                 label_from = gtk_label_new (_("From"));
279                 gtk_widget_show (label_from);
280                 gtk_box_pack_start (GTK_BOX (hbox3), label_from, FALSE, FALSE, 0);
281
282                 entry_from = gtk_entry_new ();
283                 gtk_widget_show (entry_from);
284                 gtk_box_pack_start (GTK_BOX (hbox3), entry_from, TRUE, TRUE, 0);
285                 gtk_widget_set_size_request (entry_from, 100, -1);
286
287                 gtk_tooltips_set_tip(gtk_tooltips_new(), entry_from,
288                                 _("Override From header. This doesn't change the account used to reply."),
289                                 NULL);
290         }
291
292         hbox1 = gtk_hbox_new (FALSE, 32);
293         gtk_widget_show (hbox1);
294         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
295
296         hbox2 = gtk_hbox_new (FALSE, 8);
297         gtk_widget_show (hbox2);
298         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
299
300         label_quotemark = gtk_label_new (_("Quotation mark"));
301         gtk_widget_show (label_quotemark);
302         gtk_box_pack_start (GTK_BOX (hbox2), label_quotemark, FALSE, FALSE, 0);
303
304         entry_quotemark = gtk_entry_new ();
305         gtk_widget_show (entry_quotemark);
306         gtk_box_pack_start (GTK_BOX (hbox2), entry_quotemark, FALSE, FALSE, 0);
307         gtk_widget_set_size_request (entry_quotemark, 64, -1);
308
309         scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL);
310         gtk_widget_show (scrolledwin_quotefmt);
311         gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt,
312                             TRUE, TRUE, 0);
313         gtk_scrolled_window_set_policy
314                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt),
315                  GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
316         gtk_scrolled_window_set_shadow_type
317                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt), GTK_SHADOW_IN);
318
319         text_quotefmt = gtk_text_view_new ();
320         if (prefs_common.textfont) {
321                 PangoFontDescription *font_desc;
322
323                 font_desc = pango_font_description_from_string
324                                                 (prefs_common.textfont);
325                 if (font_desc) {
326                         gtk_widget_modify_font(text_quotefmt, font_desc);
327                         pango_font_description_free(font_desc);
328                 }
329         }
330         gtk_widget_show(text_quotefmt);
331         gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt), text_quotefmt);
332         gtk_text_view_set_editable (GTK_TEXT_VIEW (text_quotefmt), TRUE);
333         gtk_widget_set_size_request(text_quotefmt, -1, 100);
334
335         if (checkbtn_reply_with_format) {
336                 SET_TOGGLE_SENSITIVITY(checkbtn_use_format, label_quotemark);
337                 SET_TOGGLE_SENSITIVITY(checkbtn_use_format, entry_quotemark);
338                 if (override_from_format)
339                         SET_TOGGLE_SENSITIVITY(checkbtn_use_format, entry_from);
340                 SET_TOGGLE_SENSITIVITY(checkbtn_use_format, text_quotefmt);
341         }
342
343         if (add_info_button)
344                 quotefmt_add_info_button(parent_window, vbox_quote);
345         if (set_defaults_func)
346                 quotefmt_add_defaults_button(parent_window, vbox_quote, set_defaults_func);
347
348         if (checkbtn_reply_with_format)
349                 *checkbtn_reply_with_format = checkbtn_use_format;
350         *edit_reply_quotemark = entry_quotemark;
351         if (override_from_format)
352                 *override_from_format = entry_from;
353         *edit_reply_format = text_quotefmt;
354 }
355
356 void quotefmt_create_forward_fmt_widgets(GtkWindow *parent_window,
357                                                 GtkWidget *parent_box,
358                                                 GtkWidget **checkbtn_forward_with_format,
359                                                 GtkWidget **override_from_format,
360                                                 GtkWidget **edit_fw_quotemark,
361                                                 GtkWidget **edit_fw_format,
362                                                 gboolean add_info_button,
363                                                 void(*set_defaults_func)(void))
364 {
365         GtkWidget *checkbtn_use_format = NULL;
366         GtkWidget *vbox_quote;
367         GtkWidget *hbox1;
368         GtkWidget *hbox2;
369         GtkWidget *hbox3;
370         GtkWidget *label_quotemark;
371         GtkWidget *entry_fw_quotemark;
372         GtkWidget *label_from;
373         GtkWidget *entry_from = NULL;
374         GtkWidget *scrolledwin_quotefmt;
375         GtkWidget *text_fw_quotefmt;
376
377         if (add_info_button)
378                 g_return_if_fail(parent_window != NULL);
379         g_return_if_fail(parent_box != NULL);
380         if (checkbtn_forward_with_format) {
381                 g_return_if_fail(checkbtn_forward_with_format != NULL);
382         }
383         g_return_if_fail(edit_fw_quotemark != NULL);
384         g_return_if_fail(edit_fw_format != NULL);
385
386         if (checkbtn_forward_with_format)
387                 PACK_CHECK_BUTTON (parent_box, checkbtn_use_format,
388                                    _("Use template when forwarding messages"));
389
390         vbox_quote = gtk_vbox_new (FALSE, 4);
391         gtk_widget_show(vbox_quote);
392         gtk_container_add(GTK_CONTAINER (parent_box), vbox_quote);
393         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
394
395         if (override_from_format) {
396                 hbox3 = gtk_hbox_new (FALSE, 8);
397                 gtk_widget_show (hbox3);
398                 gtk_box_pack_start (GTK_BOX (vbox_quote), hbox3, FALSE, FALSE, 0);
399
400                 label_from = gtk_label_new (_("From"));
401                 gtk_widget_show (label_from);
402                 gtk_box_pack_start (GTK_BOX (hbox3), label_from, FALSE, FALSE, 0);
403
404                 entry_from = gtk_entry_new ();
405                 gtk_widget_show (entry_from);
406                 gtk_box_pack_start (GTK_BOX (hbox3), entry_from, TRUE, TRUE, 0);
407                 gtk_widget_set_size_request (entry_from, 100, -1);
408
409                 gtk_tooltips_set_tip(gtk_tooltips_new(), entry_from,
410                                 _("Override From header. This doesn't change the account used to forward."),
411                                 NULL);
412         }
413
414         hbox1 = gtk_hbox_new (FALSE, 32);
415         gtk_widget_show (hbox1);
416         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
417
418         hbox2 = gtk_hbox_new (FALSE, 8);
419         gtk_widget_show (hbox2);
420         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
421
422         label_quotemark = gtk_label_new (_("Quotation mark"));
423         gtk_widget_show (label_quotemark);
424         gtk_box_pack_start (GTK_BOX (hbox2), label_quotemark, FALSE, FALSE, 0);
425
426         entry_fw_quotemark = gtk_entry_new ();
427         gtk_widget_show (entry_fw_quotemark);
428         gtk_box_pack_start (GTK_BOX (hbox2), entry_fw_quotemark,
429                             FALSE, FALSE, 0);
430         gtk_widget_set_size_request (entry_fw_quotemark, 64, -1);
431
432         scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL);
433         gtk_widget_show (scrolledwin_quotefmt);
434         gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt,
435                             TRUE, TRUE, 0);
436         gtk_scrolled_window_set_policy
437                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt),
438                  GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
439         gtk_scrolled_window_set_shadow_type
440                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt), GTK_SHADOW_IN);
441
442         text_fw_quotefmt = gtk_text_view_new ();
443         if (prefs_common.textfont) {
444                 PangoFontDescription *font_desc;
445
446                 font_desc = pango_font_description_from_string
447                                                 (prefs_common.textfont);
448                 if (font_desc) {
449                         gtk_widget_modify_font(text_fw_quotefmt, font_desc);
450                         pango_font_description_free(font_desc);
451                 }
452         }
453         gtk_widget_show(text_fw_quotefmt);
454         gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt),
455                           text_fw_quotefmt);
456         gtk_text_view_set_editable (GTK_TEXT_VIEW (text_fw_quotefmt), TRUE);
457         gtk_widget_set_size_request (text_fw_quotefmt, -1, 100);
458
459         if (checkbtn_forward_with_format) {
460                 SET_TOGGLE_SENSITIVITY(checkbtn_use_format, label_quotemark);
461                 SET_TOGGLE_SENSITIVITY(checkbtn_use_format, entry_fw_quotemark);
462                 if (override_from_format)
463                         SET_TOGGLE_SENSITIVITY(checkbtn_use_format, entry_from);
464                 SET_TOGGLE_SENSITIVITY(checkbtn_use_format, text_fw_quotefmt);
465         }
466
467         if (add_info_button)
468                 quotefmt_add_info_button(parent_window, vbox_quote);
469         if (set_defaults_func)
470                 quotefmt_add_defaults_button(parent_window, vbox_quote, set_defaults_func);
471
472         if (checkbtn_forward_with_format)
473                 *checkbtn_forward_with_format = checkbtn_use_format;
474         *edit_fw_quotemark = entry_fw_quotemark;
475         if (override_from_format)
476                 *override_from_format = entry_from;
477         *edit_fw_format = text_fw_quotefmt;
478 }
479
480 void quotefmt_add_info_button(GtkWindow *parent_window, GtkWidget *parent_box)
481 {
482         GtkWidget *hbox_formatdesc;
483         GtkWidget *btn_formatdesc;
484
485         hbox_formatdesc = gtk_hbox_new (FALSE, 32);
486         gtk_widget_show (hbox_formatdesc);
487         gtk_box_pack_start (GTK_BOX (parent_box), hbox_formatdesc, FALSE, FALSE,
488                                 VBOX_BORDER);
489
490 #if GTK_CHECK_VERSION(2, 8, 0)
491         btn_formatdesc = gtk_button_new_from_stock(GTK_STOCK_INFO);
492 #else
493         btn_formatdesc =
494                 gtk_button_new_with_label (_("Description of symbols..."));
495 #endif
496         gtk_widget_show (btn_formatdesc);
497         gtk_box_pack_start (GTK_BOX (hbox_formatdesc), btn_formatdesc, FALSE, FALSE, 0);
498         g_signal_connect(G_OBJECT(btn_formatdesc), "clicked",
499                          G_CALLBACK(quote_fmt_quote_description), GTK_WIDGET(parent_window));
500 }
501
502 void quotefmt_add_defaults_button(GtkWindow *parent_window,
503                                                                   GtkWidget *parent_box,
504                                                                   void(*set_defaults_func)(void))
505 {
506         GtkWidget *hbox_formatdesc;
507         GtkWidget *btn_formatdesc;
508
509         g_return_if_fail(set_defaults_func != NULL);
510
511         hbox_formatdesc = gtk_hbox_new (FALSE, 32);
512         gtk_widget_show (hbox_formatdesc);
513         gtk_box_pack_start (GTK_BOX (parent_box), hbox_formatdesc, FALSE, FALSE,
514                                 VBOX_BORDER);
515
516         btn_formatdesc = gtk_button_new_with_mnemonic (_("Defaults"));
517         gtk_button_set_image (GTK_BUTTON(btn_formatdesc),
518                 gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_BUTTON));
519         gtk_widget_show (btn_formatdesc);
520         gtk_box_pack_start (GTK_BOX (hbox_formatdesc), btn_formatdesc, FALSE, FALSE, 0);
521         g_signal_connect(G_OBJECT(btn_formatdesc), "clicked",
522                          G_CALLBACK(set_defaults_func), GTK_WIDGET(parent_window));
523 }
524
525 void quotefmt_check_new_msg_formats(gboolean use_format,
526                                     gchar *override_from_fmt,
527                                     gchar *subject_fmt,
528                                     gchar *body_fmt)
529 {
530         if (use_format) {
531                 gint line;
532
533                 if (override_from_fmt && !prefs_template_string_is_valid(override_from_fmt, NULL, TRUE, TRUE))
534                         alertpanel_error(_("New message From format error."));
535
536                 if (!prefs_template_string_is_valid(subject_fmt, NULL, TRUE, FALSE))
537                         alertpanel_error(_("New message subject format error."));
538
539                 if (!prefs_template_string_is_valid(body_fmt, &line, TRUE, FALSE)) {
540                         alertpanel_error(_("New message body format error at line %d."), line);
541                 }
542         }
543 }
544
545 void quotefmt_check_reply_formats(gboolean use_format,
546                                   gchar *override_from_fmt,
547                                   gchar *quotation_mark,
548                                   gchar *body_fmt)
549 {
550         if (use_format) {
551                 gint line;
552
553                 if (!prefs_template_string_is_valid(quotation_mark, NULL, TRUE, FALSE))
554                         alertpanel_error(_("Message reply quotation mark format error."));
555
556                 if (override_from_fmt && !prefs_template_string_is_valid(override_from_fmt, NULL, TRUE, TRUE))
557                         alertpanel_error(_("Message reply From format error."));
558
559                 if (!prefs_template_string_is_valid(body_fmt, &line, TRUE, FALSE)) {
560                         alertpanel_error(_("Message reply format error at line %d."), line);
561                 }
562         }
563 }
564
565 void quotefmt_check_forward_formats(gboolean use_format,
566                                     gchar *override_from_fmt,
567                                     gchar *quotation_mark,
568                                     gchar *body_fmt)
569 {
570         if (use_format) {
571                 gint line;
572
573                 if (!prefs_template_string_is_valid(quotation_mark, NULL, TRUE, FALSE))
574                         alertpanel_error(_("Message forward quotation mark format error."));
575
576                 if (override_from_fmt && !prefs_template_string_is_valid(override_from_fmt, NULL, TRUE, TRUE))
577                         alertpanel_error(_("Message forward From format error."));
578
579                 if (!prefs_template_string_is_valid(body_fmt, &line, TRUE, FALSE)) {
580                         alertpanel_error(_("Message forward format error at line %d."), line);
581                 }
582         }
583 }