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/>.
21 #include "claws-features.h"
30 #include <glib/gi18n.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) \
47 static struct MessageColorButtons
{
49 GtkWidget
*color
[COL_LAST_COLOR_INDEX
];
51 GtkWidget
*custom_color
[COLORLABELS
];
54 typedef struct _MsgColorsPage
60 GtkWidget
*checkbtn_enable_colors
;
61 GtkWidget
*checkbtn_enable_bgcolors
;
62 GtkWidget
*checkbtn_recycle_colors
;
65 GtkWidget
*entry_custom_colorlabel
[COLORLABELS
];
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
,
74 static void quote_colors_set_dialog_ok (GtkWidget
*widget
,
76 static void quote_colors_set_dialog_cancel (GtkWidget
*widget
,
78 static gboolean
quote_colors_set_dialog_key_pressed (GtkWidget
*widget
,
81 static void prefs_msg_colors_reset_custom_colors(GtkWidget
*widget
,
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
,
109 MsgColorsPage
*prefs_msg_colors
= (MsgColorsPage
*) _page
;
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
;
121 GtkWidget
*label
[COL_LAST_COLOR_INDEX
];
122 GtkWidget
*frame_msg
;
123 GtkWidget
*frame_folder
;
124 GtkWidget
*frame_quote
;
126 GtkWidget
*hbox_quote
;
127 GtkWidget
*vbox_quotefg
;
128 GtkWidget
*vbox_quotebg
;
129 GtkWidget
*frame_diff
;
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
];
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
,
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
,
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
,
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
,
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 */
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"));
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
,
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
],
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
],
412 CLAWS_SET_TIP(color_buttons
.custom_color
[c
],
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
],
420 CLAWS_SET_TIP(entry_custom_colorlabel
[c
],
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
],
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
],
443 CLAWS_SET_TIP(color_buttons
.custom_color
[c
],
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
],
451 CLAWS_SET_TIP(entry_custom_colorlabel
[c
],
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
,
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
,
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
]),
472 G_CALLBACK(quote_color_set_dialog
),
473 GINT_TO_POINTER(COLORLABELS
+ c
));
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
);
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
]);
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
;
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
;
562 GtkColorSelectionDialog
*dialog
;
563 GtkWidget
*button_ok
;
564 GtkWidget
*button_cancel
;
567 ctype
= GPOINTER_TO_INT(type
);
569 /* leave the extra space at the end of the title, this is for translators' convenience */
570 for (c
= 0; c
< COLORLABELS
; 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
;
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
];
589 g_warning("Unrecognized datatype '%s' in quote_color_set_dialog", type
);
594 color_dialog
= gtk_color_selection_dialog_new(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
,
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
));
630 gchar
*type
= (gchar
*)data
;
633 gtk_color_selection_get_current_color(colorsel
, &color
);
634 GTKUT_GDKCOLOR_TO_GDKRGBA(color
, rgba
);
636 ctype
= GPOINTER_TO_INT(type
);
638 for (c
= 0; c
< COLORLABELS
; c
++) {
640 prefs_common
.custom_colorlabel
[c
].color
= rgba
;
641 gtkut_set_button_color(color_buttons
.custom_color
[c
], &rgba
);
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
]);
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
,
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
,
681 switch (event
->keyval
) {
683 gtk_button_clicked(GTK_BUTTON(button_cancel
));
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
));
700 static void prefs_msg_colors_save(PrefsPage
*_page
)
702 MsgColorsPage
*page
= (MsgColorsPage
*) _page
;
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
));
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
;
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)
750 static gchar
*path
[3];
752 path
[0] = _("Display");
753 path
[1] = _("Colors");
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
);