2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2007 Hiroyuki Yamamoto and the Claws Mail team
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.
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.
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/>.
25 #include <glib/gi18n.h>
27 #include <gdk/gdkkeysyms.h>
29 #include "manage_window.h"
30 #include "description_window.h"
33 #include "prefs_gtk.h"
34 #include "prefs_common.h"
35 #include "quote_fmt.h"
36 #include "alertpanel.h"
37 #include "prefs_template.h"
41 * Strings describing quote format strings
43 * When adding new lines, remember to put 2 strings for each line
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"),
84 "\\n", N_("new line"),
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 */
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"),
101 static DescriptionWindow quote_desc_win = {
105 N_("Description of symbols"),
106 N_("The following symbols and commands can be used:"),
111 void quote_fmt_quote_description(GtkWidget *widget, GtkWidget *pref_window)
113 quote_desc_win.parent = pref_window;
114 description_window_create("e_desc_win);
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))
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;
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);
143 g_return_if_fail(edit_subject_format != NULL);
144 g_return_if_fail(edit_body_format != NULL);
146 if (checkbtn_compose_with_format)
147 PACK_CHECK_BUTTON (parent_box, checkbtn_use_format,
148 _("Use template when composing new messages"));
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);
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);
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);
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);
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."),
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);
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);
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);
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,
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);
197 text_format = gtk_text_view_new ();
198 if (prefs_common.textfont) {
199 PangoFontDescription *font_desc;
201 font_desc = pango_font_description_from_string
202 (prefs_common.textfont);
204 gtk_widget_modify_font(text_format, font_desc);
205 pango_font_description_free(font_desc);
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);
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);
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);
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;
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))
243 GtkWidget *checkbtn_use_format = NULL;
244 GtkWidget *vbox_quote;
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;
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);
261 g_return_if_fail(edit_reply_quotemark != NULL);
262 g_return_if_fail(edit_reply_format != NULL);
264 if (checkbtn_reply_with_format)
265 PACK_CHECK_BUTTON (parent_box, checkbtn_use_format,
266 _("Use template when replying to messages"));
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);
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);
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);
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);
287 gtk_tooltips_set_tip(gtk_tooltips_new(), entry_from,
288 _("Override From header. This doesn't change the account used to reply."),
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);
296 hbox2 = gtk_hbox_new (FALSE, 8);
297 gtk_widget_show (hbox2);
298 gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
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);
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);
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,
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);
319 text_quotefmt = gtk_text_view_new ();
320 if (prefs_common.textfont) {
321 PangoFontDescription *font_desc;
323 font_desc = pango_font_description_from_string
324 (prefs_common.textfont);
326 gtk_widget_modify_font(text_quotefmt, font_desc);
327 pango_font_description_free(font_desc);
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);
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);
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);
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;
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))
365 GtkWidget *checkbtn_use_format = NULL;
366 GtkWidget *vbox_quote;
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;
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);
383 g_return_if_fail(edit_fw_quotemark != NULL);
384 g_return_if_fail(edit_fw_format != NULL);
386 if (checkbtn_forward_with_format)
387 PACK_CHECK_BUTTON (parent_box, checkbtn_use_format,
388 _("Use template when forwarding messages"));
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);
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);
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);
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);
409 gtk_tooltips_set_tip(gtk_tooltips_new(), entry_from,
410 _("Override From header. This doesn't change the account used to forward."),
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);
418 hbox2 = gtk_hbox_new (FALSE, 8);
419 gtk_widget_show (hbox2);
420 gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
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);
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,
430 gtk_widget_set_size_request (entry_fw_quotemark, 64, -1);
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,
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);
442 text_fw_quotefmt = gtk_text_view_new ();
443 if (prefs_common.textfont) {
444 PangoFontDescription *font_desc;
446 font_desc = pango_font_description_from_string
447 (prefs_common.textfont);
449 gtk_widget_modify_font(text_fw_quotefmt, font_desc);
450 pango_font_description_free(font_desc);
453 gtk_widget_show(text_fw_quotefmt);
454 gtk_container_add(GTK_CONTAINER(scrolledwin_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);
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);
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);
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;
480 void quotefmt_add_info_button(GtkWindow *parent_window, GtkWidget *parent_box)
482 GtkWidget *hbox_formatdesc;
483 GtkWidget *btn_formatdesc;
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,
490 #if GTK_CHECK_VERSION(2, 8, 0)
491 btn_formatdesc = gtk_button_new_from_stock(GTK_STOCK_INFO);
494 gtk_button_new_with_label (_("Description of symbols..."));
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));
502 void quotefmt_add_defaults_button(GtkWindow *parent_window,
503 GtkWidget *parent_box,
504 void(*set_defaults_func)(void))
506 GtkWidget *hbox_formatdesc;
507 GtkWidget *btn_formatdesc;
509 g_return_if_fail(set_defaults_func != NULL);
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,
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));
525 void quotefmt_check_new_msg_formats(gboolean use_format,
526 gchar *override_from_fmt,
533 if (override_from_fmt && !prefs_template_string_is_valid(override_from_fmt, NULL, TRUE, TRUE))
534 alertpanel_error(_("New message From format error."));
536 if (!prefs_template_string_is_valid(subject_fmt, NULL, TRUE, FALSE))
537 alertpanel_error(_("New message subject format error."));
539 if (!prefs_template_string_is_valid(body_fmt, &line, TRUE, FALSE)) {
540 alertpanel_error(_("New message body format error at line %d."), line);
545 void quotefmt_check_reply_formats(gboolean use_format,
546 gchar *override_from_fmt,
547 gchar *quotation_mark,
553 if (!prefs_template_string_is_valid(quotation_mark, NULL, TRUE, FALSE))
554 alertpanel_error(_("Message reply quotation mark format error."));
556 if (override_from_fmt && !prefs_template_string_is_valid(override_from_fmt, NULL, TRUE, TRUE))
557 alertpanel_error(_("Message reply From format error."));
559 if (!prefs_template_string_is_valid(body_fmt, &line, TRUE, FALSE)) {
560 alertpanel_error(_("Message reply format error at line %d."), line);
565 void quotefmt_check_forward_formats(gboolean use_format,
566 gchar *override_from_fmt,
567 gchar *quotation_mark,
573 if (!prefs_template_string_is_valid(quotation_mark, NULL, TRUE, FALSE))
574 alertpanel_error(_("Message forward quotation mark format error."));
576 if (override_from_fmt && !prefs_template_string_is_valid(override_from_fmt, NULL, TRUE, TRUE))
577 alertpanel_error(_("Message forward From format error."));
579 if (!prefs_template_string_is_valid(body_fmt, &line, TRUE, FALSE)) {
580 alertpanel_error(_("Message forward format error at line %d."), line);