2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 2004 Hiroyuki Yamamoto & The Sylpheed-Claws 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 2 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, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
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"
42 static struct MessageColorButtons {
43 GtkWidget *quote_level1_btn;
44 GtkWidget *quote_level2_btn;
45 GtkWidget *quote_level3_btn;
47 GtkWidget *tgt_folder_btn;
48 GtkWidget *signature_btn;
49 GtkWidget *color_new_btn;
52 typedef struct _MsgColorsPage
58 GtkWidget *chkbtn_enablecol;
59 GtkWidget *chkbtn_recycle_colors;
62 static GtkWidget *color_dialog;
64 static void quote_color_set_dialog (GtkWidget *widget,
66 static void quote_colors_set_dialog_ok (GtkWidget *widget,
68 static void quote_colors_set_dialog_cancel (GtkWidget *widget,
70 static gboolean quote_colors_set_dialog_key_pressed (GtkWidget *widget,
73 static void set_button_bg_color (GtkWidget *widget,
76 void prefs_msg_colors_create_widget(PrefsPage *_page, GtkWindow *window,
79 MsgColorsPage *prefs_msg_colors = (MsgColorsPage *) _page;
83 GtkWidget *chkbtn_enablecol;
84 GtkWidget *quotelevel1_label;
85 GtkWidget *quotelevel2_label;
86 GtkWidget *quotelevel3_label;
88 GtkWidget *signature_label;
89 GtkWidget *tgt_folder_label;
90 GtkWidget *chkbtn_recycle_colors;
92 GtkWidget *color_new_label;
94 GtkWidget *folder_frame;
96 vbox1 = gtk_vbox_new (FALSE, VSPACING_NARROW);
97 gtk_widget_show (vbox1);
98 gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
100 PACK_FRAME(vbox1, msg_frame, _("Message view"));
102 vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
103 gtk_widget_show (vbox2);
104 gtk_container_add (GTK_CONTAINER (msg_frame), vbox2);
105 gtk_container_set_border_width (GTK_CONTAINER (vbox2), VBOX_BORDER);
107 hbox = gtk_hbox_new(FALSE, 8);
108 gtk_widget_show (hbox);
109 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, TRUE, 0);
111 PACK_CHECK_BUTTON (hbox, chkbtn_enablecol,
112 _("Enable coloration of message text"));
114 hbox = gtk_hbox_new(FALSE, 8);
115 gtk_widget_show (hbox);
116 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, TRUE, 0);
118 color_buttons.quote_level1_btn = gtk_button_new();
119 gtk_widget_show(color_buttons.quote_level1_btn);
120 gtk_widget_set_size_request (color_buttons.quote_level1_btn, 30, 20);
121 gtk_box_pack_start (GTK_BOX(hbox), color_buttons.quote_level1_btn,
124 quotelevel1_label = gtk_label_new (_("Quoted Text - First Level"));
125 gtk_widget_show(quotelevel1_label);
126 gtk_box_pack_start (GTK_BOX(hbox), quotelevel1_label,
129 hbox = gtk_hbox_new(FALSE, 8);
130 gtk_widget_show (hbox);
131 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, TRUE, 0);
133 color_buttons.quote_level2_btn = gtk_button_new();
134 gtk_widget_show(color_buttons.quote_level2_btn);
135 gtk_widget_set_size_request (color_buttons.quote_level2_btn, 30, 20);
136 gtk_box_pack_start (GTK_BOX(hbox), color_buttons.quote_level2_btn,
139 quotelevel2_label = gtk_label_new (_("Quoted Text - Second Level"));
140 gtk_widget_show(quotelevel2_label);
141 gtk_box_pack_start (GTK_BOX(hbox), quotelevel2_label,
144 hbox = gtk_hbox_new(FALSE, 8);
145 gtk_widget_show (hbox);
146 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, TRUE, 0);
148 color_buttons.quote_level3_btn = gtk_button_new_with_label ("");
149 gtk_widget_show(color_buttons.quote_level3_btn);
150 gtk_widget_set_size_request (color_buttons.quote_level3_btn, 30, 20);
151 gtk_box_pack_start (GTK_BOX(hbox), color_buttons.quote_level3_btn,
154 quotelevel3_label = gtk_label_new (_("Quoted Text - Third Level"));
155 gtk_widget_show(quotelevel3_label);
156 gtk_box_pack_start (GTK_BOX(hbox), quotelevel3_label,
159 hbox = gtk_hbox_new(FALSE, 8);
160 gtk_widget_show (hbox);
161 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, TRUE, 0);
163 PACK_CHECK_BUTTON (hbox, chkbtn_recycle_colors,
164 _("Cycle quote colors"));
166 hbox = gtk_hbox_new(FALSE, 8);
167 gtk_widget_show (hbox);
168 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, TRUE, 0);
170 color_buttons.uri_btn = gtk_button_new_with_label ("");
171 gtk_widget_show(color_buttons.uri_btn);
172 gtk_widget_set_size_request (color_buttons.uri_btn, 30, 20);
173 gtk_box_pack_start (GTK_BOX(hbox), color_buttons.uri_btn,
176 uri_label = gtk_label_new (_("URI link"));
177 gtk_widget_show(uri_label);
178 gtk_box_pack_start (GTK_BOX(hbox), uri_label, FALSE, FALSE, 0);
180 hbox = gtk_hbox_new(FALSE, 8);
181 gtk_widget_show (hbox);
182 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, TRUE, 0);
184 color_buttons.signature_btn = gtk_button_new_with_label ("");
185 gtk_widget_show(color_buttons.signature_btn);
186 gtk_widget_set_size_request (color_buttons.signature_btn, 30, 20);
187 gtk_box_pack_start (GTK_BOX(hbox), color_buttons.signature_btn,
190 signature_label = gtk_label_new (_("Signatures"));
191 gtk_widget_show(signature_label);
192 gtk_box_pack_start (GTK_BOX(hbox), signature_label, FALSE, FALSE, 0);
194 PACK_FRAME(vbox1, folder_frame, _("Folder list"));
196 vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
197 gtk_widget_show (vbox2);
198 gtk_container_add (GTK_CONTAINER (folder_frame), vbox2);
199 gtk_container_set_border_width (GTK_CONTAINER (vbox2), VBOX_BORDER);
201 hbox = gtk_hbox_new(FALSE, 8);
202 gtk_widget_show (hbox);
203 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, TRUE, 0);
205 color_buttons.tgt_folder_btn = gtk_button_new_with_label ("");
206 gtk_widget_show(color_buttons.tgt_folder_btn);
207 gtk_widget_set_size_request (color_buttons.tgt_folder_btn, 30, 20);
208 gtk_box_pack_start (GTK_BOX(hbox), color_buttons.tgt_folder_btn,
211 tgt_folder_label = gtk_label_new (_("Target folder"));
212 gtk_widget_show(tgt_folder_label);
213 gtk_box_pack_start (GTK_BOX(hbox), tgt_folder_label, FALSE, FALSE, 0);
215 hbox = gtk_hbox_new(FALSE, 8);
216 gtk_widget_show (hbox);
217 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
219 color_buttons.color_new_btn = gtk_button_new_with_label ("");
220 gtk_widget_show (color_buttons.color_new_btn);
221 gtk_widget_set_size_request (color_buttons.color_new_btn, 30, 20);
222 gtk_box_pack_start (GTK_BOX(hbox), color_buttons.color_new_btn,
225 color_new_label = gtk_label_new (_("Folder containing new messages"));
226 gtk_widget_show(color_new_label);
227 gtk_box_pack_start (GTK_BOX(hbox), color_new_label, FALSE, FALSE, 0);
229 g_signal_connect(G_OBJECT(color_buttons.quote_level1_btn), "clicked",
230 G_CALLBACK(quote_color_set_dialog), "LEVEL1");
231 g_signal_connect(G_OBJECT(color_buttons.quote_level2_btn), "clicked",
232 G_CALLBACK(quote_color_set_dialog), "LEVEL2");
233 g_signal_connect(G_OBJECT(color_buttons.quote_level3_btn), "clicked",
234 G_CALLBACK(quote_color_set_dialog), "LEVEL3");
235 g_signal_connect(G_OBJECT(color_buttons.uri_btn), "clicked",
236 G_CALLBACK(quote_color_set_dialog), "URI");
237 g_signal_connect(G_OBJECT(color_buttons.tgt_folder_btn), "clicked",
238 G_CALLBACK(quote_color_set_dialog), "TGTFLD");
239 g_signal_connect(G_OBJECT(color_buttons.signature_btn), "clicked",
240 G_CALLBACK(quote_color_set_dialog), "SIGNATURE");
241 g_signal_connect(G_OBJECT(color_buttons.color_new_btn), "clicked",
242 G_CALLBACK(quote_color_set_dialog), "NEW");
244 set_button_bg_color(color_buttons.quote_level1_btn,
245 prefs_common.quote_level1_col);
246 set_button_bg_color(color_buttons.quote_level2_btn,
247 prefs_common.quote_level2_col);
248 set_button_bg_color(color_buttons.quote_level3_btn,
249 prefs_common.quote_level3_col);
250 set_button_bg_color(color_buttons.uri_btn,
251 prefs_common.uri_col);
252 set_button_bg_color(color_buttons.tgt_folder_btn,
253 prefs_common.tgt_folder_col);
254 set_button_bg_color(color_buttons.signature_btn,
255 prefs_common.signature_col);
256 set_button_bg_color(color_buttons.color_new_btn,
257 prefs_common.color_new);
259 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chkbtn_enablecol),
260 prefs_common.enable_color);
261 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chkbtn_recycle_colors),
262 prefs_common.recycle_quote_colors);
264 prefs_msg_colors->chkbtn_enablecol = chkbtn_enablecol;
265 prefs_msg_colors->chkbtn_recycle_colors = chkbtn_recycle_colors;
267 prefs_msg_colors->page.widget = vbox1;
270 static void quote_color_set_dialog(GtkWidget *widget, gpointer data)
272 gchar *type = (gchar *)data;
274 gdouble color[4] = {0.0, 0.0, 0.0, 0.0};
276 GtkColorSelectionDialog *dialog;
278 if(g_ascii_strcasecmp(type, "LEVEL1") == 0) {
279 title = _("Pick color for quotation level 1");
280 rgbvalue = prefs_common.quote_level1_col;
281 } else if(g_ascii_strcasecmp(type, "LEVEL2") == 0) {
282 title = _("Pick color for quotation level 2");
283 rgbvalue = prefs_common.quote_level2_col;
284 } else if(g_ascii_strcasecmp(type, "LEVEL3") == 0) {
285 title = _("Pick color for quotation level 3");
286 rgbvalue = prefs_common.quote_level3_col;
287 } else if(g_ascii_strcasecmp(type, "URI") == 0) {
288 title = _("Pick color for URI");
289 rgbvalue = prefs_common.uri_col;
290 } else if(g_ascii_strcasecmp(type, "TGTFLD") == 0) {
291 title = _("Pick color for target folder");
292 rgbvalue = prefs_common.tgt_folder_col;
293 } else if(g_ascii_strcasecmp(type, "SIGNATURE") == 0) {
294 title = _("Pick color for signatures");
295 rgbvalue = prefs_common.signature_col;
296 } else if(g_ascii_strcasecmp(type, "NEW") == 0) {
297 title = _("Pick color for folder");
298 rgbvalue = prefs_common.color_new;
299 } else { /* Should never be called */
300 g_warning("Unrecognized datatype '%s' in quote_color_set_dialog\n", type);
304 color_dialog = gtk_color_selection_dialog_new(title);
305 gtk_window_set_position(GTK_WINDOW(color_dialog), GTK_WIN_POS_CENTER);
306 gtk_window_set_modal(GTK_WINDOW(color_dialog), TRUE);
307 gtk_window_set_resizable(GTK_WINDOW(color_dialog), FALSE);
308 manage_window_set_transient(GTK_WINDOW(color_dialog));
310 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(color_dialog)->ok_button),
311 "clicked", G_CALLBACK(quote_colors_set_dialog_ok), data);
312 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(color_dialog)->cancel_button),
313 "clicked", G_CALLBACK(quote_colors_set_dialog_cancel), data);
314 g_signal_connect(G_OBJECT(color_dialog), "key_press_event",
315 G_CALLBACK(quote_colors_set_dialog_key_pressed),data);
317 /* preselect the previous color in the color selection dialog */
318 color[0] = (gdouble) ((rgbvalue & 0xff0000) >> 16) / 255.0;
319 color[1] = (gdouble) ((rgbvalue & 0x00ff00) >> 8) / 255.0;
320 color[2] = (gdouble) (rgbvalue & 0x0000ff) / 255.0;
321 dialog = GTK_COLOR_SELECTION_DIALOG(color_dialog);
322 gtk_color_selection_set_color
323 (GTK_COLOR_SELECTION(dialog->colorsel), color);
325 gtk_widget_show(color_dialog);
328 static void quote_colors_set_dialog_ok(GtkWidget *widget, gpointer data)
330 GtkColorSelection *colorsel = (GtkColorSelection *)
331 ((GtkColorSelectionDialog *)color_dialog)->colorsel;
333 gint red, green, blue, rgbvalue;
334 gchar *type = (gchar *)data;
336 gtk_color_selection_get_color(colorsel, color);
338 red = (gint) (color[0] * 255.0);
339 green = (gint) (color[1] * 255.0);
340 blue = (gint) (color[2] * 255.0);
341 rgbvalue = (gint) ((red * 0x10000) | (green * 0x100) | blue);
344 fprintf(stderr, "redc = %f, greenc = %f, bluec = %f\n", color[0], color[1], color[2]);
345 fprintf(stderr, "red = %d, green = %d, blue = %d\n", red, green, blue);
346 fprintf(stderr, "Color is %x\n", rgbvalue);
349 if (g_ascii_strcasecmp(type, "LEVEL1") == 0) {
350 prefs_common.quote_level1_col = rgbvalue;
351 set_button_bg_color(color_buttons.quote_level1_btn, rgbvalue);
352 } else if (g_ascii_strcasecmp(type, "LEVEL2") == 0) {
353 prefs_common.quote_level2_col = rgbvalue;
354 set_button_bg_color(color_buttons.quote_level2_btn, rgbvalue);
355 } else if (g_ascii_strcasecmp(type, "LEVEL3") == 0) {
356 prefs_common.quote_level3_col = rgbvalue;
357 set_button_bg_color(color_buttons.quote_level3_btn, rgbvalue);
358 } else if (g_ascii_strcasecmp(type, "URI") == 0) {
359 prefs_common.uri_col = rgbvalue;
360 set_button_bg_color(color_buttons.uri_btn, rgbvalue);
361 } else if (g_ascii_strcasecmp(type, "TGTFLD") == 0) {
362 prefs_common.tgt_folder_col = rgbvalue;
363 set_button_bg_color(color_buttons.tgt_folder_btn, rgbvalue);
364 folderview_set_target_folder_color(prefs_common.tgt_folder_col);
365 } else if (g_ascii_strcasecmp(type, "SIGNATURE") == 0) {
366 prefs_common.signature_col = rgbvalue;
367 set_button_bg_color(color_buttons.signature_btn, rgbvalue);
368 } else if (g_ascii_strcasecmp(type, "NEW") == 0) {
369 prefs_common.color_new = rgbvalue;
370 set_button_bg_color(color_buttons.color_new_btn, rgbvalue);
372 fprintf( stderr, "Unrecognized datatype '%s' in quote_color_set_dialog_ok\n", type );
374 gtk_widget_destroy(color_dialog);
377 static void quote_colors_set_dialog_cancel(GtkWidget *widget, gpointer data)
379 gtk_widget_destroy(color_dialog);
382 static gboolean quote_colors_set_dialog_key_pressed(GtkWidget *widget,
387 switch (event->keyval) {
389 gtk_button_clicked(GTK_BUTTON(GTK_COLOR_SELECTION_DIALOG
390 (widget)->cancel_button));
394 /* NOTE: changing focus makes widget accept all currently
395 * changed settings! */
396 gtk_widget_grab_focus
397 (GTK_COLOR_SELECTION_DIALOG
398 (widget)->ok_button);
399 /* call ok handler */
400 gtk_button_clicked(GTK_BUTTON
401 (GTK_COLOR_SELECTION_DIALOG
402 (widget)->ok_button));
411 static void set_button_bg_color(GtkWidget *widget, gint rgbvalue)
416 gtkut_convert_int_to_gdk_color(rgbvalue, &color);
417 newstyle = gtk_style_copy(gtk_widget_get_default_style());
418 newstyle->bg[GTK_STATE_NORMAL] = color;
419 newstyle->bg[GTK_STATE_PRELIGHT] = color;
420 newstyle->bg[GTK_STATE_ACTIVE] = color;
422 gtk_widget_set_style(GTK_WIDGET(widget), newstyle);
425 void prefs_msg_colors_save(PrefsPage *_page)
427 MsgColorsPage *page = (MsgColorsPage *) _page;
429 prefs_common.enable_color =
430 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->chkbtn_enablecol));
431 prefs_common.recycle_quote_colors =
432 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->chkbtn_recycle_colors));
434 main_window_reflect_prefs_all();
437 static void prefs_msg_colors_destroy_widget(PrefsPage *_page)
441 MsgColorsPage *prefs_msg_colors;
443 void prefs_msg_colors_init(void)
446 static gchar *path[3];
448 path[0] = _("Display");
449 path[1] = _("Colors");
452 page = g_new0(MsgColorsPage, 1);
453 page->page.path = path;
454 page->page.create_widget = prefs_msg_colors_create_widget;
455 page->page.destroy_widget = prefs_msg_colors_destroy_widget;
456 page->page.save_page = prefs_msg_colors_save;
457 page->page.weight = 165.0;
458 prefs_gtk_register_page((PrefsPage *) page);
459 prefs_msg_colors = page;
462 void prefs_msg_colors_done(void)
464 prefs_gtk_unregister_page((PrefsPage *) prefs_msg_colors);
465 g_free(prefs_msg_colors);