Statistics
| Revision:

root / src / prefs_display_header.c @ 478

History | View | Annotate | Download (17.4 kB)

1
/*
2
 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3
 * Copyright (C) 1999-2005 Hiroyuki Yamamoto
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
 */
19
20
#ifdef HAVE_CONFIG_H
21
#  include "config.h"
22
#endif
23
24
#include "defs.h"
25
26
#include <glib.h>
27
#include <glib/gi18n.h>
28
#include <gtk/gtk.h>
29
#include <gdk/gdkkeysyms.h>
30
#include <stdio.h>
31
#include <stdlib.h>
32
#include <string.h>
33
#include <errno.h>
34
35
#include "prefs.h"
36
#include "prefs_display_header.h"
37
#include "prefs_common.h"
38
#include "manage_window.h"
39
#include "alertpanel.h"
40
#include "displayheader.h"
41
#include "utils.h"
42
#include "gtkutils.h"
43
44
static struct DisplayHeader {
45
        GtkWidget *window;
46
47
        GtkWidget *confirm_area;
48
        GtkWidget *ok_btn;
49
        GtkWidget *cancel_btn;
50
51
        GtkWidget *hdr_combo;
52
        GtkWidget *hdr_entry;
53
        GtkWidget *key_check;
54
        GtkWidget *headers_clist;
55
        GtkWidget *hidden_headers_clist;
56
57
        GtkWidget *other_headers;
58
} dispheader;
59
60
/* widget creating functions */
61
static void prefs_display_header_create        (void);
62
63
static void prefs_display_header_set_dialog        (void);
64
static void prefs_display_header_set_list        (void);
65
static gint prefs_display_header_clist_set_row        (gboolean hidden);
66
67
/* callback functions */
68
static void prefs_display_header_register_cb        (GtkButton        *btn,
69
                                                 gpointer         hidden_data);
70
static void prefs_display_header_delete_cb        (GtkButton        *btn,
71
                                                 gpointer         clist_data);
72
static void prefs_display_header_up                (void);
73
static void prefs_display_header_down                (void);
74
75
static void prefs_display_header_row_moved        (GtkCList        *clist,
76
                                                 gint                 source_row,
77
                                                 gint                 dest_row,
78
                                                 gpointer         data);
79
80
static gboolean prefs_display_header_key_pressed(GtkWidget        *widget,
81
                                                 GdkEventKey        *event,
82
                                                 gpointer         data);
83
static void prefs_display_header_ok                (void);
84
static void prefs_display_header_cancel                (void);
85
static gint prefs_display_header_deleted        (GtkWidget        *widget,
86
                                                 GdkEventAny        *event,
87
                                                 gpointer         data);
88
89
static gchar *defaults[] =
90
{
91
        "From",
92
        "To",
93
        "Cc",
94
        "Reply-To",
95
        "Newsgroups",
96
        "Followup-To",
97
        "Subject",
98
        "Date",
99
        "Sender",
100
        "Organization",
101
        "X-Mailer",
102
        "X-Newsreader",
103
        "User-Agent",
104
        "-Received",
105
        "-Message-Id",
106
        "-In-Reply-To",
107
        "-References",
108
        "-Mime-Version",
109
        "-Content-Type",
110
        "-Content-Transfer-Encoding",
111
        "-X-UIDL",
112
        "-Precedence",
113
        "-Status",
114
        "-Priority",
115
        "-X-Face"
116
};
117
118
static void prefs_display_header_set_default(void)
119
{
120
        gint i;
121
        DisplayHeaderProp *dp;
122
123
        for(i = 0; i < sizeof(defaults) / sizeof(defaults[0]); i++) {
124
                dp = display_header_prop_read_str(defaults[i]);
125
                prefs_common.disphdr_list =
126
                        g_slist_append(prefs_common.disphdr_list, dp);
127
        }
128
}
129
130
void prefs_display_header_open(void)
131
{
132
        if (!dispheader.window) {
133
                prefs_display_header_create();
134
        }
135
136
        gtkut_box_set_reverse_order(GTK_BOX(dispheader.confirm_area),
137
                                    !prefs_common.comply_gnome_hig);
138
        manage_window_set_transient(GTK_WINDOW(dispheader.window));
139
        gtk_widget_grab_focus(dispheader.ok_btn);
140
141
        prefs_display_header_set_dialog();
142
143
        gtk_widget_show(dispheader.window);
144
}
145
146
static void prefs_display_header_create(void)
147
{
148
        GtkWidget *window;
149
        GtkWidget *vbox;
150
        GtkWidget *btn_hbox;
151
        GtkWidget *confirm_area;
152
        GtkWidget *ok_btn;
153
        GtkWidget *cancel_btn;
154
155
        GtkWidget *vbox1;
156
157
        GtkWidget *hbox1;
158
        GtkWidget *hdr_label;
159
        GtkWidget *hdr_combo;
160
161
        GtkWidget *btn_vbox;
162
        GtkWidget *reg_btn;
163
        GtkWidget *del_btn;
164
        GtkWidget *up_btn;
165
        GtkWidget *down_btn;
166
167
        GtkWidget *clist_hbox;
168
        GtkWidget *clist_hbox1;
169
        GtkWidget *clist_hbox2;
170
        GtkWidget *clist_scrolledwin;
171
        GtkWidget *headers_clist;
172
        GtkWidget *hidden_headers_clist;
173
174
        GtkWidget *checkbtn_other_headers;
175
176
        gchar *title[1];
177
178
        debug_print(_("Creating display header setting window...\n"));
179
180
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
181
        gtk_container_set_border_width (GTK_CONTAINER (window), 8);
182
        gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
183
        gtk_window_set_modal (GTK_WINDOW (window), TRUE);
184
        gtk_window_set_policy (GTK_WINDOW (window), FALSE, TRUE, FALSE);
185
186
        vbox = gtk_vbox_new (FALSE, 6);
187
        gtk_widget_show (vbox);
188
        gtk_container_add (GTK_CONTAINER (window), vbox);
189
190
        btn_hbox = gtk_hbox_new (FALSE, 8);
191
        gtk_widget_show (btn_hbox);
192
        gtk_box_pack_end (GTK_BOX (vbox), btn_hbox, FALSE, FALSE, 0);
193
194
        gtkut_stock_button_set_create(&confirm_area, &ok_btn, GTK_STOCK_OK,
195
                                      &cancel_btn, GTK_STOCK_CANCEL,
196
                                      NULL, NULL);
197
        gtk_widget_show (confirm_area);
198
        gtk_box_pack_end (GTK_BOX(btn_hbox), confirm_area, FALSE, FALSE, 0);
199
        gtk_widget_grab_default (ok_btn);
200
201
        gtk_window_set_title (GTK_WINDOW(window),
202
                              _("Display header setting"));
203
        MANAGE_WINDOW_SIGNALS_CONNECT(window);
204
        g_signal_connect (G_OBJECT(window), "delete_event",
205
                          G_CALLBACK(prefs_display_header_deleted), NULL);
206
        g_signal_connect (G_OBJECT(window), "key_press_event",
207
                          G_CALLBACK(prefs_display_header_key_pressed), NULL);
208
        g_signal_connect (G_OBJECT(ok_btn), "clicked",
209
                          G_CALLBACK(prefs_display_header_ok), NULL);
210
        g_signal_connect (G_OBJECT(cancel_btn), "clicked",
211
                          G_CALLBACK(prefs_display_header_cancel), NULL);
212
213
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
214
        gtk_widget_show (vbox1);
215
        gtk_box_pack_start (GTK_BOX (vbox), vbox1, TRUE, TRUE, 0);
216
        gtk_container_set_border_width (GTK_CONTAINER (vbox1), 2);
217
218
        hbox1 = gtk_hbox_new (FALSE, 8);
219
        gtk_widget_show (hbox1);
220
        gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, TRUE, 0);
221
222
        hdr_label = gtk_label_new (_("Header name"));
223
        gtk_widget_show (hdr_label);
224
        gtk_box_pack_start (GTK_BOX (hbox1), hdr_label, FALSE, FALSE, 0);
225
226
        hdr_combo = gtk_combo_new ();
227
        gtk_widget_show (hdr_combo);
228
        gtk_box_pack_start (GTK_BOX (hbox1), hdr_combo, TRUE, TRUE, 0);
229
        gtk_widget_set_size_request (hdr_combo, 150, -1);
230
        gtkut_combo_set_items (GTK_COMBO (hdr_combo),
231
                               "From", "To", "Cc", "Subject", "Date",
232
                               "Reply-To", "Sender", "User-Agent", "X-Mailer",
233
                               NULL);
234
235
        clist_hbox = gtk_hbox_new (FALSE, 10);
236
        gtk_widget_show (clist_hbox);
237
        gtk_box_pack_start (GTK_BOX (vbox1), clist_hbox, TRUE, TRUE, 0);
238
239
        /* display headers list */
240
241
        clist_hbox1 = gtk_hbox_new (FALSE, 8);
242
        gtk_widget_show (clist_hbox1);
243
        gtk_box_pack_start (GTK_BOX (clist_hbox), clist_hbox1, TRUE, TRUE, 0);
244
245
        clist_scrolledwin = gtk_scrolled_window_new (NULL, NULL);
246
        gtk_widget_set_size_request (clist_scrolledwin, 200, 210);
247
        gtk_widget_show (clist_scrolledwin);
248
        gtk_box_pack_start (GTK_BOX (clist_hbox1), clist_scrolledwin,
249
                            TRUE, TRUE, 0);
250
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (clist_scrolledwin),
251
                                        GTK_POLICY_AUTOMATIC,
252
                                        GTK_POLICY_AUTOMATIC);
253
254
        title[0] = _("Displayed Headers");
255
        headers_clist = gtk_clist_new_with_titles(1, title);
256
        gtk_widget_show (headers_clist);
257
        gtk_container_add (GTK_CONTAINER (clist_scrolledwin), headers_clist);
258
        gtk_clist_set_selection_mode (GTK_CLIST (headers_clist),
259
                                      GTK_SELECTION_BROWSE);
260
        gtk_clist_set_reorderable (GTK_CLIST (headers_clist), TRUE);
261
        gtk_clist_set_use_drag_icons (GTK_CLIST (headers_clist), FALSE);
262
        GTK_WIDGET_UNSET_FLAGS (GTK_CLIST (headers_clist)->column[0].button,
263
                                GTK_CAN_FOCUS);
264
        g_signal_connect_after
265
                (G_OBJECT (headers_clist), "row_move",
266
                 G_CALLBACK (prefs_display_header_row_moved), NULL);
267
268
        btn_vbox = gtk_vbox_new (FALSE, 8);
269
        gtk_widget_show (btn_vbox);
270
        gtk_box_pack_start (GTK_BOX (clist_hbox1), btn_vbox, FALSE, FALSE, 0);
271
272
        reg_btn = gtk_button_new_with_label (_("Add"));
273
        gtk_widget_show (reg_btn);
274
        gtk_box_pack_start (GTK_BOX (btn_vbox), reg_btn, FALSE, TRUE, 0);
275
        g_signal_connect (G_OBJECT (reg_btn), "clicked",
276
                          G_CALLBACK (prefs_display_header_register_cb),
277
                          GINT_TO_POINTER(FALSE));
278
        del_btn = gtk_button_new_with_label (_("Delete"));
279
        gtk_widget_show (del_btn);
280
        gtk_box_pack_start (GTK_BOX (btn_vbox), del_btn, FALSE, TRUE, 0);
281
        g_signal_connect (G_OBJECT (del_btn), "clicked",
282
                          G_CALLBACK (prefs_display_header_delete_cb),
283
                          headers_clist);
284
285
        up_btn = gtk_button_new_with_label (_("Up"));
286
        gtk_widget_show (up_btn);
287
        gtk_box_pack_start (GTK_BOX (btn_vbox), up_btn, FALSE, FALSE, 0);
288
        g_signal_connect (G_OBJECT (up_btn), "clicked",
289
                          G_CALLBACK (prefs_display_header_up), NULL);
290
291
        down_btn = gtk_button_new_with_label (_("Down"));
292
        gtk_widget_show (down_btn);
293
        gtk_box_pack_start (GTK_BOX (btn_vbox), down_btn, FALSE, FALSE, 0);
294
        g_signal_connect (G_OBJECT (down_btn), "clicked",
295
                          G_CALLBACK (prefs_display_header_down), NULL);
296
297
        /* hidden headers list */
298
299
        clist_hbox2 = gtk_hbox_new (FALSE, 8);
300
        gtk_widget_show (clist_hbox2);
301
        gtk_box_pack_start (GTK_BOX (clist_hbox), clist_hbox2, TRUE, TRUE, 0);
302
303
        clist_scrolledwin = gtk_scrolled_window_new (NULL, NULL);
304
        gtk_widget_set_size_request (clist_scrolledwin, 200, 210);
305
        gtk_widget_show (clist_scrolledwin);
306
        gtk_box_pack_start (GTK_BOX (clist_hbox2), clist_scrolledwin,
307
                            TRUE, TRUE, 0);
308
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (clist_scrolledwin),
309
                                        GTK_POLICY_AUTOMATIC,
310
                                        GTK_POLICY_AUTOMATIC);
311
312
        title[0] = _("Hidden headers");
313
        hidden_headers_clist = gtk_clist_new_with_titles(1, title);
314
        gtk_widget_show (hidden_headers_clist);
315
        gtk_container_add (GTK_CONTAINER (clist_scrolledwin),
316
                           hidden_headers_clist);
317
        gtk_clist_set_selection_mode (GTK_CLIST (hidden_headers_clist),
318
                                      GTK_SELECTION_BROWSE);
319
        gtk_clist_set_auto_sort(GTK_CLIST (hidden_headers_clist), TRUE);
320
        GTK_WIDGET_UNSET_FLAGS (GTK_CLIST (hidden_headers_clist)->
321
                                column[0].button, GTK_CAN_FOCUS);
322
323
        btn_vbox = gtk_vbox_new (FALSE, 8);
324
        gtk_widget_show (btn_vbox);
325
        gtk_box_pack_start (GTK_BOX (clist_hbox2), btn_vbox, FALSE, FALSE, 0);
326
327
        reg_btn = gtk_button_new_with_label (_("Add"));
328
        gtk_widget_show (reg_btn);
329
        gtk_box_pack_start (GTK_BOX (btn_vbox), reg_btn, FALSE, TRUE, 0);
330
        g_signal_connect (G_OBJECT (reg_btn), "clicked",
331
                          G_CALLBACK (prefs_display_header_register_cb),
332
                          GINT_TO_POINTER (TRUE));
333
        del_btn = gtk_button_new_with_label (_("Delete"));
334
        gtk_widget_show (del_btn);
335
        gtk_box_pack_start (GTK_BOX (btn_vbox), del_btn, FALSE, TRUE, 0);
336
        g_signal_connect (G_OBJECT (del_btn), "clicked",
337
                          G_CALLBACK (prefs_display_header_delete_cb),
338
                          hidden_headers_clist);
339
340
        PACK_CHECK_BUTTON (btn_hbox, checkbtn_other_headers,
341
                           _("Show all unspecified headers"));
342
        SET_TOGGLE_SENSITIVITY (checkbtn_other_headers, clist_hbox2);
343
344
        gtk_widget_show_all(window);
345
346
        dispheader.window        = window;
347
348
        dispheader.confirm_area  = confirm_area;
349
        dispheader.ok_btn        = ok_btn;
350
        dispheader.cancel_btn    = cancel_btn;
351
352
        dispheader.hdr_combo     = hdr_combo;
353
        dispheader.hdr_entry     = GTK_COMBO (hdr_combo)->entry;
354
355
        dispheader.headers_clist        = headers_clist;
356
        dispheader.hidden_headers_clist = hidden_headers_clist;
357
358
        dispheader.other_headers = checkbtn_other_headers;
359
}
360
361
void prefs_display_header_read_config(void)
362
{
363
        gchar *rcpath;
364
        FILE *fp;
365
        gchar buf[PREFSBUFSIZE];
366
        DisplayHeaderProp *dp;
367
368
        debug_print(_("Reading configuration for displaying headers...\n"));
369
370
        rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
371
                             DISPLAY_HEADER_RC, NULL);
372
        if ((fp = g_fopen(rcpath, "rb")) == NULL) {
373
                if (ENOENT != errno) FILE_OP_ERROR(rcpath, "fopen");
374
                g_free(rcpath);
375
                prefs_common.disphdr_list = NULL;
376
                prefs_display_header_set_default();
377
                return;
378
        }
379
        g_free(rcpath);
380
381
        /* remove all previous headers list */
382
        while (prefs_common.disphdr_list != NULL) {
383
                dp = (DisplayHeaderProp *)prefs_common.disphdr_list->data;
384
                display_header_prop_free(dp);
385
                prefs_common.disphdr_list =
386
                        g_slist_remove(prefs_common.disphdr_list, dp);
387
        }
388
389
        while (fgets(buf, sizeof(buf), fp) != NULL) {
390
                g_strchomp(buf);
391
                dp = display_header_prop_read_str(buf);
392
                if (dp)
393
                        prefs_common.disphdr_list =
394
                                g_slist_append(prefs_common.disphdr_list, dp);
395
        }
396
397
        fclose(fp);
398
}
399
400
void prefs_display_header_write_config(void)
401
{
402
        gchar *rcpath;
403
        PrefFile *pfile;
404
        GSList *cur;
405
406
        debug_print(_("Writing configuration for displaying headers...\n"));
407
408
        rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
409
                             DISPLAY_HEADER_RC, NULL);
410
411
        if ((pfile = prefs_file_open(rcpath)) == NULL) {
412
                g_warning(_("failed to write configuration to file\n"));
413
                g_free(rcpath);
414
                return;
415
        }
416
417
        for (cur = prefs_common.disphdr_list; cur != NULL;
418
             cur = cur->next) {
419
                DisplayHeaderProp *dp = (DisplayHeaderProp *)cur->data;
420
                gchar *dpstr;
421
422
                dpstr = display_header_prop_get_str(dp);
423
                if (fputs(dpstr, pfile->fp) == EOF ||
424
                    fputc('\n', pfile->fp) == EOF) {
425
                        FILE_OP_ERROR(rcpath, "fputs || fputc");
426
                        prefs_file_close_revert(pfile);
427
                        g_free(rcpath);
428
                        g_free(dpstr);
429
                        return;
430
                }
431
                g_free(dpstr);
432
        }
433
434
        g_free(rcpath);
435
436
        if (prefs_file_close(pfile) < 0) {
437
                g_warning(_("failed to write configuration to file\n"));
438
                return;
439
        }
440
}
441
442
static void prefs_display_header_set_dialog(void)
443
{
444
        GtkCList *clist = GTK_CLIST(dispheader.headers_clist);
445
        GtkCList *hidden_clist = GTK_CLIST(dispheader.hidden_headers_clist);
446
        GSList *cur;
447
        gchar *dp_str[1];
448
        gint row;
449
450
        gtk_clist_freeze(clist);
451
        gtk_clist_freeze(hidden_clist);
452
453
        gtk_clist_clear(clist);
454
        gtk_clist_clear(hidden_clist);
455
456
        for (cur = prefs_common.disphdr_list; cur != NULL;
457
             cur = cur->next) {
458
                DisplayHeaderProp *dp = (DisplayHeaderProp *)cur->data;
459
460
                dp_str[0] = dp->name;
461
462
                if (dp->hidden) {
463
                        row = gtk_clist_append(hidden_clist, dp_str);
464
                        gtk_clist_set_row_data(hidden_clist, row, dp);
465
                } else {
466
                        row = gtk_clist_append(clist, dp_str);
467
                        gtk_clist_set_row_data(clist, row, dp);
468
                }
469
        }
470
471
        gtk_clist_thaw(hidden_clist);
472
        gtk_clist_thaw(clist);
473
474
        gtk_toggle_button_set_active
475
                (GTK_TOGGLE_BUTTON(dispheader.other_headers),
476
                 prefs_common.show_other_header);
477
}
478
479
static void prefs_display_header_set_list()
480
{
481
        gint row = 0;
482
        DisplayHeaderProp *dp;
483
484
        g_slist_free(prefs_common.disphdr_list);
485
        prefs_common.disphdr_list = NULL;
486
487
        while ((dp = gtk_clist_get_row_data
488
                (GTK_CLIST(dispheader.headers_clist), row)) != NULL) {
489
                prefs_common.disphdr_list =
490
                        g_slist_append(prefs_common.disphdr_list, dp);
491
                row++;
492
        }
493
494
        row = 0;
495
        while ((dp = gtk_clist_get_row_data
496
                (GTK_CLIST(dispheader.hidden_headers_clist), row)) != NULL) {
497
                prefs_common.disphdr_list =
498
                        g_slist_append(prefs_common.disphdr_list, dp);
499
                row++;
500
        }
501
}
502
503
static gint prefs_display_header_find_header(GtkCList *clist,
504
                                             const gchar *header)
505
{
506
        gint row = 0;
507
        DisplayHeaderProp *dp;
508
509
        while ((dp = gtk_clist_get_row_data(clist, row)) != NULL) {
510
                if (g_ascii_strcasecmp(dp->name, header) == 0)
511
                        return row;
512
                row++;
513
        }
514
515
        return -1;
516
}
517
518
static gint prefs_display_header_clist_set_row(gboolean hidden)
519
{
520
        GtkCList *clist;
521
        DisplayHeaderProp *dp;
522
        const gchar *entry_text;
523
        gchar *dp_str[1];
524
        gint row;
525
526
        entry_text = gtk_entry_get_text(GTK_ENTRY(dispheader.hdr_entry));
527
        if (entry_text[0] == '\0') {
528
                alertpanel_error(_("Header name is not set."));
529
                return -1;
530
        }
531
532
        if (hidden)
533
                clist = GTK_CLIST(dispheader.hidden_headers_clist);
534
        else
535
                clist = GTK_CLIST(dispheader.headers_clist);
536
537
        if (prefs_display_header_find_header(clist, entry_text) != -1) {
538
                alertpanel_error(_("This header is already in the list."));
539
                return -1;
540
        }
541
542
        dp = g_new0(DisplayHeaderProp, 1);
543
544
        dp->name = g_strdup(entry_text);
545
        dp->hidden = hidden;
546
547
        dp_str[0] = dp->name;
548
        row = gtk_clist_append(clist, dp_str);
549
        gtk_clist_set_row_data(clist, row, dp);
550
551
        prefs_display_header_set_list();
552
553
        return row;
554
}
555
556
static void prefs_display_header_register_cb(GtkButton *btn,
557
                                             gpointer hidden_data)
558
{
559
        prefs_display_header_clist_set_row(GPOINTER_TO_INT(hidden_data));
560
}
561
562
static void prefs_display_header_delete_cb(GtkButton *btn, gpointer clist_data)
563
{
564
        GtkCList *clist = GTK_CLIST(clist_data);
565
        DisplayHeaderProp *dp;
566
        gint row;
567
568
        if (!clist->selection) return;
569
        row = GPOINTER_TO_INT(clist->selection->data);
570
571
        dp = gtk_clist_get_row_data(clist, row);
572
        display_header_prop_free(dp);
573
        gtk_clist_remove(clist, row);
574
        prefs_common.disphdr_list =
575
                g_slist_remove(prefs_common.disphdr_list, dp);
576
}
577
578
static void prefs_display_header_up(void)
579
{
580
        GtkCList *clist = GTK_CLIST(dispheader.headers_clist);
581
        gint row;
582
583
        if (!clist->selection) return;
584
585
        row = GPOINTER_TO_INT(clist->selection->data);
586
        if (row > 0)
587
                gtk_clist_row_move(clist, row, row - 1);
588
}
589
590
static void prefs_display_header_down(void)
591
{
592
        GtkCList *clist = GTK_CLIST(dispheader.headers_clist);
593
        gint row;
594
595
        if (!clist->selection) return;
596
597
        row = GPOINTER_TO_INT(clist->selection->data);
598
        if (row >= 0 && row < clist->rows - 1)
599
                gtk_clist_row_move(clist, row, row + 1);
600
}
601
602
static void prefs_display_header_row_moved(GtkCList *clist, gint source_row,
603
                                           gint dest_row, gpointer data)
604
{
605
        prefs_display_header_set_list();
606
}
607
608
static gboolean prefs_display_header_key_pressed(GtkWidget *widget,
609
                                             GdkEventKey *event,
610
                                             gpointer data)
611
{
612
        if (event && event->keyval == GDK_Escape)
613
                prefs_display_header_cancel();
614
        return FALSE;
615
}
616
617
static void prefs_display_header_ok(void)
618
{
619
        prefs_common.show_other_header =
620
                gtk_toggle_button_get_active
621
                        (GTK_TOGGLE_BUTTON(dispheader.other_headers));
622
        prefs_display_header_write_config();
623
        gtk_widget_hide(dispheader.window);
624
}
625
626
static void prefs_display_header_cancel(void)
627
{
628
        prefs_display_header_read_config();
629
        gtk_widget_hide(dispheader.window);
630
}
631
632
static gint prefs_display_header_deleted(GtkWidget *widget, GdkEventAny *event,
633
                                         gpointer data)
634
{
635
        prefs_display_header_cancel();
636
        return TRUE;
637
}