2008-10-09 [colin] 3.6.0cvs20
[claws.git] / src / prefs_fonts.c
index 5fcec3b0976d7c1f8485e751d226bec9d62fb715..db606b6891ad6b0f27ff8df890fa113afe3189ba 100644 (file)
@@ -1,12 +1,10 @@
-
-
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 2003 Hiroyuki Yamamoto & the Sylpheed-Claws team
+ * Copyright (C) 2003-2007 Hiroyuki Yamamoto & The Claws Mail Team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
@@ -15,8 +13,8 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * 
  */
 
 #ifdef HAVE_CONFIG_H
 #include <stdlib.h>
 
 #include <glib.h>
+#include <glib/gi18n.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 
-#include "intl.h"
-#include "utils.h"
 #include "prefs_common.h"
 #include "prefs_gtk.h"
 
-#include "gtk/gtkutils.h"
 #include "gtk/prefswindow.h"
 
-#include "manage_window.h"
-
 typedef struct _FontsPage
 {
        PrefsPage page;
 
        GtkWidget *window;              /* do not modify */
 
-       GtkWidget *label_textfont;
-       GtkWidget *entry_textfont;
-       GtkWidget *entry_smallfont;
-       GtkWidget *entry_normalfont;
-       GtkWidget *entry_boldfont;
-       GtkWidget *button_textfont;
+       GtkWidget *entry_folderview_smallfont;
+       GtkWidget *entry_folderview_normalfont;
+       GtkWidget *entry_folderview_boldfont;
+       GtkWidget *entry_messageviewfont;
+       GtkWidget *derive_from_normalfont_checkbutton;
+#if defined(USE_GNOMEPRINT) || GTK_CHECK_VERSION(2,10,0)
+       GtkWidget *print_checkbutton;
+       GtkWidget *entry_messageprintfont;
+#endif
 } FontsPage;
 
-static GtkWidget *font_sel_win;
-static guint font_sel_conn_id;
-
-static void prefs_font_select  (GtkButton *button, GtkEntry *entry);
-
-static void prefs_font_selection_key_pressed   (GtkWidget      *widget,
-                                                GdkEventKey    *event,
-                                                gpointer        data);
-static void prefs_font_selection_ok            (GtkButton      *button, GtkEntry *entry);
-
-static void prefs_font_select(GtkButton *button, GtkEntry *entry)
-{
-       gchar *font_name;
-       
-       g_return_if_fail(entry != NULL);
-       
-       if (!font_sel_win) {
-               font_sel_win = gtk_font_selection_dialog_new
-                       (_("Font selection"));
-               gtk_window_position(GTK_WINDOW(font_sel_win),
-                                   GTK_WIN_POS_CENTER);
-               gtk_signal_connect(GTK_OBJECT(font_sel_win), "delete_event",
-                                  GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
-                                  NULL);
-               gtk_signal_connect
-                       (GTK_OBJECT(font_sel_win), "key_press_event",
-                        GTK_SIGNAL_FUNC(prefs_font_selection_key_pressed),
-                        NULL);
-               gtk_signal_connect_object
-                       (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel_win)->cancel_button),
-                        "clicked",
-                        GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
-                        GTK_OBJECT(font_sel_win));
-       }
-
-       if(font_sel_conn_id) {
-               gtk_signal_disconnect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel_win)->ok_button), font_sel_conn_id);
-       }
-       font_sel_conn_id = gtk_signal_connect
-               (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel_win)->ok_button),
-                "clicked",
-                GTK_SIGNAL_FUNC(prefs_font_selection_ok),
-                entry);
-       printf("%i\n", font_sel_conn_id);
-
-       font_name = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
-       gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(font_sel_win), font_name);
-       g_free(font_name);
-       manage_window_set_transient(GTK_WINDOW(font_sel_win));
-       gtk_window_set_modal(GTK_WINDOW(font_sel_win), TRUE);
-       gtk_widget_grab_focus
-               (GTK_FONT_SELECTION_DIALOG(font_sel_win)->ok_button);
-       gtk_widget_show(font_sel_win);
-}
-
-static void prefs_font_selection_key_pressed(GtkWidget *widget,
-                                            GdkEventKey *event,
-                                            gpointer data)
-{
-       if (event && event->keyval == GDK_Escape)
-               gtk_widget_hide(font_sel_win);
-}
-
-static void prefs_font_selection_ok(GtkButton *button, GtkEntry *entry)
-{
-       gchar *fontname;
-
-       fontname = gtk_font_selection_dialog_get_font_name
-               (GTK_FONT_SELECTION_DIALOG(font_sel_win));
-
-       if (fontname) {
-               gtk_entry_set_text(entry, fontname);
-
-               g_free(fontname);
-       }
-
-       gtk_widget_hide(font_sel_win);
-}
-
-void prefs_fonts_create_widget(PrefsPage *_page, GtkWindow *window, 
+static void prefs_fonts_create_widget(PrefsPage *_page, GtkWindow *window, 
                               gpointer data)
 {
        FontsPage *prefs_fonts = (FontsPage *) _page;
 
        GtkWidget *table;
-       GtkWidget *label_textfont;
-       GtkWidget *entry_textfont;
-       GtkWidget *entry_smallfont;
-       GtkWidget *entry_boldfont;
-       GtkWidget *entry_normalfont;
-       GtkWidget *button_textfont;
-       GtkWidget *tmplabel, *tmpbutton;
+       GtkWidget *entry_folderview_smallfont;
+       GtkWidget *entry_folderview_normalfont;
+       GtkWidget *entry_folderview_boldfont;
+       GtkWidget *entry_messageviewfont;
+       GtkWidget *tmplabel;
+#if defined(USE_GNOMEPRINT) || GTK_CHECK_VERSION(2,10,0)
+       GtkWidget *entry_messageprintfont;
+       GtkWidget *print_checkbutton;
+#endif
+       GtkWidget *derive_from_normalfont_checkbutton;
        GtkWidget *vbox;
-       GtkWidget *hint_label;
+       gint      row = 0;
 
-       table = gtk_table_new(8, 3, FALSE);
+       table = gtk_table_new(10, 2, FALSE);
        gtk_widget_show(table);
-       gtk_container_set_border_width(GTK_CONTAINER(table), 8);
+       gtk_container_set_border_width(GTK_CONTAINER(table), VBOX_BORDER);
        gtk_table_set_row_spacings(GTK_TABLE(table), 4);
        gtk_table_set_col_spacings(GTK_TABLE(table), 8);
 
-       label_textfont = gtk_label_new (_("Text"));
-       gtk_widget_show (label_textfont);
-       gtk_table_attach (GTK_TABLE (table), label_textfont, 0, 1, 0, 1,
-                        (GtkAttachOptions) (GTK_FILL),
+       /* normal font label */
+       tmplabel = gtk_label_new (_("Folder and Message Lists"));
+       gtk_widget_show (tmplabel);
+       gtk_table_attach (GTK_TABLE (table), tmplabel, 0, 1, row, row+1,
+                        (GtkAttachOptions) GTK_FILL,
                         (GtkAttachOptions) (0), 0, 0);
-       gtk_label_set_justify(GTK_LABEL(label_textfont), GTK_JUSTIFY_RIGHT);
-       gtk_misc_set_alignment(GTK_MISC(label_textfont), 1, 0.5);
+       gtk_label_set_justify(GTK_LABEL(tmplabel), GTK_JUSTIFY_RIGHT);
+       gtk_misc_set_alignment(GTK_MISC(tmplabel), 1, 0.5);
 
-       entry_textfont = gtk_entry_new ();
-       gtk_widget_show (entry_textfont);
-       gtk_table_attach (GTK_TABLE (table), entry_textfont, 1, 2, 0, 1,
+       /* normal font button */
+       entry_folderview_normalfont = gtk_font_button_new_with_font (prefs_common.normalfont);
+       g_object_set(G_OBJECT(entry_folderview_normalfont), 
+                             "use-font", TRUE, 
+                             NULL);
+       gtk_widget_show (entry_folderview_normalfont);
+       gtk_table_attach (GTK_TABLE (table), entry_folderview_normalfont, 1, 2, row, row+1,
                         (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
                         (GtkAttachOptions) (0), 0, 0);
-       gtk_entry_set_text(GTK_ENTRY(entry_textfont), prefs_common.textfont);
+       row++;
 
-       button_textfont = gtk_button_new_with_label (" ... ");
-
-       gtk_widget_show (button_textfont);
-       gtk_table_attach (GTK_TABLE (table), button_textfont, 2, 3, 0, 1,
-                         0, 0, 0, 0);
-       gtk_signal_connect (GTK_OBJECT (button_textfont), "clicked",
-                           GTK_SIGNAL_FUNC (prefs_font_select), entry_textfont);
-
-       tmplabel = gtk_label_new (_("Small"));
+       /* message font label */
+       tmplabel = gtk_label_new (_("Message"));
        gtk_widget_show (tmplabel);
-       gtk_table_attach (GTK_TABLE (table), tmplabel, 0, 1, 1, 2,
+       gtk_table_attach (GTK_TABLE (table), tmplabel, 0, 1, row, row+1,
                         (GtkAttachOptions) GTK_FILL,
                         (GtkAttachOptions) (0), 0, 0);
        gtk_label_set_justify(GTK_LABEL(tmplabel), GTK_JUSTIFY_RIGHT);
        gtk_misc_set_alignment(GTK_MISC(tmplabel), 1, 0.5);
 
-       entry_smallfont = gtk_entry_new ();
-       gtk_widget_show (entry_smallfont);
-       gtk_table_attach (GTK_TABLE (table), entry_smallfont, 1, 2, 1, 2,
+       /* message font button */
+       entry_messageviewfont = gtk_font_button_new_with_font (prefs_common.textfont);
+       g_object_set(G_OBJECT(entry_messageviewfont), 
+                             "use-font", TRUE, 
+                             NULL);
+       gtk_widget_show (entry_messageviewfont);
+       gtk_table_attach (GTK_TABLE (table), entry_messageviewfont, 1, 2, row, row+1,
                         (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
                         (GtkAttachOptions) (0), 0, 0);
-       gtk_entry_set_text(GTK_ENTRY(entry_smallfont), prefs_common.smallfont);
+       row++;
 
-       tmpbutton = gtk_button_new_with_label (" ... ");
-       gtk_widget_show (tmpbutton);
-       gtk_table_attach (GTK_TABLE (table), tmpbutton, 2, 3, 1, 2,
-                         0, 0, 0, 0);
-       gtk_signal_connect (GTK_OBJECT(tmpbutton), "clicked",
-                           GTK_SIGNAL_FUNC(prefs_font_select), entry_smallfont);
+       vbox = gtk_vbox_new(FALSE, VSPACING_NARROW);
+       gtk_widget_show(vbox);
+       gtk_table_attach (GTK_TABLE (table), vbox, 0, 4, row, row+1,
+                        (GtkAttachOptions) GTK_FILL,
+                        (GtkAttachOptions) (0), 0, 0);
+       row++;
+       
+       /* derive from normal font check button */
+       derive_from_normalfont_checkbutton = gtk_check_button_new_with_label(_("Derive small and bold fonts from Folder and Message Lists font"));
+       gtk_widget_show(derive_from_normalfont_checkbutton);
+       gtk_table_attach (GTK_TABLE (table), derive_from_normalfont_checkbutton, 0, 2, row, row+1,
+                        (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                        (GtkAttachOptions) (0), 0, 0);
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(derive_from_normalfont_checkbutton),
+                prefs_common.derive_from_normal_font);
+       row++;
 
-       tmplabel = gtk_label_new (_("Normal"));
+       /* small font label */
+       tmplabel = gtk_label_new (_("Small"));
        gtk_widget_show (tmplabel);
-       gtk_table_attach (GTK_TABLE (table), tmplabel, 0, 1, 2, 3,
+       gtk_table_attach (GTK_TABLE (table), tmplabel, 0, 1, row, row+1,
                         (GtkAttachOptions) GTK_FILL,
                         (GtkAttachOptions) (0), 0, 0);
        gtk_label_set_justify(GTK_LABEL(tmplabel), GTK_JUSTIFY_RIGHT);
        gtk_misc_set_alignment(GTK_MISC(tmplabel), 1, 0.5);
-
-       entry_normalfont = gtk_entry_new ();
-       gtk_widget_show (entry_normalfont);
-       gtk_table_attach (GTK_TABLE (table), entry_normalfont, 1, 2, 2, 3,
+       SET_TOGGLE_SENSITIVITY_REVERSE (derive_from_normalfont_checkbutton, tmplabel);
+
+       /* small font button */
+       entry_folderview_smallfont = gtk_font_button_new_with_font (prefs_common.smallfont);
+       g_object_set(G_OBJECT(entry_folderview_smallfont), 
+                             "use-font", TRUE, 
+                             NULL);
+       gtk_widget_show (entry_folderview_smallfont);
+       gtk_table_attach (GTK_TABLE (table), entry_folderview_smallfont, 1, 2, row, row+1,
                         (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
                         (GtkAttachOptions) (0), 0, 0);
-       gtk_entry_set_text(GTK_ENTRY(entry_normalfont), prefs_common.normalfont);
-
-       tmpbutton = gtk_button_new_with_label (" ... ");
-       gtk_widget_show (tmpbutton);
-       gtk_table_attach (GTK_TABLE (table), tmpbutton, 2, 3, 2, 3,
-                         0, 0, 0, 0);
-       gtk_signal_connect (GTK_OBJECT(tmpbutton), "clicked",
-                               GTK_SIGNAL_FUNC(prefs_font_select), entry_normalfont);
+       SET_TOGGLE_SENSITIVITY_REVERSE (derive_from_normalfont_checkbutton, entry_folderview_smallfont);
+       row++;
 
+       /* bold font label */
        tmplabel = gtk_label_new (_("Bold"));
        gtk_widget_show (tmplabel);
-       gtk_table_attach (GTK_TABLE (table), tmplabel, 0, 1, 3, 4,
+       gtk_table_attach (GTK_TABLE (table), tmplabel, 0, 1, row, row+1,
                         (GtkAttachOptions) GTK_FILL,
                         (GtkAttachOptions) (0), 0, 0);
        gtk_label_set_justify(GTK_LABEL(tmplabel), GTK_JUSTIFY_RIGHT);
        gtk_misc_set_alignment(GTK_MISC(tmplabel), 1, 0.5);
-
-       entry_boldfont = gtk_entry_new ();
-       gtk_widget_show (entry_boldfont);
-       gtk_table_attach (GTK_TABLE (table), entry_boldfont, 1, 2, 3, 4,
+       SET_TOGGLE_SENSITIVITY_REVERSE (derive_from_normalfont_checkbutton, tmplabel);
+
+       /* bold font button */
+       entry_folderview_boldfont = gtk_font_button_new_with_font (prefs_common.boldfont);
+       g_object_set(G_OBJECT(entry_folderview_boldfont), 
+                             "use-font", TRUE, 
+                             NULL);
+       gtk_widget_show (entry_folderview_boldfont);
+       gtk_table_attach (GTK_TABLE (table), entry_folderview_boldfont, 1, 2, row, row+1,
                         (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
                         (GtkAttachOptions) (0), 0, 0);
-       gtk_entry_set_text(GTK_ENTRY(entry_boldfont), prefs_common.boldfont);
-
-       tmpbutton = gtk_button_new_with_label (" ... ");
-       gtk_widget_show (tmpbutton);
-       gtk_table_attach (GTK_TABLE (table), tmpbutton, 2, 3, 3, 4,
-                         0, 0, 0, 0);
-       gtk_signal_connect (GTK_OBJECT(tmpbutton), "clicked",
-                               GTK_SIGNAL_FUNC(prefs_font_select), entry_boldfont);
+       SET_TOGGLE_SENSITIVITY_REVERSE (derive_from_normalfont_checkbutton, entry_folderview_boldfont);
+       row++;
+
+#if defined(USE_GNOMEPRINT) || GTK_CHECK_VERSION(2,10,0)
+       /* print check button */
+       print_checkbutton = gtk_check_button_new_with_label(_("Use different font for printing"));
+       gtk_widget_show(print_checkbutton);
+       gtk_table_attach (GTK_TABLE (table), print_checkbutton, 0, 2, row, row+1,
+                        (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                        (GtkAttachOptions) (0), 0, 0);
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(print_checkbutton),
+                prefs_common.use_different_print_font);
+       row++;
 
-       vbox = gtk_vbox_new(FALSE, VSPACING_NARROW);
-       gtk_widget_show(vbox);
-       gtk_table_attach (GTK_TABLE (table), vbox, 0, 4, 4, 5,
-                        (GtkAttachOptions) (GTK_FILL),
+       /* print font label */
+       tmplabel = gtk_label_new (_("Message Printing"));
+       gtk_widget_show (tmplabel);
+       gtk_table_attach (GTK_TABLE (table), tmplabel, 0, 1, row, row+1,
+                        (GtkAttachOptions) GTK_FILL,
                         (GtkAttachOptions) (0), 0, 0);
-       
-       hint_label = gtk_label_new (_("You will need to restart for the "
-                                     "changes to take effect"));
-       gtk_widget_show (hint_label);
-       gtk_box_pack_start (GTK_BOX (vbox), 
-                           hint_label, FALSE, FALSE, 0);
-       gtk_misc_set_alignment(GTK_MISC(hint_label), 0.5, 0.5);
-
-       prefs_fonts->window             = GTK_WIDGET(window);
-       prefs_fonts->entry_textfont     = entry_textfont;
-       prefs_fonts->entry_smallfont    = entry_smallfont;
-       prefs_fonts->entry_normalfont   = entry_normalfont;
-       prefs_fonts->entry_boldfont     = entry_boldfont;
-       prefs_fonts->button_textfont    = button_textfont;
+       gtk_label_set_justify(GTK_LABEL(tmplabel), GTK_JUSTIFY_RIGHT);
+       gtk_misc_set_alignment(GTK_MISC(tmplabel), 1, 0.5);
+       SET_TOGGLE_SENSITIVITY (print_checkbutton, tmplabel);
+
+       /* print font button */
+       entry_messageprintfont = gtk_font_button_new_with_font (prefs_common.printfont);
+       g_object_set(G_OBJECT(entry_messageprintfont), 
+                             "use-font", TRUE, 
+                             NULL);
+       gtk_widget_show (entry_messageprintfont);
+       gtk_table_attach (GTK_TABLE (table), entry_messageprintfont, 1, 2, row, row+1,
+                        (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                        (GtkAttachOptions) (0), 0, 0);
+       SET_TOGGLE_SENSITIVITY (print_checkbutton, entry_messageprintfont);
+       row++;
+#endif
+
+       prefs_fonts->window                     = GTK_WIDGET(window);
+       prefs_fonts->entry_folderview_smallfont = entry_folderview_smallfont;
+       prefs_fonts->entry_folderview_normalfont = entry_folderview_normalfont;
+       prefs_fonts->entry_folderview_boldfont   = entry_folderview_boldfont;
+       prefs_fonts->entry_messageviewfont      = entry_messageviewfont;
+       prefs_fonts->derive_from_normalfont_checkbutton = derive_from_normalfont_checkbutton;
+#if defined(USE_GNOMEPRINT) || GTK_CHECK_VERSION(2,10,0)
+       prefs_fonts->entry_messageprintfont     = entry_messageprintfont;
+       prefs_fonts->print_checkbutton          = print_checkbutton;
+#endif
 
        prefs_fonts->page.widget = table;
 }
 
-void prefs_fonts_save(PrefsPage *_page)
+static void prefs_fonts_save(PrefsPage *_page)
 {
        FontsPage *fonts = (FontsPage *) _page;
 
-       prefs_common.textfont   = gtk_editable_get_chars
-               (GTK_EDITABLE(fonts->entry_textfont), 0, -1);
-       prefs_common.smallfont  = gtk_editable_get_chars
-               (GTK_EDITABLE(fonts->entry_smallfont), 0, -1);
-       prefs_common.boldfont   = gtk_editable_get_chars
-               (GTK_EDITABLE(fonts->entry_boldfont), 0, -1);
-       prefs_common.normalfont = gtk_editable_get_chars
-               (GTK_EDITABLE(fonts->entry_normalfont), 0, -1);
+       g_free(prefs_common.boldfont);
+       prefs_common.boldfont = g_strdup(gtk_font_button_get_font_name
+               (GTK_FONT_BUTTON(fonts->entry_folderview_boldfont)));
+
+       g_free(prefs_common.normalfont);
+       prefs_common.normalfont = g_strdup(gtk_font_button_get_font_name
+               (GTK_FONT_BUTTON(fonts->entry_folderview_normalfont)));
+               
+       g_free(prefs_common.smallfont);         
+       prefs_common.smallfont  = g_strdup(gtk_font_button_get_font_name
+               (GTK_FONT_BUTTON(fonts->entry_folderview_smallfont)));
+
+       g_free(prefs_common.textfont);          
+       prefs_common.textfont   = g_strdup(gtk_font_button_get_font_name
+               (GTK_FONT_BUTTON(fonts->entry_messageviewfont)));
+
+       prefs_common.derive_from_normal_font = gtk_toggle_button_get_active
+                       (GTK_TOGGLE_BUTTON(fonts->derive_from_normalfont_checkbutton));
+
+#if defined(USE_GNOMEPRINT) || GTK_CHECK_VERSION(2,10,0)
+       g_free(prefs_common.printfont);         
+       prefs_common.printfont   = g_strdup(gtk_font_button_get_font_name
+               (GTK_FONT_BUTTON(fonts->entry_messageprintfont)));
+       prefs_common.use_different_print_font = gtk_toggle_button_get_active
+                       (GTK_TOGGLE_BUTTON(fonts->print_checkbutton));
+#endif
+
+       main_window_reflect_prefs_all();
 }
+
 static void prefs_fonts_destroy_widget(PrefsPage *_page)
 {
        /* FontsPage *fonts = (FontsPage *) _page; */
@@ -293,13 +272,18 @@ FontsPage *prefs_fonts;
 void prefs_fonts_init(void)
 {
        FontsPage *page;
+       static gchar *path[3];
+
+       path[0] = _("Display");
+       path[1] = _("Fonts");
+       path[2] = NULL;
 
        page = g_new0(FontsPage, 1);
-       page->page.path = _("Display/Fonts");
+       page->page.path = path;
        page->page.create_widget = prefs_fonts_create_widget;
        page->page.destroy_widget = prefs_fonts_destroy_widget;
        page->page.save_page = prefs_fonts_save;
-       page->page.weight = 60.0;
+       page->page.weight = 135.0;
        prefs_gtk_register_page((PrefsPage *) page);
        prefs_fonts = page;
 }