displaying of headers in the mail viewer - customization
authorHoà Viêt Dinh <dinh.viet.hoa@free.fr>
Mon, 30 Apr 2001 23:21:18 +0000 (23:21 +0000)
committerHoà Viêt Dinh <dinh.viet.hoa@free.fr>
Mon, 30 Apr 2001 23:21:18 +0000 (23:21 +0000)
and minor changes

15 files changed:
ChangeLog.claws
src/Makefile.am
src/defs.h
src/grouplist_dialog.c
src/grouplist_dialog.h
src/headers.h
src/headers_display.c [new file with mode: 0644]
src/headers_display.h [new file with mode: 0644]
src/main.c
src/prefs_common.c
src/prefs_display_headers.c [new file with mode: 0644]
src/prefs_display_headers.h [new file with mode: 0644]
src/prefs_headers.c
src/procheader.c
src/textview.c

index a695f8ece284c095e8f15b376ca66206759d265b..745efd508149ba2471b967811f314446327a7034 100644 (file)
@@ -1,3 +1,22 @@
+2001-05-01 [hoa]
+       * src/Makefile.am added prefs_display_headers.[ch] headers_display.[ch]
+       * src/defs.h added HEADERS_DISPLAY_RC : name of the config file
+               for displaying of headers
+       * src/grouplist_dialog.[ch] minor changes to remove warnings
+       * src/prefs_display_headers.[ch] dialog to choose the
+       headers to display in the mail viewer.
+       * src/headers.h correction of #define
+       * src/headers_display.[ch] configuration for displaying of headers.
+       * src/main.c read config of displaying of headers
+       * src/prefs_common.c add a button to access the config dialog
+               for displaying of headers
+       * src/prefs_display_headers.[ch] dialog for configuration for
+               displaying of the headers.
+       * src/prefs_headers.c cleaning of code
+       * src/procheader.c comments added to code
+       * src/textview.c changes to reorder the headers depending
+               on the config for displaying of headers
+
 2001-04-30 [alfons]
 
        0.4.65claws7
@@ -18,6 +37,7 @@
        * src/news.c (news_session_new_for_folder): set userid=NULL if
        password dialog is cancelled.
 
+>>>>>>> 1.29
 2001-04-30 [sergey]
 
        * src/nntp.h (NNTPSockInfo): new type.
index 02e37b041e61b9a4dfedce8e579e172ad0e6d752..0bbc4053982228eefb3c9fa00de4f8028fbba7a6 100644 (file)
@@ -76,7 +76,9 @@ sylpheed_SOURCES = \
        gtkstext.c gtkstext.h \
        grouplist_dialog.c grouplist_dialog.h \
        headers.c headers.h \
-       prefs_headers.c prefs_headers.h
+       prefs_headers.c prefs_headers.h \
+       headers_display.c headers_display.h \
+       prefs_display_headers.c prefs_display_headers.h
 
 EXTRA_DIST = \
        pixmaps/clip.xpm \
index 25634786f8bc977a7205c36a7e32300a6f5d6e67..42b764e3ba1a1c45a0041e06211bf191ddf922ef 100644 (file)
@@ -47,6 +47,7 @@
 #define ACCOUNT_RC             "accountrc"
 #define FILTER_RC              "filterrc"
 #define HEADERS_RC             "headersrc"
+#define HEADERS_DISPLAY_RC     "headersdisplayrc"
 #define MENU_RC                        "menurc"
 #define ADDRESS_BOOK           "addressbook.xml"
 #define MANUAL_HTML_INDEX      "sylpheed.html"
index 75de618847d1531a9bdb546e06feb984a02f1820..882a72cee50fddec44cd4489acfbea88cdffc959 100644 (file)
@@ -206,7 +206,8 @@ static void grouplist_dialog_set_list(void)
        gtk_clist_clear(GTK_CLIST(group_clist));
        for(elt = group_list; elt != NULL ; elt = elt->next)
          {
-           row = gtk_clist_append(GTK_CLIST(group_clist), &(elt->data));
+           row = gtk_clist_append(GTK_CLIST(group_clist),
+                                  (void *) &(elt->data));
            gtk_clist_set_row_data(GTK_CLIST(group_clist), row, elt->data);
          }
 
index 307e9ff89351bd37400ca45c98a5c21ae83cf5a9..75ad71b1577cfdd71ba36f8cbc518da0f5f11218 100644 (file)
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-#ifndef __INPUTDIALOG_H__
-#define __INPUTDIALOG_H__
+#ifndef __GROUPLISTDIALOG_H__
+#define __GROUPLISTDIALOG_H__
 
 #include <glib.h>
 #include "folder.h"
 
 gchar *grouplist_dialog                        (FolderItem * item);
 
-#endif /* __INPUTDIALOG_H__ */
+#endif /* __GROUPLISTDIALOG_H__ */
index 5e6a3926d29a5e6a7fd46f0d2c384c87991cf3ea..5659fbce1b467065b007557284f0e7de4ecbe7a6 100644 (file)
@@ -33,4 +33,4 @@ gchar * custom_header_get_str(CustomHeader *ch);
 CustomHeader * custom_header_read_str(gchar * buf);
 void custom_header_free(CustomHeader *ch);
 
-#endif /* __FILTER_H__ */
+#endif /* __HEADERS_H__ */
diff --git a/src/headers_display.c b/src/headers_display.c
new file mode 100644 (file)
index 0000000..8f79293
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999,2000 Hiroyuki Yamamoto
+ *
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <glib.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+
+#include "intl.h"
+#include "headers_display.h"
+#include "utils.h"
+
+
+gchar * header_display_prop_get_str(HeaderDisplayProp *dp)
+{
+       return g_strdup_printf
+               ("%s%s", dp->hidden?"-":"", dp->name);
+}
+HeaderDisplayProp * header_display_prop_read_str(gchar * buf)
+{
+       HeaderDisplayProp * dp;
+
+       dp = g_new0(HeaderDisplayProp, 1);
+
+       dp->hidden = 0;
+       if (*buf == '-') {
+               dp->hidden = 1;
+               buf ++;
+       }
+       if (*buf == 0) {
+               g_free(dp);
+               return NULL;
+       }
+       dp->name = g_strdup(buf);
+
+       return dp;
+}
+void header_display_prop_free(HeaderDisplayProp *dp)
+{
+       if (!dp) return;
+       if (dp->name)
+               g_free(dp->name);
+       g_free(dp);
+}
diff --git a/src/headers_display.h b/src/headers_display.h
new file mode 100644 (file)
index 0000000..689c4dd
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999,2000 Hiroyuki Yamamoto
+ *
+ * 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.
+ */
+
+#ifndef __HEADERS_DISPLAY_H__
+#define __HEADERS_DISPLAY_H__
+
+struct _HeaderDisplayProp
+{
+       gchar *name;
+       int hidden;
+};
+
+typedef struct _HeaderDisplayProp HeaderDisplayProp;
+
+gchar * header_display_prop_get_str(HeaderDisplayProp *dp);
+HeaderDisplayProp * header_display_prop_read_str(gchar * buf);
+void header_display_prop_free(HeaderDisplayProp *dp);
+
+#endif /* __DISPLAY_H__ */
index 40e945a687a894b0f5020bb44fdaae86d6a6b3a3..c153022e0243717d54b8a984517d0dd33078ce36 100644 (file)
@@ -213,6 +213,8 @@ int main(int argc, char *argv[])
        prefs_common_save_config();
        prefs_filter_read_config();
        prefs_filter_write_config();
+       prefs_display_headers_read_config();
+       prefs_display_headers_write_config();
 
        gtkut_widget_init();
 
index 6f2a72b06afcad6725fac020133b1e8e10a56e62..60c738eefe497f3f779c60b2427ee9c4061c666d 100644 (file)
@@ -47,6 +47,7 @@
 #include "gtkutils.h"
 #include "alertpanel.h"
 #include "folder.h"
+#include "prefs_display_headers.h"
 
 PrefsCommon prefs_common;
 
@@ -1285,6 +1286,7 @@ static void prefs_display_create(void)
        GtkWidget *label_datefmt;
        GtkWidget *entry_datefmt;
        GtkWidget *button_dispitem;
+       GtkWidget *button_headers_display;
 
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
        gtk_widget_show (vbox1);
@@ -1369,6 +1371,19 @@ static void prefs_display_create(void)
                            GTK_SIGNAL_FUNC (prefs_summary_display_item_set),
                            NULL);
 
+       hbox1 = gtk_hbox_new (FALSE, 8);
+       gtk_widget_show (hbox1);
+       gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
+
+       button_headers_display = gtk_button_new_with_label
+               (_(" Set displaying of headers... "));
+       gtk_widget_show (button_headers_display);
+       gtk_box_pack_start (GTK_BOX (hbox1), button_headers_display, FALSE,
+                           TRUE, 0);
+       gtk_signal_connect (GTK_OBJECT (button_headers_display), "clicked",
+                           GTK_SIGNAL_FUNC (prefs_display_headers_open),
+                           NULL);
+
        display.entry_textfont  = entry_textfont;
        display.button_textfont = button_textfont;
 
diff --git a/src/prefs_display_headers.c b/src/prefs_display_headers.c
new file mode 100644 (file)
index 0000000..ef3a483
--- /dev/null
@@ -0,0 +1,630 @@
+/*
+ * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2001 Hiroyuki Yamamoto
+ *
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "defs.h"
+
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include "intl.h"
+#include "main.h"
+#include "prefs.h"
+#include "prefs_display_headers.h"
+#include "prefs_common.h"
+#include "mainwindow.h"
+#include "foldersel.h"
+#include "manage_window.h"
+#include "utils.h"
+#include "gtkutils.h"
+#include "alertpanel.h"
+#include "folder.h"
+#include "headers_display.h"
+
+static struct Headers {
+       GtkWidget *window;
+
+       GtkWidget *close_btn;
+
+       GtkWidget *hdr_combo;
+       GtkWidget *hdr_entry;
+       GtkWidget *key_check;
+       GtkWidget *headers_clist;
+} headers;
+
+/*
+   parameter name, default value, pointer to the prefs variable, data type,
+   pointer to the widget pointer,
+   pointer to the function for data setting,
+   pointer to the function for widget setting
+ */
+
+#define VSPACING               12
+#define VSPACING_NARROW                4
+#define DEFAULT_ENTRY_WIDTH    80
+#define PREFSBUFSIZE           1024
+
+/* widget creating functions */
+static void prefs_display_headers_create               (void);
+
+static void prefs_display_headers_set_dialog   (void);
+static void prefs_display_headers_set_list     (void);
+static gint prefs_display_headers_clist_set_row        (gint    row);
+
+/* callback functions */
+static void prefs_display_headers_select_dest_cb       (void);
+static void prefs_display_headers_register_cb  (void);
+static void prefs_display_headers_substitute_cb        (void);
+static void prefs_display_headers_delete_cb    (void);
+static void prefs_display_headers_up           (void);
+static void prefs_display_headers_down         (void);
+static void prefs_display_headers_select               (GtkCList       *clist,
+                                        gint            row,
+                                        gint            column,
+                                        GdkEvent       *event);
+
+static void prefs_display_headers_dest_radio_button_toggled    (void);
+static void prefs_display_headers_notrecv_radio_button_toggled (void);
+
+static void prefs_display_headers_key_pressed  (GtkWidget      *widget,
+                                        GdkEventKey    *event,
+                                        gpointer        data);
+static void prefs_display_headers_close                (GtkButton      *button);
+
+GSList * prefs_display_headers = NULL;
+
+static char * defaults[] =
+{
+       "Sender",
+       "From",
+       "Reply-To",
+       "To",
+       "Cc",
+       "Subject",
+       "Date",
+       "-Received",
+       "-Message-Id",
+       "-In-Reply-To",
+       "-References",
+       "-Mime-Version",
+       "-Content-Type",
+       "-Content-Transfer-Encoding",
+       "-X-UIDL",
+       "-Precedence",
+       "-Status",
+       "-Priority"
+};
+
+static void prefs_display_headers_set_default(void)
+{
+       int i;
+
+       for(i = 0 ; i < sizeof(defaults) / sizeof(char *) ; i++) {
+               HeaderDisplayProp * dp =
+                       header_display_prop_read_str(defaults[i]);
+               prefs_display_headers =
+                       g_slist_append(prefs_display_headers, dp);
+       }
+}
+
+void prefs_display_headers_open(void)
+{
+       if (!headers.window) {
+               prefs_display_headers_create();
+       }
+
+       manage_window_set_transient(GTK_WINDOW(headers.window));
+       gtk_widget_grab_focus(headers.close_btn);
+
+       prefs_display_headers_set_dialog();
+
+       gtk_widget_show(headers.window);
+}
+
+static void prefs_display_headers_create(void)
+{
+       GtkWidget *window;
+       GtkWidget *vbox;
+       GtkWidget *close_btn;
+       GtkWidget *confirm_area;
+
+       GtkWidget *vbox1;
+
+       GtkWidget *table1;
+       GtkWidget *hdr_label;
+       GtkWidget *hdr_combo;
+       GtkWidget *key_label;
+       GtkWidget *key_check;
+
+       GtkWidget *reg_hbox;
+       GtkWidget *btn_hbox;
+       GtkWidget *arrow;
+       GtkWidget *reg_btn;
+       GtkWidget *subst_btn;
+       GtkWidget *del_btn;
+
+       GtkWidget *ch_hbox;
+       GtkWidget *ch_scrolledwin;
+       GtkWidget *headers_clist;
+
+       GtkWidget *btn_vbox;
+       GtkWidget *up_btn;
+       GtkWidget *down_btn;
+
+       gchar *title[] = {_("Custom headers")};
+
+       debug_print(_("Creating headers setting window...\n"));
+
+       window = gtk_window_new (GTK_WINDOW_DIALOG);
+       gtk_container_set_border_width (GTK_CONTAINER (window), 8);
+       gtk_window_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
+       gtk_window_set_modal (GTK_WINDOW (window), TRUE);
+       gtk_window_set_policy (GTK_WINDOW (window), FALSE, TRUE, FALSE);
+
+       vbox = gtk_vbox_new (FALSE, 6);
+       gtk_widget_show (vbox);
+       gtk_container_add (GTK_CONTAINER (window), vbox);
+
+       gtkut_button_set_create (&confirm_area, &close_btn, _("Close"),
+                                NULL, NULL, NULL, NULL);
+       gtk_widget_show (confirm_area);
+       gtk_box_pack_end (GTK_BOX(vbox), confirm_area, FALSE, FALSE, 0);
+       gtk_widget_grab_default (close_btn);
+
+       gtk_window_set_title (GTK_WINDOW(window),
+                             _("Headers setting"));
+       gtk_signal_connect (GTK_OBJECT(window), "delete_event",
+                           GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete), NULL);
+       gtk_signal_connect (GTK_OBJECT(window), "key_press_event",
+                           GTK_SIGNAL_FUNC(prefs_display_headers_key_pressed),
+                           NULL);
+       gtk_signal_connect (GTK_OBJECT(window), "focus_in_event",
+                           GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
+       gtk_signal_connect (GTK_OBJECT(window), "focus_out_event",
+                           GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
+       gtk_signal_connect (GTK_OBJECT(close_btn), "clicked",
+                           GTK_SIGNAL_FUNC(prefs_display_headers_close),
+                           NULL);
+
+       vbox1 = gtk_vbox_new (FALSE, VSPACING);
+       gtk_widget_show (vbox1);
+       gtk_box_pack_start (GTK_BOX (vbox), vbox1, TRUE, TRUE, 0);
+       gtk_container_set_border_width (GTK_CONTAINER (vbox1), 2);
+
+       table1 = gtk_table_new (2, 2, FALSE);
+       gtk_widget_show (table1);
+       gtk_box_pack_start (GTK_BOX (vbox1), table1,
+                           FALSE, FALSE, 0);
+       gtk_table_set_row_spacings (GTK_TABLE (table1), 8);
+       gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
+
+       hdr_label = gtk_label_new (_("Header"));
+       gtk_widget_show (hdr_label);
+       gtk_table_attach (GTK_TABLE (table1), hdr_label, 0, 1, 0, 1,
+                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
+                         0, 0, 0);
+       gtk_misc_set_alignment (GTK_MISC (hdr_label), 0, 0.5);
+       
+       hdr_combo = gtk_combo_new ();
+       gtk_widget_show (hdr_combo);
+       gtk_table_attach (GTK_TABLE (table1), hdr_combo, 0, 1, 1, 2,
+                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
+                         0, 0, 0);
+       gtk_widget_set_usize (hdr_combo, 150 /* 96 */, -1);
+       gtkut_combo_set_items (GTK_COMBO (hdr_combo),
+                              "From", "To", "Subject", "Date", NULL);
+
+       key_label = gtk_label_new (_("Hide"));
+       gtk_widget_show (key_label);
+       gtk_table_attach (GTK_TABLE (table1), key_label, 1, 2, 0, 1,
+                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
+                         0, 0, 0);
+       gtk_misc_set_alignment (GTK_MISC (key_label), 0, 0.5);
+       
+       //      key_entry = gtk_entry_new ();
+       key_check = gtk_check_button_new();
+       gtk_widget_show (key_check);
+       gtk_table_attach (GTK_TABLE (table1), key_check, 1, 2, 1, 2,
+                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
+                         0, 0, 0);
+
+       /* register / substitute / delete */
+
+       reg_hbox = gtk_hbox_new (FALSE, 4);
+       gtk_widget_show (reg_hbox);
+       gtk_box_pack_start (GTK_BOX (vbox1), reg_hbox,
+                           FALSE, FALSE, 0);
+
+       arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT);
+       gtk_widget_show (arrow);
+       gtk_box_pack_start (GTK_BOX (reg_hbox), arrow, FALSE, FALSE, 0);
+       gtk_widget_set_usize (arrow, -1, 16);
+
+       btn_hbox = gtk_hbox_new (TRUE, 4);
+       gtk_widget_show (btn_hbox);
+       gtk_box_pack_start (GTK_BOX (reg_hbox), btn_hbox, FALSE, FALSE, 0);
+
+       reg_btn = gtk_button_new_with_label (_("Add"));
+       gtk_widget_show (reg_btn);
+       gtk_box_pack_start (GTK_BOX (btn_hbox), reg_btn, FALSE, TRUE, 0);
+       gtk_signal_connect (GTK_OBJECT (reg_btn), "clicked",
+                           GTK_SIGNAL_FUNC
+                           (prefs_display_headers_register_cb), NULL);
+
+       subst_btn = gtk_button_new_with_label (_(" Substitute "));
+       gtk_widget_show (subst_btn);
+       gtk_box_pack_start (GTK_BOX (btn_hbox), subst_btn, FALSE, TRUE, 0);
+       gtk_signal_connect (GTK_OBJECT (subst_btn), "clicked",
+                           GTK_SIGNAL_FUNC
+                           (prefs_display_headers_substitute_cb),
+                           NULL);
+
+       del_btn = gtk_button_new_with_label (_("Delete"));
+       gtk_widget_show (del_btn);
+       gtk_box_pack_start (GTK_BOX (btn_hbox), del_btn, FALSE, TRUE, 0);
+       gtk_signal_connect (GTK_OBJECT (del_btn), "clicked",
+                           GTK_SIGNAL_FUNC (prefs_display_headers_delete_cb),
+                           NULL);
+
+
+       ch_hbox = gtk_hbox_new (FALSE, 8);
+       gtk_widget_show (ch_hbox);
+       gtk_box_pack_start (GTK_BOX (vbox1), ch_hbox,
+                           TRUE, TRUE, 0);
+
+       ch_scrolledwin = gtk_scrolled_window_new (NULL, NULL);
+       gtk_widget_set_usize (ch_scrolledwin, -1, 100);
+       gtk_widget_show (ch_scrolledwin);
+       gtk_box_pack_start (GTK_BOX (ch_hbox), ch_scrolledwin,
+                           TRUE, TRUE, 0);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (ch_scrolledwin),
+                                       GTK_POLICY_AUTOMATIC,
+                                       GTK_POLICY_AUTOMATIC);
+
+       headers_clist = gtk_clist_new_with_titles(1, title);
+       gtk_widget_show (headers_clist);
+       gtk_container_add (GTK_CONTAINER (ch_scrolledwin), headers_clist);
+       gtk_clist_set_column_width (GTK_CLIST (headers_clist), 0, 80);
+       gtk_clist_set_selection_mode (GTK_CLIST (headers_clist),
+                                     GTK_SELECTION_BROWSE);
+       GTK_WIDGET_UNSET_FLAGS (GTK_CLIST (headers_clist)->column[0].button,
+                               GTK_CAN_FOCUS);
+       gtk_signal_connect (GTK_OBJECT (headers_clist), "select_row",
+                           GTK_SIGNAL_FUNC (prefs_display_headers_select),
+                           NULL);
+
+
+       btn_vbox = gtk_vbox_new (FALSE, 8);
+       gtk_widget_show (btn_vbox);
+       gtk_box_pack_start (GTK_BOX (ch_hbox), btn_vbox, FALSE, FALSE, 0);
+
+       up_btn = gtk_button_new_with_label (_("Up"));
+       gtk_widget_show (up_btn);
+       gtk_box_pack_start (GTK_BOX (btn_vbox), up_btn, FALSE, FALSE, 0);
+       gtk_signal_connect (GTK_OBJECT (up_btn), "clicked",
+                           GTK_SIGNAL_FUNC (prefs_display_headers_up), NULL);
+
+       down_btn = gtk_button_new_with_label (_("Down"));
+       gtk_widget_show (down_btn);
+       gtk_box_pack_start (GTK_BOX (btn_vbox), down_btn, FALSE, FALSE, 0);
+       gtk_signal_connect (GTK_OBJECT (down_btn), "clicked",
+                           GTK_SIGNAL_FUNC (prefs_display_headers_down), NULL);
+
+
+       gtk_widget_show_all(window);
+
+       headers.window    = window;
+       headers.close_btn = close_btn;
+
+       headers.hdr_combo  = hdr_combo;
+       headers.hdr_entry  = GTK_COMBO (hdr_combo)->entry;
+       headers.key_check  = key_check;
+       headers.headers_clist   = headers_clist;
+}
+
+void prefs_display_headers_read_config(void)
+{
+       gchar *rcpath;
+       FILE *fp;
+       gchar buf[PREFSBUFSIZE];
+       HeaderDisplayProp *dp;
+
+       debug_print(_("Reading configuration for displaying of headers...\n"));
+
+       rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
+                            HEADERS_DISPLAY_RC, NULL);
+       if ((fp = fopen(rcpath, "r")) == NULL) {
+               if (ENOENT != errno) FILE_OP_ERROR(rcpath, "fopen");
+               g_free(rcpath);
+               prefs_display_headers = NULL;
+               prefs_display_headers_set_default();
+               return;
+       }
+       g_free(rcpath);
+
+       /* remove all previous headers list */
+       while (prefs_display_headers != NULL) {
+               dp = (HeaderDisplayProp *)prefs_display_headers->data;
+               header_display_prop_free(dp);
+               prefs_display_headers =
+                       g_slist_remove(prefs_display_headers, dp);
+       }
+       while (fgets(buf, sizeof(buf), fp) != NULL) {
+               g_strchomp(buf);
+               dp = header_display_prop_read_str(buf);
+               if (dp) {
+                       prefs_display_headers =
+                               g_slist_append(prefs_display_headers, dp);
+               }
+       }
+       fclose(fp);
+}
+
+void prefs_display_headers_write_config(void)
+{
+       gchar *rcpath;
+       PrefFile *pfile;
+       GSList *cur;
+       gchar buf[PREFSBUFSIZE];
+       FILE * fp;
+       HeaderDisplayProp *dp;
+
+       debug_print(_("Writing configuration for displaying of headers...\n"));
+
+       rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
+                            HEADERS_DISPLAY_RC, NULL);
+
+       if ((pfile = prefs_write_open(rcpath)) == NULL) {
+               g_warning(_("failed to write configuration to file\n"));
+               g_free(rcpath);
+               return;
+       }
+
+       for (cur = prefs_display_headers; cur != NULL; cur = cur->next) {
+               HeaderDisplayProp *hdr = (HeaderDisplayProp *)cur->data;
+               gchar *dpstr;
+
+               dpstr = header_display_prop_get_str(hdr);
+               if (fputs(dpstr, pfile->fp) == EOF ||
+                   fputc('\n', pfile->fp) == EOF) {
+                       FILE_OP_ERROR(rcpath, "fputs || fputc");
+                       prefs_write_close_revert(pfile);
+                       g_free(rcpath);
+                       g_free(dpstr);
+                       return;
+               }
+               g_free(dpstr);
+       }
+
+       g_free(rcpath);
+
+       if (prefs_write_close(pfile) < 0) {
+               g_warning(_("failed to write configuration to file\n"));
+               return;
+       }
+}
+
+static void prefs_display_headers_set_dialog()
+{
+       GtkCList *clist = GTK_CLIST(headers.headers_clist);
+       GSList *cur;
+       gchar *dp_str[1];
+       gint row;
+
+       gtk_clist_freeze(clist);
+       gtk_clist_clear(clist);
+
+       dp_str[0] = _("(New)");
+       row = gtk_clist_append(clist, dp_str);
+       gtk_clist_set_row_data(clist, row, NULL);
+
+       for (cur = prefs_display_headers; cur != NULL; cur = cur->next) {
+               HeaderDisplayProp *dp = (HeaderDisplayProp *)cur->data;
+
+               if (dp->hidden)
+                       dp_str[0] = g_strdup_printf("(%s)", dp->name);
+               else
+                       dp_str[0] = g_strdup_printf("%s", dp->name);
+               row = gtk_clist_append(clist, dp_str);
+               gtk_clist_set_row_data(clist, row, dp);
+
+               g_free(dp_str[0]);
+       }
+
+       gtk_clist_thaw(clist);
+}
+
+static void prefs_display_headers_set_list()
+{
+       gint row = 1;
+       HeaderDisplayProp *dp;
+
+       g_slist_free(prefs_display_headers);
+       prefs_display_headers = NULL;
+
+       while ((dp = gtk_clist_get_row_data(GTK_CLIST(headers.headers_clist),
+               row)) != NULL) {
+               prefs_display_headers = g_slist_append(prefs_display_headers,
+                                                      dp);
+               row++;
+       }
+}
+
+#define GET_ENTRY(entry) \
+       entry_text = gtk_entry_get_text(GTK_ENTRY(entry))
+
+static gint prefs_display_headers_clist_set_row(gint row)
+{
+       GtkCList *clist = GTK_CLIST(headers.headers_clist);
+       HeaderDisplayProp *dp;
+       gchar *entry_text;
+       gchar *dp_str[1];
+
+       g_return_val_if_fail(row != 0, -1);
+
+       GET_ENTRY(headers.hdr_entry);
+       if (entry_text[0] == '\0') {
+               alertpanel_error(_("Header name is not set."));
+               return -1;
+       }
+
+       dp = g_new0(HeaderDisplayProp, 1);
+
+       dp->name = g_strdup(entry_text);
+
+       dp->hidden = gtk_toggle_button_get_active
+               (GTK_TOGGLE_BUTTON(headers.key_check));
+
+       if (dp->hidden)
+               dp_str[0] = g_strdup_printf("(%s)", dp->name);
+       else
+               dp_str[0] = g_strdup_printf("%s", dp->name);
+
+       if (row < 0)
+               row = gtk_clist_append(clist, dp_str);
+       else {
+               HeaderDisplayProp *tmpdp;
+
+               gtk_clist_set_text(clist, row, 0, dp_str[0]);
+               tmpdp = gtk_clist_get_row_data(clist, row);
+               if (tmpdp)
+                       header_display_prop_free(tmpdp);
+       }
+
+       gtk_clist_set_row_data(clist, row, dp);
+
+       g_free(dp_str[0]);
+
+       prefs_display_headers_set_list();
+
+       return row;
+}
+
+static void prefs_display_headers_register_cb(void)
+{
+       prefs_display_headers_clist_set_row(-1);
+}
+
+static void prefs_display_headers_substitute_cb(void)
+{
+       GtkCList *clist = GTK_CLIST(headers.headers_clist);
+       HeaderDisplayProp *dp;
+       gint row;
+
+       if (!clist->selection) return;
+
+       row = GPOINTER_TO_INT(clist->selection->data);
+       if (row == 0) return;
+
+       dp = gtk_clist_get_row_data(clist, row);
+       if (!dp) return;
+
+       prefs_display_headers_clist_set_row(row);
+}
+
+static void prefs_display_headers_delete_cb(void)
+{
+       GtkCList *clist = GTK_CLIST(headers.headers_clist);
+       HeaderDisplayProp *dp;
+       gint row;
+
+       if (!clist->selection) return;
+       row = GPOINTER_TO_INT(clist->selection->data);
+       if (row == 0) return;
+
+       if (alertpanel(_("Delete header"),
+                      _("Do you really want to delete this header?"),
+                      _("Yes"), _("No"), NULL) == G_ALERTALTERNATE)
+               return;
+
+       dp = gtk_clist_get_row_data(clist, row);
+       header_display_prop_free(dp);
+       gtk_clist_remove(clist, row);
+       prefs_display_headers = g_slist_remove(prefs_display_headers, dp);
+}
+
+static void prefs_display_headers_up(void)
+{
+       GtkCList *clist = GTK_CLIST(headers.headers_clist);
+       gint row;
+
+       if (!clist->selection) return;
+
+       row = GPOINTER_TO_INT(clist->selection->data);
+       if (row > 1) {
+               gtk_clist_row_move(clist, row, row - 1);
+               prefs_display_headers_set_list();
+       }
+}
+
+static void prefs_display_headers_down(void)
+{
+       GtkCList *clist = GTK_CLIST(headers.headers_clist);
+       gint row;
+
+       if (!clist->selection) return;
+
+       row = GPOINTER_TO_INT(clist->selection->data);
+       if (row > 0 && row < clist->rows - 1) {
+               gtk_clist_row_move(clist, row, row + 1);
+               prefs_display_headers_set_list();
+       }
+}
+
+#define ENTRY_SET_TEXT(entry, str) \
+       gtk_entry_set_text(GTK_ENTRY(entry), str ? str : "")
+
+static void prefs_display_headers_select(GtkCList *clist, gint row,
+                                        gint column, GdkEvent *event)
+{
+       HeaderDisplayProp *dp;
+       HeaderDisplayProp default_dp = { "", 0 };
+       dp = gtk_clist_get_row_data(clist, row);
+       if (!dp)
+               dp = &default_dp;
+       ENTRY_SET_TEXT(headers.hdr_entry, dp->name);
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(headers.key_check),
+                                    dp->hidden);
+}
+
+static void prefs_display_headers_key_pressed(GtkWidget *widget,
+                                             GdkEventKey *event,
+                                             gpointer data)
+{
+       if (event && event->keyval == GDK_Escape)
+               gtk_widget_hide(headers.window);
+}
+
+static void prefs_display_headers_close(GtkButton *button)
+{
+       prefs_display_headers_write_config();
+       gtk_widget_hide(headers.window);
+}
diff --git a/src/prefs_display_headers.h b/src/prefs_display_headers.h
new file mode 100644 (file)
index 0000000..4fef6cf
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2001 Hiroyuki Yamamoto
+ *
+ * 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.
+ */
+
+#ifndef __PREFS_DISPLAY_HEADERS_H__
+#define __PREFS_DISPLAY_HEADERS_H__
+
+void prefs_display_headers_read_config (void);
+void prefs_display_headers_write_config        (void);
+void prefs_display_headers_open         (void);
+
+extern GSList * prefs_display_headers;
+
+#endif /* __PREFS_DISPLAY_HEADERS_H__ */
index 90e2272928afea1cae9982df994d6d6b9d066de3..e7c053ddb15a09b4b2f1ec6742bb68867ce4a4d6 100644 (file)
@@ -55,30 +55,6 @@ static struct Headers {
        GtkWidget *hdr_entry;
        GtkWidget *key_entry;
        GtkWidget *headers_clist;
-
-       /*
-       GtkWidget *hdr_combo1;
-       GtkWidget *hdr_combo2;
-       GtkWidget *hdr_entry1;
-       GtkWidget *hdr_entry2;
-       GtkWidget *key_entry1;
-       GtkWidget *key_entry2;
-       GtkWidget *pred_combo1;
-       GtkWidget *pred_combo2;
-       GtkWidget *pred_entry1;
-       GtkWidget *pred_entry2;
-       GtkWidget *op_combo;
-       GtkWidget *op_entry;
-
-       GtkWidget *dest_entry;
-       GtkWidget *regex_chkbtn;
-
-       GtkWidget *destsel_btn;
-       GtkWidget *dest_radiobtn;
-       GtkWidget *notrecv_radiobtn;
-
-       GtkWidget *cond_clist;
-       */
 } headers;
 
 /*
@@ -168,49 +144,6 @@ static void prefs_headers_create(void)
        GtkWidget *btn_vbox;
        GtkWidget *up_btn;
        GtkWidget *down_btn;
-       /*
-
-       GtkWidget *table1;
-       GtkWidget *op_label;
-       GtkWidget *op_combo;
-       GtkWidget *op_entry;
-       GtkWidget *hdr_label;
-       GtkWidget *hdr_combo1;
-       GtkWidget *hdr_combo2;
-       GtkWidget *key_label;
-       GtkWidget *key_entry1;
-       GtkWidget *key_entry2;
-       GtkWidget *pred_label;
-       GtkWidget *pred_combo1;
-       GtkWidget *pred_entry1;
-       GtkWidget *pred_combo2;
-       GtkWidget *pred_entry2;
-
-       GtkWidget *vbox2;
-       GtkWidget *dest_hbox;
-       GtkWidget *dest_entry;
-       GtkWidget *destsel_btn;
-       GtkWidget *dest_radiobtn;
-       GtkWidget *notrecv_radiobtn;
-       GSList *recv_group = NULL;
-
-       GtkWidget *regex_chkbtn;
-
-       GtkWidget *reg_hbox;
-       GtkWidget *btn_hbox;
-       GtkWidget *arrow;
-       GtkWidget *reg_btn;
-       GtkWidget *subst_btn;
-       GtkWidget *del_btn;
-
-       GtkWidget *cond_hbox;
-       GtkWidget *cond_scrolledwin;
-       GtkWidget *cond_clist;
-
-       GtkWidget *btn_vbox;
-       GtkWidget *up_btn;
-       GtkWidget *down_btn;
-       */
 
        gchar *title[] = {_("Custom headers")};
 
@@ -257,228 +190,6 @@ static void prefs_headers_create(void)
        gtk_table_set_row_spacings (GTK_TABLE (table1), 8);
        gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
 
-       /*
-       op_label = gtk_label_new (_("Operator"));
-       gtk_widget_show (op_label);
-       gtk_table_attach (GTK_TABLE (table1), op_label, 0, 1, 0, 1,
-                         GTK_FILL, 0, 0, 0);
-       gtk_misc_set_alignment (GTK_MISC (op_label), 0, 0.5);
-
-       op_combo = gtk_combo_new ();
-       gtk_widget_show (op_combo);
-       gtk_table_attach (GTK_TABLE (table1), op_combo, 0, 1, 2, 3,
-                         0, 0, 0, 0);
-       gtk_widget_set_usize (op_combo, 52, -1);
-       gtkut_combo_set_items (GTK_COMBO (op_combo), "and", "or", NULL);
-
-       op_entry = GTK_COMBO (op_combo)->entry;
-       gtk_entry_set_editable (GTK_ENTRY (op_entry), FALSE);
-
-       hdr_label = gtk_label_new (_("Header"));
-       gtk_widget_show (hdr_label);
-       gtk_table_attach (GTK_TABLE (table1), hdr_label, 1, 2, 0, 1,
-                         GTK_FILL, 0, 0, 0);
-       gtk_misc_set_alignment (GTK_MISC (hdr_label), 0, 0.5);
-
-       hdr_combo1 = gtk_combo_new ();
-       gtk_widget_show (hdr_combo1);
-       gtk_table_attach (GTK_TABLE (table1), hdr_combo1, 1, 2, 1, 2,
-                         0, 0, 0, 0);
-       gtk_widget_set_usize (hdr_combo1, 96, -1);
-       gtkut_combo_set_items (GTK_COMBO (hdr_combo1),
-                              "Subject", "From", "To", "Cc", "Reply-To",
-                              "Sender", "X-ML-Name", "X-List", "X-Sequence",
-                              "X-Mailer",
-                              NULL);
-
-       hdr_combo2 = gtk_combo_new ();
-       gtk_widget_show (hdr_combo2);
-       gtk_table_attach (GTK_TABLE (table1), hdr_combo2, 1, 2, 2, 3,
-                         0, 0, 0, 0);
-       gtk_widget_set_usize (hdr_combo2, 96, -1);
-       gtkut_combo_set_items (GTK_COMBO (hdr_combo2), _("(none)"),
-                              "Subject", "From", "To", "Cc", "Reply-To",
-                              "Sender", "X-ML-Name", "X-List", "X-Sequence",
-                              "X-Mailer",
-                              NULL);
-
-       key_label = gtk_label_new (_("Keyword"));
-       gtk_widget_show (key_label);
-       gtk_table_attach (GTK_TABLE (table1), key_label, 2, 3, 0, 1,
-                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
-                         0, 0, 0);
-       gtk_misc_set_alignment (GTK_MISC (key_label), 0, 0.5);
-
-       key_entry1 = gtk_entry_new ();
-       gtk_widget_show (key_entry1);
-       gtk_widget_set_usize (key_entry1, 128, -1);
-       gtk_table_attach (GTK_TABLE (table1), key_entry1, 2, 3, 1, 2,
-                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
-                         0, 0, 0);
-
-       key_entry2 = gtk_entry_new ();
-       gtk_widget_show (key_entry2);
-       gtk_widget_set_usize (key_entry2, 128, -1);
-       gtk_table_attach (GTK_TABLE (table1), key_entry2, 2, 3, 2, 3,
-                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
-                         0, 0, 0);
-
-       pred_label = gtk_label_new (_("Predicate"));
-       gtk_widget_show (pred_label);
-       gtk_table_attach (GTK_TABLE (table1), pred_label, 3, 4, 0, 1,
-                         GTK_FILL, 0, 0, 0);
-       gtk_misc_set_alignment (GTK_MISC (pred_label), 0, 0.5);
-
-       pred_combo1 = gtk_combo_new ();
-       gtk_widget_show (pred_combo1);
-       gtk_table_attach (GTK_TABLE (table1), pred_combo1, 3, 4, 1, 2,
-                         0, 0, 0, 0);
-       gtk_widget_set_usize (pred_combo1, 92, -1);
-       gtkut_combo_set_items (GTK_COMBO (pred_combo1),
-                              _("contains"), _("not contain"), NULL);
-
-       pred_entry1 = GTK_COMBO (pred_combo1)->entry;
-       gtk_entry_set_editable (GTK_ENTRY (pred_entry1), FALSE);
-
-       pred_combo2 = gtk_combo_new ();
-       gtk_widget_show (pred_combo2);
-       gtk_table_attach (GTK_TABLE (table1), pred_combo2, 3, 4, 2, 3,
-                         0, 0, 0, 0);
-       gtk_widget_set_usize (pred_combo2, 92, -1);
-       gtkut_combo_set_items (GTK_COMBO (pred_combo2),
-                              _("contains"), _("not contain"), NULL);
-
-       pred_entry2 = GTK_COMBO (pred_combo2)->entry;
-       gtk_entry_set_editable (GTK_ENTRY (pred_entry2), FALSE);
-       */
-
-       /* destination */
-
-       /*
-       vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
-       gtk_widget_show (vbox2);
-       gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, TRUE, 0);
-
-       dest_hbox = gtk_hbox_new (FALSE, 8);
-       gtk_widget_show (dest_hbox);
-       gtk_box_pack_start (GTK_BOX (vbox2), dest_hbox, FALSE, TRUE, 0);
-
-       dest_radiobtn =
-               gtk_radio_button_new_with_label (recv_group, _("Destination"));
-       recv_group = gtk_radio_button_group (GTK_RADIO_BUTTON (dest_radiobtn));
-       gtk_widget_show (dest_radiobtn);
-       gtk_box_pack_start (GTK_BOX (dest_hbox), dest_radiobtn,
-                           FALSE, FALSE, 0);
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dest_radiobtn), TRUE);
-       gtk_signal_connect
-               (GTK_OBJECT (dest_radiobtn), "toggled",
-                GTK_SIGNAL_FUNC (prefs_headers_dest_radio_button_toggled),
-                NULL);
-
-       dest_entry = gtk_entry_new ();
-       gtk_widget_show (dest_entry);
-       gtk_widget_set_usize (dest_entry, DEFAULT_ENTRY_WIDTH, -1);
-       gtk_box_pack_start (GTK_BOX (dest_hbox), dest_entry, TRUE, TRUE, 0);
-       gtk_entry_set_editable (GTK_ENTRY (dest_entry), FALSE);
-
-       destsel_btn = gtk_button_new_with_label (_(" Select... "));
-       gtk_widget_show (destsel_btn);
-       gtk_box_pack_start (GTK_BOX (dest_hbox), destsel_btn, FALSE, FALSE, 0);
-       gtk_signal_connect (GTK_OBJECT (destsel_btn), "clicked",
-                           GTK_SIGNAL_FUNC (prefs_headers_select_dest_cb),
-                           NULL);
-
-       PACK_CHECK_BUTTON (dest_hbox, regex_chkbtn, _("Use regex"));
-       gtk_widget_set_sensitive(regex_chkbtn, FALSE);
-
-       notrecv_radiobtn = gtk_radio_button_new_with_label
-               (recv_group, _("Don't receive"));
-       recv_group = gtk_radio_button_group
-               (GTK_RADIO_BUTTON (notrecv_radiobtn));
-       gtk_widget_show (notrecv_radiobtn);
-       gtk_box_pack_start (GTK_BOX (vbox2), notrecv_radiobtn, FALSE, FALSE, 0);
-       gtk_signal_connect
-               (GTK_OBJECT (notrecv_radiobtn), "toggled",
-                GTK_SIGNAL_FUNC (prefs_headers_notrecv_radio_button_toggled),
-                NULL);
-       */
-
-       /* register / substitute / delete */
-
-       /*
-       reg_hbox = gtk_hbox_new (FALSE, 4);
-       gtk_widget_show (reg_hbox);
-       gtk_box_pack_start (GTK_BOX (vbox1), reg_hbox, FALSE, FALSE, 0);
-
-       arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT);
-       gtk_widget_show (arrow);
-       gtk_box_pack_start (GTK_BOX (reg_hbox), arrow, FALSE, FALSE, 0);
-       gtk_widget_set_usize (arrow, -1, 16);
-
-       btn_hbox = gtk_hbox_new (TRUE, 4);
-       gtk_widget_show (btn_hbox);
-       gtk_box_pack_start (GTK_BOX (reg_hbox), btn_hbox, FALSE, FALSE, 0);
-
-       reg_btn = gtk_button_new_with_label (_("Register"));
-       gtk_widget_show (reg_btn);
-       gtk_box_pack_start (GTK_BOX (btn_hbox), reg_btn, FALSE, TRUE, 0);
-       gtk_signal_connect (GTK_OBJECT (reg_btn), "clicked",
-                           GTK_SIGNAL_FUNC (prefs_headers_register_cb), NULL);
-
-       subst_btn = gtk_button_new_with_label (_(" Substitute "));
-       gtk_widget_show (subst_btn);
-       gtk_box_pack_start (GTK_BOX (btn_hbox), subst_btn, FALSE, TRUE, 0);
-       gtk_signal_connect (GTK_OBJECT (subst_btn), "clicked",
-                           GTK_SIGNAL_FUNC (prefs_headers_substitute_cb),
-                           NULL);
-
-       del_btn = gtk_button_new_with_label (_("Delete"));
-       gtk_widget_show (del_btn);
-       gtk_box_pack_start (GTK_BOX (btn_hbox), del_btn, FALSE, TRUE, 0);
-       gtk_signal_connect (GTK_OBJECT (del_btn), "clicked",
-                           GTK_SIGNAL_FUNC (prefs_headers_delete_cb), NULL);
-
-       cond_hbox = gtk_hbox_new (FALSE, 8);
-       gtk_widget_show (cond_hbox);
-       gtk_box_pack_start (GTK_BOX (vbox1), cond_hbox, TRUE, TRUE, 0);
-
-       cond_scrolledwin = gtk_scrolled_window_new (NULL, NULL);
-       gtk_widget_show (cond_scrolledwin);
-       gtk_widget_set_usize (cond_scrolledwin, -1, 150);
-       gtk_box_pack_start (GTK_BOX (cond_hbox), cond_scrolledwin,
-                           TRUE, TRUE, 0);
-       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (cond_scrolledwin),
-                                       GTK_POLICY_AUTOMATIC,
-                                       GTK_POLICY_AUTOMATIC);
-
-       cond_clist = gtk_clist_new_with_titles(1, title);
-       gtk_widget_show (cond_clist);
-       gtk_container_add (GTK_CONTAINER (cond_scrolledwin), cond_clist);
-       gtk_clist_set_column_width (GTK_CLIST (cond_clist), 0, 80);
-       gtk_clist_set_selection_mode (GTK_CLIST (cond_clist),
-                                     GTK_SELECTION_BROWSE);
-       GTK_WIDGET_UNSET_FLAGS (GTK_CLIST (cond_clist)->column[0].button,
-                               GTK_CAN_FOCUS);
-       gtk_signal_connect (GTK_OBJECT (cond_clist), "select_row",
-                           GTK_SIGNAL_FUNC (prefs_headers_select), NULL);
-
-       btn_vbox = gtk_vbox_new (FALSE, 8);
-       gtk_widget_show (btn_vbox);
-       gtk_box_pack_start (GTK_BOX (cond_hbox), btn_vbox, FALSE, FALSE, 0);
-
-       up_btn = gtk_button_new_with_label (_("Up"));
-       gtk_widget_show (up_btn);
-       gtk_box_pack_start (GTK_BOX (btn_vbox), up_btn, FALSE, FALSE, 0);
-       gtk_signal_connect (GTK_OBJECT (up_btn), "clicked",
-                           GTK_SIGNAL_FUNC (prefs_headers_up), NULL);
-
-       down_btn = gtk_button_new_with_label (_("Down"));
-       gtk_widget_show (down_btn);
-       gtk_box_pack_start (GTK_BOX (btn_vbox), down_btn, FALSE, FALSE, 0);
-       gtk_signal_connect (GTK_OBJECT (down_btn), "clicked",
-                           GTK_SIGNAL_FUNC (prefs_headers_down), NULL);
-       */
-
        hdr_label = gtk_label_new (_("Header"));
        gtk_widget_show (hdr_label);
        gtk_table_attach (GTK_TABLE (table1), hdr_label, 0, 1, 0, 1,
@@ -597,29 +308,6 @@ static void prefs_headers_create(void)
        headers.hdr_entry  = GTK_COMBO (hdr_combo)->entry;
        headers.key_entry  = key_entry;
        headers.headers_clist   = headers_clist;
-
-       /*
-       headers.hdr_combo1  = hdr_combo1;
-       headers.hdr_combo2  = hdr_combo2;
-       headers.hdr_entry1  = GTK_COMBO (hdr_combo1)->entry;
-       headers.hdr_entry2  = GTK_COMBO (hdr_combo2)->entry;
-       headers.key_entry1  = key_entry1;
-       headers.key_entry2  = key_entry2;
-       headers.pred_combo1 = pred_combo1;
-       headers.pred_combo2 = pred_combo2;
-       headers.pred_entry1 = pred_entry1;
-       headers.pred_entry2 = pred_entry2;
-       headers.op_combo    = op_combo;
-       headers.op_entry    = op_entry;
-
-       headers.dest_entry      = dest_entry;
-       headers.destsel_btn     = destsel_btn;
-       headers.dest_radiobtn   = dest_radiobtn;
-       headers.notrecv_radiobtn        = notrecv_radiobtn;
-       headers.regex_chkbtn     = regex_chkbtn;
-
-       headers.headers_clist   = headers_clist;
-       */
 }
 
 void prefs_headers_read_config(PrefsAccount * ac)
index 39cb58e4f99b8e6b72819ec7b5e54e1e479fdc08..922e794c2fbf6e514b8559bd6c078d37b95d3d29 100644 (file)
 
 #define BUFFSIZE       8192
 
+/*
+  procheader_get_one_field
+  - reads fp and puts the header and the corresponding content into buf
+    if one of these is one of hentry table.
+  - if hentry is NULL, ignores no headers
+ */
+
 gint procheader_get_one_field(gchar *buf, gint len, FILE *fp,
                              HeaderEntry hentry[])
 {
index 92b32dc6734e5028ced034e7e43fa613dcabfeca..dd0488fa0e21f1015b225f105210d58255d531f1 100644 (file)
@@ -47,6 +47,8 @@
 #include "html.h"
 #include "compose.h"
 #include "addressbook.h"
+#include "headers_display.h"
+#include "prefs_display_headers.h"
 
 #define FONT_LOAD(font, s) \
 { \
@@ -931,8 +933,25 @@ enum
        H_ORGANIZATION  = 11,
 };
 
+static gboolean hdrequal(char * hdr1, char * hdr2)
+{
+       int len1;
+       int len2;
+
+       len1 = strlen(hdr1);
+       len2 = strlen(hdr2);
+       if (hdr1[len1 - 1] == ':')
+               len1--;
+       if (hdr2[len2 - 1] == ':')
+               len2--;
+       if (len1 != len2)
+               return 0;
+       return (strncasecmp(hdr1, hdr2, len1) == 0);
+}
+
 static GPtrArray *textview_scan_header(TextView *textview, FILE *fp)
 {
+       /*
        static HeaderEntry hentry[] = {{"Date:",         NULL, FALSE},
                                       {"From:",         NULL, TRUE},
                                       {"To:",           NULL, FALSE},
@@ -946,10 +965,15 @@ static GPtrArray *textview_scan_header(TextView *textview, FILE *fp)
                                       {"User-Agent:",   NULL, TRUE},
                                       {"Organization:", NULL, TRUE},
                                       {NULL,            NULL, FALSE}};
+       */
        gchar buf[BUFFSIZE], tmp[BUFFSIZE];
        gint hnum;
        HeaderEntry *hp;
        GPtrArray *headers;
+       GSList * l;
+
+       int i;
+       GPtrArray *sorted_headers;
 
        g_return_val_if_fail(fp != NULL, NULL);
 
@@ -961,6 +985,7 @@ static GPtrArray *textview_scan_header(TextView *textview, FILE *fp)
 
        headers = g_ptr_array_new();
 
+       /*
        while ((hnum = procheader_get_one_field(buf, sizeof(buf), fp, hentry))
               != -1) {
                Header *header;
@@ -975,8 +1000,59 @@ static GPtrArray *textview_scan_header(TextView *textview, FILE *fp)
 
                g_ptr_array_add(headers, header);
        }
+       */
+       //      while (procheader_get_unfolded_line(buf, sizeof(buf), fp) != NULL) {
+       while (procheader_get_one_field(buf, sizeof(buf), fp, NULL) != -1) {
+               gchar * p;
+               Header *header;
+
+               if (*buf == ':') continue;
+               for (p = buf; *p && *p != ' '; p++) {
+                       if (*p == ':') {
+                               header = g_new(Header, 1);
+                               header->name = g_strndup(buf, p - buf + 1);
+                               p++;
+                               /* while (*p == ' ' || *p == '\t') p++; */
+                               conv_unmime_header(tmp, sizeof(tmp), p, NULL);
+                               header->body = g_strdup(tmp);
+
+                               g_ptr_array_add(headers, header);
+                               break;
+                       }
+               }
+       }
 
-       return headers;
+       sorted_headers = g_ptr_array_new();
+       for(l = prefs_display_headers ; l != NULL ; l = g_slist_next(l)) {
+               HeaderDisplayProp * dp = (HeaderDisplayProp *) l->data;
+               for(i = 0 ; i < headers->len ; i++) {
+                       Header * header = g_ptr_array_index(headers, i);
+                       if (hdrequal(header->name, dp->name)) {
+                               if (dp->hidden) {
+                                       g_ptr_array_remove_index(headers, i);
+                                       g_free(header->body);
+                                       g_free(header->name);
+                                       g_free(header);
+                                       i--;
+                               }
+                               else {
+                                       g_ptr_array_add(sorted_headers,
+                                                       header);
+                                       g_ptr_array_remove_index(headers, i);
+                                       i--;
+                               }
+                       }
+               }
+       }
+
+       for(i = 0 ; i < headers->len ; i++) {
+               Header * header = g_ptr_array_index(headers, i);
+               g_ptr_array_add(sorted_headers, header);
+       }
+
+       g_ptr_array_free(headers, TRUE);
+       
+       return sorted_headers;
 }
 
 static void textview_show_header(TextView *textview, GPtrArray *headers)