replace some deprecated functions
[claws.git] / src / prefs_msg_colors.c
blob2e39669380c13285285e9f20f2dd6e8450590203
1 /*
2 * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 2004-2019 The Claws Mail Team & Hiroyuki Yamamoto
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/>.
19 #ifdef HAVE_CONFIG_H
20 # include "config.h"
21 #include "claws-features.h"
22 #endif
24 #include "defs.h"
26 #include <stdio.h>
27 #include <stdlib.h>
29 #include <glib.h>
30 #include <glib/gi18n.h>
31 #include <gtk/gtk.h>
32 #include <gdk/gdkkeysyms.h>
34 #include "prefs_common.h"
35 #include "prefs_gtk.h"
37 #include "gtk/gtkutils.h"
38 #include "gtk/prefswindow.h"
40 #include "manage_window.h"
41 #include "mainwindow.h"
42 #include "colorlabel.h"
44 #define SAFE_STRING(str) \
45 (str) ? (str) : ""
47 static struct MessageColorButtons {
48 /* program colors */
49 GtkWidget *color[COL_LAST_COLOR_INDEX];
50 /* custom colors */
51 GtkWidget *custom_color[COLORLABELS];
52 } color_buttons;
54 typedef struct _MsgColorsPage
56 PrefsPage page;
58 GtkWidget *window;
60 GtkWidget *checkbtn_enable_colors;
61 GtkWidget *checkbtn_enable_bgcolors;
62 GtkWidget *checkbtn_recycle_colors;
64 /* custom colors */
65 GtkWidget *entry_custom_colorlabel[COLORLABELS];
66 } MsgColorsPage;
68 static GtkWidget *color_dialog;
69 static const gchar *color_dialog_title[COL_LAST_COLOR_INDEX];
70 static gboolean color_dialog_title_init = FALSE;
72 static void quote_color_set_dialog (GtkWidget *widget,
73 gpointer data);
74 static void quote_colors_set_dialog_ok (GtkWidget *widget,
75 gpointer data);
76 static void quote_colors_set_dialog_cancel (GtkWidget *widget,
77 gpointer data);
78 static gboolean quote_colors_set_dialog_key_pressed (GtkWidget *widget,
79 GdkEventKey *event,
80 gpointer data);
81 static void prefs_msg_colors_reset_custom_colors(GtkWidget *widget,
82 gpointer data);
84 #define COLOR_BUTTON_PACK_START(gtkbox, colorid, tooltiptext) \
85 color_buttons.color[colorid] = gtk_button_new_with_label ("\x20\xE2\x80\x83\x20"); \
86 gtk_widget_show (color_buttons.color[colorid]); \
87 gtk_box_pack_start (GTK_BOX(gtkbox), color_buttons.color[colorid], FALSE, FALSE, 0); \
88 gtk_widget_set_tooltip_text (GTK_WIDGET(color_buttons.color[colorid]), tooltiptext)
90 #define COLOR_BUTTON_PACK_END(gtkbox, colorid, tooltiptext) \
91 color_buttons.color[colorid] = gtk_button_new_with_label ("\x20\xE2\x80\x83\x20"); \
92 gtk_widget_show (color_buttons.color[colorid]); \
93 gtk_box_pack_end (GTK_BOX(gtkbox), color_buttons.color[colorid], FALSE, FALSE, 0); \
94 gtk_widget_set_tooltip_text (GTK_WIDGET(color_buttons.color[colorid]), tooltiptext)
96 #define COLOR_LABEL_PACK_START(gtkbox, colorid, labeltext) \
97 label[colorid] = gtk_label_new (labeltext); \
98 gtk_widget_show (label[colorid]); \
99 gtk_box_pack_start (GTK_BOX(gtkbox), label[colorid], FALSE, FALSE, 0)
101 #define COLOR_LABEL_PACK_END(gtkbox, colorid, labeltext) \
102 label[colorid] = gtk_label_new (labeltext); \
103 gtk_widget_show (label[colorid]); \
104 gtk_box_pack_end (GTK_BOX(gtkbox), label[colorid], FALSE, FALSE, 0)
106 static void prefs_msg_colors_create_widget(PrefsPage *_page, GtkWindow *window,
107 gpointer data)
109 MsgColorsPage *prefs_msg_colors = (MsgColorsPage *) _page;
111 GtkWidget *notebook;
112 GtkWidget *vbox1;
113 GtkWidget *vbox2;
114 GtkWidget *checkbtn_enable_colors;
115 GtkWidget *label_quote_level1;
116 GtkWidget *label_quote_level2;
117 GtkWidget *label_quote_level3;
118 GtkWidget *checkbtn_enable_bgcolors;
119 GtkWidget *checkbtn_recycle_colors;
120 GtkWidget *hbox;
121 GtkWidget *label[COL_LAST_COLOR_INDEX];
122 GtkWidget *frame_msg;
123 GtkWidget *frame_folder;
124 GtkWidget *frame_quote;
125 GtkWidget *vbox3;
126 GtkWidget *hbox_quote;
127 GtkWidget *vbox_quotefg;
128 GtkWidget *vbox_quotebg;
129 GtkWidget *frame_diff;
130 GtkWidget *vbox4;
131 /* custom colors */
132 GtkWidget *hbox_custom_colors;
133 GtkWidget *vbox_custom_colors;
134 GtkWidget *vbox_custom_colors1;
135 GtkWidget *vbox_custom_colors2;
136 GtkWidget *hbox_reset_custom_colors;
137 GtkWidget *btn_reset_custom_colors;
138 GtkWidget *hbox_custom_color[COLORLABELS];
139 GtkWidget *entry_custom_colorlabel[COLORLABELS];
140 gint c;
141 gchar *tooltip_btn_text = NULL;
142 gchar *tooltip_entry_text = NULL;
144 notebook = gtk_notebook_new();
145 gtk_widget_show(notebook);
147 vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VBOX_BORDER);
148 gtk_widget_show (vbox1);
149 gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
150 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox1,
151 gtk_label_new(_("Other")));
153 vbox2 = gtkut_get_options_frame(vbox1, &frame_msg, _("Message view"));
155 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
156 gtk_widget_show (hbox);
158 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, TRUE, 0);
159 PACK_CHECK_BUTTON (hbox, checkbtn_enable_colors,
160 _("Enable coloration of message text"));
162 hbox_quote = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
163 gtk_widget_show (hbox_quote);
164 vbox_quotefg = gtk_box_new(GTK_ORIENTATION_VERTICAL, VBOX_BORDER);
165 gtk_widget_show (vbox_quotefg);
166 vbox_quotebg = gtk_box_new(GTK_ORIENTATION_VERTICAL, VBOX_BORDER);
167 gtk_widget_show (vbox_quotebg);
168 vbox3 = gtkut_get_options_frame(vbox2, &frame_quote, _("Quote"));
169 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, frame_quote);
171 gtk_box_pack_start (GTK_BOX (vbox3), hbox_quote, FALSE, TRUE, 0);
172 gtk_box_pack_start (GTK_BOX (hbox_quote), vbox_quotefg, FALSE, TRUE, 0);
173 gtk_box_pack_start (GTK_BOX (hbox_quote), vbox_quotebg, FALSE, TRUE, 0);
175 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
176 gtk_widget_show (hbox);
177 gtk_box_pack_start (GTK_BOX (vbox_quotefg), hbox, FALSE, TRUE, 0);
179 PACK_CHECK_BUTTON (hbox, checkbtn_recycle_colors,
180 _("Cycle quote colors"));
181 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, checkbtn_recycle_colors);
183 CLAWS_SET_TIP(checkbtn_recycle_colors,
184 _("If there are more than 3 quote levels, the colors will be reused"));
186 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
187 gtk_widget_show (hbox);
188 gtk_box_pack_start (GTK_BOX (vbox_quotefg), hbox, FALSE, TRUE, 0);
190 label_quote_level1 = gtk_label_new (_("1st Level"));
191 gtk_widget_show(label_quote_level1);
192 gtk_box_pack_start (GTK_BOX(hbox), label_quote_level1,
193 FALSE, FALSE, 0);
194 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, label_quote_level1);
196 COLOR_LABEL_PACK_END(hbox, COL_QUOTE_LEVEL1, _("Text"));
197 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, label[COL_QUOTE_LEVEL1]);
199 COLOR_BUTTON_PACK_END(hbox, COL_QUOTE_LEVEL1,
200 C_("Tooltip", "Pick color for 1st level text"));
201 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors,
202 color_buttons.color[COL_QUOTE_LEVEL1]);
204 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
205 gtk_widget_show (hbox);
206 gtk_box_pack_start (GTK_BOX (vbox_quotefg), hbox, FALSE, TRUE, 0);
208 label_quote_level2 = gtk_label_new (_("2nd Level"));
209 gtk_widget_show(label_quote_level2);
210 gtk_box_pack_start (GTK_BOX(hbox), label_quote_level2,
211 FALSE, FALSE, 0);
212 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, label_quote_level2);
214 COLOR_LABEL_PACK_END(hbox, COL_QUOTE_LEVEL2, _("Text"));
215 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, label[COL_QUOTE_LEVEL2]);
217 COLOR_BUTTON_PACK_END(hbox, COL_QUOTE_LEVEL2,
218 C_("Tooltip", "Pick color for 2nd level text"));
219 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors,
220 color_buttons.color[COL_QUOTE_LEVEL2]);
222 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
223 gtk_widget_show (hbox);
224 gtk_box_pack_start (GTK_BOX (vbox_quotefg), hbox, FALSE, TRUE, 0);
226 label_quote_level3 = gtk_label_new (_("3rd Level"));
227 gtk_widget_show(label_quote_level3);
228 gtk_box_pack_start (GTK_BOX(hbox), label_quote_level3,
229 FALSE, FALSE, 0);
230 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, label_quote_level3);
232 COLOR_LABEL_PACK_END(hbox, COL_QUOTE_LEVEL3, _("Text"));
233 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, label[COL_QUOTE_LEVEL3]);
235 COLOR_BUTTON_PACK_END(hbox, COL_QUOTE_LEVEL3,
236 C_("Tooltip", "Pick color for 3rd level text"));
237 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors,
238 color_buttons.color[COL_QUOTE_LEVEL3]);
240 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
241 gtk_widget_show (hbox);
242 gtk_box_pack_start (GTK_BOX (vbox_quotebg), hbox, FALSE, TRUE, 0);
244 PACK_CHECK_BUTTON (hbox, checkbtn_enable_bgcolors,
245 _("Enable coloration of text background"));
246 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, checkbtn_enable_bgcolors);
248 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
249 gtk_widget_show (hbox);
250 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, hbox);
251 gtk_box_pack_start (GTK_BOX (vbox_quotebg), hbox, FALSE, TRUE, 0);
253 COLOR_BUTTON_PACK_START(hbox, COL_QUOTE_LEVEL1_BG,
254 C_("Tooltip", "Pick color for 1st level text background"));
255 SET_TOGGLE_SENSITIVITY(checkbtn_enable_bgcolors,
256 color_buttons.color[COL_QUOTE_LEVEL1_BG]);
258 COLOR_LABEL_PACK_START(hbox, COL_QUOTE_LEVEL1_BG, _("Background"));
259 SET_TOGGLE_SENSITIVITY(checkbtn_enable_bgcolors, label[COL_QUOTE_LEVEL1_BG]);
261 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
262 gtk_widget_show (hbox);
263 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, hbox);
264 gtk_box_pack_start (GTK_BOX (vbox_quotebg), hbox, FALSE, TRUE, 0);
266 COLOR_BUTTON_PACK_START(hbox, COL_QUOTE_LEVEL2_BG,
267 C_("Tooltip", "Pick color for 2nd level text background"));
268 SET_TOGGLE_SENSITIVITY(checkbtn_enable_bgcolors,
269 color_buttons.color[COL_QUOTE_LEVEL2_BG]);
271 COLOR_LABEL_PACK_START(hbox, COL_QUOTE_LEVEL2_BG, _("Background"));
272 SET_TOGGLE_SENSITIVITY(checkbtn_enable_bgcolors, label[COL_QUOTE_LEVEL2_BG]);
274 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
275 gtk_widget_show (hbox);
276 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, hbox);
277 gtk_box_pack_start (GTK_BOX (vbox_quotebg), hbox, FALSE, TRUE, 0);
279 COLOR_BUTTON_PACK_START(hbox, COL_QUOTE_LEVEL3_BG,
280 C_("Tooltip", "Pick color for 3rd level text background"));
281 SET_TOGGLE_SENSITIVITY(checkbtn_enable_bgcolors,
282 color_buttons.color[COL_QUOTE_LEVEL3_BG]);
284 COLOR_LABEL_PACK_START(hbox, COL_QUOTE_LEVEL3_BG, _("Background"));
285 SET_TOGGLE_SENSITIVITY(checkbtn_enable_bgcolors, label[COL_QUOTE_LEVEL3_BG]);
287 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
288 gtk_widget_show (hbox);
289 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, TRUE, 0);
291 COLOR_BUTTON_PACK_START(hbox, COL_URI,
292 C_("Tooltip", "Pick color for links"));
293 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors,
294 color_buttons.color[COL_URI]);
296 COLOR_LABEL_PACK_START(hbox, COL_URI, _("URI link"));
297 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, label[COL_URI]);
299 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
300 gtk_widget_show (hbox);
301 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, TRUE, 0);
303 COLOR_BUTTON_PACK_START(hbox, COL_SIGNATURE,
304 C_("Tooltip", "Pick color for signatures"));
305 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors,
306 color_buttons.color[COL_SIGNATURE]);
308 COLOR_LABEL_PACK_START(hbox, COL_SIGNATURE, _("Signatures"));
309 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, label[COL_SIGNATURE]);
311 vbox4 = gtkut_get_options_frame(vbox2, &frame_diff,
312 /* TRANSLATORS: A patch is a text file listing the differences between 2 or more different */
313 /* versions of the same text file */
314 _("Patch messages and attachments"));
315 SET_TOGGLE_SENSITIVITY(checkbtn_enable_colors, frame_diff);
317 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
318 gtk_widget_show (hbox);
319 gtk_box_pack_start (GTK_BOX (vbox4), hbox, FALSE, TRUE, 0);
321 COLOR_BUTTON_PACK_START(hbox, COL_DIFF_ADDED,
322 C_("Tooltip", "Pick color for inserted lines"));
324 COLOR_LABEL_PACK_START(hbox, COL_DIFF_ADDED, _("Inserted lines"));
326 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
327 gtk_widget_show (hbox);
328 gtk_box_pack_start (GTK_BOX (vbox4), hbox, FALSE, FALSE, 0);
330 COLOR_BUTTON_PACK_START(hbox, COL_DIFF_DELETED,
331 C_("Tooltip", "Pick color for removed lines"));
333 COLOR_LABEL_PACK_START(hbox, COL_DIFF_DELETED,
334 _("Removed lines"));
336 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
337 gtk_widget_show (hbox);
338 gtk_box_pack_start (GTK_BOX (vbox4), hbox, FALSE, FALSE, 0);
340 COLOR_BUTTON_PACK_START(hbox, COL_DIFF_HUNK,
341 /* TRANSLATORS: A hunk is a section of the patch indicating how the files differ */
342 C_("Tooltip", "Pick color for hunk lines"));
344 COLOR_LABEL_PACK_START(hbox, COL_DIFF_HUNK,
345 /* TRANSLATORS: A hunk is a section of the patch indicating how the files differ */
346 _("Hunk lines"));
348 vbox2 = gtkut_get_options_frame(vbox1, &frame_folder, _("Folder list"));
350 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
351 gtk_widget_show (hbox);
352 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, TRUE, 0);
354 COLOR_BUTTON_PACK_START(hbox, COL_TGT_FOLDER,
355 C_("Tooltip", "Pick color for Target folder. "
356 "Target folder is used when the option "
357 "'Execute immediately when moving or "
358 "deleting messages' is turned off"));
360 COLOR_LABEL_PACK_START(hbox, COL_TGT_FOLDER, _("Target folder"));
362 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
363 gtk_widget_show (hbox);
364 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
366 COLOR_BUTTON_PACK_START(hbox, COL_NEW,
367 C_("Tooltip", "Pick color for folders "
368 "containing new messages"));
370 COLOR_LABEL_PACK_START(hbox, COL_NEW,
371 _("Folder containing new messages"));
373 /* custom colors */
374 vbox_custom_colors = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING_NARROW);
375 gtk_widget_show (vbox_custom_colors);
376 gtk_container_set_border_width (GTK_CONTAINER (vbox_custom_colors), VBOX_BORDER);
377 gtk_notebook_prepend_page(GTK_NOTEBOOK(notebook), vbox_custom_colors,
378 gtk_label_new(_("Color labels")));
380 hbox_custom_colors = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
381 gtk_widget_show(hbox_custom_colors);
382 gtk_box_pack_start(GTK_BOX (vbox_custom_colors), hbox_custom_colors,
383 FALSE, TRUE, 0);
385 vbox_custom_colors1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING_NARROW);
386 gtk_widget_show (vbox_custom_colors1);
387 gtk_box_pack_start (GTK_BOX (hbox_custom_colors), vbox_custom_colors1, FALSE, FALSE, 0);
389 vbox_custom_colors2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING_NARROW);
390 gtk_widget_show (vbox_custom_colors2);
391 gtk_box_pack_start (GTK_BOX (hbox_custom_colors), vbox_custom_colors2, FALSE, FALSE, 0);
393 for (c = 0; c < (COLORLABELS>>1)+(COLORLABELS&1); c++) {
394 /* TRANSLATORS: 'color %d' refers to the filtering/processing
395 rule name and should not be translated */
396 tooltip_btn_text = g_strdup_printf(C_("Tooltip", "Pick color for 'color %d'"), c+1);
398 /* TRANSLATORS: 'color %d' refers to the filtering/processing
399 rule name and should not be translated */
400 tooltip_entry_text = g_strdup_printf(_("Set label for 'color %d'"), c+1);
402 hbox_custom_color[c] = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
403 gtk_widget_show(hbox_custom_color[c]);
404 gtk_box_pack_start(GTK_BOX (vbox_custom_colors1), hbox_custom_color[c],
405 FALSE, TRUE, 0);
407 color_buttons.custom_color[c] = gtk_button_new_with_label("");
408 gtk_widget_show(color_buttons.custom_color[c]);
409 gtk_box_pack_start(GTK_BOX (hbox_custom_color[c]), color_buttons.custom_color[c],
410 FALSE, FALSE, 0);
412 CLAWS_SET_TIP(color_buttons.custom_color[c],
413 tooltip_btn_text);
414 g_free(tooltip_btn_text);
416 entry_custom_colorlabel[c] = gtk_entry_new();
417 gtk_widget_show (entry_custom_colorlabel[c]);
418 gtk_box_pack_start(GTK_BOX (hbox_custom_color[c]), entry_custom_colorlabel[c],
419 FALSE, FALSE, 0);
420 CLAWS_SET_TIP(entry_custom_colorlabel[c],
421 tooltip_entry_text);
422 g_free(tooltip_entry_text);
425 for (c = (COLORLABELS>>1)+(COLORLABELS&1); c < COLORLABELS; c++) {
426 /* TRANSLATORS: 'color %d' refers to the filtering/processing
427 rule name and should not be translated */
428 tooltip_btn_text = g_strdup_printf(C_("Tooltip", "Pick color for 'color %d'"), c+1);
430 /* TRANSLATORS: 'color %d' refers to the filtering/processing
431 rule name and should not be translated */
432 tooltip_entry_text = g_strdup_printf(_("Set label for 'color %d'"), c+1);
434 hbox_custom_color[c] = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
435 gtk_widget_show(hbox_custom_color[c]);
436 gtk_box_pack_start(GTK_BOX (vbox_custom_colors2), hbox_custom_color[c],
437 FALSE, TRUE, 0);
439 color_buttons.custom_color[c] = gtk_button_new_with_label("");
440 gtk_widget_show(color_buttons.custom_color[c]);
441 gtk_box_pack_start(GTK_BOX (hbox_custom_color[c]), color_buttons.custom_color[c],
442 FALSE, FALSE, 0);
443 CLAWS_SET_TIP(color_buttons.custom_color[c],
444 tooltip_btn_text);
445 g_free(tooltip_btn_text);
447 entry_custom_colorlabel[c] = gtk_entry_new();
448 gtk_widget_show (entry_custom_colorlabel[c]);
449 gtk_box_pack_start(GTK_BOX (hbox_custom_color[c]), entry_custom_colorlabel[c],
450 FALSE, FALSE, 0);
451 CLAWS_SET_TIP(entry_custom_colorlabel[c],
452 tooltip_entry_text);
454 g_free(tooltip_entry_text);
457 hbox_reset_custom_colors = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER);
458 gtk_widget_show (hbox_reset_custom_colors);
459 gtk_box_pack_start(GTK_BOX (vbox_custom_colors), hbox_reset_custom_colors,
460 FALSE, FALSE, 0);
462 btn_reset_custom_colors = gtk_button_new_with_label(_(" Use default "));
463 gtk_widget_show(btn_reset_custom_colors);
464 gtk_box_pack_start(GTK_BOX(hbox_reset_custom_colors), btn_reset_custom_colors,
465 FALSE, FALSE, 0);
467 /* program colors */
468 for (c = 0; c < COL_LAST_COLOR_INDEX; c++) {
469 if (color_buttons.color[c] != NULL) {
470 g_signal_connect(G_OBJECT(color_buttons.color[c]),
471 "clicked",
472 G_CALLBACK(quote_color_set_dialog),
473 GINT_TO_POINTER(COLORLABELS + c));
476 /* custom colors */
477 for (c = 0; c < COLORLABELS; c++) {
478 g_signal_connect(G_OBJECT(color_buttons.custom_color[c]), "clicked",
479 G_CALLBACK(quote_color_set_dialog), GINT_TO_POINTER(c));
482 g_signal_connect(G_OBJECT(btn_reset_custom_colors), "clicked",
483 G_CALLBACK(prefs_msg_colors_reset_custom_colors), prefs_msg_colors);
485 /* program colors */
486 for (c = 0; c < COL_LAST_COLOR_INDEX; c++) {
487 if (color_buttons.color[c] != NULL) {
488 gtkut_set_button_color(color_buttons.color[c],
489 &prefs_common.color[c]);
492 /* custom colors */
493 for (c = 0; c < COLORLABELS; c++) {
494 gtkut_set_button_color(color_buttons.custom_color[c],
495 &prefs_common.custom_colorlabel[c].color);
496 gtk_entry_set_text(GTK_ENTRY (entry_custom_colorlabel[c]),
497 gettext(SAFE_STRING (prefs_common.custom_colorlabel[c].label)));
500 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_colors),
501 prefs_common.enable_color);
502 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_bgcolors),
503 prefs_common.enable_bgcolor);
504 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_recycle_colors),
505 prefs_common.recycle_quote_colors);
507 prefs_msg_colors->checkbtn_enable_colors = checkbtn_enable_colors;
508 prefs_msg_colors->checkbtn_enable_bgcolors = checkbtn_enable_bgcolors;
509 prefs_msg_colors->checkbtn_recycle_colors = checkbtn_recycle_colors;
510 /* custom colors */
511 for (c = 0; c < COLORLABELS; c++) {
512 prefs_msg_colors->entry_custom_colorlabel[c] = entry_custom_colorlabel[c];
514 gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0);
516 prefs_msg_colors->page.widget = notebook;
519 #undef COLOR_BUTTON_PACK_START
520 #undef COLOR_BUTTON_PACK_END
521 #undef COLOR_LABEL_PACK_START
522 #undef COLOR_LABEL_PACK_END
524 static void initialize_color_dialog_title()
526 color_dialog_title[COL_QUOTE_LEVEL1] =
527 C_("Dialog title", "Pick color for 1st level text");
528 color_dialog_title[COL_QUOTE_LEVEL2] =
529 C_("Dialog title", "Pick color for 2nd level text");
530 color_dialog_title[COL_QUOTE_LEVEL3] =
531 C_("Dialog title", "Pick color for 3rd level text");
532 color_dialog_title[COL_QUOTE_LEVEL1_BG] =
533 C_("Dialog title", "Pick color for 1st level text background");
534 color_dialog_title[COL_QUOTE_LEVEL2_BG] =
535 C_("Dialog title", "Pick color for 2nd level text background");
536 color_dialog_title[COL_QUOTE_LEVEL3_BG] =
537 C_("Dialog title", "Pick color for 3rd level text background");
538 color_dialog_title[COL_URI] =
539 C_("Dialog title", "Pick color for links");
540 color_dialog_title[COL_TGT_FOLDER] =
541 C_("Dialog title", "Pick color for target folder");
542 color_dialog_title[COL_SIGNATURE] =
543 C_("Dialog title", "Pick color for signatures");
544 color_dialog_title[COL_NEW] =
545 C_("Dialog title", "Pick color for folder");
546 color_dialog_title[COL_DIFF_ADDED] =
547 C_("Dialog title", "Pick color for inserted lines");
548 color_dialog_title[COL_DIFF_DELETED] =
549 C_("Dialog title", "Pick color for removed lines");
550 color_dialog_title[COL_DIFF_HUNK] =
551 C_("Dialog title", "Pick color for hunk lines");
553 color_dialog_title_init = TRUE;
556 static void quote_color_set_dialog(GtkWidget *widget, gpointer data)
558 gchar *type = (gchar *)data;
559 gchar *title = NULL;
560 GdkColor color;
561 GdkRGBA rgba;
562 GtkColorSelectionDialog *dialog;
563 GtkWidget *button_ok;
564 GtkWidget *button_cancel;
565 gint c, ctype;
567 ctype = GPOINTER_TO_INT(type);
568 /* custom colors */
569 /* leave the extra space at the end of the title, this is for translators' convenience */
570 for (c = 0; c < COLORLABELS; c++) {
571 if (ctype == c) {
572 /* TRANSLATORS: 'color %d' refers to the filtering/processing
573 rule name and should not be translated */
574 title = g_strdup_printf(C_("Dialog title", "Pick color for 'color %d'"), c+1);
575 rgba = prefs_common.custom_colorlabel[c].color;
576 break;
579 /* other colors */
580 if (!color_dialog_title_init)
581 initialize_color_dialog_title();
583 if (c == COLORLABELS) {
584 ctype -= COLORLABELS;
585 if (ctype < COL_LAST_COLOR_INDEX) {
586 title = g_strdup(color_dialog_title[ctype]);
587 rgba = prefs_common.color[ctype];
588 } else {
589 g_warning("Unrecognized datatype '%s' in quote_color_set_dialog", type);
590 return;
594 color_dialog = gtk_color_selection_dialog_new(title);
595 g_free(title);
596 gtk_window_set_position(GTK_WINDOW(color_dialog), GTK_WIN_POS_CENTER);
597 gtk_window_set_modal(GTK_WINDOW(color_dialog), TRUE);
598 gtk_window_set_resizable(GTK_WINDOW(color_dialog), FALSE);
599 manage_window_set_transient(GTK_WINDOW(color_dialog));
601 g_object_get(color_dialog, "ok-button", &button_ok,
602 "cancel-button", &button_cancel,
603 NULL);
605 g_signal_connect(G_OBJECT(button_cancel),
606 "clicked", G_CALLBACK(quote_colors_set_dialog_cancel), data);
607 g_signal_connect(G_OBJECT(button_ok),
608 "clicked", G_CALLBACK(quote_colors_set_dialog_ok), data);
609 g_signal_connect(G_OBJECT(color_dialog), "key_press_event",
610 G_CALLBACK(quote_colors_set_dialog_key_pressed),data);
612 /* preselect the previous color in the color selection dialog */
614 GTKUT_GDKRGBA_TO_GDKCOLOR(rgba, color);
616 dialog = GTK_COLOR_SELECTION_DIALOG(color_dialog);
617 gtk_color_selection_set_current_color
618 (GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(dialog)), &color);
620 gtk_widget_show(color_dialog);
623 static void quote_colors_set_dialog_ok(GtkWidget *widget, gpointer data)
625 GtkColorSelection *colorsel = GTK_COLOR_SELECTION(
626 gtk_color_selection_dialog_get_color_selection
627 ((GtkColorSelectionDialog *)color_dialog));
628 GdkColor color;
629 GdkRGBA rgba;
630 gchar *type = (gchar *)data;
631 gint c, ctype;
633 gtk_color_selection_get_current_color(colorsel, &color);
634 GTKUT_GDKCOLOR_TO_GDKRGBA(color, rgba);
636 ctype = GPOINTER_TO_INT(type);
637 /* custom colors */
638 for (c = 0; c < COLORLABELS; c++) {
639 if (ctype == c) {
640 prefs_common.custom_colorlabel[c].color = rgba;
641 gtkut_set_button_color(color_buttons.custom_color[c], &rgba);
642 break;
645 /* other colors */
646 if (c == COLORLABELS) {
647 ctype -= COLORLABELS;
648 if (ctype < COL_LAST_COLOR_INDEX) {
649 prefs_common.color[ctype] = rgba;
650 gtkut_set_button_color(color_buttons.color[ctype], &rgba);
651 if (ctype == COL_TGT_FOLDER) {
652 folderview_set_target_folder_color(prefs_common.color[ctype]);
654 } else {
655 g_warning("Unrecognized datatype '%s' in quote_color_set_dialog_ok", type);
659 gtk_widget_destroy(color_dialog);
662 static void quote_colors_set_dialog_cancel(GtkWidget *widget, gpointer data)
664 gtk_widget_destroy(color_dialog);
667 static gboolean quote_colors_set_dialog_key_pressed(GtkWidget *widget,
668 GdkEventKey *event,
669 gpointer data)
671 GtkColorSelectionDialog *dialog;
672 GtkWidget *button_ok;
673 GtkWidget *button_cancel;
675 dialog = GTK_COLOR_SELECTION_DIALOG(widget);
676 g_object_get(dialog, "ok-button", &button_ok,
677 "cancel-button", &button_cancel,
678 NULL);
680 if (event) {
681 switch (event->keyval) {
682 case GDK_KEY_Escape:
683 gtk_button_clicked(GTK_BUTTON(button_cancel));
684 return TRUE;
685 case GDK_KEY_Return:
686 case GDK_KEY_KP_Enter:
687 /* NOTE: changing focus makes widget accept all currently
688 * changed settings! */
689 gtk_widget_grab_focus(button_ok);
690 /* call ok handler */
691 gtk_button_clicked(GTK_BUTTON(button_ok));
692 return TRUE;
693 default:
694 break;
697 return FALSE;
700 static void prefs_msg_colors_save(PrefsPage *_page)
702 MsgColorsPage *page = (MsgColorsPage *) _page;
703 gint c;
705 prefs_common.enable_color =
706 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_colors));
707 prefs_common.enable_bgcolor =
708 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_enable_bgcolors));
709 prefs_common.recycle_quote_colors =
710 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_recycle_colors));
712 /* custom colors */
713 for (c = 0; c < COLORLABELS; c++) {
714 g_free(prefs_common.custom_colorlabel[c].label);
715 prefs_common.custom_colorlabel[c].label =
716 gtk_editable_get_chars(GTK_EDITABLE(page->entry_custom_colorlabel[c]), 0, -1);
718 colorlabel_update_colortable_from_prefs();
720 main_window_reflect_prefs_all();
721 main_window_reflect_prefs_custom_colors(mainwindow_get_mainwindow());
724 static void prefs_msg_colors_reset_custom_colors(GtkWidget *widget, gpointer data)
726 MsgColorsPage *page = (MsgColorsPage *) data;
727 GdkRGBA rgba;
728 gint c;
730 for (c = 0; c < COLORLABELS; c++) {
731 rgba = colorlabel_get_default_color(c);
732 prefs_common.custom_colorlabel[c].color = rgba;
733 gtkut_set_button_color(color_buttons.custom_color[c],
734 &prefs_common.custom_colorlabel[c].color);
735 gtk_entry_set_text(GTK_ENTRY (page->entry_custom_colorlabel[c]),
736 gettext(SAFE_STRING (colorlabel_get_color_default_text(c))));
741 static void prefs_msg_colors_destroy_widget(PrefsPage *_page)
745 MsgColorsPage *prefs_msg_colors;
747 void prefs_msg_colors_init(void)
749 MsgColorsPage *page;
750 static gchar *path[3];
752 path[0] = _("Display");
753 path[1] = _("Colors");
754 path[2] = NULL;
756 page = g_new0(MsgColorsPage, 1);
757 page->page.path = path;
758 page->page.create_widget = prefs_msg_colors_create_widget;
759 page->page.destroy_widget = prefs_msg_colors_destroy_widget;
760 page->page.save_page = prefs_msg_colors_save;
761 page->page.weight = 165.0;
762 prefs_gtk_register_page((PrefsPage *) page);
763 prefs_msg_colors = page;
766 void prefs_msg_colors_done(void)
768 prefs_gtk_unregister_page((PrefsPage *) prefs_msg_colors);
769 g_free(prefs_msg_colors);