/*
* grn_prefs.c: preferences dialog
*
* $Id: grn_prefs.c,v 1.22 2000/05/19 14:51:46 sc Exp $
*/
/* Copyright (C) 1999-2000 Sergey Chernikov (sc@ivvs.ul.ru)
*
* Authors: Sergey Chernikov <sc@ivvs.ul.ru>
*
* 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
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* 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
*/
#include "grn_consts.h"
#include <gnome.h>
#include "grn_vars.h"
#include "grn_config.h"
#include "grn_prefs.h"
#include "grn_util.h"
#include "grn_nglist.h"
typedef struct GrnPrefs
{
GnomePropertyBox *pbox;
GtkRadioButton *toolbar_type[PREFS_NUM_TOOLBAR_STYLES];
GtkWidget *nntp_server;
GtkWidget *nntp_auth;
GtkWidget *nntp_login;
GtkWidget *nntp_passwd;
GtkWidget *groups_desc;
GtkWidget *smtp_server;
GtkWidget *en_name;
GtkWidget *en_email;
GtkWidget *en_replyto;
GtkWidget *en_org;
GtkWidget *en_qre;
GtkWidget *en_ua;
GtkWidget *srv_autoconnect;
GtkWidget *cb_tooltips;
GtkWidget *cb_sscroll;
GtkWidget *cfms[NCFMS];
GtkWidget *fp[NFONTS];
GtkWidget *fg_cp[NCOLORS];
GtkWidget *bg_cp[NCOLORS];
GtkWidget *en_path[NPATHS];
} GrnPrefs;
typedef struct FontPal
{
GnomeDialog *dialog;
GtkCList *clist;
GtkWidget *lbl_test;
GtkWidget *btn_edit;
GtkWidget *btn_del;
GtkWidget *btn_up;
GtkWidget *btn_down;
} FontPal;
typedef struct ColorPal
{
GnomeDialog *dialog;
GtkCList *clist;
GtkWidget *btn_edit;
GtkWidget *btn_del;
GtkWidget *btn_up;
GtkWidget *btn_down;
} ColorPal;
static GrnPrefs *pui=NULL;
static FontPal *fpal=NULL;
static ColorPal *cpal=NULL;
static guint toolbar_stl[PREFS_NUM_TOOLBAR_STYLES] =
{ GTK_TOOLBAR_TEXT, GTK_TOOLBAR_ICONS, GTK_TOOLBAR_BOTH, -1 };
static gchar *toolbar_stl_label[PREFS_NUM_TOOLBAR_STYLES] =
{ N_("Text"), N_("Icons"), N_("Both"), N_("Gnome setting") };
static GtkWidget *create_server_page(void);
static GtkWidget *create_identity_page(void);
static GtkWidget *create_display_page(void);
static GtkWidget *create_fonts_page(void);
static GtkWidget *create_colors_page(void);
static GtkWidget *create_confirm_page(void);
static GtkWidget *create_paths_page(void);
static void properties_modified_cb(GtkWidget *, GnomePropertyBox *);
static void set_prefs(void);
static void cancel_prefs(void);
static void apply_prefs(GnomePropertyBox *, gint, GrnPrefs *);
void evt_preferences(GtkWidget *w)
{
GtkWidget *label;
GnomeApp *active_win;
gint i;
if (pui)
{
gdk_window_raise(GTK_WIDGET(GNOME_DIALOG(pui->pbox))->window);
return;
}
pui = (GrnPrefs *) g_malloc(sizeof(GrnPrefs));
pui->pbox = GNOME_PROPERTY_BOX(gnome_property_box_new());
gtk_window_set_title(GTK_WINDOW(pui->pbox), _("GRN Preferences"));
active_win = GNOME_APP(GRN->window);
gnome_dialog_set_parent(GNOME_DIALOG(pui->pbox), GTK_WINDOW(active_win));
gtk_signal_connect(GTK_OBJECT(pui->pbox), "destroy",
GTK_SIGNAL_FUNC(cancel_prefs), pui);
gtk_signal_connect(GTK_OBJECT(pui->pbox), "delete_event",
GTK_SIGNAL_FUNC(gtk_false), NULL);
gtk_signal_connect(GTK_OBJECT(pui->pbox), "apply",
GTK_SIGNAL_FUNC(apply_prefs), pui);
label = gtk_label_new(_("Server"));
gtk_notebook_append_page(GTK_NOTEBOOK(GNOME_PROPERTY_BOX(pui->pbox)->notebook),
create_server_page(), label);
label = gtk_label_new(_("Identity"));
gtk_notebook_append_page(GTK_NOTEBOOK(GNOME_PROPERTY_BOX(pui->pbox)->notebook),
create_identity_page(), label);
label = gtk_label_new(_("Display"));
gtk_notebook_append_page(GTK_NOTEBOOK(GNOME_PROPERTY_BOX(pui->pbox)->notebook),
create_display_page(), label);
label = gtk_label_new(_("Fonts"));
gtk_notebook_append_page(GTK_NOTEBOOK(GNOME_PROPERTY_BOX(pui->pbox)->notebook),
create_fonts_page(), label);
label = gtk_label_new(_("Colors"));
gtk_notebook_append_page(GTK_NOTEBOOK(GNOME_PROPERTY_BOX(pui->pbox)->notebook),
create_colors_page(), label);
label = gtk_label_new(_("Confirmations"));
gtk_notebook_append_page(GTK_NOTEBOOK(GNOME_PROPERTY_BOX(pui->pbox)->notebook),
create_confirm_page(), label);
label = gtk_label_new(_("Paths"));
gtk_notebook_append_page(GTK_NOTEBOOK(GNOME_PROPERTY_BOX(pui->pbox)->notebook),
create_paths_page(), label);
set_prefs();
gtk_signal_connect(GTK_OBJECT(pui->srv_autoconnect), "clicked",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->nntp_auth), "clicked",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->groups_desc), "clicked",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->cb_tooltips), "clicked",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->cb_sscroll), "clicked",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->nntp_server), "changed",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->nntp_login), "changed",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->nntp_passwd), "changed",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->smtp_server), "changed",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->en_name), "changed",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->en_email), "changed",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->en_replyto), "changed",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->en_org), "changed",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->en_qre), "changed",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_signal_connect(GTK_OBJECT(pui->en_ua), "changed",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
for (i=0; i<PREFS_NUM_TOOLBAR_STYLES; i++)
gtk_signal_connect(GTK_OBJECT(pui->toolbar_type[i]), "clicked",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
for (i=0; i<NPATHS; i++)
gtk_signal_connect(GTK_OBJECT(pui->en_path[i]), "changed",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
for (i=0; i<NCFMS; i++)
gtk_signal_connect(GTK_OBJECT(pui->cfms[i]), "clicked",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
for (i=0; i<NFONTS; i++)
gtk_signal_connect(GTK_OBJECT(pui->fp[i]), "clicked",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
for (i=0; i<NCOLORS; i++)
gtk_signal_connect(GTK_OBJECT(pui->fg_cp[i]), "clicked",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
for (i=0; i<NCOLORS; i++)
if (pui->bg_cp[i]) gtk_signal_connect(GTK_OBJECT(pui->bg_cp[i]), "clicked",
GTK_SIGNAL_FUNC(properties_modified_cb), pui->pbox);
gtk_widget_show_all(GTK_WIDGET(pui->pbox));
}
static void nntp_auth_clicked(GtkWidget *w, gpointer data)
{
gboolean active = GTK_TOGGLE_BUTTON(pui->nntp_auth)->active;
gtk_widget_set_sensitive(pui->nntp_login, active);
gtk_widget_set_sensitive(pui->nntp_passwd, active);
}
static GtkWidget *create_server_page(void)
{
GtkWidget *vbox, *table, *label;
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
table = gtk_table_new(4, 2, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 5);
label = gtk_label_new(_("NNTP Server:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0,1,0,1, GTK_FILL, GTK_FILL, 5,2);
pui->nntp_server = gtk_entry_new();
gtk_table_attach(GTK_TABLE(table), pui->nntp_server, 1,2,0,1,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0,2);
pui->srv_autoconnect = gtk_check_button_new_with_label(_("Connect to NNTP server at startup"));
gtk_table_attach(GTK_TABLE(table), pui->srv_autoconnect, 1,2,1,2,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 2);
pui->nntp_auth = gtk_check_button_new_with_label(_("NNTP server needs authentication"));
gtk_table_attach(GTK_TABLE(table), pui->nntp_auth, 1,2,2,3,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 2);
label = gtk_label_new(_("Login:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0,1,3,4, GTK_FILL, GTK_FILL, 5,2);
pui->nntp_login = gtk_entry_new();
gtk_table_attach(GTK_TABLE(table), pui->nntp_login, 1,2,3,4,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0,2);
label = gtk_label_new(_("Password:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0,1,4,5, GTK_FILL, GTK_FILL, 5,2);
pui->nntp_passwd = gtk_entry_new();
gtk_entry_set_visibility(GTK_ENTRY(pui->nntp_passwd), FALSE);
gtk_table_attach(GTK_TABLE(table), pui->nntp_passwd, 1,2,4,5,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0,2);
pui->groups_desc = gtk_check_button_new_with_label(_("Download groups descriptions"));
gtk_table_attach(GTK_TABLE(table), pui->groups_desc, 1,2,5,6,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 2);
gtk_widget_set_sensitive(pui->nntp_login, grn_prefs.nntp_auth);
gtk_widget_set_sensitive(pui->nntp_passwd, grn_prefs.nntp_auth);
gtk_signal_connect(GTK_OBJECT(pui->nntp_auth), "clicked",
GTK_SIGNAL_FUNC(nntp_auth_clicked), NULL);
gtk_table_attach(GTK_TABLE(table), gtk_hseparator_new(), 0,2,6,7,
GTK_FILL, GTK_FILL, 0,2);
label = gtk_label_new(_("SMTP Server:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0,1,7,8, GTK_FILL, GTK_FILL, 5,2);
pui->smtp_server = gtk_entry_new();
gtk_table_attach(GTK_TABLE(table), pui->smtp_server, 1,2,7,8,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0,2);
return vbox;
}
static GtkWidget *create_identity_page(void)
{
GtkWidget *vbox, *table, *label;
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
table = gtk_table_new(4, 2, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 5);
label = gtk_label_new(_("Your name:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0,1,0,1, GTK_FILL, GTK_FILL, 5,2);
pui->en_name = gtk_entry_new();
gtk_table_attach(GTK_TABLE(table), pui->en_name, 1,2,0,1,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0,2);
label = gtk_label_new(_("e-mail address:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0,1,1,2, GTK_FILL, GTK_FILL, 5,2);
pui->en_email = gtk_entry_new();
gtk_table_attach(GTK_TABLE(table), pui->en_email, 1,2,1,2,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0,2);
label = gtk_label_new(_("Reply-to address:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0,1,2,3, GTK_FILL, GTK_FILL, 5,2);
pui->en_replyto = gtk_entry_new();
gtk_tooltips_set_tip(GRN->tooltips, pui->en_replyto, _("Specify your Reply-to address if only it differs from e-mail address"), NULL);
gtk_table_attach(GTK_TABLE(table), pui->en_replyto, 1,2,2,3,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0,2);
label = gtk_label_new(_("Organization:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0,1,3,4, GTK_FILL, GTK_FILL, 5,2);
pui->en_org = gtk_entry_new();
gtk_table_attach(GTK_TABLE(table), pui->en_org, 1,2,3,4,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0,2);
label = gtk_label_new(_("User-Agent:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0,1,4,5, GTK_FILL, GTK_FILL, 5,2);
pui->en_ua = gtk_entry_new();
gtk_table_attach(GTK_TABLE(table), pui->en_ua, 1,2,4,5,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0,2);
return vbox;
}
static GtkWidget *create_paths_page(void)
{
GtkWidget *vbox, *table, *label;
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
table = gtk_table_new(4, 2, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 5);
label = gtk_label_new(_("newsrc:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0,1,0,1, GTK_FILL, GTK_FILL, 5,2);
pui->en_path[0] = gtk_entry_new();
gtk_table_attach(GTK_TABLE(table), pui->en_path[0], 1,2,0,1,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0,2);
label = gtk_label_new(_("backup newsrc:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0,1,1,2, GTK_FILL, GTK_FILL, 5,2);
pui->en_path[1] = gtk_entry_new();
gtk_table_attach(GTK_TABLE(table), pui->en_path[1], 1,2,1,2,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0,2);
return vbox;
}
static GtkWidget *create_display_page(void)
{
GtkWidget *vbox, *vbox1, *frame, *table, *label;
GSList *group;
gint i;
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
table = gtk_table_new(2, 1, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 5);
frame = gtk_frame_new(_("Toolbars"));
gtk_table_attach(GTK_TABLE(table), frame, 0,1,0,4, GTK_FILL, GTK_FILL, 2,0);
vbox1 = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(frame), GTK_WIDGET(vbox1));
group = NULL;
for (i=0; i<PREFS_NUM_TOOLBAR_STYLES; i++)
{
pui->toolbar_type[i] = GTK_RADIO_BUTTON(gtk_radio_button_new_with_label(group, _(toolbar_stl_label[i])));
gtk_box_pack_start(GTK_BOX(vbox1), GTK_WIDGET(pui->toolbar_type[i]), TRUE, TRUE, 2);
group = gtk_radio_button_group(pui->toolbar_type[i]);
}
pui->cb_tooltips = gtk_check_button_new_with_label(_("Show tooltips"));
gtk_table_attach(GTK_TABLE(table), pui->cb_tooltips, 1,2,0,1, GTK_FILL, GTK_FILL, 3,0);
pui->cb_sscroll = gtk_check_button_new_with_label(_("Smooth scrolling"));
gtk_table_attach(GTK_TABLE(table), pui->cb_sscroll, 1,2,1,2, GTK_FILL, GTK_FILL, 3,0);
table = gtk_table_new(4, 2, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 5);
label = gtk_label_new(_("Quoting regexp:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0,1,0,1,
GTK_FILL, GTK_FILL, 5,5);
pui->en_qre = gtk_entry_new();
gtk_table_attach(GTK_TABLE(table), pui->en_qre, 1,2,0,1,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0,5);
return vbox;
}
static void fp_set_font(GnomeFontPicker *fp, gchar *font_name, GtkLabel *label)
{
g_return_if_fail(GTK_IS_LABEL(label));
grn_widget_set_style(GTK_WIDGET(label), font_name, NULL, NULL, NULL);
gtk_label_set_text(label, font_name);
}
static GtkWidget *create_fonts_page(void)
{
gchar *frame_title[NFONTS] =
{
_("Article body proportional font"),
_("Article body monospaced font"),
_("Message headers font"),
_("Threadlist font"),
_("Groups listing font")
};
GtkWidget *vbox, *table;
gint i;
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
table = gtk_table_new(2, 2, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
for (i=0; i<NFONTS; i++)
{
GtkWidget *frame, *hbox, *label;
frame = gtk_frame_new(frame_title[i]);
gtk_table_attach(GTK_TABLE(table), frame, 0, 1, i, i + 1,
GTK_FILL|GTK_EXPAND, GTK_FILL, 2, 2);
hbox = gtk_hbox_new(FALSE, FALSE);
gtk_container_add(GTK_CONTAINER(frame), hbox);
label = gtk_label_new("");
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 1);
pui->fp[i] = gnome_font_picker_new();
fp_set_font(GNOME_FONT_PICKER(pui->fp[i]), grn_prefs.fonts[i], GTK_LABEL(label));
gtk_signal_connect(GTK_OBJECT(pui->fp[i]), "font_set",
GTK_SIGNAL_FUNC(fp_set_font), label);
gtk_box_pack_start(GTK_BOX(hbox), pui->fp[i], FALSE, FALSE, 1);
}
return vbox;
}
static GtkWidget *create_colors_page(void)
{
GtkWidget *vbox, *table, *label;
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
table = gtk_table_new(2, 2, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
label = gtk_label_new(_("Foreground"));
gtk_table_attach(GTK_TABLE(table), label, 2,3,0,1, GTK_FILL, GTK_FILL, GNOME_PAD_SMALL,1);
label = gtk_label_new(_("Background"));
gtk_table_attach(GTK_TABLE(table), label, 3,4,0,1, GTK_FILL, GTK_FILL, GNOME_PAD_SMALL,1);
gtk_table_attach(GTK_TABLE(table), gtk_hseparator_new(), 0,4,1,2,
GTK_FILL, GTK_FILL, 0,GNOME_PAD_SMALL);
gtk_table_attach(GTK_TABLE(table), gtk_vseparator_new(), 1,2,0,5,
GTK_FILL, GTK_FILL, GNOME_PAD_SMALL,1);
label = gtk_label_new(_("Article body"));
gtk_table_attach(GTK_TABLE(table), label, 0,1,2,3, GTK_FILL, GTK_FILL, GNOME_PAD_SMALL,GNOME_PAD_SMALL);
pui->fg_cp[0] = gnome_color_picker_new();
gtk_table_attach(GTK_TABLE(table), pui->fg_cp[0], 2,3,2,3, GTK_FILL, GTK_FILL, GNOME_PAD_SMALL,GNOME_PAD_SMALL);
pui->bg_cp[0] = gnome_color_picker_new();
gtk_table_attach(GTK_TABLE(table), pui->bg_cp[0], 3,4,2,3, GTK_FILL, GTK_FILL, GNOME_PAD_SMALL,GNOME_PAD_SMALL);
label = gtk_label_new(_("Quoted text"));
gtk_table_attach(GTK_TABLE(table), label, 0,1,3,4, GTK_FILL, GTK_FILL, GNOME_PAD_SMALL,GNOME_PAD_SMALL);
pui->fg_cp[1] = gnome_color_picker_new();
gtk_table_attach(GTK_TABLE(table), pui->fg_cp[1], 2,3,3,4, GTK_FILL, GTK_FILL, GNOME_PAD_SMALL,GNOME_PAD_SMALL);
pui->bg_cp[1] = NULL;
label = gtk_label_new(_("Signature"));
gtk_table_attach(GTK_TABLE(table), label, 0,1,4,5, GTK_FILL, GTK_FILL, GNOME_PAD_SMALL,GNOME_PAD_SMALL);
pui->fg_cp[2] = gnome_color_picker_new();
gtk_table_attach(GTK_TABLE(table), pui->fg_cp[2], 2,3,4,5, GTK_FILL, GTK_FILL, GNOME_PAD_SMALL,GNOME_PAD_SMALL);
pui->bg_cp[2] = NULL;
return vbox;
}
static GtkWidget *create_confirm_page(void)
{
gchar *cfm_names[NCFMS] =
{
_("Catchup group"),
_("Mark group unread"),
_("Mark thread read"),
_("Mark thread unread"),
_("Abort posting"),
_("Show warnings"),
_("Show informational messages")
};
GtkWidget *vbox;
gint i;
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
for (i=0; i<NCFMS; i++)
{
pui->cfms[i] = gtk_check_button_new_with_label(cfm_names[i]);
gtk_box_pack_start(GTK_BOX(vbox), pui->cfms[i], FALSE, FALSE, 2);
}
return vbox;
}
static void properties_modified_cb(GtkWidget *w, GnomePropertyBox *gpb)
{
gnome_property_box_changed(gpb);
}
static void set_prefs(void)
{
gint i;
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pui->srv_autoconnect), grn_prefs.srv_autoconnect);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pui->nntp_auth), grn_prefs.nntp_auth);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pui->groups_desc), grn_prefs.groups_desc);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pui->cb_tooltips), grn_prefs.tooltips);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pui->cb_sscroll), grn_prefs.smooth_scrolling);
gtk_entry_set_text(GTK_ENTRY(pui->nntp_server), grn_prefs.nntp_server);
gtk_entry_set_text(GTK_ENTRY(pui->nntp_login), grn_prefs.nntp_login);
gtk_entry_set_text(GTK_ENTRY(pui->nntp_passwd), grn_prefs.nntp_passwd);
gtk_entry_set_text(GTK_ENTRY(pui->smtp_server), grn_prefs.smtp_server);
gtk_entry_set_text(GTK_ENTRY(pui->en_name), grn_prefs.name);
gtk_entry_set_text(GTK_ENTRY(pui->en_email), grn_prefs.email);
gtk_entry_set_text(GTK_ENTRY(pui->en_replyto), grn_prefs.replyto);
gtk_entry_set_text(GTK_ENTRY(pui->en_org), grn_prefs.org);
gtk_entry_set_text(GTK_ENTRY(pui->en_ua), grn_prefs.ua);
gtk_entry_set_text(GTK_ENTRY(pui->en_qre), grn_prefs.re_quoting);
for (i=0; i<NPATHS; i++)
gtk_entry_set_text(GTK_ENTRY(pui->en_path[i]), grn_prefs.paths[i]);
for (i=0; i<PREFS_NUM_TOOLBAR_STYLES; i++)
if (grn_prefs.toolbar_style == toolbar_stl[i])
{
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pui->toolbar_type[i]), TRUE);
break;
}
for (i=0; i<NCFMS; i++)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pui->cfms[i]), grn_prefs.cfms[i]);
for (i=0; i<NFONTS; i++)
gnome_font_picker_set_font_name(GNOME_FONT_PICKER(pui->fp[i]), g_strdup(grn_prefs.fonts[i]));
for (i=0; i<NCOLORS; i++)
{
gnome_color_picker_set_i16(GNOME_COLOR_PICKER(pui->fg_cp[i]), grn_prefs.fg_colors[i].red,
grn_prefs.fg_colors[i].green, grn_prefs.fg_colors[i].blue, 65534);
if (pui->bg_cp[i])
gnome_color_picker_set_i16(GNOME_COLOR_PICKER(pui->bg_cp[i]), grn_prefs.bg_colors[i].red,
grn_prefs.bg_colors[i].green, grn_prefs.bg_colors[i].blue, 65534);
}
}
static void cancel_prefs(void)
{
gtk_widget_destroy(GTK_WIDGET(pui->pbox));
g_free(pui);
pui = NULL;
}
static void apply_prefs(GnomePropertyBox *pbox, gint page, GrnPrefs *gp)
{
gint i;
GdkColormap *cmap;
grn_prefs.srv_autoconnect = GTK_TOGGLE_BUTTON(pui->srv_autoconnect)->active;
grn_prefs.nntp_auth = GTK_TOGGLE_BUTTON(pui->nntp_auth)->active;
grn_prefs.groups_desc = GTK_TOGGLE_BUTTON(pui->groups_desc)->active;
grn_prefs.tooltips = GTK_TOGGLE_BUTTON(pui->cb_tooltips)->active;
grn_prefs.smooth_scrolling = GTK_TOGGLE_BUTTON(pui->cb_sscroll)->active;
str_free(&(grn_prefs.nntp_server));
grn_prefs.nntp_server = g_strdup(gtk_entry_get_text(GTK_ENTRY(pui->nntp_server)));
str_free(&(grn_prefs.nntp_login));
grn_prefs.nntp_login = g_strdup(gtk_entry_get_text(GTK_ENTRY(pui->nntp_login)));
str_free(&(grn_prefs.nntp_passwd));
grn_prefs.nntp_passwd = g_strdup(gtk_entry_get_text(GTK_ENTRY(pui->nntp_passwd)));
str_free(&(grn_prefs.smtp_server));
grn_prefs.smtp_server = g_strdup(gtk_entry_get_text(GTK_ENTRY(pui->smtp_server)));
str_free(&(grn_prefs.name));
grn_prefs.name = g_strdup(gtk_entry_get_text(GTK_ENTRY(pui->en_name)));
str_free(&(grn_prefs.email));
grn_prefs.email = g_strdup(gtk_entry_get_text(GTK_ENTRY(pui->en_email)));
str_free(&(grn_prefs.replyto));
grn_prefs.replyto = g_strdup(gtk_entry_get_text(GTK_ENTRY(pui->en_replyto)));
str_free(&(grn_prefs.org));
grn_prefs.org = g_strdup(gtk_entry_get_text(GTK_ENTRY(pui->en_org)));
str_free(&(grn_prefs.ua));
grn_prefs.ua = g_strdup(gtk_entry_get_text(GTK_ENTRY(pui->en_ua)));
str_free(&(grn_prefs.re_quoting));
grn_prefs.re_quoting = g_strdup(gtk_entry_get_text(GTK_ENTRY(pui->en_qre)));
for (i=0; i<NPATHS; i++)
{
str_free(&(grn_prefs.paths[i]));
grn_prefs.paths[i] = g_strdup(gtk_entry_get_text(GTK_ENTRY(pui->en_path[i])));
}
for (i=0; i<PREFS_NUM_TOOLBAR_STYLES; i++)
if (GTK_TOGGLE_BUTTON(pui->toolbar_type[i])->active)
{
grn_prefs.toolbar_style = toolbar_stl[i];
break;
}
for (i=0; i<NCFMS; i++)
grn_prefs.cfms[i] = GTK_TOGGLE_BUTTON(pui->cfms[i])->active;
for (i=0; i<NFONTS; i++)
{
str_free(&(grn_prefs.fonts[i]));
grn_prefs.fonts[i] = g_strdup(gnome_font_picker_get_font_name(GNOME_FONT_PICKER(pui->fp[i])));
}
cmap = gdk_colormap_get_system();
for (i=0; i<NCOLORS; i++)
{
gushort r, g, b, a;
gnome_color_picker_get_i16(GNOME_COLOR_PICKER(pui->fg_cp[i]), &r, &g, &b, &a);
grn_prefs.fg_colors[i].red = r; grn_prefs.fg_colors[i].green = g;
grn_prefs.fg_colors[i].blue = b;
gdk_color_alloc(cmap, &(grn_prefs.fg_colors[i]));
if (pui->bg_cp[i])
{
gnome_color_picker_get_i16(GNOME_COLOR_PICKER(pui->bg_cp[i]), &r, &g, &b, &a);
grn_prefs.bg_colors[i].red = r; grn_prefs.bg_colors[i].green = g;
grn_prefs.bg_colors[i].blue = b;
gdk_color_alloc(cmap, &(grn_prefs.bg_colors[i]));
}
}
grn_prefs_realize();
}
static void destroy_fpal(GtkWidget *w)
{
g_free(fpal); fpal = NULL;
}
static void fpal_ok(GtkWidget *w)
{
gint i;
GSList *l;
if (! fpal) return;
for (l=grn_prefs.fontpal; l; l=l->next) g_free(l->data);
g_slist_free(grn_prefs.fontpal); grn_prefs.fontpal = NULL;
for (i=0; i<GTK_CLIST(fpal->clist)->rows; i++)
{
gchar *font;
gtk_clist_get_text(GTK_CLIST(fpal->clist), i, 1, &font);
grn_prefs.fontpal = g_slist_prepend(grn_prefs.fontpal, g_strdup(font));
}
grn_prefs.fontpal = g_slist_reverse(grn_prefs.fontpal);
gtk_widget_destroy(GTK_WIDGET(fpal->dialog));
}
static void fpal_clist_renumber(GtkWidget *clist)
{
clist_renumber(GTK_CLIST(clist));
}
static void fpal_add_to_clist(GtkWidget *clist, gchar *font)
{
gchar *text[2] = {"", font};
gint row = gtk_clist_append(GTK_CLIST(clist), text);
gtk_clist_select_row(GTK_CLIST(clist), row, 1);
}
static void fpal_sel(GtkWidget *clist, gint row, gint col, GdkEventButton *ev, GtkWidget *lbl)
{
gchar *font;
gtk_clist_get_text(GTK_CLIST(clist), row, 1, &font);
grn_widget_set_style(lbl, font, NULL, NULL, NULL);
}
typedef struct font_data
{
GtkWidget **dlg;
GtkWidget *clist;
gint row;
} font_data;
static void font_destroy(GtkWidget *w, font_data *fd)
{
*(fd->dlg) = NULL;
g_free(fd);
}
static void font_cancel(GtkWidget *w, font_data *fd)
{
gtk_widget_destroy(*(fd->dlg));
}
static void font_ok(GtkWidget *w, font_data *fd)
{
fpal_add_to_clist(fd->clist, gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(*(fd->dlg))));
fpal_clist_renumber(fd->clist);
gtk_widget_destroy(*(fd->dlg));
}
static void fpal_add(GtkWidget *w, GtkWidget *clist)
{
static GtkWidget *dlg = NULL;
font_data *fd;
if (dlg) return;
fd = g_new(font_data, 1);
dlg = gtk_font_selection_dialog_new(_("Add new font"));
fd->clist = clist; fd->dlg = &dlg;
gtk_widget_destroy(GTK_FONT_SELECTION_DIALOG(dlg)->apply_button);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
GTK_SIGNAL_FUNC(font_destroy), fd);
gtk_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(dlg)->cancel_button),
"clicked", GTK_SIGNAL_FUNC(font_cancel), fd);
gtk_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(dlg)->ok_button),
"clicked", GTK_SIGNAL_FUNC(font_ok), fd);
gtk_widget_show_all(dlg);
}
static void edit_ok(GtkWidget *w, font_data *fd)
{
gtk_clist_set_text(GTK_CLIST(fd->clist), fd->row, 1,
gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(*(fd->dlg))));
gtk_clist_select_row(GTK_CLIST(fd->clist), fd->row, 1);
gtk_widget_destroy(*(fd->dlg));
}
static void fpal_edit(GtkWidget *w, GtkWidget *clist)
{
static GtkWidget *dlg = NULL;
font_data *fd;
gchar *font;
if (dlg) return;
fd = g_new(font_data, 1);
dlg = gtk_font_selection_dialog_new(_("Edit font"));
fd->clist = clist; fd->dlg = &dlg;
if (GTK_CLIST(clist)->selection)
fd->row = GPOINTER_TO_INT(GTK_CLIST(clist)->selection->data);
else fd->row = 0;
gtk_clist_get_text(GTK_CLIST(clist), fd->row, 1, &font);
gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(*(fd->dlg)), font);
gtk_widget_destroy(GTK_FONT_SELECTION_DIALOG(dlg)->apply_button);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
GTK_SIGNAL_FUNC(font_destroy), fd);
gtk_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(dlg)->cancel_button),
"clicked", GTK_SIGNAL_FUNC(font_cancel), fd);
gtk_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(dlg)->ok_button),
"clicked", GTK_SIGNAL_FUNC(edit_ok), fd);
gtk_widget_show_all(dlg);
}
static void fpal_del(GtkWidget *w, GtkWidget *clist)
{
gint row;
if (GTK_CLIST(clist)->selection)
row = GPOINTER_TO_INT(GTK_CLIST(clist)->selection->data);
else row = 0;
gtk_clist_remove(GTK_CLIST(clist), row);
fpal_clist_renumber(clist);
}
static void fpal_up(GtkWidget *w, GtkWidget *clist)
{
gint row, drow;
if (GTK_CLIST(clist)->selection)
row = GPOINTER_TO_INT(GTK_CLIST(clist)->selection->data);
else row = 0;
drow = row - 1;
if (drow < 0) return;
gtk_clist_row_move(GTK_CLIST(clist), row, drow);
fpal_clist_renumber(clist);
}
static void fpal_down(GtkWidget *w, GtkWidget *clist)
{
gint row, drow;
if (GTK_CLIST(clist)->selection)
row = GPOINTER_TO_INT(GTK_CLIST(clist)->selection->data);
else row = 0;
drow = row + 1;
if (drow >= GTK_CLIST(clist)->rows) return;
gtk_clist_row_move(GTK_CLIST(clist), row, drow);
fpal_clist_renumber(clist);
}
void evt_fontpal(GtkWidget *w)
{
gchar *titles[] = {_("Index"), _("Font")};
GtkWidget *table, *table1, *scrwin, *btn;
GnomeApp *active_win;
GSList *l;
if (fpal)
{
gdk_window_raise(GTK_WIDGET(GNOME_DIALOG(fpal->dialog))->window);
return;
}
fpal = (FontPal *) g_malloc(sizeof(FontPal));
fpal->dialog = GNOME_DIALOG(gnome_dialog_new(_("Font palette"),
GNOME_STOCK_BUTTON_OK, NULL));
active_win = GNOME_APP(GRN->window);
gnome_dialog_set_parent(GNOME_DIALOG(fpal->dialog), GTK_WINDOW(active_win));
gnome_dialog_button_connect(fpal->dialog, 0,
GTK_SIGNAL_FUNC(fpal_ok), fpal);
gtk_signal_connect(GTK_OBJECT(fpal->dialog), "destroy",
GTK_SIGNAL_FUNC(destroy_fpal), fpal);
gtk_signal_connect(GTK_OBJECT(fpal->dialog), "delete_event",
GTK_SIGNAL_FUNC(gtk_false), NULL);
table = gtk_table_new(2, 2, FALSE);
gtk_box_pack_start(GTK_BOX(fpal->dialog->vbox), table, FALSE, FALSE, 3);
fpal->clist = GTK_CLIST(gtk_clist_new_with_titles(2, titles));
gtk_widget_set_usize(GTK_WIDGET(fpal->clist), 400, 200);
gtk_clist_set_column_justification(fpal->clist, 0, GTK_JUSTIFY_RIGHT);
gtk_clist_set_selection_mode(fpal->clist, GTK_SELECTION_BROWSE);
gtk_clist_column_titles_passive(fpal->clist);
scrwin = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(scrwin), GTK_WIDGET(fpal->clist));
gtk_table_attach(GTK_TABLE(table), scrwin, 0,1,0,1,
GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 3,2);
fpal->lbl_test = gtk_label_new(_("Test"));
gtk_table_attach(GTK_TABLE(table), fpal->lbl_test, 1,2,0,1, GTK_FILL, GTK_FILL, 0,2);
gtk_signal_connect(GTK_OBJECT(fpal->clist), "select_row",
GTK_SIGNAL_FUNC(fpal_sel), fpal->lbl_test);
table1 = gtk_table_new(5, 1, FALSE);
gtk_table_attach(GTK_TABLE(table), table1, 0,2,1,2, GTK_FILL|GTK_EXPAND, GTK_FILL, 0,0);
btn = gnome_pixmap_button(gnome_stock_pixmap_widget(NULL, GNOME_STOCK_PIXMAP_ADD), _("Add..."));
gtk_table_attach(GTK_TABLE(table1), btn, 0,1,0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 3,2);
gtk_signal_connect(GTK_OBJECT(btn), "clicked",
GTK_SIGNAL_FUNC(fpal_add), fpal->clist);
fpal->btn_edit = gnome_pixmap_button(gnome_stock_pixmap_widget(NULL, GNOME_STOCK_PIXMAP_PROPERTIES), _("Edit..."));
gtk_table_attach(GTK_TABLE(table1), fpal->btn_edit, 1,2,0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 3,2);
gtk_signal_connect(GTK_OBJECT(fpal->btn_edit), "clicked",
GTK_SIGNAL_FUNC(fpal_edit), fpal->clist);
fpal->btn_del = gnome_pixmap_button(gnome_stock_pixmap_widget(NULL, GNOME_STOCK_PIXMAP_REMOVE), _("Delete"));
gtk_table_attach(GTK_TABLE(table1), fpal->btn_del, 2,3,0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 3,2);
gtk_signal_connect(GTK_OBJECT(fpal->btn_del), "clicked",
GTK_SIGNAL_FUNC(fpal_del), fpal->clist);
fpal->btn_up = gnome_stock_button(GNOME_STOCK_BUTTON_UP);
gtk_table_attach(GTK_TABLE(table1), fpal->btn_up, 3,4,0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 3,2);
gtk_signal_connect(GTK_OBJECT(fpal->btn_up), "clicked",
GTK_SIGNAL_FUNC(fpal_up), fpal->clist);
fpal->btn_down = gnome_stock_button(GNOME_STOCK_BUTTON_DOWN);
gtk_table_attach(GTK_TABLE(table1), fpal->btn_down, 4,5,0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 3,2);
gtk_signal_connect(GTK_OBJECT(fpal->btn_down), "clicked",
GTK_SIGNAL_FUNC(fpal_down), fpal->clist);
for (l=grn_prefs.fontpal; l; l=l->next)
fpal_add_to_clist(GTK_WIDGET(fpal->clist), l->data);
gtk_widget_show_all(GTK_WIDGET(fpal->dialog));
fpal_clist_renumber(GTK_WIDGET(fpal->clist));
}
static void cancel_cpal(GtkWidget *w)
{
if (! cpal) return;
gtk_widget_destroy(GTK_WIDGET(cpal->dialog));
g_free(cpal); cpal = NULL;
}
typedef struct clr_data
{
GtkWidget **dlg;
GtkWidget *clist;
gint row;
} clr_data;
static gchar *get_clr_string(GdkColor *clr)
{
return g_strdup_printf("%s=%.02f, %s=%.02f, %s=%.02f", _("Red"),
(gdouble) clr->red/0xffff, _("Green"), (gdouble) clr->green/0xffff,
_("Blue"), (gdouble) clr->blue/0xffff);
}
static void cpal_add_to_clist(GtkWidget *clist, GdkColor *clr)
{
gchar *text[2] = {"", NULL};
gint row;
gchar *buf = get_clr_string(clr);
text[1] = buf;
row = gtk_clist_append(GTK_CLIST(clist), text);
// gtk_clist_set_foreground(GTK_CLIST(clist), row, clr);
gtk_clist_set_row_data(GTK_CLIST(clist), row, clr);
gtk_clist_select_row(GTK_CLIST(clist), row, 1);
g_free(buf);
}
static void cpal_sel(GtkWidget *clist, gint row, gint col, GdkEventButton *ev, GtkWidget *btn)
{
GdkColor *clr;
clr = gtk_clist_get_row_data(GTK_CLIST(clist), row);
if (! clr) return;
gnome_color_picker_set_i16(GNOME_COLOR_PICKER(btn), clr->red, clr->green,
clr->blue, 65535);
}
static void clr_destroy(GtkWidget *w, clr_data *cd)
{
*(cd->dlg) = NULL;
g_free(cd);
}
static void clr_cancel(GtkWidget *w, clr_data *cd)
{
gtk_widget_destroy(*(cd->dlg));
}
static void clr_ok(GtkWidget *w, clr_data *cd)
{
gdouble dc[4];
GdkColor *clr = g_new(GdkColor, 1);
gtk_color_selection_get_color(GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(*(cd->dlg))->colorsel), dc);
clr->red = dc[0] * 0xffff; clr->green = dc[1] * 0xffff;
clr->blue = dc[2] * 0xffff;
cpal_add_to_clist(cd->clist, clr);
fpal_clist_renumber(cd->clist);
gtk_widget_destroy(*(cd->dlg));
}
static void cpal_add(GtkWidget *w, GtkWidget *clist)
{
static GtkWidget *dlg = NULL;
clr_data *cd;
if (dlg) return;
cd = g_new(clr_data, 1);
dlg = gtk_color_selection_dialog_new(_("Add new color"));
cd->clist = clist; cd->dlg = &dlg;
gtk_widget_destroy(GTK_COLOR_SELECTION_DIALOG(dlg)->help_button);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
GTK_SIGNAL_FUNC(clr_destroy), cd);
gtk_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(dlg)->cancel_button),
"clicked", GTK_SIGNAL_FUNC(clr_cancel), cd);
gtk_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(dlg)->ok_button),
"clicked", GTK_SIGNAL_FUNC(clr_ok), cd);
gtk_widget_show_all(dlg);
}
static void cpal_edit(GnomeColorPicker *cp, guint r, guint g, guint b, guint a, GtkWidget *clist)
{
GdkColor *clr;
gint row;
gchar *buf;
if (GTK_CLIST(clist)->selection)
row = GPOINTER_TO_INT(GTK_CLIST(clist)->selection->data);
else row = 0;
clr = gtk_clist_get_row_data(GTK_CLIST(clist), row);
if (! clr) return;
clr->red = r; clr->green = g; clr->blue = b;
buf = get_clr_string(clr);
gtk_clist_set_text(GTK_CLIST(clist), row, 1, buf);
g_free(buf);
// gtk_clist_set_foreground(GTK_CLIST(clist), row, clr);
}
static void cpal_del(GtkWidget *w, GtkWidget *clist)
{
gint row;
GdkColor *clr;
if (GTK_CLIST(clist)->selection)
row = GPOINTER_TO_INT(GTK_CLIST(clist)->selection->data);
else row = 0;
clr = gtk_clist_get_row_data(GTK_CLIST(clist), row);
if (clr) g_free(clr);
gtk_clist_remove(GTK_CLIST(clist), row);
fpal_clist_renumber(clist);
}
static void cpal_ok(GtkWidget *w, ColorPal *cpal)
{
gint i;
GSList *l;
if (! cpal) return;
for (l=grn_prefs.colorpal; l; l=l->next) g_free(l->data);
g_slist_free(grn_prefs.colorpal); grn_prefs.colorpal = NULL;
for (i=0; i<GTK_CLIST(cpal->clist)->rows; i++)
{
GdkColor *clr = gtk_clist_get_row_data(GTK_CLIST(cpal->clist), i);
if (clr) grn_prefs.colorpal = g_slist_prepend(grn_prefs.colorpal, clr);
}
grn_prefs.colorpal = g_slist_reverse(grn_prefs.colorpal);
gtk_widget_destroy(GTK_WIDGET(cpal->dialog));
}
void evt_colorpal(GtkWidget *w)
{
gchar *titles[] = {_("Index"), _("Color")};
GtkWidget *table, *table1, *scrwin, *btn;
GnomeApp *active_win;
GSList *l;
if (cpal)
{
gdk_window_raise(GTK_WIDGET(GNOME_DIALOG(cpal->dialog))->window);
return;
}
cpal = (ColorPal *) g_malloc(sizeof(ColorPal));
cpal->dialog = GNOME_DIALOG(gnome_dialog_new(_("Color palette"),
GNOME_STOCK_BUTTON_OK, NULL));
active_win = GNOME_APP(GRN->window);
gnome_dialog_set_parent(GNOME_DIALOG(cpal->dialog), GTK_WINDOW(active_win));
gnome_dialog_button_connect(cpal->dialog, 0,
GTK_SIGNAL_FUNC(cpal_ok), cpal);
gtk_signal_connect(GTK_OBJECT(cpal->dialog), "destroy",
GTK_SIGNAL_FUNC(cancel_cpal), cpal);
gtk_signal_connect(GTK_OBJECT(cpal->dialog), "delete_event",
GTK_SIGNAL_FUNC(gtk_false), NULL);
table = gtk_table_new(2, 2, FALSE);
gtk_box_pack_start(GTK_BOX(cpal->dialog->vbox), table, FALSE, FALSE, 3);
cpal->clist = GTK_CLIST(gtk_clist_new_with_titles(2, titles));
gtk_widget_set_usize(GTK_WIDGET(cpal->clist), 300, 150);
gtk_clist_set_column_justification(cpal->clist, 0, GTK_JUSTIFY_RIGHT);
gtk_clist_set_selection_mode(cpal->clist, GTK_SELECTION_BROWSE);
gtk_clist_set_reorderable(cpal->clist, TRUE);
gtk_clist_column_titles_passive(cpal->clist);
scrwin = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(scrwin), GTK_WIDGET(cpal->clist));
gtk_table_attach(GTK_TABLE(table), scrwin, 0,1,0,1,
GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 3,2);
table1 = gtk_table_new(5, 1, FALSE);
gtk_table_attach(GTK_TABLE(table), table1, 0,1,1,2, GTK_FILL|GTK_EXPAND, GTK_FILL, 0,0);
btn = gnome_pixmap_button(gnome_stock_pixmap_widget(NULL, GNOME_STOCK_PIXMAP_ADD), _("Add..."));
gtk_table_attach(GTK_TABLE(table1), btn, 0,1,0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 3,2);
gtk_signal_connect(GTK_OBJECT(btn), "clicked",
GTK_SIGNAL_FUNC(cpal_add), cpal->clist);
cpal->btn_edit = gnome_color_picker_new();
gtk_tooltips_set_tip(GRN->tooltips, cpal->btn_edit, _("Edit current color"), NULL);
gtk_table_attach(GTK_TABLE(table1), cpal->btn_edit, 1,2,0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 3,2);
gtk_signal_connect(GTK_OBJECT(cpal->btn_edit), "color_set",
GTK_SIGNAL_FUNC(cpal_edit), cpal->clist);
cpal->btn_del = gnome_pixmap_button(gnome_stock_pixmap_widget(NULL, GNOME_STOCK_PIXMAP_REMOVE), _("Delete"));
gtk_table_attach(GTK_TABLE(table1), cpal->btn_del, 2,3,0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 3,2);
gtk_signal_connect(GTK_OBJECT(cpal->btn_del), "clicked",
GTK_SIGNAL_FUNC(cpal_del), cpal->clist);
cpal->btn_up = gnome_stock_button(GNOME_STOCK_BUTTON_UP);
gtk_table_attach(GTK_TABLE(table1), cpal->btn_up, 3,4,0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 3,2);
gtk_signal_connect(GTK_OBJECT(cpal->btn_up), "clicked",
GTK_SIGNAL_FUNC(fpal_up), cpal->clist);
cpal->btn_down = gnome_stock_button(GNOME_STOCK_BUTTON_DOWN);
gtk_table_attach(GTK_TABLE(table1), cpal->btn_down, 4,5,0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 3,2);
gtk_signal_connect(GTK_OBJECT(cpal->btn_down), "clicked",
GTK_SIGNAL_FUNC(fpal_down), cpal->clist);
gtk_signal_connect(GTK_OBJECT(cpal->clist), "select_row",
GTK_SIGNAL_FUNC(cpal_sel), cpal->btn_edit);
for (l=grn_prefs.colorpal; l; l=l->next)
{
GdkColor *clr = g_new(GdkColor, 1), *c = (GdkColor *) l->data;
clr->red = c->red; clr->green = c->green; clr->blue = c->blue;
cpal_add_to_clist(GTK_WIDGET(cpal->clist), clr);
}
gtk_widget_show_all(GTK_WIDGET(cpal->dialog));
fpal_clist_renumber(GTK_WIDGET(cpal->clist));
}
syntax highlighted by Code2HTML, v. 0.9.1