Statistics
| Revision:

root / src / mainwindow.c @ 3044

History | View | Annotate | Download (126.4 kB)

1
/*
2
 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3
 * Copyright (C) 1999-2012 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
#include "defs.h"
21
22
#include <glib.h>
23
#include <glib/gi18n.h>
24
#include <gdk/gdkkeysyms.h>
25
#include <gtk/gtkmain.h>
26
#include <gtk/gtkversion.h>
27
#include <gtk/gtkwindow.h>
28
#include <gtk/gtkwidget.h>
29
#include <gtk/gtksignal.h>
30
#include <gtk/gtkvbox.h>
31
#include <gtk/gtkcontainer.h>
32
#include <gtk/gtkstatusbar.h>
33
#include <gtk/gtkprogressbar.h>
34
#include <gtk/gtkhpaned.h>
35
#include <gtk/gtkvpaned.h>
36
#include <gtk/gtkcheckmenuitem.h>
37
#include <gtk/gtkitemfactory.h>
38
#include <gtk/gtkeditable.h>
39
#include <gtk/gtkmenu.h>
40
#include <gtk/gtkmenuitem.h>
41
#include <gtk/gtktoolbar.h>
42
#include <gtk/gtktoolitem.h>
43
#include <gtk/gtktoolbutton.h>
44
#include <gtk/gtkseparatortoolitem.h>
45
#include <gtk/gtkbutton.h>
46
#include <gtk/gtktooltips.h>
47
#include <gtk/gtkarrow.h>
48
#include <gtk/gtkstock.h>
49
#include <gtk/gtkimage.h>
50
#include <string.h>
51
52
#include "main.h"
53
#include "mainwindow.h"
54
#include "folderview.h"
55
#include "foldersel.h"
56
#include "summaryview.h"
57
#include "quick_search.h"
58
#include "query_search.h"
59
#include "messageview.h"
60
#include "mimeview.h"
61
#include "message_search.h"
62
#include "headerview.h"
63
#include "menu.h"
64
#include "stock_pixmap.h"
65
#include "folder.h"
66
#include "inc.h"
67
#include "rpop3.h"
68
#include "compose.h"
69
#include "procmsg.h"
70
#include "send_message.h"
71
#include "import.h"
72
#include "export.h"
73
#include "prefs_common.h"
74
#include "prefs_common_dialog.h"
75
#include "prefs_filter.h"
76
#include "prefs_actions.h"
77
#include "prefs_account.h"
78
#include "prefs_summary_column.h"
79
#include "prefs_template.h"
80
#include "prefs_search_folder.h"
81
#include "prefs_toolbar.h"
82
#include "plugin_manager.h"
83
#include "action.h"
84
#include "account.h"
85
#include "account_dialog.h"
86
#include "addressbook.h"
87
#include "logwindow.h"
88
#include "manage_window.h"
89
#include "alertpanel.h"
90
#include "statusbar.h"
91
#include "inputdialog.h"
92
#include "trayicon.h"
93
#include "printing.h"
94
#include "utils.h"
95
#include "gtkutils.h"
96
#include "codeconv.h"
97
#include "about.h"
98
#include "manual.h"
99
#include "update_check.h"
100
#include "setup.h"
101
#include "version.h"
102
103
#define AC_LABEL_WIDTH        240
104
105
#define STATUSBAR_PUSH(mainwin, str) \
106
{ \
107
        gtk_statusbar_push(GTK_STATUSBAR(mainwin->statusbar), \
108
                           mainwin->mainwin_cid, str); \
109
        gtkut_widget_draw_now(mainwin->statusbar); \
110
}
111
112
#define STATUSBAR_POP(mainwin) \
113
{ \
114
        gtk_statusbar_pop(GTK_STATUSBAR(mainwin->statusbar), \
115
                          mainwin->mainwin_cid); \
116
}
117
118
/* list of all instantiated MainWindow */
119
static GList *mainwin_list = NULL;
120
121
static GdkCursor *watch_cursor;
122
123
static void main_window_menu_callback_block        (MainWindow        *mainwin);
124
static void main_window_menu_callback_unblock        (MainWindow        *mainwin);
125
126
static void main_window_show_cur_account        (MainWindow        *mainwin);
127
128
static void main_window_set_toolbar_button_visibility
129
                                                (MainWindow        *mainwin);
130
131
static void main_window_set_widgets                (MainWindow        *mainwin,
132
                                                 LayoutType         layout,
133
                                                 SeparateType         type);
134
static GtkWidget *main_window_toolbar_create        (MainWindow        *mainwin);
135
static GtkWidget *main_window_toolbar_create_from_list
136
                                                (MainWindow        *mainwin,
137
                                                 GList                *item_list);
138
static void main_window_toolbar_toggle_menu_set_active
139
                                                (MainWindow        *mainwin,
140
                                                 ToolbarStyle         style);
141
142
/* callback functions */
143
static void toolbar_inc_cb                (GtkWidget        *widget,
144
                                         gpointer         data);
145
static void toolbar_inc_all_cb                (GtkWidget        *widget,
146
                                         gpointer         data);
147
static void toolbar_rpop3_cb                (GtkWidget        *widget,
148
                                         gpointer         data);
149
static void toolbar_send_cb                (GtkWidget        *widget,
150
                                         gpointer         data);
151
152
static void toolbar_compose_cb                (GtkWidget        *widget,
153
                                         gpointer         data);
154
static void toolbar_reply_cb                (GtkWidget        *widget,
155
                                         gpointer         data);
156
static void toolbar_reply_to_all_cb        (GtkWidget        *widget,
157
                                         gpointer         data);
158
static void toolbar_forward_cb                (GtkWidget        *widget,
159
                                         gpointer         data);
160
161
static void toolbar_delete_cb                (GtkWidget        *widget,
162
                                         gpointer         data);
163
static void toolbar_junk_cb                (GtkWidget        *widget,
164
                                         gpointer         data);
165
static void toolbar_notjunk_cb                (GtkWidget        *widget,
166
                                         gpointer         data);
167
static void toolbar_exec_cb                (GtkWidget        *widget,
168
                                         gpointer         data);
169
170
static void toolbar_next_unread_cb        (GtkWidget        *widget,
171
                                         gpointer         data);
172
static void toolbar_prev_unread_cb        (GtkWidget        *widget,
173
                                         gpointer         data);
174
static void toolbar_address_cb                (GtkWidget        *widget,
175
                                         gpointer         data);
176
static void toolbar_search_cb                (GtkWidget        *widget,
177
                                         gpointer         data);
178
static void toolbar_print_cb                (GtkWidget        *widget,
179
                                         gpointer         data);
180
static void toolbar_stop_cb                (GtkWidget        *widget,
181
                                         gpointer         data);
182
static void toolbar_prefs_common_cb        (GtkWidget        *widget,
183
                                         gpointer         data);
184
static void toolbar_prefs_account_cb        (GtkWidget        *widget,
185
                                         gpointer         data);
186
187
static gboolean toolbar_button_pressed        (GtkWidget        *widget,
188
                                         GdkEventButton        *event,
189
                                         gpointer         data);
190
191
static void online_switch_clicked                (GtkWidget        *widget,
192
                                                 gpointer         data);
193
static gboolean ac_label_button_pressed                (GtkWidget        *widget,
194
                                                 GdkEventButton        *event,
195
                                                 gpointer         data);
196
static void ac_menu_popup_closed                (GtkMenuShell        *menu_shell,
197
                                                 gpointer         data);
198
199
static gboolean main_window_key_pressed                (GtkWidget        *widget,
200
                                                 GdkEventKey        *event,
201
                                                 gpointer         data);
202
203
static gint main_window_close_cb                (GtkWidget        *widget,
204
                                                 GdkEventAny        *event,
205
                                                 gpointer         data);
206
static gint folder_window_close_cb                (GtkWidget        *widget,
207
                                                 GdkEventAny        *event,
208
                                                 gpointer         data);
209
static gint message_window_close_cb                (GtkWidget        *widget,
210
                                                 GdkEventAny        *event,
211
                                                 gpointer         data);
212
213
static void main_window_size_allocate_cb        (GtkWidget        *widget,
214
                                                 GtkAllocation        *allocation,
215
                                                 gpointer         data);
216
static void folder_window_size_allocate_cb        (GtkWidget        *widget,
217
                                                 GtkAllocation        *allocation,
218
                                                 gpointer         data);
219
static void message_window_size_allocate_cb        (GtkWidget        *widget,
220
                                                 GtkAllocation        *allocation,
221
                                                 gpointer         data);
222
223
static gboolean main_window_window_state_cb        (GtkWidget                *widget,
224
                                                 GdkEventWindowState        *event,
225
                                                 gpointer                 data);
226
static gboolean main_window_visibility_notify_cb(GtkWidget                *widget,
227
                                                 GdkEventVisibility        *event,
228
                                                 gpointer                 data);
229
230
static void new_folder_cb         (MainWindow        *mainwin,
231
                                  guint                 action,
232
                                  GtkWidget        *widget);
233
static void rename_folder_cb         (MainWindow        *mainwin,
234
                                  guint                 action,
235
                                  GtkWidget        *widget);
236
static void move_folder_cb         (MainWindow        *mainwin,
237
                                  guint                 action,
238
                                  GtkWidget        *widget);
239
static void delete_folder_cb         (MainWindow        *mainwin,
240
                                  guint                 action,
241
                                  GtkWidget        *widget);
242
static void update_folderview_cb (MainWindow        *mainwin,
243
                                  guint                 action,
244
                                  GtkWidget        *widget);
245
246
static void add_mailbox_cb         (MainWindow        *mainwin,
247
                                  guint                 action,
248
                                  GtkWidget        *widget);
249
static void remove_mailbox_cb         (MainWindow        *mainwin,
250
                                  guint                 action,
251
                                  GtkWidget        *widget);
252
static void rebuild_tree_cb         (MainWindow        *mainwin,
253
                                  guint                 action,
254
                                  GtkWidget        *widget);
255
256
static void import_mail_cb         (MainWindow        *mainwin,
257
                                  guint                 action,
258
                                  GtkWidget        *widget);
259
static void export_mail_cb         (MainWindow        *mainwin,
260
                                  guint                 action,
261
                                  GtkWidget        *widget);
262
static void empty_trash_cb         (MainWindow        *mainwin,
263
                                  guint                 action,
264
                                  GtkWidget        *widget);
265
266
static void save_as_cb                 (MainWindow        *mainwin,
267
                                  guint                 action,
268
                                  GtkWidget        *widget);
269
#if GTK_CHECK_VERSION(2, 10, 0)
270
static void page_setup_cb         (MainWindow        *mainwin,
271
                                  guint                 action,
272
                                  GtkWidget        *widget);
273
#endif
274
static void print_cb                 (MainWindow        *mainwin,
275
                                  guint                 action,
276
                                  GtkWidget        *widget);
277
static void toggle_offline_cb         (MainWindow        *mainwin,
278
                                  guint                 action,
279
                                  GtkWidget        *widget);
280
static void app_exit_cb                 (MainWindow        *mainwin,
281
                                  guint                 action,
282
                                  GtkWidget        *widget);
283
284
static void search_cb                 (MainWindow        *mainwin,
285
                                  guint                 action,
286
                                  GtkWidget        *widget);
287
288
static void toggle_folder_cb         (MainWindow        *mainwin,
289
                                  guint                 action,
290
                                  GtkWidget        *widget);
291
static void toggle_message_cb         (MainWindow        *mainwin,
292
                                  guint                 action,
293
                                  GtkWidget        *widget);
294
static void toggle_toolbar_cb         (MainWindow        *mainwin,
295
                                  guint                 action,
296
                                  GtkWidget        *widget);
297
static void toggle_searchbar_cb         (MainWindow        *mainwin,
298
                                  guint                 action,
299
                                  GtkWidget        *widget);
300
static void toggle_statusbar_cb         (MainWindow        *mainwin,
301
                                  guint                 action,
302
                                  GtkWidget        *widget);
303
static void toolbar_customize_cb (MainWindow        *mainwin,
304
                                  guint                 action,
305
                                  GtkWidget        *widget);
306
static void change_layout_cb         (MainWindow        *mainwin,
307
                                  guint                 action,
308
                                  GtkWidget        *widget);
309
static void separate_widget_cb         (MainWindow        *mainwin,
310
                                  guint                 action,
311
                                  GtkWidget        *widget);
312
313
static void addressbook_open_cb        (MainWindow        *mainwin,
314
                                 guint                 action,
315
                                 GtkWidget        *widget);
316
static void log_window_show_cb        (MainWindow        *mainwin,
317
                                 guint                 action,
318
                                 GtkWidget        *widget);
319
320
static void inc_mail_cb                        (MainWindow        *mainwin,
321
                                         guint                 action,
322
                                         GtkWidget        *widget);
323
static void inc_all_account_mail_cb        (MainWindow        *mainwin,
324
                                         guint                 action,
325
                                         GtkWidget        *widget);
326
static void inc_stop_cb                        (MainWindow        *mainwin,
327
                                         guint                 action,
328
                                         GtkWidget        *widget);
329
330
static void rpop3_cb                        (MainWindow        *mainwin,
331
                                         guint                 action,
332
                                         GtkWidget        *widget);
333
334
static void send_queue_cb                (MainWindow        *mainwin,
335
                                         guint                 action,
336
                                         GtkWidget        *widget);
337
338
static void compose_cb                        (MainWindow        *mainwin,
339
                                         guint                 action,
340
                                         GtkWidget        *widget);
341
static void reply_cb                        (MainWindow        *mainwin,
342
                                         guint                 action,
343
                                         GtkWidget        *widget);
344
345
static void open_msg_cb                        (MainWindow        *mainwin,
346
                                         guint                 action,
347
                                         GtkWidget        *widget);
348
349
static void view_source_cb                (MainWindow        *mainwin,
350
                                         guint                 action,
351
                                         GtkWidget        *widget);
352
353
static void show_all_header_cb                (MainWindow        *mainwin,
354
                                         guint                 action,
355
                                         GtkWidget        *widget);
356
357
static void move_to_cb                        (MainWindow        *mainwin,
358
                                         guint                 action,
359
                                         GtkWidget        *widget);
360
static void copy_to_cb                        (MainWindow        *mainwin,
361
                                         guint                 action,
362
                                         GtkWidget        *widget);
363
static void delete_cb                        (MainWindow        *mainwin,
364
                                         guint                 action,
365
                                         GtkWidget        *widget);
366
367
static void mark_cb                        (MainWindow        *mainwin,
368
                                         guint                 action,
369
                                         GtkWidget        *widget);
370
static void unmark_cb                        (MainWindow        *mainwin,
371
                                         guint                 action,
372
                                         GtkWidget        *widget);
373
374
static void mark_as_unread_cb                (MainWindow        *mainwin,
375
                                         guint                 action,
376
                                         GtkWidget        *widget);
377
static void mark_as_read_cb                (MainWindow        *mainwin,
378
                                         guint                 action,
379
                                         GtkWidget        *widget);
380
static void mark_thread_as_read_cb        (MainWindow        *mainwin,
381
                                         guint                 action,
382
                                         GtkWidget        *widget);
383
static void mark_all_read_cb                (MainWindow        *mainwin,
384
                                         guint                 action,
385
                                         GtkWidget        *widget);
386
387
static void junk_cb                        (MainWindow        *mainwin,
388
                                         guint                 action,
389
                                         GtkWidget        *widget);
390
391
static void reedit_cb                        (MainWindow        *mainwin,
392
                                         guint                 action,
393
                                         GtkWidget        *widget);
394
395
static void add_address_cb                (MainWindow        *mainwin,
396
                                         guint                 action,
397
                                         GtkWidget        *widget);
398
399
static void set_charset_cb                (MainWindow        *mainwin,
400
                                         guint                 action,
401
                                         GtkWidget        *widget);
402
403
static void thread_cb                 (MainWindow        *mainwin,
404
                                  guint                 action,
405
                                  GtkWidget        *widget);
406
static void expand_threads_cb         (MainWindow        *mainwin,
407
                                  guint                 action,
408
                                  GtkWidget        *widget);
409
static void collapse_threads_cb         (MainWindow        *mainwin,
410
                                  guint                 action,
411
                                  GtkWidget        *widget);
412
413
static void set_display_item_cb         (MainWindow        *mainwin,
414
                                  guint                 action,
415
                                  GtkWidget        *widget);
416
static void sort_summary_cb         (MainWindow        *mainwin,
417
                                  guint                 action,
418
                                  GtkWidget        *widget);
419
static void sort_summary_type_cb (MainWindow        *mainwin,
420
                                  guint                 action,
421
                                  GtkWidget        *widget);
422
static void attract_by_subject_cb(MainWindow        *mainwin,
423
                                  guint                 action,
424
                                  GtkWidget        *widget);
425
426
static void delete_duplicated_cb (MainWindow        *mainwin,
427
                                  guint                 action,
428
                                  GtkWidget        *widget);
429
static void concat_partial_cb         (MainWindow        *mainwin,
430
                                  guint                 action,
431
                                  GtkWidget        *widget);
432
static void filter_cb                 (MainWindow        *mainwin,
433
                                  guint                 action,
434
                                  GtkWidget        *widget);
435
static void filter_junk_cb         (MainWindow        *mainwin,
436
                                  guint                 action,
437
                                  GtkWidget        *widget);
438
static void execute_summary_cb         (MainWindow        *mainwin,
439
                                  guint                 action,
440
                                  GtkWidget        *widget);
441
static void update_summary_cb         (MainWindow        *mainwin,
442
                                  guint                 action,
443
                                  GtkWidget        *widget);
444
445
static void prev_cb                 (MainWindow        *mainwin,
446
                                  guint                 action,
447
                                  GtkWidget        *widget);
448
static void next_cb                 (MainWindow        *mainwin,
449
                                  guint                 action,
450
                                  GtkWidget        *widget);
451
452
static void prev_unread_cb         (MainWindow        *mainwin,
453
                                  guint                 action,
454
                                  GtkWidget        *widget);
455
static void next_unread_cb         (MainWindow        *mainwin,
456
                                  guint                 action,
457
                                  GtkWidget        *widget);
458
static void prev_new_cb                 (MainWindow        *mainwin,
459
                                  guint                 action,
460
                                  GtkWidget        *widget);
461
static void next_new_cb                 (MainWindow        *mainwin,
462
                                  guint                 action,
463
                                  GtkWidget        *widget);
464
static void prev_marked_cb         (MainWindow        *mainwin,
465
                                  guint                 action,
466
                                  GtkWidget        *widget);
467
static void next_marked_cb         (MainWindow        *mainwin,
468
                                  guint                 action,
469
                                  GtkWidget        *widget);
470
static void prev_labeled_cb         (MainWindow        *mainwin,
471
                                  guint                 action,
472
                                  GtkWidget        *widget);
473
static void next_labeled_cb         (MainWindow        *mainwin,
474
                                  guint                 action,
475
                                  GtkWidget        *widget);
476
477
static void goto_folder_cb         (MainWindow        *mainwin,
478
                                  guint                 action,
479
                                  GtkWidget        *widget);
480
481
static void copy_cb                 (MainWindow        *mainwin,
482
                                  guint                 action,
483
                                  GtkWidget        *widget);
484
static void allsel_cb                 (MainWindow        *mainwin,
485
                                  guint                 action,
486
                                  GtkWidget        *widget);
487
static void select_thread_cb         (MainWindow        *mainwin,
488
                                  guint                 action,
489
                                  GtkWidget        *widget);
490
491
static void create_filter_cb         (MainWindow        *mainwin,
492
                                  guint                 action,
493
                                  GtkWidget        *widget);
494
495
static void prefs_common_open_cb        (MainWindow        *mainwin,
496
                                         guint                 action,
497
                                         GtkWidget        *widget);
498
static void prefs_filter_open_cb        (MainWindow        *mainwin,
499
                                         guint                 action,
500
                                         GtkWidget        *widget);
501
static void prefs_template_open_cb        (MainWindow        *mainwin,
502
                                         guint                 action,
503
                                         GtkWidget        *widget);
504
static void plugin_manager_open_cb        (MainWindow        *mainwin,
505
                                         guint                 action,
506
                                         GtkWidget        *widget);
507
#ifndef G_OS_WIN32
508
static void prefs_actions_open_cb        (MainWindow        *mainwin,
509
                                         guint                 action,
510
                                         GtkWidget        *widget);
511
#endif
512
static void prefs_account_open_cb        (MainWindow        *mainwin,
513
                                         guint                 action,
514
                                         GtkWidget        *widget);
515
516
static void new_account_cb         (MainWindow        *mainwin,
517
                                  guint                 action,
518
                                  GtkWidget        *widget);
519
520
static void account_selector_menu_cb         (GtkMenuItem        *menuitem,
521
                                          gpointer         data);
522
static void account_receive_menu_cb         (GtkMenuItem        *menuitem,
523
                                          gpointer         data);
524
525
static void manual_open_cb         (MainWindow        *mainwin,
526
                                  guint                 action,
527
                                  GtkWidget        *widget);
528
static void faq_open_cb                 (MainWindow        *mainwin,
529
                                  guint                 action,
530
                                  GtkWidget        *widget);
531
static void help_cmdline_cb         (MainWindow        *mainwin,
532
                                  guint                 action,
533
                                  GtkWidget        *widget);
534
#if USE_UPDATE_CHECK
535
static void update_check_cb         (MainWindow        *mainwin,
536
                                  guint                 action,
537
                                  GtkWidget        *widget);
538
#ifdef USE_UPDATE_CHECK_PLUGIN
539
static void update_check_plugin_cb(MainWindow *mainwin, guint action,
540
                                   GtkWidget *widget);
541
#endif
542
#endif
543
544
static void scan_tree_func         (Folder        *folder,
545
                                  FolderItem        *item,
546
                                  gpointer         data);
547
548
static GtkItemFactoryEntry mainwin_entries[] =
549
{
550
        {N_("/_File"),                                NULL, NULL, 0, "<Branch>"},
551
        {N_("/_File/_Folder"),                        NULL, NULL, 0, "<Branch>"},
552
        {N_("/_File/_Folder/Create _new folder..."),
553
                                                NULL, new_folder_cb, 0, NULL},
554
        {N_("/_File/_Folder/_Rename folder..."),NULL, rename_folder_cb, 0, NULL},
555
        {N_("/_File/_Folder/_Move folder..."),  NULL, move_folder_cb, 0, NULL},
556
        {N_("/_File/_Folder/_Delete folder"),        NULL, delete_folder_cb, 0, NULL},
557
        {N_("/_File/_Mailbox"),                        NULL, NULL, 0, "<Branch>"},
558
        {N_("/_File/_Mailbox/Add _mailbox..."),        NULL, add_mailbox_cb, 0, NULL},
559
        {N_("/_File/_Mailbox/_Remove mailbox"),        NULL, remove_mailbox_cb, 0, NULL},
560
        {N_("/_File/_Mailbox/---"),                NULL, NULL, 0, "<Separator>"},
561
        {N_("/_File/_Mailbox/_Check for new messages"),
562
                                                NULL, update_folderview_cb, 0, NULL},
563
        {N_("/_File/_Mailbox/Check for new messages in _all mailboxes"),
564
                                                NULL, update_folderview_cb, 1, NULL},
565
        {N_("/_File/_Mailbox/---"),                NULL, NULL, 0, "<Separator>"},
566
        {N_("/_File/_Mailbox/R_ebuild folder tree"),
567
                                                NULL, rebuild_tree_cb, 0, NULL},
568
        {N_("/_File/---"),                        NULL, NULL, 0, "<Separator>"},
569
        {N_("/_File/_Import mail data..."),        NULL, import_mail_cb, 0, NULL},
570
        {N_("/_File/_Export mail data..."),        NULL, export_mail_cb, 0, NULL},
571
        {N_("/_File/---"),                        NULL, NULL, 0, "<Separator>"},
572
        {N_("/_File/Empty all _trash"),                NULL, empty_trash_cb, 0, NULL},
573
        {N_("/_File/---"),                        NULL, NULL, 0, "<Separator>"},
574
        {N_("/_File/_Save as..."),                "<control>S", save_as_cb, 0, NULL},
575
        {N_("/_File/---"),                        NULL, NULL, 0, "<Separator>"},
576
#if GTK_CHECK_VERSION(2, 10, 0)
577
        {N_("/_File/Page set_up..."),                NULL, page_setup_cb, 0, NULL},
578
#endif
579
        {N_("/_File/_Print..."),                NULL, print_cb, 0, NULL},
580
        {N_("/_File/---"),                        NULL, NULL, 0, "<Separator>"},
581
        {N_("/_File/_Work offline"),                NULL, toggle_offline_cb, 0, "<ToggleItem>"},
582
        {N_("/_File/---"),                        NULL, NULL, 0, "<Separator>"},
583
        /* {N_("/_File/_Close"),                "<alt>W", app_exit_cb, 0, NULL}, */
584
        {N_("/_File/E_xit"),                        "<control>Q", app_exit_cb, 0, NULL},
585
586
        {N_("/_Edit"),                                NULL, NULL, 0, "<Branch>"},
587
        {N_("/_Edit/_Copy"),                        "<control>C", copy_cb, 0, NULL},
588
        {N_("/_Edit/Select _all"),                "<control>A", allsel_cb, 0, NULL},
589
        {N_("/_Edit/Select _thread"),                NULL, select_thread_cb, 0, NULL},
590
        {N_("/_Edit/---"),                        NULL, NULL, 0, "<Separator>"},
591
        {N_("/_Edit/_Find in current message..."),
592
                                                "<control>F", search_cb, 0, NULL},
593
        {N_("/_Edit/_Search messages..."),        "<shift><control>F", search_cb, 1, NULL},
594
        {N_("/_Edit/_Quick search"),                "<shift><control>S", search_cb, 2, NULL},
595
596
        {N_("/_View"),                                NULL, NULL, 0, "<Branch>"},
597
        {N_("/_View/Show or hi_de"),                NULL, NULL, 0, "<Branch>"},
598
        {N_("/_View/Show or hi_de/_Folder tree"),
599
                                                NULL, toggle_folder_cb, 0, "<ToggleItem>"},
600
        {N_("/_View/Show or hi_de/_Message view"),
601
                                                "V", toggle_message_cb, 0, "<ToggleItem>"},
602
        {N_("/_View/Show or hi_de/_Toolbar"),
603
                                                NULL, NULL, 0, "<Branch>"},
604
        {N_("/_View/Show or hi_de/_Toolbar/Icon _and text"),
605
                                                NULL, toggle_toolbar_cb, TOOLBAR_BOTH, "<RadioItem>"},
606
        {N_("/_View/Show or hi_de/_Toolbar/Text at the _right of icon"),
607
                                                NULL, toggle_toolbar_cb, TOOLBAR_BOTH_HORIZ, "/View/Show or hide/Toolbar/Icon and text"},
608
        {N_("/_View/Show or hi_de/_Toolbar/_Icon"),
609
                                                NULL, toggle_toolbar_cb, TOOLBAR_ICON, "/View/Show or hide/Toolbar/Icon and text"},
610
        {N_("/_View/Show or hi_de/_Toolbar/_Text"),
611
                                                NULL, toggle_toolbar_cb, TOOLBAR_TEXT, "/View/Show or hide/Toolbar/Icon and text"},
612
        {N_("/_View/Show or hi_de/_Toolbar/_None"),
613
                                                NULL, toggle_toolbar_cb, TOOLBAR_NONE, "/View/Show or hide/Toolbar/Icon and text"},
614
        {N_("/_View/Show or hi_de/_Search bar"),
615
                                                NULL, toggle_searchbar_cb, 0, "<ToggleItem>"},
616
        {N_("/_View/Show or hi_de/Status _bar"),
617
                                                NULL, toggle_statusbar_cb, 0, "<ToggleItem>"},
618
        {N_("/_View/_Customize toolbar..."),        NULL, toolbar_customize_cb, 0, NULL},
619
        {N_("/_View/---"),                        NULL, NULL, 0, "<Separator>"},
620
        {N_("/_View/Layou_t"),                        NULL, NULL, 0, "<Branch>"},
621
        {N_("/_View/Layou_t/_Normal"),                NULL, change_layout_cb, LAYOUT_NORMAL, "<RadioItem>"},
622
        {N_("/_View/Layou_t/_Vertical"),        NULL, change_layout_cb, LAYOUT_VERTICAL, "/View/Layout/Normal"},
623
        {N_("/_View/Separate f_older tree"),        NULL, separate_widget_cb, SEPARATE_FOLDER, "<ToggleItem>"},
624
        {N_("/_View/Separate _message view"),        NULL, separate_widget_cb, SEPARATE_MESSAGE, "<ToggleItem>"},
625
        {N_("/_View/---"),                        NULL, NULL, 0, "<Separator>"},
626
        {N_("/_View/_Sort"),                        NULL, NULL, 0, "<Branch>"},
627
        {N_("/_View/_Sort/by _number"),                NULL, sort_summary_cb, SORT_BY_NUMBER, "<RadioItem>"},
628
        {N_("/_View/_Sort/by s_ize"),                NULL, sort_summary_cb, SORT_BY_SIZE, "/View/Sort/by number"},
629
        {N_("/_View/_Sort/by _date"),                NULL, sort_summary_cb, SORT_BY_DATE, "/View/Sort/by number"},
630
        {N_("/_View/_Sort/by t_hread date"),        NULL, sort_summary_cb, SORT_BY_TDATE, "/View/Sort/by number"},
631
        {N_("/_View/_Sort/by _from"),                NULL, sort_summary_cb, SORT_BY_FROM, "/View/Sort/by number"},
632
        {N_("/_View/_Sort/by _recipient"),        NULL, sort_summary_cb, SORT_BY_TO, "/View/Sort/by number"},
633
        {N_("/_View/_Sort/by _subject"),        NULL, sort_summary_cb, SORT_BY_SUBJECT, "/View/Sort/by number"},
634
        {N_("/_View/_Sort/by _color label"),
635
                                                NULL, sort_summary_cb, SORT_BY_LABEL, "/View/Sort/by number"},
636
        {N_("/_View/_Sort/by _mark"),                NULL, sort_summary_cb, SORT_BY_MARK, "/View/Sort/by number"},
637
        {N_("/_View/_Sort/by _unread"),                NULL, sort_summary_cb, SORT_BY_UNREAD, "/View/Sort/by number"},
638
        {N_("/_View/_Sort/by a_ttachment"),
639
                                                NULL, sort_summary_cb, SORT_BY_MIME, "/View/Sort/by number"},
640
        {N_("/_View/_Sort/D_on't sort"),        NULL, sort_summary_cb, SORT_BY_NONE, "/View/Sort/by number"},
641
        {N_("/_View/_Sort/---"),                NULL, NULL, 0, "<Separator>"},
642
        {N_("/_View/_Sort/Ascending"),                NULL, sort_summary_type_cb, SORT_ASCENDING, "<RadioItem>"},
643
        {N_("/_View/_Sort/Descending"),                NULL, sort_summary_type_cb, SORT_DESCENDING, "/View/Sort/Ascending"},
644
        {N_("/_View/_Sort/---"),                NULL, NULL, 0, "<Separator>"},
645
        {N_("/_View/_Sort/_Attract by subject"),
646
                                                NULL, attract_by_subject_cb, 0, NULL},
647
        {N_("/_View/Th_read view"),                "<control>T", thread_cb, 0, "<ToggleItem>"},
648
        {N_("/_View/E_xpand all threads"),        NULL, expand_threads_cb, 0, NULL},
649
        {N_("/_View/Co_llapse all threads"),        NULL, collapse_threads_cb, 0, NULL},
650
        {N_("/_View/Set display _item..."),        NULL, set_display_item_cb, 0, NULL},
651
652
        {N_("/_View/---"),                        NULL, NULL, 0, "<Separator>"},
653
        {N_("/_View/_Go to"),                        NULL, NULL, 0, "<Branch>"},
654
        {N_("/_View/_Go to/_Prev message"),        "P", prev_cb, 0, NULL},
655
        {N_("/_View/_Go to/_Next message"),        "N", next_cb, 0, NULL},
656
        {N_("/_View/_Go to/---"),                NULL, NULL, 0, "<Separator>"},
657
        {N_("/_View/_Go to/P_rev unread message"),
658
                                                "<shift>P", prev_unread_cb, 0, NULL},
659
        {N_("/_View/_Go to/N_ext unread message"),
660
                                                "<shift>N", next_unread_cb, 0, NULL},
661
        {N_("/_View/_Go to/---"),                NULL, NULL, 0, "<Separator>"},
662
        {N_("/_View/_Go to/Prev ne_w message"),        NULL, prev_new_cb, 0, NULL},
663
        {N_("/_View/_Go to/Ne_xt new message"),        NULL, next_new_cb, 0, NULL},
664
        {N_("/_View/_Go to/---"),                NULL, NULL, 0, "<Separator>"},
665
        {N_("/_View/_Go to/Prev _marked message"),
666
                                                NULL, prev_marked_cb, 0, NULL},
667
        {N_("/_View/_Go to/Next m_arked message"),
668
                                                NULL, next_marked_cb, 0, NULL},
669
        {N_("/_View/_Go to/---"),                NULL, NULL, 0, "<Separator>"},
670
        {N_("/_View/_Go to/Prev _labeled message"),
671
                                                NULL, prev_labeled_cb, 0, NULL},
672
        {N_("/_View/_Go to/Next la_beled message"),
673
                                                NULL, next_labeled_cb, 0, NULL},
674
        {N_("/_View/_Go to/---"),                NULL, NULL, 0, "<Separator>"},
675
        {N_("/_View/_Go to/Other _folder..."),        "G", goto_folder_cb, 0, NULL},
676
        {N_("/_View/---"),                        NULL, NULL, 0, "<Separator>"},
677
678
#define ENC_SEPARATOR \
679
        {N_("/_View/Character _encoding/---"),                NULL, NULL, 0, "<Separator>"}
680
#define ENC_ACTION(action) \
681
         NULL, set_charset_cb, action, "/View/Character encoding/Auto detect"
682
683
        {N_("/_View/Character _encoding"),                NULL, NULL, 0, "<Branch>"},
684
        {N_("/_View/Character _encoding/_Auto detect"),
685
         NULL, set_charset_cb, C_AUTO, "<RadioItem>"},
686
        {N_("/_View/Character _encoding/---"),                NULL, NULL, 0, "<Separator>"},
687
        {N_("/_View/Character _encoding/7bit ascii (US-ASC_II)"),
688
         ENC_ACTION(C_US_ASCII)},
689
        {N_("/_View/Character _encoding/Unicode (_UTF-8)"),
690
         ENC_ACTION(C_UTF_8)},
691
        ENC_SEPARATOR,
692
693
        {N_("/_View/Character _encoding/Western European (ISO-8859-_1)"),
694
         ENC_ACTION(C_ISO_8859_1)},
695
        {N_("/_View/Character _encoding/Western European (ISO-8859-15)"),
696
         ENC_ACTION(C_ISO_8859_15)},
697
        {N_("/_View/Character _encoding/Western European (Windows-1252)"),
698
         ENC_ACTION(C_WINDOWS_1252)},
699
        ENC_SEPARATOR,
700
701
        {N_("/_View/Character _encoding/Central European (ISO-8859-_2)"),
702
         ENC_ACTION(C_ISO_8859_2)},
703
        ENC_SEPARATOR,
704
705
        {N_("/_View/Character _encoding/_Baltic (ISO-8859-13)"),
706
         ENC_ACTION(C_ISO_8859_13)},
707
        {N_("/_View/Character _encoding/Baltic (ISO-8859-_4)"),
708
         ENC_ACTION(C_ISO_8859_4)},
709
        {N_("/_View/Character _encoding/Baltic (Windows-1257)"),
710
         ENC_ACTION(C_WINDOWS_1257)},
711
        ENC_SEPARATOR,
712
713
        {N_("/_View/Character _encoding/Greek (ISO-8859-_7)"),
714
         ENC_ACTION(C_ISO_8859_7)},
715
        ENC_SEPARATOR,
716
717
        {N_("/_View/Character _encoding/Arabic (ISO-8859-_6)"),
718
         ENC_ACTION(C_ISO_8859_6)},
719
        {N_("/_View/Character _encoding/Arabic (Windows-1256)"),
720
         ENC_ACTION(C_CP1256)},
721
        ENC_SEPARATOR,
722
723
        {N_("/_View/Character _encoding/Hebrew (ISO-8859-_8)"),
724
         ENC_ACTION(C_ISO_8859_8)},
725
        {N_("/_View/Character _encoding/Hebrew (Windows-1255)"),
726
         ENC_ACTION(C_CP1255)},
727
        ENC_SEPARATOR,
728
729
        {N_("/_View/Character _encoding/Turkish (ISO-8859-_9)"),
730
         ENC_ACTION(C_ISO_8859_9)},
731
        ENC_SEPARATOR,
732
733
        {N_("/_View/Character _encoding/Cyrillic (ISO-8859-_5)"),
734
         ENC_ACTION(C_ISO_8859_5)},
735
        {N_("/_View/Character _encoding/Cyrillic (KOI8-_R)"),
736
         ENC_ACTION(C_KOI8_R)},
737
        {N_("/_View/Character _encoding/Cyrillic (KOI8-U)"),
738
         ENC_ACTION(C_KOI8_U)},
739
        {N_("/_View/Character _encoding/Cyrillic (Windows-1251)"),
740
         ENC_ACTION(C_CP1251)},
741
        ENC_SEPARATOR,
742
743
        {N_("/_View/Character _encoding/Japanese (ISO-2022-_JP)"),
744
         ENC_ACTION(C_ISO_2022_JP)},
745
        {N_("/_View/Character _encoding/Japanese (ISO-2022-JP-2)"),
746
         ENC_ACTION(C_ISO_2022_JP_2)},
747
        {N_("/_View/Character _encoding/Japanese (_EUC-JP)"),
748
         ENC_ACTION(C_EUC_JP)},
749
        {N_("/_View/Character _encoding/Japanese (_Shift__JIS)"),
750
         ENC_ACTION(C_SHIFT_JIS)},
751
        ENC_SEPARATOR,
752
753
        {N_("/_View/Character _encoding/Simplified Chinese (_GB2312)"),
754
         ENC_ACTION(C_GB2312)},
755
        {N_("/_View/Character _encoding/Simplified Chinese (GBK)"),
756
         ENC_ACTION(C_GBK)},
757
        {N_("/_View/Character _encoding/Traditional Chinese (_Big5)"),
758
         ENC_ACTION(C_BIG5)},
759
        {N_("/_View/Character _encoding/Traditional Chinese (EUC-_TW)"),
760
         ENC_ACTION(C_EUC_TW)},
761
        {N_("/_View/Character _encoding/Chinese (ISO-2022-_CN)"),
762
         ENC_ACTION(C_ISO_2022_CN)},
763
        ENC_SEPARATOR,
764
765
        {N_("/_View/Character _encoding/Korean (EUC-_KR)"),
766
         ENC_ACTION(C_EUC_KR)},
767
        {N_("/_View/Character _encoding/Korean (ISO-2022-KR)"),
768
         ENC_ACTION(C_ISO_2022_KR)},
769
        ENC_SEPARATOR,
770
771
        {N_("/_View/Character _encoding/Thai (TIS-620)"),
772
         ENC_ACTION(C_TIS_620)},
773
        {N_("/_View/Character _encoding/Thai (Windows-874)"),
774
         ENC_ACTION(C_WINDOWS_874)},
775
776
#undef CODESET_SEPARATOR
777
#undef CODESET_ACTION
778
779
        {N_("/_View/---"),                        NULL, NULL, 0, "<Separator>"},
780
        {N_("/_View/Open in new _window"),        "<control><alt>N", open_msg_cb, 0, NULL},
781
        {N_("/_View/Mess_age source"),                "<control>U", view_source_cb, 0, NULL},
782
        {N_("/_View/All _headers"),        "<control>H", show_all_header_cb, 0, "<ToggleItem>"},
783
        {N_("/_View/---"),                        NULL, NULL, 0, "<Separator>"},
784
        {N_("/_View/_Update summary"),                "<control><alt>U", update_summary_cb,  0, NULL},
785
786
        {N_("/_Message"),                        NULL, NULL, 0, "<Branch>"},
787
        {N_("/_Message/Recei_ve"),                NULL, NULL, 0, "<Branch>"},
788
        {N_("/_Message/Recei_ve/Get from _current account"),
789
                                                "<control>I",        inc_mail_cb, 0, NULL},
790
        {N_("/_Message/Recei_ve/Get from _all accounts"),
791
                                                "<shift><control>I", inc_all_account_mail_cb, 0, NULL},
792
        {N_("/_Message/Recei_ve/Stop receivin_g"),
793
                                                NULL, inc_stop_cb, 0, NULL},
794
        {N_("/_Message/Recei_ve/_Remote mailbox..."),
795
                                                NULL, rpop3_cb, 0, NULL},
796
        {N_("/_Message/Recei_ve/---"),                NULL, NULL, 0, "<Separator>"},
797
        {N_("/_Message/_Send queued messages"), NULL, send_queue_cb, 0, NULL},
798
        {N_("/_Message/---"),                        NULL, NULL, 0, "<Separator>"},
799
        {N_("/_Message/Compose _new message"),        "<control>M",        compose_cb, 0, NULL},
800
        {N_("/_Message/---"),                        NULL, NULL, 0, "<Separator>"},
801
        {N_("/_Message/_Reply"),                "<control>R",         reply_cb, COMPOSE_REPLY, NULL},
802
        {N_("/_Message/Repl_y to"),                NULL, NULL, 0, "<Branch>"},
803
        {N_("/_Message/Repl_y to/_all"),        "<shift><control>R", reply_cb, COMPOSE_REPLY_TO_ALL, NULL},
804
        {N_("/_Message/Repl_y to/_sender"),        NULL, reply_cb, COMPOSE_REPLY_TO_SENDER, NULL},
805
        {N_("/_Message/Repl_y to/mailing _list"),
806
                                                "<control>L", reply_cb, COMPOSE_REPLY_TO_LIST, NULL},
807
        {N_("/_Message/---"),                        NULL, NULL, 0, "<Separator>"},
808
        {N_("/_Message/_Forward"),                "<control><alt>F", reply_cb, COMPOSE_FORWARD, NULL},
809
        {N_("/_Message/For_ward as attachment"),
810
                                                "<shift><control><alt>F", reply_cb, COMPOSE_FORWARD_AS_ATTACH, NULL},
811
        {N_("/_Message/Redirec_t"),                NULL, reply_cb, COMPOSE_REDIRECT, NULL},
812
        {N_("/_Message/---"),                        NULL, NULL, 0, "<Separator>"},
813
        {N_("/_Message/M_ove..."),                "<control>O", move_to_cb, 0, NULL},
814
        {N_("/_Message/_Copy..."),                "<shift><control>O", copy_to_cb, 0, NULL},
815
        {N_("/_Message/---"),                        NULL, NULL, 0, "<Separator>"},
816
        {N_("/_Message/_Mark"),                        NULL, NULL, 0, "<Branch>"},
817
        {N_("/_Message/_Mark/Set _flag"),        "<shift>asterisk", mark_cb, 0, NULL},
818
        {N_("/_Message/_Mark/_Unset flag"),        "U", unmark_cb, 0, NULL},
819
        {N_("/_Message/_Mark/---"),                NULL, NULL, 0, "<Separator>"},
820
        {N_("/_Message/_Mark/Mark as unr_ead"),        "<shift>exclam", mark_as_unread_cb, 0, NULL},
821
        {N_("/_Message/_Mark/Mark as rea_d"),
822
                                                NULL, mark_as_read_cb, 0, NULL},
823
        {N_("/_Message/_Mark/Mark _thread as read"),
824
                                                NULL, mark_thread_as_read_cb, 0, NULL},
825
        {N_("/_Message/_Mark/Mark all _read"),        NULL, mark_all_read_cb, 0, NULL},
826
        {N_("/_Message/---"),                        NULL, NULL, 0, "<Separator>"},
827
        {N_("/_Message/_Delete"),                "<control>D", delete_cb, 0, NULL},
828
        {N_("/_Message/---"),                        NULL, NULL, 0, "<Separator>"},
829
        {N_("/_Message/Set as _junk mail"),        "<control>J", junk_cb, 0, NULL},
830
        {N_("/_Message/Set as not j_unk mail"),        "<shift><control>J", junk_cb, 1, NULL},
831
        {N_("/_Message/---"),                        NULL, NULL, 0, "<Separator>"},
832
        {N_("/_Message/Re-_edit"),                NULL, reedit_cb, 0, NULL},
833
834
        {N_("/_Tools"),                                NULL, NULL, 0, "<Branch>"},
835
        {N_("/_Tools/_Address book"),                "<shift><control>A", addressbook_open_cb, 0, NULL},
836
        {N_("/_Tools/Add sender to address boo_k..."),
837
                                                NULL, add_address_cb, 0, NULL},
838
        {N_("/_Tools/---"),                        NULL, NULL, 0, "<Separator>"},
839
        {N_("/_Tools/_Filter all messages in folder"),
840
                                                NULL, filter_cb, 0, NULL},
841
        {N_("/_Tools/Filter _selected messages"),
842
                                                NULL, filter_cb, 1, NULL},
843
        {N_("/_Tools/_Create filter rule"),        NULL, NULL, 0, "<Branch>"},
844
        {N_("/_Tools/_Create filter rule/_Automatically"),
845
                                                NULL, create_filter_cb, FLT_BY_AUTO, NULL},
846
        {N_("/_Tools/_Create filter rule/by _From"),
847
                                                NULL, create_filter_cb, FLT_BY_FROM, NULL},
848
        {N_("/_Tools/_Create filter rule/by _To"),
849
                                                NULL, create_filter_cb, FLT_BY_TO, NULL},
850
        {N_("/_Tools/_Create filter rule/by _Subject"),
851
                                                NULL, create_filter_cb, FLT_BY_SUBJECT, NULL},
852
        {N_("/_Tools/---"),                        NULL, NULL, 0, "<Separator>"},
853
        {N_("/_Tools/Filter _junk mails in folder"),
854
                                                NULL, filter_junk_cb, 0, NULL},
855
        {N_("/_Tools/Filter junk _mails in selected messages"),
856
                                                NULL, filter_junk_cb, 1, NULL},
857
        {N_("/_Tools/---"),                        NULL, NULL, 0, "<Separator>"},
858
#ifndef G_OS_WIN32
859
        {N_("/_Tools/Actio_ns"),                NULL, NULL, 0, "<Branch>"},
860
        {N_("/_Tools/---"),                        NULL, NULL, 0, "<Separator>"},
861
#endif
862
        {N_("/_Tools/Delete du_plicated messages"),
863
                                                NULL, delete_duplicated_cb,   0, NULL},
864
        {N_("/_Tools/C_oncatenate separated messages"),
865
                                                NULL, concat_partial_cb, 0, NULL},
866
        {N_("/_Tools/---"),                        NULL, NULL, 0, "<Separator>"},
867
        {N_("/_Tools/E_xecute marked process"),        "X", execute_summary_cb, 0, NULL},
868
        {N_("/_Tools/---"),                        NULL, NULL, 0, "<Separator>"},
869
        {N_("/_Tools/_Log window"),                "<shift><control>L", log_window_show_cb, 0, NULL},
870
871
        {N_("/_Configuration"),                        NULL, NULL, 0, "<Branch>"},
872
        {N_("/_Configuration/_Common preferences..."),
873
                                                NULL, prefs_common_open_cb, 0, NULL},
874
        {N_("/_Configuration/_Filter settings..."),
875
                                                NULL, prefs_filter_open_cb, 0, NULL},
876
        {N_("/_Configuration/_Template..."),        NULL, prefs_template_open_cb, 0, NULL},
877
#ifndef G_OS_WIN32
878
        {N_("/_Configuration/_Actions..."),        NULL, prefs_actions_open_cb, 0, NULL},
879
#endif
880
        {N_("/_Configuration/Plug-in _manager..."),
881
                                                NULL, plugin_manager_open_cb, 0, NULL},
882
        {N_("/_Configuration/---"),                NULL, NULL, 0, "<Separator>"},
883
        {N_("/_Configuration/_Preferences for current account..."),
884
                                                NULL, prefs_account_open_cb, 0, NULL},
885
        {N_("/_Configuration/Create _new account..."),
886
                                                NULL, new_account_cb, 0, NULL},
887
        {N_("/_Configuration/_Edit accounts..."),
888
                                                NULL, account_edit_open, 0, NULL},
889
        {N_("/_Configuration/C_hange current account"),
890
                                                NULL, NULL, 0, "<Branch>"},
891
892
        {N_("/_Help"),                                NULL, NULL, 0, "<Branch>"},
893
        {N_("/_Help/_Manual"),                        NULL, NULL, 0, "<Branch>"},
894
        {N_("/_Help/_Manual/_English"),                NULL, manual_open_cb, MANUAL_LANG_EN, NULL},
895
        {N_("/_Help/_Manual/_Japanese"),        NULL, manual_open_cb, MANUAL_LANG_JA, NULL},
896
        {N_("/_Help/_FAQ"),                        NULL, NULL, 0, "<Branch>"},
897
        {N_("/_Help/_FAQ/_English"),                NULL, faq_open_cb, MANUAL_LANG_EN, NULL},
898
        {N_("/_Help/_FAQ/_German"),                NULL, faq_open_cb, MANUAL_LANG_DE, NULL},
899
        {N_("/_Help/_FAQ/_Spanish"),                NULL, faq_open_cb, MANUAL_LANG_ES, NULL},
900
        {N_("/_Help/_FAQ/_French"),                NULL, faq_open_cb, MANUAL_LANG_FR, NULL},
901
        {N_("/_Help/_FAQ/_Italian"),                NULL, faq_open_cb, MANUAL_LANG_IT, NULL},
902
        {N_("/_Help/_Command line options"),        NULL, help_cmdline_cb, 0, NULL},
903
#if USE_UPDATE_CHECK
904
        {N_("/_Help/---"),                        NULL, NULL, 0, "<Separator>"},
905
        {N_("/_Help/_Update check..."),                NULL, update_check_cb, 0, NULL},
906
#ifdef USE_UPDATE_CHECK_PLUGIN
907
        {N_("/_Help/Update check of _plug-ins..."),
908
                                                NULL, update_check_plugin_cb, 0, NULL},
909
#endif
910
#endif
911
        {N_("/_Help/---"),                        NULL, NULL, 0, "<Separator>"},
912
        {N_("/_Help/_About"),                        NULL, about_show, 0, NULL}
913
};
914
915
MainWindow *main_window_create(SeparateType type)
916
{
917
        MainWindow *mainwin;
918
        GtkWidget *window;
919
        GtkWidget *vbox;
920
        GtkWidget *menubar;
921
        GtkWidget *toolbar;
922
        GtkWidget *hbox_spc;
923
        GtkWidget *vbox_body;
924
        GtkWidget *statusbar;
925
        GtkWidget *progressbar;
926
        GtkWidget *statuslabel;
927
        GtkWidget *online_hbox;
928
        GtkWidget *online_switch;
929
        GtkWidget *online_pixmap;
930
        GtkWidget *offline_pixmap;
931
        GtkTooltips *online_tip;
932
#if !GTK_CHECK_VERSION(2, 6, 0)
933
        GtkWidget *spacer_hbox;
934
#endif
935
        GtkWidget *ac_button;
936
        GtkWidget *ac_label;
937
938
        TrayIcon *tray_icon;
939
940
        FolderView *folderview;
941
        SummaryView *summaryview;
942
        MessageView *messageview;
943
        GdkColormap *colormap;
944
        GdkColor color[3];
945
        gboolean success[3];
946
        guint n_menu_entries;
947
        GtkItemFactory *ifactory;
948
        GtkWidget *ac_menu;
949
        GtkWidget *menuitem;
950
        gint i;
951
952
        static GdkGeometry geometry;
953
954
        debug_print(_("Creating main window...\n"));
955
        mainwin = g_new0(MainWindow, 1);
956
957
        /* main window */
958
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
959
        gtk_window_set_title(GTK_WINDOW(window), PROG_VERSION);
960
        gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
961
        gtk_window_set_wmclass(GTK_WINDOW(window), "main_window", "Sylpheed");
962
        gtk_widget_add_events(window, GDK_VISIBILITY_NOTIFY_MASK);
963
        g_signal_connect(G_OBJECT(window), "key_press_event",
964
                         G_CALLBACK(main_window_key_pressed), mainwin);
965
966
        if (!geometry.min_height) {
967
                geometry.min_width = 320;
968
                geometry.min_height = 200;
969
        }
970
        gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry,
971
                                      GDK_HINT_MIN_SIZE);
972
973
        g_signal_connect(G_OBJECT(window), "delete_event",
974
                         G_CALLBACK(main_window_close_cb), mainwin);
975
        MANAGE_WINDOW_SIGNALS_CONNECT(window);
976
        gtk_widget_realize(window);
977
978
        vbox = gtk_vbox_new(FALSE, 0);
979
        gtk_widget_show(vbox);
980
        gtk_container_add(GTK_CONTAINER(window), vbox);
981
982
        /* menu bar */
983
        n_menu_entries = sizeof(mainwin_entries) / sizeof(mainwin_entries[0]);
984
        menubar = menubar_create(window, mainwin_entries, 
985
                                 n_menu_entries, "<Main>", mainwin);
986
        gtk_widget_show(menubar);
987
        gtk_widget_set_size_request(menubar, 300, -1);
988
        gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
989
        ifactory = gtk_item_factory_from_widget(menubar);
990
991
        toolbar = main_window_toolbar_create(mainwin);
992
        gtk_widget_set_size_request(toolbar, 300, -1);
993
        gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
994
995
        hbox_spc = gtk_hbox_new(FALSE, 0);
996
        gtk_widget_show(hbox_spc);
997
        gtk_widget_set_size_request(hbox_spc, -1, BORDER_WIDTH);
998
        gtk_box_pack_start(GTK_BOX(vbox), hbox_spc, FALSE, FALSE, 0);
999
1000
        /* vbox that contains body */
1001
        vbox_body = gtk_vbox_new(FALSE, BORDER_WIDTH);
1002
        gtk_widget_show(vbox_body);
1003
        gtk_container_set_border_width(GTK_CONTAINER(vbox_body), 0);
1004
        gtk_box_pack_start(GTK_BOX(vbox), vbox_body, TRUE, TRUE, 0);
1005
1006
        statusbar = statusbar_create();
1007
        gtk_box_pack_end(GTK_BOX(vbox_body), statusbar, FALSE, FALSE, 0);
1008
1009
        progressbar = gtk_progress_bar_new();
1010
        gtk_widget_set_size_request(progressbar, 120, 1);
1011
        gtk_box_pack_start(GTK_BOX(statusbar), progressbar, FALSE, FALSE, 0);
1012
1013
        statuslabel = gtk_label_new("");
1014
        gtk_box_pack_start(GTK_BOX(statusbar), statuslabel, FALSE, FALSE, 0);
1015
1016
        online_hbox = gtk_hbox_new(FALSE, 0);
1017
1018
        online_pixmap = stock_pixbuf_widget(statusbar, STOCK_PIXMAP_ONLINE);
1019
        offline_pixmap = stock_pixbuf_widget(statusbar, STOCK_PIXMAP_OFFLINE);
1020
        gtk_box_pack_start(GTK_BOX(online_hbox), online_pixmap,
1021
                           FALSE, FALSE, 0);
1022
        gtk_box_pack_start(GTK_BOX(online_hbox), offline_pixmap,
1023
                           FALSE, FALSE, 0);
1024
1025
        online_switch = gtk_button_new();
1026
        gtk_button_set_relief(GTK_BUTTON(online_switch), GTK_RELIEF_NONE);
1027
        GTK_WIDGET_UNSET_FLAGS(online_switch, GTK_CAN_FOCUS);
1028
#ifdef G_OS_WIN32
1029
        gtk_widget_set_size_request(online_switch, 34, 20);
1030
#else
1031
        gtk_widget_set_size_request(online_switch, 34, 24);
1032
#endif
1033
        gtk_container_add(GTK_CONTAINER(online_switch), online_hbox);
1034
        g_signal_connect(G_OBJECT(online_switch), "clicked",
1035
                         G_CALLBACK(online_switch_clicked), mainwin);
1036
        gtk_box_pack_start(GTK_BOX(statusbar), online_switch, FALSE, FALSE, 0);
1037
1038
        online_tip = gtk_tooltips_new();
1039
1040
#if !GTK_CHECK_VERSION(2, 6, 0)
1041
        spacer_hbox = gtk_hbox_new(FALSE, 0);
1042
        gtk_box_pack_end(GTK_BOX(statusbar), spacer_hbox, FALSE, FALSE, 0);
1043
#endif
1044
1045
        ac_button = gtk_button_new();
1046
        gtk_button_set_relief(GTK_BUTTON(ac_button), GTK_RELIEF_NONE);
1047
        GTK_WIDGET_UNSET_FLAGS(ac_button, GTK_CAN_FOCUS);
1048
        gtk_widget_set_size_request(ac_button, -1, 1);
1049
        gtk_box_pack_end(GTK_BOX(statusbar), ac_button, FALSE, FALSE, 0);
1050
        g_signal_connect(G_OBJECT(ac_button), "button_press_event",
1051
                         G_CALLBACK(ac_label_button_pressed), mainwin);
1052
1053
        ac_label = gtk_label_new("");
1054
        gtk_container_add(GTK_CONTAINER(ac_button), ac_label);
1055
1056
        gtk_widget_show_all(statusbar);
1057
1058
        tray_icon = trayicon_create(mainwin);
1059
        if (tray_icon && prefs_common.show_trayicon)
1060
                trayicon_show(tray_icon);
1061
1062
        /* create views */
1063
        mainwin->folderview  = folderview  = folderview_create();
1064
        mainwin->summaryview = summaryview = summary_create();
1065
        mainwin->messageview = messageview = messageview_create();
1066
        mainwin->logwin      = log_window_create();
1067
1068
        quick_search_create(summaryview);
1069
1070
        folderview->mainwin      = mainwin;
1071
        folderview->summaryview  = summaryview;
1072
1073
        summaryview->mainwin     = mainwin;
1074
        summaryview->folderview  = folderview;
1075
        summaryview->messageview = messageview;
1076
        summaryview->window      = window;
1077
1078
        messageview->statusbar   = statusbar;
1079
        messageview->mainwin     = mainwin;
1080
1081
        mainwin->window         = window;
1082
        mainwin->vbox           = vbox;
1083
        mainwin->menubar        = menubar;
1084
        mainwin->menu_factory   = ifactory;
1085
        mainwin->toolbar        = toolbar;
1086
        mainwin->vbox_body      = vbox_body;
1087
        mainwin->statusbar      = statusbar;
1088
        mainwin->progressbar    = progressbar;
1089
        mainwin->statuslabel    = statuslabel;
1090
        mainwin->online_switch  = online_switch;
1091
        mainwin->online_pixmap  = online_pixmap;
1092
        mainwin->offline_pixmap = offline_pixmap;
1093
        mainwin->online_tip     = online_tip;
1094
        mainwin->ac_button      = ac_button;
1095
        mainwin->ac_label       = ac_label;
1096
1097
        mainwin->tray_icon      = tray_icon;
1098
1099
        /* set context IDs for status bar */
1100
        mainwin->mainwin_cid = gtk_statusbar_get_context_id
1101
                (GTK_STATUSBAR(statusbar), "Main Window");
1102
        mainwin->folderview_cid = gtk_statusbar_get_context_id
1103
                (GTK_STATUSBAR(statusbar), "Folder View");
1104
        mainwin->summaryview_cid = gtk_statusbar_get_context_id
1105
                (GTK_STATUSBAR(statusbar), "Summary View");
1106
        mainwin->messageview_cid = gtk_statusbar_get_context_id
1107
                (GTK_STATUSBAR(statusbar), "Message View");
1108
1109
        messageview->statusbar_cid = mainwin->messageview_cid;
1110
1111
        /* allocate colors for summary view and folder view */
1112
        summaryview->color_marked.red = summaryview->color_marked.green = 0;
1113
        summaryview->color_marked.blue = (guint16)65535;
1114
1115
        summaryview->color_dim.red = summaryview->color_dim.green =
1116
                summaryview->color_dim.blue = COLOR_DIM;
1117
1118
        folderview->color_new.red = (guint16)55000;
1119
        folderview->color_new.green = folderview->color_new.blue = 15000;
1120
1121
        folderview->color_noselect.red = folderview->color_noselect.green =
1122
                folderview->color_noselect.blue = COLOR_DIM;
1123
1124
        color[0] = summaryview->color_marked;
1125
        color[1] = summaryview->color_dim;
1126
        color[2] = folderview->color_new;
1127
1128
        colormap = gdk_window_get_colormap(window->window);
1129
        gdk_colormap_alloc_colors(colormap, color, 3, FALSE, TRUE, success);
1130
        for (i = 0; i < 3; i++) {
1131
                if (success[i] == FALSE)
1132
                        g_warning(_("MainWindow: color allocation %d failed\n"), i);
1133
        }
1134
1135
        if (prefs_common.layout_type == LAYOUT_VERTICAL)
1136
                messageview->visible = TRUE;
1137
        else
1138
                messageview->visible = prefs_common.msgview_visible;
1139
1140
        main_window_set_widgets(mainwin, prefs_common.layout_type, type);
1141
1142
        if (prefs_common.mainwin_maximized)
1143
                gtk_window_maximize(GTK_WINDOW(window));
1144
1145
        g_signal_connect(G_OBJECT(window), "size_allocate",
1146
                         G_CALLBACK(main_window_size_allocate_cb), mainwin);
1147
        g_signal_connect(G_OBJECT(window), "window_state_event",
1148
                         G_CALLBACK(main_window_window_state_cb), mainwin);
1149
        g_signal_connect(G_OBJECT(window), "visibility_notify_event",
1150
                         G_CALLBACK(main_window_visibility_notify_cb), mainwin);
1151
1152
        /* set menu items */
1153
        menuitem = gtk_item_factory_get_item
1154
                (ifactory, "/View/Character encoding/Auto detect");
1155
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
1156
1157
        main_window_toolbar_toggle_menu_set_active
1158
                (mainwin, prefs_common.toolbar_style);
1159
1160
        gtk_widget_hide(GTK_WIDGET_PTR(summaryview->qsearch));
1161
        menuitem = gtk_item_factory_get_item
1162
                (ifactory, "/View/Show or hide/Search bar");
1163
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
1164
                                       prefs_common.show_searchbar);
1165
1166
        gtk_widget_hide(mainwin->statusbar);
1167
        menuitem = gtk_item_factory_get_item
1168
                (ifactory, "/View/Show or hide/Status bar");
1169
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
1170
                                       prefs_common.show_statusbar);
1171
1172
        /* set account selection menu */
1173
        ac_menu = gtk_item_factory_get_widget
1174
                (ifactory, "/Configuration/Change current account");
1175
        g_signal_connect(G_OBJECT(ac_menu), "selection_done",
1176
                         G_CALLBACK(ac_menu_popup_closed), mainwin);
1177
        mainwin->ac_menu = ac_menu;
1178
1179
        main_window_set_toolbar_sensitive(mainwin);
1180
        main_window_set_toolbar_button_visibility(mainwin);
1181
1182
        /* create actions menu */
1183
#ifndef G_OS_WIN32
1184
        action_update_mainwin_menu(ifactory, mainwin);
1185
#endif
1186
1187
        /* initialize online switch */
1188
        prefs_common.online_mode = !prefs_common.online_mode;
1189
        online_switch_clicked(online_switch, mainwin);
1190
1191
        /* show main window */
1192
        gtk_widget_show(mainwin->window);
1193
1194
#if !GTK_CHECK_VERSION(2, 6, 0)
1195
        {
1196
                gint w, h;
1197
                gdk_drawable_get_size
1198
                        (GDK_DRAWABLE(GTK_STATUSBAR(statusbar)->grip_window),
1199
                         &w, &h);
1200
                gtk_widget_set_size_request(spacer_hbox, w, -1);
1201
        }
1202
#endif
1203
1204
        /* initialize views */
1205
        folderview_init(folderview);
1206
        summary_init(summaryview);
1207
        messageview_init(messageview);
1208
        log_window_init(mainwin->logwin);
1209
1210
        mainwin->lock_count = 0;
1211
        mainwin->menu_lock_count = 0;
1212
        mainwin->cursor_count = 0;
1213
1214
        mainwin->window_hidden = FALSE;
1215
        mainwin->window_obscured = FALSE;
1216
1217
        if (!watch_cursor)
1218
                watch_cursor = gdk_cursor_new(GDK_WATCH);
1219
1220
        mainwin_list = g_list_append(mainwin_list, mainwin);
1221
1222
        debug_print(_("done.\n"));
1223
1224
        return mainwin;
1225
}
1226
1227
void main_window_cursor_wait(MainWindow *mainwin)
1228
{
1229
1230
        if (mainwin->cursor_count == 0)
1231
                gdk_window_set_cursor(mainwin->window->window, watch_cursor);
1232
1233
        mainwin->cursor_count++;
1234
1235
        gdk_flush();
1236
}
1237
1238
void main_window_cursor_normal(MainWindow *mainwin)
1239
{
1240
        if (mainwin->cursor_count)
1241
                mainwin->cursor_count--;
1242
1243
        if (mainwin->cursor_count == 0)
1244
                gdk_window_set_cursor(mainwin->window->window, NULL);
1245
1246
        gdk_flush();
1247
}
1248
1249
/* lock / unlock the user-interface */
1250
void main_window_lock(MainWindow *mainwin)
1251
{
1252
        if (mainwin->lock_count == 0)
1253
                gtk_widget_set_sensitive(mainwin->ac_button, FALSE);
1254
1255
        mainwin->lock_count++;
1256
1257
        main_window_set_menu_sensitive(mainwin);
1258
        main_window_set_toolbar_sensitive(mainwin);
1259
}
1260
1261
void main_window_unlock(MainWindow *mainwin)
1262
{
1263
        if (mainwin->lock_count)
1264
                mainwin->lock_count--;
1265
1266
        main_window_set_menu_sensitive(mainwin);
1267
        main_window_set_toolbar_sensitive(mainwin);
1268
1269
        if (mainwin->lock_count == 0)
1270
                gtk_widget_set_sensitive(mainwin->ac_button, TRUE);
1271
}
1272
1273
static void main_window_menu_callback_block(MainWindow *mainwin)
1274
{
1275
        mainwin->menu_lock_count++;
1276
}
1277
1278
static void main_window_menu_callback_unblock(MainWindow *mainwin)
1279
{
1280
        if (mainwin->menu_lock_count)
1281
                mainwin->menu_lock_count--;
1282
}
1283
1284
void main_window_reflect_prefs_all(void)
1285
{
1286
        MainWindow *mainwin;
1287
1288
        mainwin = main_window_get();
1289
1290
        main_window_show_cur_account(mainwin);
1291
        main_window_set_menu_sensitive(mainwin);
1292
        main_window_set_toolbar_sensitive(mainwin);
1293
        main_window_set_toolbar_button_visibility(mainwin);
1294
1295
        if (mainwin->tray_icon) {
1296
                if (prefs_common.show_trayicon)
1297
                        trayicon_show(mainwin->tray_icon);
1298
                else {
1299
                        /* trayicon is automatically replaced by new one */
1300
                        trayicon_hide(mainwin->tray_icon);
1301
                }
1302
        }
1303
1304
        folderview_reflect_prefs(mainwin->folderview);
1305
1306
        headerview_set_visibility(mainwin->messageview->headerview,
1307
                                  prefs_common.display_header_pane);
1308
1309
        textview_reflect_prefs(mainwin->messageview->textview);
1310
        textview_reflect_prefs(mainwin->messageview->mimeview->textview);
1311
1312
        summary_redisplay_msg(mainwin->summaryview);
1313
}
1314
1315
void main_window_set_summary_column(void)
1316
{
1317
        summary_set_column_order(main_window_get()->summaryview);
1318
}
1319
1320
static void main_window_set_account_selector_menu(MainWindow *mainwin,
1321
                                                  GList *account_list)
1322
{
1323
        GList *cur_ac, *cur_item;
1324
        GtkWidget *menuitem;
1325
        PrefsAccount *ac_prefs;
1326
1327
        /* destroy all previous menu item */
1328
        cur_item = GTK_MENU_SHELL(mainwin->ac_menu)->children;
1329
        while (cur_item != NULL) {
1330
                GList *next = cur_item->next;
1331
                gtk_widget_destroy(GTK_WIDGET(cur_item->data));
1332
                cur_item = next;
1333
        }
1334
1335
        for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
1336
                ac_prefs = (PrefsAccount *)cur_ac->data;
1337
1338
                menuitem = gtk_menu_item_new_with_label
1339
                        (ac_prefs->account_name
1340
                         ? ac_prefs->account_name : _("Untitled"));
1341
                gtk_widget_show(menuitem);
1342
                gtk_menu_append(GTK_MENU(mainwin->ac_menu), menuitem);
1343
                g_signal_connect(G_OBJECT(menuitem), "activate",
1344
                                 G_CALLBACK(account_selector_menu_cb),
1345
                                 ac_prefs);
1346
        }
1347
}
1348
1349
static void main_window_set_account_receive_menu(MainWindow *mainwin,
1350
                                                 GList *account_list)
1351
{
1352
        GList *cur_ac, *cur_item;
1353
        GtkWidget *menu;
1354
        GtkWidget *menuitem;
1355
        PrefsAccount *ac_prefs;
1356
1357
        menu = gtk_item_factory_get_widget(mainwin->menu_factory,
1358
                                           "/Message/Receive");
1359
1360
        /* search for separator */
1361
        for (cur_item = GTK_MENU_SHELL(menu)->children; cur_item != NULL;
1362
             cur_item = cur_item->next) {
1363
                if (GTK_BIN(cur_item->data)->child == NULL) {
1364
                        cur_item = cur_item->next;
1365
                        break;
1366
                }
1367
        }
1368
1369
        /* destroy all previous menu item */
1370
        while (cur_item != NULL) {
1371
                GList *next = cur_item->next;
1372
                gtk_widget_destroy(GTK_WIDGET(cur_item->data));
1373
                cur_item = next;
1374
        }
1375
1376
        for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
1377
                ac_prefs = (PrefsAccount *)cur_ac->data;
1378
1379
                menuitem = gtk_menu_item_new_with_label
1380
                        (ac_prefs->account_name ? ac_prefs->account_name
1381
                         : _("Untitled"));
1382
                gtk_widget_show(menuitem);
1383
                gtk_menu_append(GTK_MENU(menu), menuitem);
1384
                g_signal_connect(G_OBJECT(menuitem), "activate",
1385
                                 G_CALLBACK(account_receive_menu_cb),
1386
                                 ac_prefs);
1387
        }
1388
}
1389
1390
void main_window_set_account_menu(GList *account_list)
1391
{
1392
        MainWindow *mainwin;
1393
1394
        mainwin = main_window_get();
1395
        main_window_set_account_selector_menu(mainwin, account_list);
1396
        main_window_set_account_receive_menu(mainwin, account_list);
1397
}
1398
1399
static void main_window_show_cur_account(MainWindow *mainwin)
1400
{
1401
        gchar *buf;
1402
        gchar *ac_name;
1403
1404
        ac_name = g_strdup(cur_account
1405
                           ? (cur_account->account_name
1406
                              ? cur_account->account_name : _("Untitled"))
1407
                           : _("none"));
1408
1409
        if (cur_account)
1410
                buf = g_strdup_printf("%s - %s", ac_name, PROG_VERSION);
1411
        else
1412
                buf = g_strdup(PROG_VERSION);
1413
        gtk_window_set_title(GTK_WINDOW(mainwin->window), buf);
1414
        g_free(buf);
1415
1416
        gtk_label_set_text(GTK_LABEL(mainwin->ac_label), ac_name);
1417
        gtk_widget_queue_resize(mainwin->ac_button);
1418
1419
        g_free(ac_name);
1420
}
1421
1422
void main_window_change_cur_account(void)
1423
{
1424
        MainWindow *mainwin;
1425
1426
        mainwin = main_window_get();
1427
        main_window_show_cur_account(mainwin);
1428
        main_window_set_menu_sensitive(mainwin);
1429
        main_window_set_toolbar_sensitive(mainwin);
1430
}
1431
1432
MainWindow *main_window_get(void)
1433
{
1434
        if (mainwin_list)
1435
                return (MainWindow *)mainwin_list->data;
1436
        else
1437
                return NULL;
1438
}
1439
1440
GtkWidget *main_window_get_folder_window(MainWindow *mainwin)
1441
{
1442
        switch (mainwin->type) {
1443
        case SEPARATE_FOLDER:
1444
                return mainwin->win.sep_folder.folderwin;
1445
        case SEPARATE_BOTH:
1446
                return mainwin->win.sep_both.folderwin;
1447
        default:
1448
                return NULL;
1449
        }
1450
}
1451
1452
GtkWidget *main_window_get_message_window(MainWindow *mainwin)
1453
{
1454
        switch (mainwin->type) {
1455
        case SEPARATE_MESSAGE:
1456
                return mainwin->win.sep_message.messagewin;
1457
        case SEPARATE_BOTH:
1458
                return mainwin->win.sep_both.messagewin;
1459
        default:
1460
                return NULL;
1461
        }
1462
}
1463
1464
void main_window_hide(MainWindow *mainwin)
1465
{
1466
        GtkWidget *folder_wid  = GTK_WIDGET_PTR(mainwin->folderview);
1467
        GtkWidget *summary_wid = GTK_WIDGET_PTR(mainwin->summaryview);
1468
        GtkWidget *message_wid = GTK_WIDGET_PTR(mainwin->messageview);
1469
        GtkWidget *qsearch_wid = GTK_WIDGET_PTR(mainwin->summaryview->qsearch);
1470
        GtkWidget *vbox_summary = qsearch_wid->parent;
1471
1472
        /* remove widgets from those containers */
1473
        gtkut_container_remove
1474
                (GTK_CONTAINER(folder_wid->parent), folder_wid);
1475
        gtkut_container_remove
1476
                (GTK_CONTAINER(summary_wid->parent), summary_wid);
1477
        gtkut_container_remove
1478
                (GTK_CONTAINER(message_wid->parent), message_wid);
1479
        gtkut_container_remove
1480
                (GTK_CONTAINER(qsearch_wid->parent), qsearch_wid);
1481
1482
        /* clean containers */
1483
        switch (mainwin->type) {
1484
        case SEPARATE_NONE:
1485
                if (!mainwin->win.sep_none.vpaned->parent)
1486
                        gtk_widget_destroy(mainwin->win.sep_none.vpaned);
1487
                gtk_widget_destroy(mainwin->win.sep_none.hpaned);
1488
                mainwin->win.sep_none.hpaned = NULL;
1489
                mainwin->win.sep_none.vpaned = NULL;
1490
                break;
1491
        case SEPARATE_FOLDER:
1492
                gtk_widget_destroy(mainwin->win.sep_folder.folderwin);
1493
                if (!mainwin->win.sep_folder.vpaned->parent)
1494
                        gtk_widget_destroy(mainwin->win.sep_folder.vpaned);
1495
                gtk_widget_destroy(vbox_summary);
1496
                mainwin->win.sep_folder.folderwin = NULL;
1497
                mainwin->win.sep_folder.vpaned = NULL;
1498
                break;
1499
        case SEPARATE_MESSAGE:
1500
                gtk_widget_destroy(mainwin->win.sep_message.messagewin);
1501
                gtk_widget_destroy(mainwin->win.sep_message.hpaned);
1502
                mainwin->win.sep_message.messagewin = NULL;
1503
                mainwin->win.sep_message.hpaned = NULL;
1504
                break;
1505
        case SEPARATE_BOTH:
1506
                gtk_widget_destroy(vbox_summary);
1507
                gtk_widget_destroy(mainwin->win.sep_both.folderwin);
1508
                gtk_widget_destroy(mainwin->win.sep_both.messagewin);
1509
                mainwin->win.sep_both.folderwin = NULL;
1510
                mainwin->win.sep_both.messagewin = NULL;
1511
                break;
1512
        }
1513
1514
        gtk_widget_hide(mainwin->window);
1515
}
1516
1517
void main_window_change_layout(MainWindow *mainwin, LayoutType layout,
1518
                               SeparateType type)
1519
{
1520
        GtkWidget *folder_wid  = GTK_WIDGET_PTR(mainwin->folderview);
1521
        GtkWidget *summary_wid = GTK_WIDGET_PTR(mainwin->summaryview);
1522
        GtkWidget *message_wid = GTK_WIDGET_PTR(mainwin->messageview);
1523
        GtkWidget *qsearch_wid = GTK_WIDGET_PTR(mainwin->summaryview->qsearch);
1524
        GtkWidget *focus_widget;
1525
1526
        debug_print("Changing window layout type (layout: %d -> %d, separation: %d -> %d)\n", prefs_common.layout_type, layout, mainwin->type, type);
1527
1528
        if (prefs_common.layout_type == layout && mainwin->type == type)
1529
                return;
1530
1531
        /* keep previous focus */
1532
        focus_widget = gtk_window_get_focus(GTK_WINDOW(mainwin->window));
1533
1534
        gtk_widget_ref(folder_wid);
1535
        gtk_widget_ref(summary_wid);
1536
        gtk_widget_ref(message_wid);
1537
        gtk_widget_ref(qsearch_wid);
1538
1539
        main_window_hide(mainwin);
1540
        main_window_set_widgets(mainwin, layout, type);
1541
        gtk_widget_show(mainwin->window);
1542
        if (focus_widget)
1543
                gtk_widget_grab_focus(focus_widget);
1544
1545
        gtk_widget_unref(folder_wid);
1546
        gtk_widget_unref(summary_wid);
1547
        gtk_widget_unref(message_wid);
1548
        gtk_widget_unref(qsearch_wid);
1549
}
1550
1551
void main_window_toggle_message_view(MainWindow *mainwin)
1552
{
1553
        SummaryView *summaryview = mainwin->summaryview;
1554
        union CompositeWin *cwin = &mainwin->win;
1555
        GtkWidget *vpaned = NULL;
1556
        GtkWidget *container = NULL;
1557
        GtkWidget *msgwin = NULL;
1558
        gboolean use_vlayout = (prefs_common.layout_type == LAYOUT_VERTICAL);
1559
1560
        switch (mainwin->type) {
1561
        case SEPARATE_NONE:
1562
                vpaned = cwin->sep_none.vpaned;
1563
                container = GTK_WIDGET_PTR(summaryview->qsearch)->parent;
1564
                break;
1565
        case SEPARATE_FOLDER:
1566
                vpaned = cwin->sep_folder.vpaned;
1567
                container = GTK_WIDGET_PTR(summaryview->qsearch)->parent;
1568
                break;
1569
        case SEPARATE_MESSAGE:
1570
                msgwin = mainwin->win.sep_message.messagewin;
1571
                break;
1572
        case SEPARATE_BOTH:
1573
                msgwin = mainwin->win.sep_both.messagewin;
1574
                break;
1575
        }
1576
1577
        if (msgwin) {
1578
                /* separate message view */
1579
                if (GTK_WIDGET_VISIBLE(msgwin)) {
1580
                        gtk_widget_hide(msgwin);
1581
                        mainwin->messageview->visible = FALSE;
1582
                        summaryview->displayed = NULL;
1583
                } else {
1584
                        gtk_widget_show(msgwin);
1585
                        mainwin->messageview->visible = TRUE;
1586
                }
1587
        } else if (vpaned->parent != NULL) {
1588
                /* hide message view */
1589
                mainwin->messageview->visible = FALSE;
1590
                summaryview->displayed = NULL;
1591
                gtk_widget_ref(vpaned);
1592
                gtkut_container_remove(GTK_CONTAINER(container), vpaned);
1593
                gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), container);
1594
                if (!use_vlayout)
1595
                        gtk_widget_hide(summaryview->hseparator);
1596
        } else {
1597
                /* show message view */
1598
                mainwin->messageview->visible = TRUE;
1599
                gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), vpaned);
1600
                gtk_container_add(GTK_CONTAINER(container), vpaned);
1601
                gtk_widget_unref(vpaned);
1602
                if (!use_vlayout)
1603
                        gtk_widget_show(summaryview->hseparator);
1604
        }
1605
1606
        if (messageview_is_visible(mainwin->messageview))
1607
                gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
1608
                              use_vlayout ? GTK_ARROW_RIGHT : GTK_ARROW_DOWN,
1609
                              GTK_SHADOW_OUT);
1610
        else
1611
                gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
1612
                              use_vlayout ? GTK_ARROW_LEFT : GTK_ARROW_UP,
1613
                              GTK_SHADOW_OUT);
1614
1615
        if (mainwin->messageview->visible == FALSE)
1616
                messageview_clear(mainwin->messageview);
1617
1618
        main_window_set_menu_sensitive(mainwin);
1619
1620
        prefs_common.msgview_visible = mainwin->messageview->visible;
1621
1622
        gtk_widget_grab_focus(summaryview->treeview);
1623
}
1624
1625
void main_window_get_size(MainWindow *mainwin)
1626
{
1627
        GtkAllocation *allocation;
1628
        gboolean vlayout = (prefs_common.layout_type == LAYOUT_VERTICAL);
1629
1630
        allocation = &(GTK_WIDGET_PTR(mainwin->summaryview)->allocation);
1631
        if (allocation->width > 1 && allocation->height > 1) {
1632
                if (vlayout) {
1633
                        if (!(mainwin->type & SEPARATE_MESSAGE) &&
1634
                            messageview_is_visible(mainwin->messageview))
1635
                                prefs_common.summaryview_vwidth = allocation->width;
1636
                        prefs_common.summaryview_vheight = allocation->height;
1637
                } else {
1638
                        if (!prefs_common.mainwin_maximized) {
1639
                                prefs_common.summaryview_width = allocation->width;
1640
                                prefs_common.mainview_width = allocation->width;
1641
                        }
1642
                        if ((mainwin->type == SEPARATE_NONE ||
1643
                             mainwin->type == SEPARATE_FOLDER) &&
1644
                            messageview_is_visible(mainwin->messageview))
1645
                                prefs_common.summaryview_height = allocation->height;
1646
                }
1647
        }
1648
1649
        if (prefs_common.mainwin_maximized) {
1650
                allocation = &(GTK_WIDGET_PTR(mainwin->folderview)->allocation);
1651
                if (allocation->width > 1 && allocation->height > 1)
1652
                        prefs_common.folderview_width  = allocation->width;
1653
                return;
1654
        }
1655
1656
        allocation = &mainwin->window->allocation;
1657
        if (allocation->width > 1 && allocation->height > 1) {
1658
                prefs_common.mainview_height = allocation->height;
1659
                prefs_common.mainwin_width   = allocation->width;
1660
                prefs_common.mainwin_height  = allocation->height;
1661
        }
1662
1663
        allocation = &(GTK_WIDGET_PTR(mainwin->folderview)->allocation);
1664
        if (allocation->width > 1 && allocation->height > 1) {
1665
                prefs_common.folderview_width  = allocation->width;
1666
                prefs_common.folderview_height = allocation->height;
1667
        }
1668
1669
        allocation = &(GTK_WIDGET_PTR(mainwin->messageview)->allocation);
1670
        if (allocation->width > 1 && allocation->height > 1) {
1671
                if (vlayout) {
1672
                        prefs_common.msgview_vwidth = allocation->width;
1673
                        prefs_common.msgview_vheight = allocation->height;
1674
                } else {
1675
                        prefs_common.msgview_width = allocation->width;
1676
                        prefs_common.msgview_height = allocation->height;
1677
                }
1678
        }
1679
1680
#if 0
1681
        debug_print("summaryview size: %d x %d\n",
1682
                    prefs_common.summaryview_width,
1683
                    prefs_common.summaryview_height);
1684
        debug_print("mainwin size: %d x %d\n",
1685
                    prefs_common.mainwin_width,
1686
                    prefs_common.mainwin_height);
1687
        debug_print("folderview size: %d x %d\n",
1688
                    prefs_common.folderview_width,
1689
                    prefs_common.folderview_height);
1690
        debug_print("messageview size: %d x %d\n",
1691
                    prefs_common.msgview_width,
1692
                    prefs_common.msgview_height);
1693
#endif
1694
}
1695
1696
void main_window_get_position(MainWindow *mainwin)
1697
{
1698
        gint x, y;
1699
        GtkWidget *window;
1700
1701
        if (prefs_common.mainwin_maximized || mainwin->window_hidden)
1702
                return;
1703
1704
        gtkut_widget_get_uposition(mainwin->window, &x, &y);
1705
1706
        prefs_common.mainview_x = x;
1707
        prefs_common.mainview_y = y;
1708
        prefs_common.mainwin_x = x;
1709
        prefs_common.mainwin_y = y;
1710
1711
        debug_print("main window position: %d, %d\n", x, y);
1712
1713
        window = main_window_get_folder_window(mainwin);
1714
        if (window) {
1715
                gtkut_widget_get_uposition(window, &x, &y);
1716
                prefs_common.folderwin_x = x;
1717
                prefs_common.folderwin_y = y;
1718
                debug_print("folder window position: %d, %d\n", x, y);
1719
        }
1720
        window = main_window_get_message_window(mainwin);
1721
        if (window) {
1722
                gtkut_widget_get_uposition(window, &x, &y);
1723
                prefs_common.main_msgwin_x = x;
1724
                prefs_common.main_msgwin_y = y;
1725
                debug_print("message window position: %d, %d\n", x, y);
1726
        }
1727
}
1728
1729
void main_window_progress_on(MainWindow *mainwin)
1730
{
1731
        gtk_progress_set_show_text(GTK_PROGRESS(mainwin->progressbar), TRUE);
1732
        gtk_progress_set_format_string(GTK_PROGRESS(mainwin->progressbar), "");
1733
}
1734
1735
void main_window_progress_off(MainWindow *mainwin)
1736
{
1737
        gtk_progress_set_show_text(GTK_PROGRESS(mainwin->progressbar), FALSE);
1738
        gtk_progress_bar_update(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
1739
        gtk_progress_set_format_string(GTK_PROGRESS(mainwin->progressbar), "");
1740
}
1741
1742
void main_window_progress_set(MainWindow *mainwin, gint cur, gint total)
1743
{
1744
        gchar buf[32];
1745
1746
        g_snprintf(buf, sizeof(buf), "%d / %d", cur, total);
1747
        gtk_progress_set_format_string(GTK_PROGRESS(mainwin->progressbar), buf);
1748
        gtk_progress_bar_update(GTK_PROGRESS_BAR(mainwin->progressbar),
1749
                                (cur == 0 && total == 0) ? 0 :
1750
                                (gfloat)cur / (gfloat)total);
1751
}
1752
1753
void main_window_progress_show(gint cur, gint total)
1754
{
1755
        MainWindow *mainwin;
1756
1757
        mainwin = main_window_get();
1758
1759
        if (total > 0) {
1760
                gtk_progress_set_show_text(GTK_PROGRESS(mainwin->progressbar),
1761
                                           TRUE);
1762
                main_window_progress_set(mainwin, cur, total);
1763
        } else
1764
                main_window_progress_off(mainwin);
1765
}
1766
1767
void main_window_toggle_online(MainWindow *mainwin, gboolean online)
1768
{
1769
        if (prefs_common.online_mode != online)
1770
                online_switch_clicked(mainwin->online_switch, mainwin);
1771
}
1772
1773
gboolean main_window_toggle_online_if_offline(MainWindow *mainwin)
1774
{
1775
        if (!prefs_common.online_mode) {
1776
                if (alertpanel(_("Offline"),
1777
                               _("You are offline. Go online?"),
1778
                               GTK_STOCK_YES, GTK_STOCK_NO, NULL)
1779
                    == G_ALERTDEFAULT)
1780
                        main_window_toggle_online(mainwin, TRUE);
1781
        }
1782
1783
        return prefs_common.online_mode;
1784
}
1785
1786
void main_window_empty_trash(MainWindow *mainwin, gboolean confirm)
1787
{
1788
        GList *list;
1789
1790
        if (!procmsg_trash_messages_exist())
1791
                return;
1792
1793
        if (confirm) {
1794
                if (alertpanel(_("Empty all trash"),
1795
                               _("Delete all messages in trash folders?"),
1796
                               GTK_STOCK_YES, GTK_STOCK_NO, NULL)
1797
                    != G_ALERTDEFAULT)
1798
                        return;
1799
                manage_window_focus_in(mainwin->window, NULL, NULL);
1800
        }
1801
1802
        procmsg_empty_all_trash();
1803
        statusbar_pop_all();
1804
        trayicon_set_tooltip(NULL);
1805
        trayicon_set_notify(FALSE);
1806
1807
        for (list = folder_get_list(); list != NULL; list = list->next) {
1808
                Folder *folder;
1809
1810
                folder = list->data;
1811
                if (folder->trash)
1812
                        folderview_update_item(folder->trash, TRUE);
1813
        }
1814
1815
        if (mainwin->summaryview->folder_item &&
1816
            mainwin->summaryview->folder_item->stype == F_TRASH)
1817
                gtk_widget_grab_focus(mainwin->folderview->treeview);
1818
}
1819
1820
void main_window_add_mailbox(MainWindow *mainwin)
1821
{
1822
        gchar *path;
1823
        Folder *folder;
1824
1825
        path = input_dialog_with_filesel
1826
                (_("Add mailbox"),
1827
                 _("Specify the location of mailbox.\n"
1828
                   "If the existing mailbox is specified, it will be\n"
1829
                   "scanned automatically."),
1830
                 "Mail", GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
1831
        if (!path) return;
1832
        if (folder_find_from_path(path)) {
1833
                alertpanel_error(_("The mailbox `%s' already exists."), path);
1834
                g_free(path);
1835
                return;
1836
        }
1837
        if (!strcmp(path, "Mail"))
1838
                folder = folder_new(F_MH, _("Mailbox"), path);
1839
        else
1840
                folder = folder_new(F_MH, g_basename(path), path);
1841
        g_free(path);
1842
1843
        if (folder->klass->create_tree(folder) < 0) {
1844
                alertpanel_error(_("Creation of the mailbox failed.\n"
1845
                                   "Maybe some files already exist, or you don't have the permission to write there."));
1846
                folder_destroy(folder);
1847
                return;
1848
        }
1849
1850
        folder_add(folder);
1851
        folder_set_ui_func(folder, scan_tree_func, mainwin);
1852
        folder->klass->scan_tree(folder);
1853
        folder_set_ui_func(folder, NULL, NULL);
1854
1855
        folderview_set(mainwin->folderview);
1856
}
1857
1858
void main_window_send_queue(MainWindow *mainwin)
1859
{
1860
        GList *list;
1861
1862
        if (!main_window_toggle_online_if_offline(mainwin))
1863
                return;
1864
1865
        for (list = folder_get_list(); list != NULL; list = list->next) {
1866
                Folder *folder = list->data;
1867
1868
                if (folder->queue) {
1869
                        gint ret;
1870
1871
                        ret = send_message_queue_all(folder->queue,
1872
                                                     prefs_common.savemsg,
1873
                                                     prefs_common.filter_sent);
1874
                        statusbar_pop_all();
1875
                        if (ret > 0)
1876
                                folder_item_scan(folder->queue);
1877
                }
1878
        }
1879
1880
        folderview_update_all_updated(TRUE);
1881
        main_window_set_menu_sensitive(mainwin);
1882
        main_window_set_toolbar_sensitive(mainwin);
1883
}
1884
1885
typedef enum
1886
{
1887
        M_UNLOCKED            = 1 << 0,
1888
        M_MSG_EXIST           = 1 << 1,
1889
        M_TARGET_EXIST        = 1 << 2,
1890
        M_SINGLE_TARGET_EXIST = 1 << 3,
1891
        M_EXEC                = 1 << 4,
1892
        M_ALLOW_REEDIT        = 1 << 5,
1893
        M_HAVE_ACCOUNT        = 1 << 6,
1894
        M_THREADED              = 1 << 7,
1895
        M_UNTHREADED              = 1 << 8,
1896
        M_ALLOW_DELETE              = 1 << 9,
1897
        M_INC_ACTIVE              = 1 << 10,
1898
        M_ENABLE_JUNK              = 1 << 11,
1899
        M_HAVE_QUEUED_MSG     = 1 << 12,
1900
        M_POP3_ACCOUNT              = 1 << 13,
1901
1902
        M_FOLDER_NEWOK              = 1 << 17,
1903
        M_FOLDER_RENOK              = 1 << 18,
1904
        M_FOLDER_MOVEOK              = 1 << 19,
1905
        M_FOLDER_DELOK              = 1 << 20,
1906
        M_MBOX_ADDOK              = 1 << 21,
1907
        M_MBOX_RMOK              = 1 << 22,
1908
        M_MBOX_CHKOK              = 1 << 23,
1909
        M_MBOX_CHKALLOK              = 1 << 24,
1910
        M_MBOX_REBUILDOK      = 1 << 25
1911
} SensitiveCond;
1912
1913
static SensitiveCond main_window_get_current_state(MainWindow *mainwin)
1914
{
1915
        SensitiveCond state = 0;
1916
        SummarySelection selection;
1917
        GList *list;
1918
        FolderItem *item = mainwin->summaryview->folder_item;
1919
1920
        selection = summary_get_selection_type(mainwin->summaryview);
1921
1922
        if (mainwin->lock_count == 0)
1923
                state |= M_UNLOCKED;
1924
        if (selection != SUMMARY_NONE)
1925
                state |= M_MSG_EXIST;
1926
        if (item && item->path && item->parent && !item->no_select) {
1927
                state |= M_EXEC;
1928
                if (item->threaded)
1929
                        state |= M_THREADED;
1930
                else
1931
                        state |= M_UNTHREADED;        
1932
                if (FOLDER_TYPE(item->folder) != F_NEWS)
1933
                        state |= M_ALLOW_DELETE;
1934
        }
1935
        if (selection == SUMMARY_SELECTED_SINGLE ||
1936
            selection == SUMMARY_SELECTED_MULTIPLE)
1937
                state |= M_TARGET_EXIST;
1938
        if (selection == SUMMARY_SELECTED_SINGLE)
1939
                state |= M_SINGLE_TARGET_EXIST;
1940
        if (selection == SUMMARY_SELECTED_SINGLE &&
1941
            FOLDER_ITEM_IS_SENT_FOLDER(item))
1942
                state |= M_ALLOW_REEDIT;
1943
        if (cur_account) {
1944
                state |= M_HAVE_ACCOUNT;
1945
                if (cur_account->protocol == A_POP3)
1946
                        state |= M_POP3_ACCOUNT;
1947
        }
1948
1949
        if (inc_is_active())
1950
                state |= M_INC_ACTIVE;
1951
1952
        if (prefs_common.enable_junk)
1953
                state |= M_ENABLE_JUNK;
1954
1955
        for (list = folder_get_list(); list != NULL; list = list->next) {
1956
                Folder *folder = list->data;
1957
                if (folder->queue && folder->queue->total > 0) {
1958
                        state |= M_HAVE_QUEUED_MSG;
1959
                        break;
1960
                }
1961
        }
1962
1963
        item = folderview_get_selected_item(mainwin->folderview);
1964
        if (item) {
1965
                state |= M_FOLDER_NEWOK;
1966
                if (item->parent == NULL) {
1967
                        state |= M_MBOX_RMOK;
1968
                        state |= M_MBOX_CHKOK;
1969
                }
1970
                if (FOLDER_IS_LOCAL(item->folder) ||
1971
                    FOLDER_TYPE(item->folder) == F_IMAP) {
1972
                        if (item->parent == NULL)
1973
                                state |= M_MBOX_REBUILDOK;
1974
                        else if (item->stype == F_NORMAL) {
1975
                                state |= M_FOLDER_RENOK;
1976
                                state |= M_FOLDER_DELOK;
1977
                                if (item->folder->klass->move_folder)
1978
                                        state |= M_FOLDER_MOVEOK;
1979
                        }
1980
                } else if (FOLDER_TYPE(item->folder) == F_NEWS) {
1981
                        if (item->parent != NULL)
1982
                                state |= M_FOLDER_DELOK;
1983
                }
1984
        }
1985
        state |= M_MBOX_ADDOK;
1986
        state |= M_MBOX_CHKALLOK;
1987
1988
        return state;
1989
}
1990
1991
void main_window_set_toolbar_sensitive(MainWindow *mainwin)
1992
{
1993
        SensitiveCond state;
1994
        gboolean sensitive, prev_sensitive;
1995
        gint n;
1996
        gint i = 0;
1997
1998
        struct {
1999
                GtkWidget *widget;
2000
                SensitiveCond cond;
2001
        } entry[20];
2002
2003
#define SET_WIDGET_COND(w, c)        \
2004
{                                \
2005
        entry[i].widget = w;        \
2006
        entry[i].cond = c;        \
2007
        i++;                        \
2008
}
2009
2010
        SET_WIDGET_COND(mainwin->get_btn, M_HAVE_ACCOUNT|M_UNLOCKED);
2011
        SET_WIDGET_COND(mainwin->getall_btn, M_HAVE_ACCOUNT|M_UNLOCKED);
2012
        SET_WIDGET_COND(mainwin->rpop3_btn,
2013
                        M_HAVE_ACCOUNT|M_UNLOCKED|M_POP3_ACCOUNT);
2014
        SET_WIDGET_COND(mainwin->send_btn, M_HAVE_ACCOUNT|M_HAVE_QUEUED_MSG);
2015
        SET_WIDGET_COND(mainwin->compose_btn, M_HAVE_ACCOUNT);
2016
        SET_WIDGET_COND(mainwin->reply_btn,
2017
                        M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST);
2018
        SET_WIDGET_COND(mainwin->reply_combo ?
2019
                        GTK_WIDGET_PTR(mainwin->reply_combo) : NULL,
2020
                        M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST);
2021
        SET_WIDGET_COND(mainwin->replyall_btn,
2022
                        M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST);
2023
        SET_WIDGET_COND(mainwin->fwd_btn, M_HAVE_ACCOUNT|M_TARGET_EXIST);
2024
        SET_WIDGET_COND(mainwin->fwd_combo ? GTK_WIDGET_PTR(mainwin->fwd_combo)
2025
                        : NULL,
2026
                        M_HAVE_ACCOUNT|M_TARGET_EXIST);
2027
        SET_WIDGET_COND(mainwin->delete_btn,
2028
                        M_TARGET_EXIST|M_ALLOW_DELETE);
2029
        SET_WIDGET_COND(mainwin->junk_btn,
2030
                        M_TARGET_EXIST|M_ALLOW_DELETE|M_ENABLE_JUNK);
2031
        SET_WIDGET_COND(mainwin->notjunk_btn,
2032
                        M_TARGET_EXIST|M_ALLOW_DELETE|M_ENABLE_JUNK);
2033
        SET_WIDGET_COND(mainwin->exec_btn, M_MSG_EXIST|M_EXEC);
2034
        SET_WIDGET_COND(mainwin->next_btn, M_MSG_EXIST);
2035
        SET_WIDGET_COND(mainwin->prev_btn, M_MSG_EXIST);
2036
        SET_WIDGET_COND(mainwin->print_btn, M_TARGET_EXIST);
2037
        SET_WIDGET_COND(mainwin->stop_btn, M_INC_ACTIVE);
2038
        SET_WIDGET_COND(mainwin->prefs_common_btn, M_UNLOCKED);
2039
        SET_WIDGET_COND(mainwin->prefs_account_btn, M_HAVE_ACCOUNT|M_UNLOCKED);
2040
2041
#undef SET_WIDGET_COND
2042
2043
        state = main_window_get_current_state(mainwin);
2044
2045
        n = sizeof(entry) / sizeof(entry[0]);
2046
        for (i = 0; i < n; i++) {
2047
                if (entry[i].widget) {
2048
                        prev_sensitive =
2049
                                GTK_WIDGET_IS_SENSITIVE(entry[i].widget);
2050
                        sensitive = ((entry[i].cond & state) == entry[i].cond);
2051
                        if (prev_sensitive != sensitive) {
2052
                                /* workaround for GTK+ bug (#56070) */
2053
                                if (!prev_sensitive)
2054
                                        gtk_widget_hide(entry[i].widget);
2055
                                gtk_widget_set_sensitive(entry[i].widget,
2056
                                                         sensitive);
2057
                                if (!prev_sensitive)
2058
                                        gtk_widget_show(entry[i].widget);
2059
                        }
2060
                }
2061
        }
2062
}
2063
2064
static void main_window_set_toolbar_button_visibility(MainWindow *mainwin)
2065
{
2066
        GtkToolbarStyle style = GTK_TOOLBAR_BOTH_HORIZ;
2067
2068
        if (prefs_common.toolbar_style == TOOLBAR_NONE)
2069
                style = -1;
2070
        else if (prefs_common.toolbar_style == TOOLBAR_ICON)
2071
                style = GTK_TOOLBAR_ICONS;
2072
        else if (prefs_common.toolbar_style == TOOLBAR_TEXT)
2073
                style = GTK_TOOLBAR_TEXT;
2074
        else if (prefs_common.toolbar_style == TOOLBAR_BOTH)
2075
                style = GTK_TOOLBAR_BOTH;
2076
        else if (prefs_common.toolbar_style == TOOLBAR_BOTH_HORIZ)
2077
                style = GTK_TOOLBAR_BOTH_HORIZ;
2078
2079
        if (style != -1) {
2080
                gtk_toolbar_set_style(GTK_TOOLBAR(mainwin->toolbar), style);
2081
                gtk_widget_show(mainwin->toolbar);
2082
                gtk_widget_queue_resize(mainwin->toolbar);
2083
        } else
2084
                gtk_widget_hide(mainwin->toolbar);
2085
2086
#if 0
2087
        if (mainwin->junk_btn) {
2088
                if (prefs_common.enable_junk)
2089
                        gtk_widget_show(mainwin->junk_btn);
2090
                else
2091
                        gtk_widget_hide(mainwin->junk_btn);
2092
        }
2093
2094
        if (mainwin->exec_btn) {
2095
                if (prefs_common.immediate_exec)
2096
                        gtk_widget_hide(mainwin->exec_btn);
2097
                else
2098
                        gtk_widget_show(mainwin->exec_btn);
2099
        }
2100
#endif
2101
}
2102
2103
void main_window_set_menu_sensitive(MainWindow *mainwin)
2104
{
2105
        GtkItemFactory *ifactory = mainwin->menu_factory;
2106
        SensitiveCond state;
2107
        gboolean sensitive;
2108
        GtkWidget *menu;
2109
        GtkWidget *menuitem;
2110
        FolderItem *item;
2111
        gchar *menu_path;
2112
        gint i;
2113
        GList *cur_item;
2114
2115
        static const struct {
2116
                gchar *const entry;
2117
                SensitiveCond cond;
2118
        } entry[] = {
2119
                {"/File/Folder/Create new folder...", M_UNLOCKED|M_FOLDER_NEWOK},
2120
                {"/File/Folder/Rename folder..."    , M_UNLOCKED|M_FOLDER_RENOK},
2121
                {"/File/Folder/Move folder..."      , M_UNLOCKED|M_FOLDER_MOVEOK},
2122
                {"/File/Folder/Delete folder"       , M_UNLOCKED|M_FOLDER_DELOK},
2123
                {"/File/Mailbox/Add mailbox..."     , M_UNLOCKED|M_MBOX_ADDOK},
2124
                {"/File/Mailbox/Remove mailbox"     , M_UNLOCKED|M_MBOX_RMOK},
2125
                {"/File/Mailbox/Check for new messages"
2126
                                                    , M_UNLOCKED|M_MBOX_CHKOK},
2127
                {"/File/Mailbox/Check for new messages in all mailboxes"
2128
                                                    , M_UNLOCKED|M_MBOX_CHKALLOK},
2129
                {"/File/Mailbox/Rebuild folder tree", M_UNLOCKED|M_MBOX_REBUILDOK},
2130
                {"/File/Import mail data..."        , M_UNLOCKED},
2131
                {"/File/Export mail data..."        , M_UNLOCKED},
2132
                {"/File/Empty all trash"            , M_UNLOCKED},
2133
2134
                {"/File/Save as..."  , M_SINGLE_TARGET_EXIST},
2135
                {"/File/Print..."    , M_TARGET_EXIST},
2136
                {"/File/Work offline", M_UNLOCKED},
2137
                /* {"/File/Close"    , M_UNLOCKED}, */
2138
                {"/File/Exit"        , M_UNLOCKED},
2139
2140
                {"/Edit/Select thread"             , M_SINGLE_TARGET_EXIST},
2141
2142
                {"/View/Sort"                      , M_EXEC},
2143
                {"/View/Thread view"               , M_EXEC},
2144
                {"/View/Expand all threads"        , M_MSG_EXIST},
2145
                {"/View/Collapse all threads"      , M_MSG_EXIST},
2146
                {"/View/Go to/Prev message"        , M_MSG_EXIST},
2147
                {"/View/Go to/Next message"        , M_MSG_EXIST},
2148
                {"/View/Go to/Prev unread message" , M_MSG_EXIST},
2149
                {"/View/Go to/Next unread message" , M_MSG_EXIST},
2150
                {"/View/Go to/Prev new message"    , M_MSG_EXIST},
2151
                {"/View/Go to/Next new message"    , M_MSG_EXIST},
2152
                {"/View/Go to/Prev marked message" , M_MSG_EXIST},
2153
                {"/View/Go to/Next marked message" , M_MSG_EXIST},
2154
                {"/View/Go to/Prev labeled message", M_MSG_EXIST},
2155
                {"/View/Go to/Next labeled message", M_MSG_EXIST},
2156
                {"/View/Open in new window"        , M_SINGLE_TARGET_EXIST},
2157
                {"/View/All headers"          , M_SINGLE_TARGET_EXIST},
2158
                {"/View/Message source"            , M_SINGLE_TARGET_EXIST},
2159
2160
                {"/Message/Receive/Get from current account"
2161
                                                 , M_HAVE_ACCOUNT|M_UNLOCKED},
2162
                {"/Message/Receive/Get from all accounts"
2163
                                                 , M_HAVE_ACCOUNT|M_UNLOCKED},
2164
                {"/Message/Receive/Stop receiving"
2165
                                                 , M_INC_ACTIVE},
2166
                {"/Message/Receive/Remote mailbox..."
2167
                                                 , M_HAVE_ACCOUNT|M_UNLOCKED|M_POP3_ACCOUNT},
2168
                {"/Message/Send queued messages" , M_HAVE_ACCOUNT|M_HAVE_QUEUED_MSG},
2169
2170
                {"/Message/Compose new message"  , M_HAVE_ACCOUNT},
2171
                {"/Message/Reply"                , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
2172
                {"/Message/Reply to"             , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
2173
                {"/Message/Forward"              , M_HAVE_ACCOUNT|M_TARGET_EXIST},
2174
                {"/Message/Forward as attachment", M_HAVE_ACCOUNT|M_TARGET_EXIST},
2175
                {"/Message/Redirect"             , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
2176
                {"/Message/Move..."              , M_TARGET_EXIST|M_ALLOW_DELETE},
2177
                {"/Message/Copy..."              , M_TARGET_EXIST|M_EXEC},
2178
                {"/Message/Delete"               , M_TARGET_EXIST|M_ALLOW_DELETE},
2179
                {"/Message/Mark"                 , M_TARGET_EXIST},
2180
                {"/Message/Set as junk mail"     , M_TARGET_EXIST|M_ALLOW_DELETE|M_ENABLE_JUNK},
2181
                {"/Message/Set as not junk mail" , M_TARGET_EXIST|M_ALLOW_DELETE|M_ENABLE_JUNK},
2182
                {"/Message/Re-edit"              , M_HAVE_ACCOUNT|M_ALLOW_REEDIT},
2183
2184
                {"/Tools/Add sender to address book...", M_SINGLE_TARGET_EXIST},
2185
                {"/Tools/Filter all messages in folder", M_MSG_EXIST|M_EXEC},
2186
                {"/Tools/Filter selected messages"     , M_TARGET_EXIST|M_EXEC},
2187
                {"/Tools/Create filter rule"           , M_SINGLE_TARGET_EXIST|M_UNLOCKED},
2188
                {"/Tools/Filter junk mails in folder"  , M_MSG_EXIST|M_EXEC|M_ENABLE_JUNK},
2189
                {"/Tools/Filter junk mails in selected messages", M_TARGET_EXIST|M_EXEC|M_ENABLE_JUNK},
2190
#ifndef G_OS_WIN32
2191
                {"/Tools/Actions"                      , M_TARGET_EXIST|M_UNLOCKED},
2192
#endif
2193
                {"/Tools/Execute marked process"       , M_MSG_EXIST|M_EXEC},
2194
                {"/Tools/Delete duplicated messages"   , M_MSG_EXIST|M_ALLOW_DELETE},
2195
                {"/Tools/Concatenate separated messages"
2196
                                                       , M_TARGET_EXIST|M_UNLOCKED|M_ALLOW_DELETE},
2197
2198
                {"/Configuration/Common preferences...", M_UNLOCKED},
2199
                {"/Configuration/Filter settings...", M_UNLOCKED},
2200
                {"/Configuration/Preferences for current account...", M_UNLOCKED},
2201
                {"/Configuration/Create new account...", M_UNLOCKED},
2202
                {"/Configuration/Edit accounts...", M_UNLOCKED},
2203
                {"/Configuration/Change current account", M_UNLOCKED},
2204
2205
                {NULL, 0}
2206
        };
2207
2208
        state = main_window_get_current_state(mainwin);
2209
2210
        for (i = 0; entry[i].entry != NULL; i++) {
2211
                sensitive = ((entry[i].cond & state) == entry[i].cond);
2212
                menu_set_sensitive(ifactory, entry[i].entry, sensitive);
2213
        }
2214
2215
        menu = gtk_item_factory_get_widget(ifactory, "/Message/Receive");
2216
2217
        /* search for separator */
2218
        for (cur_item = GTK_MENU_SHELL(menu)->children; cur_item != NULL;
2219
             cur_item = cur_item->next) {
2220
                if (GTK_BIN(cur_item->data)->child == NULL) {
2221
                        cur_item = cur_item->next;
2222
                        break;
2223
                }
2224
        }
2225
2226
        for (; cur_item != NULL; cur_item = cur_item->next) {
2227
                gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
2228
                                         (M_UNLOCKED & state) != 0);
2229
        }
2230
2231
        main_window_menu_callback_block(mainwin);
2232
2233
#define SET_CHECK_MENU_ACTIVE(path, active) \
2234
{ \
2235
        menuitem = gtk_item_factory_get_widget(ifactory, path); \
2236
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), active); \
2237
}
2238
2239
        SET_CHECK_MENU_ACTIVE("/View/Show or hide/Message view",
2240
                              messageview_is_visible(mainwin->messageview));
2241
2242
        item = mainwin->summaryview->folder_item;
2243
        menu_path = "/View/Sort/Don't sort";
2244
        if (item) {
2245
                switch (item->sort_key) {
2246
                case SORT_BY_NUMBER:
2247
                        menu_path = "/View/Sort/by number"; break;
2248
                case SORT_BY_SIZE:
2249
                        menu_path = "/View/Sort/by size"; break;
2250
                case SORT_BY_DATE:
2251
                        menu_path = "/View/Sort/by date"; break;
2252
                case SORT_BY_TDATE:
2253
                        menu_path = "/View/Sort/by thread date"; break;
2254
                case SORT_BY_FROM:
2255
                        menu_path = "/View/Sort/by from"; break;
2256
                case SORT_BY_TO:
2257
                        menu_path = "/View/Sort/by recipient"; break;
2258
                case SORT_BY_SUBJECT:
2259
                        menu_path = "/View/Sort/by subject"; break;
2260
                case SORT_BY_LABEL:
2261
                        menu_path = "/View/Sort/by color label"; break;
2262
                case SORT_BY_MARK:
2263
                        menu_path = "/View/Sort/by mark"; break;
2264
                case SORT_BY_UNREAD:
2265
                        menu_path = "/View/Sort/by unread"; break;
2266
                case SORT_BY_MIME:
2267
                        menu_path = "/View/Sort/by attachment"; break;
2268
                case SORT_BY_NONE:
2269
                default:
2270
                        menu_path = "/View/Sort/Don't sort"; break;
2271
                }
2272
        }
2273
        SET_CHECK_MENU_ACTIVE(menu_path, TRUE);
2274
2275
        if (!item || item->sort_type == SORT_ASCENDING) {
2276
                SET_CHECK_MENU_ACTIVE("/View/Sort/Ascending", TRUE);
2277
        } else {
2278
                SET_CHECK_MENU_ACTIVE("/View/Sort/Descending", TRUE);
2279
        }
2280
2281
        if (item && item->sort_key != SORT_BY_NONE) {
2282
                menu_set_sensitive(ifactory, "/View/Sort/Ascending", TRUE);
2283
                menu_set_sensitive(ifactory, "/View/Sort/Descending", TRUE);
2284
                menu_set_sensitive(ifactory, "/View/Sort/Attract by subject",
2285
                                   FALSE);
2286
        } else {
2287
                menu_set_sensitive(ifactory, "/View/Sort/Ascending", FALSE);
2288
                menu_set_sensitive(ifactory, "/View/Sort/Descending", FALSE);
2289
                menu_set_sensitive(ifactory, "/View/Sort/Attract by subject",
2290
                                   (item != NULL));
2291
        }
2292
2293
        SET_CHECK_MENU_ACTIVE("/View/All headers",
2294
                              mainwin->messageview->textview->show_all_headers);
2295
        SET_CHECK_MENU_ACTIVE("/View/Thread view", (state & M_THREADED) != 0);
2296
2297
#undef SET_CHECK_MENU_ACTIVE
2298
2299
        main_window_menu_callback_unblock(mainwin);
2300
}
2301
2302
void main_window_popup(MainWindow *mainwin)
2303
{
2304
        gtkut_window_popup(mainwin->window);
2305
2306
        switch (mainwin->type) {
2307
        case SEPARATE_FOLDER:
2308
                if (prefs_common.folderview_visible)
2309
                        gtkut_window_popup(mainwin->win.sep_folder.folderwin);
2310
                break;
2311
        case SEPARATE_MESSAGE:
2312
                if (messageview_is_visible(mainwin->messageview))
2313
                        gtkut_window_popup(mainwin->win.sep_message.messagewin);
2314
                break;
2315
        case SEPARATE_BOTH:
2316
                if (prefs_common.folderview_visible)
2317
                        gtkut_window_popup(mainwin->win.sep_both.folderwin);
2318
                if (messageview_is_visible(mainwin->messageview))
2319
                        gtkut_window_popup(mainwin->win.sep_both.messagewin);
2320
                break;
2321
        default:
2322
                break;
2323
        }
2324
}
2325
2326
static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout,
2327
                                    SeparateType type)
2328
{
2329
        GtkWidget *folderwin = NULL;
2330
        GtkWidget *messagewin = NULL;
2331
        GtkWidget *hpaned;
2332
        GtkWidget *vpaned;
2333
        GtkWidget *vbox_body = mainwin->vbox_body;
2334
        GtkWidget *vbox_summary;
2335
        GtkItemFactory *ifactory = mainwin->menu_factory;
2336
        GtkWidget *menuitem;
2337
        gboolean use_vlayout = (layout == LAYOUT_VERTICAL);
2338
2339
        debug_print("Setting main window widgets...\n");
2340
2341
        gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
2342
                                    prefs_common.folderview_width,
2343
                                    prefs_common.folderview_height);
2344
        if (use_vlayout) {
2345
                gtk_widget_set_size_request
2346
                        (GTK_WIDGET_PTR(mainwin->summaryview),
2347
                         prefs_common.summaryview_vwidth,
2348
                         prefs_common.summaryview_vheight);
2349
                gtk_widget_set_size_request
2350
                        (GTK_WIDGET_PTR(mainwin->messageview),
2351
                         prefs_common.msgview_vwidth,
2352
                         prefs_common.msgview_vheight);
2353
        } else {
2354
                gtk_widget_set_size_request
2355
                        (GTK_WIDGET_PTR(mainwin->summaryview),
2356
                         prefs_common.summaryview_width,
2357
                         prefs_common.summaryview_height);
2358
                gtk_widget_set_size_request
2359
                        (GTK_WIDGET_PTR(mainwin->messageview),
2360
                         prefs_common.msgview_width,
2361
                         prefs_common.msgview_height);
2362
        }
2363
2364
        /* create separated window(s) if needed */
2365
        if (type & SEPARATE_FOLDER) {
2366
                folderwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
2367
                gtk_window_set_title(GTK_WINDOW(folderwin),
2368
                                     _("Sylpheed - Folder View"));
2369
                gtk_window_set_wmclass(GTK_WINDOW(folderwin),
2370
                                       "folder_view", "Sylpheed");
2371
                gtk_window_set_policy(GTK_WINDOW(folderwin),
2372
                                      TRUE, TRUE, FALSE);
2373
                gtkut_window_move(GTK_WINDOW(folderwin),
2374
                                  prefs_common.folderwin_x,
2375
                                  prefs_common.folderwin_y);
2376
                gtk_container_set_border_width(GTK_CONTAINER(folderwin), 0);
2377
                g_signal_connect(G_OBJECT(folderwin), "delete_event",
2378
                                 G_CALLBACK(folder_window_close_cb), mainwin);
2379
                gtk_container_add(GTK_CONTAINER(folderwin),
2380
                                  GTK_WIDGET_PTR(mainwin->folderview));
2381
                gtk_widget_realize(folderwin);
2382
                if (prefs_common.folderview_visible)
2383
                        gtk_widget_show(folderwin);
2384
        }
2385
        if (type & SEPARATE_MESSAGE) {
2386
                messagewin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
2387
                gtk_window_set_title(GTK_WINDOW(messagewin),
2388
                                     _("Sylpheed - Message View"));
2389
                gtk_window_set_wmclass(GTK_WINDOW(messagewin),
2390
                                       "message_view", "Sylpheed");
2391
                gtk_window_set_policy(GTK_WINDOW(messagewin),
2392
                                      TRUE, TRUE, FALSE);
2393
                gtkut_window_move(GTK_WINDOW(messagewin),
2394
                                  prefs_common.main_msgwin_x,
2395
                                  prefs_common.main_msgwin_y);
2396
                gtk_container_set_border_width(GTK_CONTAINER(messagewin), 0);
2397
                g_signal_connect(G_OBJECT(messagewin), "delete_event",
2398
                                 G_CALLBACK(message_window_close_cb), mainwin);
2399
                gtk_container_add(GTK_CONTAINER(messagewin),
2400
                                  GTK_WIDGET_PTR(mainwin->messageview));
2401
                gtk_widget_realize(messagewin);
2402
                if (messageview_is_visible(mainwin->messageview))
2403
                        gtk_widget_show(messagewin);
2404
        }
2405
2406
        vbox_summary = gtk_vbox_new(FALSE, 1);
2407
        gtk_box_pack_start(GTK_BOX(vbox_summary),
2408
                           GTK_WIDGET_PTR(mainwin->summaryview->qsearch),
2409
                           FALSE, FALSE, 0);
2410
        gtk_widget_show(vbox_summary);
2411
2412
        switch (type) {
2413
        case SEPARATE_NONE:
2414
                hpaned = gtk_hpaned_new();
2415
                gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
2416
                gtk_paned_add1(GTK_PANED(hpaned),
2417
                               GTK_WIDGET_PTR(mainwin->folderview));
2418
                gtk_paned_add2(GTK_PANED(hpaned), vbox_summary);
2419
                gtk_widget_show(hpaned);
2420
                gtk_widget_queue_resize(hpaned);
2421
2422
                if (use_vlayout) {
2423
                        vpaned = gtk_hpaned_new();
2424
                        gtk_widget_hide(mainwin->summaryview->hseparator);
2425
                } else
2426
                        vpaned = gtk_vpaned_new();
2427
                if (messageview_is_visible(mainwin->messageview)) {
2428
                        gtk_paned_add1(GTK_PANED(vpaned),
2429
                                       GTK_WIDGET_PTR(mainwin->summaryview));
2430
                        gtk_box_pack_start(GTK_BOX(vbox_summary), vpaned,
2431
                                           TRUE, TRUE, 0);
2432
                        if (!use_vlayout)
2433
                                gtk_widget_show
2434
                                        (mainwin->summaryview->hseparator);
2435
                } else {
2436
                        gtk_box_pack_start(GTK_BOX(vbox_summary),
2437
                                           GTK_WIDGET_PTR(mainwin->summaryview),
2438
                                           TRUE, TRUE, 0);
2439
                        gtk_widget_ref(vpaned);
2440
                        gtk_widget_hide(mainwin->summaryview->hseparator);
2441
                }
2442
                gtk_paned_add2(GTK_PANED(vpaned),
2443
                               GTK_WIDGET_PTR(mainwin->messageview));
2444
                gtk_widget_show(vpaned);
2445
                gtk_widget_queue_resize(vpaned);
2446
2447
                mainwin->win.sep_none.hpaned = hpaned;
2448
                mainwin->win.sep_none.vpaned = vpaned;
2449
2450
                break;
2451
        case SEPARATE_FOLDER:
2452
                gtk_box_pack_start(GTK_BOX(vbox_body), vbox_summary,
2453
                                   TRUE, TRUE, 0);
2454
2455
                if (use_vlayout) {
2456
                        vpaned = gtk_hpaned_new();
2457
                        gtk_widget_hide(mainwin->summaryview->hseparator);
2458
                } else
2459
                        vpaned = gtk_vpaned_new();
2460
                if (messageview_is_visible(mainwin->messageview)) {
2461
                        gtk_paned_add1(GTK_PANED(vpaned),
2462
                                       GTK_WIDGET_PTR(mainwin->summaryview));
2463
                        gtk_box_pack_start(GTK_BOX(vbox_summary), vpaned,
2464
                                           TRUE, TRUE, 0);
2465
                        if (!use_vlayout)
2466
                                gtk_widget_show
2467
                                        (mainwin->summaryview->hseparator);
2468
                } else {
2469
                        gtk_box_pack_start(GTK_BOX(vbox_summary),
2470
                                           GTK_WIDGET_PTR(mainwin->summaryview),
2471
                                           TRUE, TRUE, 0);
2472
                        gtk_widget_ref(vpaned);
2473
                        gtk_widget_hide(mainwin->summaryview->hseparator);
2474
                }
2475
                gtk_paned_add2(GTK_PANED(vpaned),
2476
                               GTK_WIDGET_PTR(mainwin->messageview));
2477
                gtk_widget_show(vpaned);
2478
                gtk_widget_queue_resize(vpaned);
2479
2480
                mainwin->win.sep_folder.folderwin = folderwin;
2481
                mainwin->win.sep_folder.vpaned    = vpaned;
2482
2483
                break;
2484
        case SEPARATE_MESSAGE:
2485
                hpaned = gtk_hpaned_new();
2486
                gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
2487
                gtk_paned_add1(GTK_PANED(hpaned),
2488
                               GTK_WIDGET_PTR(mainwin->folderview));
2489
                gtk_paned_add2(GTK_PANED(hpaned), vbox_summary);
2490
                gtk_box_pack_start(GTK_BOX(vbox_summary),
2491
                                   GTK_WIDGET_PTR(mainwin->summaryview),
2492
                                   TRUE, TRUE, 0);
2493
                gtk_widget_hide(mainwin->summaryview->hseparator);
2494
                gtk_widget_show(hpaned);
2495
                gtk_widget_queue_resize(hpaned);
2496
2497
                mainwin->win.sep_message.messagewin = messagewin;
2498
                mainwin->win.sep_message.hpaned     = hpaned;
2499
2500
                break;
2501
        case SEPARATE_BOTH:
2502
                gtk_box_pack_start(GTK_BOX(vbox_body), vbox_summary,
2503
                                   TRUE, TRUE, 0);
2504
                gtk_box_pack_start(GTK_BOX(vbox_summary),
2505
                                   GTK_WIDGET_PTR(mainwin->summaryview),
2506
                                   TRUE, TRUE, 0);
2507
                gtk_widget_hide(mainwin->summaryview->hseparator);
2508
2509
                mainwin->win.sep_both.folderwin = folderwin;
2510
                mainwin->win.sep_both.messagewin = messagewin;
2511
2512
                break;
2513
        }
2514
2515
        if (messageview_is_visible(mainwin->messageview))
2516
                gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2517
                              use_vlayout ? GTK_ARROW_RIGHT : GTK_ARROW_DOWN,
2518
                              GTK_SHADOW_OUT);
2519
        else
2520
                gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2521
                              use_vlayout ? GTK_ARROW_LEFT : GTK_ARROW_UP,
2522
                              GTK_SHADOW_OUT);
2523
2524
        gtkut_window_move(GTK_WINDOW(mainwin->window), 
2525
                          prefs_common.mainwin_x, prefs_common.mainwin_y);
2526
2527
        gtk_widget_queue_resize(vbox_body);
2528
        gtk_widget_queue_resize(mainwin->vbox);
2529
        gtk_widget_queue_resize(mainwin->window);
2530
2531
        mainwin->type = type;
2532
        prefs_common.layout_type = layout;
2533
2534
        /* toggle menu state */
2535
        menuitem = gtk_item_factory_get_item
2536
                (ifactory, "/View/Show or hide/Folder tree");
2537
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2538
                                       (type & SEPARATE_FOLDER) == 0 ? TRUE :
2539
                                       prefs_common.folderview_visible);
2540
        gtk_widget_set_sensitive(menuitem, ((type & SEPARATE_FOLDER) != 0));
2541
        menuitem = gtk_item_factory_get_item
2542
                (ifactory, "/View/Show or hide/Message view");
2543
        gtk_check_menu_item_set_active
2544
                (GTK_CHECK_MENU_ITEM(menuitem),
2545
                 messageview_is_visible(mainwin->messageview));
2546
2547
        if (layout == LAYOUT_NORMAL) {
2548
                menuitem = gtk_item_factory_get_item
2549
                        (ifactory, "/View/Layout/Normal");
2550
                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2551
                                               TRUE);
2552
        } else if (layout == LAYOUT_VERTICAL) {
2553
                menuitem = gtk_item_factory_get_item
2554
                        (ifactory, "/View/Layout/Vertical");
2555
                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2556
                                               TRUE);
2557
        }
2558
2559
        menuitem = gtk_item_factory_get_item
2560
                (ifactory, "/View/Separate folder tree");
2561
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2562
                                       ((type & SEPARATE_FOLDER) != 0));
2563
        menuitem = gtk_item_factory_get_item
2564
                (ifactory, "/View/Separate message view");
2565
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2566
                                       ((type & SEPARATE_MESSAGE) != 0));
2567
2568
        if (folderwin) {
2569
                g_signal_connect
2570
                        (G_OBJECT(folderwin), "size_allocate",
2571
                         G_CALLBACK(folder_window_size_allocate_cb), mainwin);
2572
        }
2573
        if (messagewin) {
2574
                g_signal_connect
2575
                        (G_OBJECT(messagewin), "size_allocate",
2576
                         G_CALLBACK(message_window_size_allocate_cb), mainwin);
2577
        }
2578
2579
        debug_print("done.\n");
2580
}
2581
2582
static GtkItemFactoryEntry reply_entries[] =
2583
{
2584
        {N_("/_Reply"),                        NULL, reply_cb, COMPOSE_REPLY, NULL},
2585
        {N_("/Reply to _all"),                NULL, reply_cb, COMPOSE_REPLY_TO_ALL, NULL},
2586
        {N_("/Reply to _sender"),        NULL, reply_cb, COMPOSE_REPLY_TO_SENDER, NULL},
2587
        {N_("/Reply to mailing _list"),        NULL, reply_cb, COMPOSE_REPLY_TO_LIST, NULL}
2588
};
2589
2590
static GtkItemFactoryEntry forward_entries[] =
2591
{
2592
        {N_("/_Forward"),                NULL, reply_cb, COMPOSE_FORWARD, NULL},
2593
        {N_("/For_ward as attachment"), NULL, reply_cb, COMPOSE_FORWARD_AS_ATTACH, NULL},
2594
        {N_("/Redirec_t"),                NULL, reply_cb, COMPOSE_REDIRECT, NULL}
2595
};
2596
2597
static PrefsToolbarItem items[] =
2598
{
2599
        {T_GET,                        TRUE,        toolbar_inc_cb},
2600
        {T_GET_ALL,                TRUE,        toolbar_inc_all_cb},
2601
        {T_SEND_QUEUE,                TRUE,        toolbar_send_cb},
2602
        {T_COMPOSE,                TRUE,        toolbar_compose_cb},
2603
        {T_REPLY,                TRUE,        toolbar_reply_cb},
2604
        {T_REPLY_ALL,                TRUE,        toolbar_reply_to_all_cb},
2605
        {T_FORWARD,                TRUE,        toolbar_forward_cb},
2606
        {T_DELETE,                FALSE,        toolbar_delete_cb},
2607
        {T_JUNK,                TRUE,        toolbar_junk_cb},
2608
        {T_NOTJUNK,                FALSE,        toolbar_notjunk_cb},
2609
        {T_NEXT,                FALSE,        toolbar_next_unread_cb},
2610
        {T_PREV,                FALSE,        toolbar_prev_unread_cb},
2611
        {T_SEARCH,                FALSE,        toolbar_search_cb},
2612
        {T_PRINT,                FALSE,        toolbar_print_cb},
2613
        {T_STOP,                FALSE,        toolbar_stop_cb},
2614
        {T_ADDRESS_BOOK,        FALSE,        toolbar_address_cb},
2615
        {T_EXECUTE,                FALSE,        toolbar_exec_cb},
2616
        {T_COMMON_PREFS,        FALSE,        toolbar_prefs_common_cb},
2617
        {T_ACCOUNT_PREFS,        FALSE,        toolbar_prefs_account_cb},
2618
        {T_REMOTE_MAILBOX,        FALSE,        toolbar_rpop3_cb},
2619
2620
        {-1, FALSE, NULL}
2621
};
2622
2623
static GtkWidget *main_window_toolbar_create(MainWindow *mainwin)
2624
{
2625
        GtkWidget *toolbar;
2626
        const gchar *setting;
2627
        GList *item_list;
2628
2629
        if (prefs_common.main_toolbar_setting &&
2630
            *prefs_common.main_toolbar_setting != '\0')
2631
                setting = prefs_common.main_toolbar_setting;
2632
        else
2633
                setting = prefs_toolbar_get_default_main_setting_name_list();
2634
2635
        item_list = prefs_toolbar_get_item_list_from_name_list(setting);
2636
        toolbar = main_window_toolbar_create_from_list(mainwin, item_list);
2637
        g_list_free(item_list);
2638
2639
        return toolbar;
2640
}
2641
2642
static GtkWidget *main_window_toolbar_create_from_list(MainWindow *mainwin,
2643
                                                       GList *item_list)
2644
{
2645
        GtkWidget *toolbar;
2646
        GtkWidget *icon_wid;
2647
        GtkToolItem *toolitem;
2648
        GtkToolItem *comboitem;
2649
        ComboButton *combo;
2650
        gint n_entries;
2651
        gint i;
2652
        GList *cur;
2653
2654
        toolbar = gtk_toolbar_new();
2655
        gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar),
2656
                                    GTK_ORIENTATION_HORIZONTAL);
2657
        gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
2658
        g_signal_connect(G_OBJECT(toolbar), "button_press_event",
2659
                         G_CALLBACK(toolbar_button_pressed), mainwin);
2660
2661
        items[0].data = &mainwin->get_btn;
2662
        items[1].data = &mainwin->getall_btn;
2663
        items[2].data = &mainwin->send_btn;
2664
        items[3].data = &mainwin->compose_btn;
2665
        items[4].data = &mainwin->reply_btn;
2666
        items[5].data = &mainwin->replyall_btn;
2667
        items[6].data = &mainwin->fwd_btn;
2668
        items[7].data = &mainwin->delete_btn;
2669
        items[8].data = &mainwin->junk_btn;
2670
        items[9].data = &mainwin->notjunk_btn;
2671
        items[10].data = &mainwin->next_btn;
2672
        items[11].data = &mainwin->prev_btn;
2673
        items[12].data = &mainwin->search_btn;
2674
        items[13].data = &mainwin->print_btn;
2675
        items[14].data = &mainwin->stop_btn;
2676
        items[15].data = &mainwin->address_btn;
2677
        items[16].data = &mainwin->exec_btn;
2678
        items[17].data = &mainwin->prefs_common_btn;
2679
        items[18].data = &mainwin->prefs_account_btn;
2680
        items[19].data = &mainwin->rpop3_btn;
2681
        for (i = 0; i <= 19; i++)
2682
                *(GtkWidget **)items[i].data = NULL;
2683
        mainwin->reply_combo = NULL;
2684
        mainwin->fwd_combo = NULL;
2685
2686
        for (cur = item_list; cur != NULL; cur = cur->next) {
2687
                const PrefsDisplayItem *ditem = cur->data;
2688
                PrefsToolbarItem *item;
2689
                GtkTooltips *tips;
2690
                gint width;
2691
2692
                if (ditem->id == T_SEPARATOR) {
2693
                        toolitem = gtk_separator_tool_item_new();
2694
                        gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1);
2695
                        continue;
2696
                }
2697
2698
                for (item = items; item->id != -1; item++) {
2699
                        if (ditem->id == item->id)
2700
                                break;
2701
                }
2702
                if (item->id == -1)
2703
                        continue;
2704
2705
                if (ditem->stock_id) {
2706
                        icon_wid = gtk_image_new_from_stock
2707
                                (ditem->stock_id, GTK_ICON_SIZE_LARGE_TOOLBAR);
2708
                } else
2709
                        icon_wid = stock_pixbuf_widget(NULL, ditem->icon);
2710
2711
                toolitem = gtk_tool_button_new(icon_wid, gettext(ditem->label));
2712
                if (ditem->description) {
2713
                        tips = gtk_tooltips_new();
2714
                        gtk_tool_item_set_tooltip(toolitem, tips,
2715
                                                  gettext(ditem->description),
2716
                                                  ditem->name);
2717
                }
2718
2719
                gtkut_get_str_size(GTK_WIDGET(toolitem), gettext(ditem->label),
2720
                                   &width, NULL);
2721
                gtk_tool_item_set_homogeneous
2722
                        (toolitem, width < 52 ? TRUE : FALSE);
2723
                gtk_tool_item_set_is_important(toolitem, item->is_important);
2724
2725
                gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1);
2726
2727
                g_signal_connect(G_OBJECT(toolitem), "clicked",
2728
                                 G_CALLBACK(item->callback), mainwin);
2729
                g_signal_connect(G_OBJECT(GTK_BIN(toolitem)->child),
2730
                                 "button_press_event",
2731
                                 G_CALLBACK(toolbar_button_pressed), mainwin);
2732
2733
                if (ditem->id == T_REPLY) {
2734
                        n_entries = sizeof(reply_entries) /
2735
                                sizeof(reply_entries[0]);
2736
                        combo = gtkut_combo_button_create
2737
                                (GTK_WIDGET(toolitem),
2738
                                 reply_entries, n_entries, "<Reply>", mainwin);
2739
                        gtk_button_set_relief(GTK_BUTTON(combo->arrow),
2740
                                              GTK_RELIEF_NONE);
2741
2742
                        comboitem = gtk_tool_item_new();
2743
                        gtk_tool_item_set_homogeneous(comboitem, FALSE);
2744
                        gtk_container_add(GTK_CONTAINER(comboitem),
2745
                                          GTK_WIDGET_PTR(combo));
2746
                        if (ditem->description) {
2747
                                tips = gtk_tooltips_new();
2748
                                gtk_tool_item_set_tooltip
2749
                                        (comboitem, tips,
2750
                                         gettext(ditem->description),
2751
                                         ditem->name);
2752
                        }
2753
2754
                        gtk_toolbar_insert(GTK_TOOLBAR(toolbar), comboitem, -1);
2755
2756
                        mainwin->reply_combo = combo;
2757
                } else if (ditem->id == T_FORWARD) {
2758
                        n_entries = sizeof(forward_entries) /
2759
                                sizeof(forward_entries[0]);
2760
                        combo = gtkut_combo_button_create
2761
                                (GTK_WIDGET(toolitem),
2762
                                 forward_entries, n_entries, "<Forward>",
2763
                                 mainwin);
2764
                        gtk_button_set_relief(GTK_BUTTON(combo->arrow),
2765
                                              GTK_RELIEF_NONE);
2766
2767
                        comboitem = gtk_tool_item_new();
2768
                        gtk_tool_item_set_homogeneous(comboitem, FALSE);
2769
                        gtk_container_add(GTK_CONTAINER(comboitem),
2770
                                          GTK_WIDGET_PTR(combo));
2771
                        if (ditem->description) {
2772
                                tips = gtk_tooltips_new();
2773
                                gtk_tool_item_set_tooltip
2774
                                        (comboitem, tips,
2775
                                         gettext(ditem->description),
2776
                                         ditem->name);
2777
                        }
2778
2779
                        gtk_toolbar_insert(GTK_TOOLBAR(toolbar), comboitem, -1);
2780
2781
                        mainwin->fwd_combo = combo;
2782
                }
2783
2784
                *(GtkWidget **)item->data = GTK_WIDGET(toolitem);
2785
        }
2786
2787
        gtk_widget_show_all(toolbar);
2788
2789
        return toolbar;
2790
}
2791
2792
static void main_window_toolbar_toggle_menu_set_active(MainWindow *mainwin,
2793
                                                       ToolbarStyle style)
2794
{
2795
        GtkWidget *menuitem = NULL;
2796
        GtkItemFactory *ifactory = mainwin->menu_factory;
2797
2798
        switch (style) {
2799
        case TOOLBAR_NONE:
2800
                menuitem = gtk_item_factory_get_item
2801
                        (ifactory, "/View/Show or hide/Toolbar/None");
2802
                break;
2803
        case TOOLBAR_ICON:
2804
                menuitem = gtk_item_factory_get_item
2805
                        (ifactory, "/View/Show or hide/Toolbar/Icon");
2806
                break;
2807
        case TOOLBAR_TEXT:
2808
                menuitem = gtk_item_factory_get_item
2809
                        (ifactory, "/View/Show or hide/Toolbar/Text");
2810
                break;
2811
        case TOOLBAR_BOTH:
2812
                menuitem = gtk_item_factory_get_item
2813
                        (ifactory, "/View/Show or hide/Toolbar/Icon and text");
2814
                break;
2815
        case TOOLBAR_BOTH_HORIZ:
2816
                menuitem = gtk_item_factory_get_item
2817
                        (ifactory, "/View/Show or hide/Toolbar/Text at the right of icon");
2818
                break;
2819
        }
2820
2821
        if (menuitem)
2822
                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2823
                                               TRUE);
2824
}
2825
2826
/* callback functions */
2827
2828
static void toolbar_inc_cb        (GtkWidget        *widget,
2829
                                 gpointer         data)
2830
{
2831
        MainWindow *mainwin = (MainWindow *)data;
2832
2833
        inc_mail_cb(mainwin, 0, NULL);
2834
}
2835
2836
static void toolbar_inc_all_cb        (GtkWidget        *widget,
2837
                                 gpointer         data)
2838
{
2839
        MainWindow *mainwin = (MainWindow *)data;
2840
2841
        inc_all_account_mail_cb(mainwin, 0, NULL);
2842
}
2843
2844
static void toolbar_rpop3_cb        (GtkWidget        *widget,
2845
                                 gpointer         data)
2846
{
2847
        MainWindow *mainwin = (MainWindow *)data;
2848
2849
        rpop3_cb(mainwin, 0, NULL);
2850
}
2851
2852
static void toolbar_send_cb        (GtkWidget        *widget,
2853
                                 gpointer         data)
2854
{
2855
        MainWindow *mainwin = (MainWindow *)data;
2856
2857
        send_queue_cb(mainwin, 0, NULL);
2858
}
2859
2860
static void toolbar_compose_cb        (GtkWidget        *widget,
2861
                                 gpointer         data)
2862
{
2863
        MainWindow *mainwin = (MainWindow *)data;
2864
2865
        compose_cb(mainwin, 0, NULL);
2866
}
2867
2868
static void toolbar_reply_cb        (GtkWidget        *widget,
2869
                                 gpointer         data)
2870
{
2871
        MainWindow *mainwin = (MainWindow *)data;
2872
2873
        if (prefs_common.default_reply_list)
2874
                reply_cb(mainwin, COMPOSE_REPLY_TO_LIST, NULL);
2875
        else
2876
                reply_cb(mainwin, COMPOSE_REPLY, NULL);
2877
}
2878
2879
static void toolbar_reply_to_all_cb        (GtkWidget        *widget,
2880
                                         gpointer         data)
2881
{
2882
        MainWindow *mainwin = (MainWindow *)data;
2883
2884
        reply_cb(mainwin, COMPOSE_REPLY_TO_ALL, NULL);
2885
}
2886
2887
static void toolbar_forward_cb        (GtkWidget        *widget,
2888
                                 gpointer         data)
2889
{
2890
        MainWindow *mainwin = (MainWindow *)data;
2891
2892
        reply_cb(mainwin, COMPOSE_FORWARD, NULL);
2893
}
2894
2895
static void toolbar_delete_cb        (GtkWidget        *widget,
2896
                                 gpointer         data)
2897
{
2898
        MainWindow *mainwin = (MainWindow *)data;
2899
2900
        summary_delete(mainwin->summaryview);
2901
}
2902
2903
static void toolbar_junk_cb        (GtkWidget        *widget,
2904
                                 gpointer         data)
2905
{
2906
        MainWindow *mainwin = (MainWindow *)data;
2907
2908
        summary_junk(mainwin->summaryview);
2909
}
2910
2911
static void toolbar_notjunk_cb        (GtkWidget        *widget,
2912
                                 gpointer         data)
2913
{
2914
        MainWindow *mainwin = (MainWindow *)data;
2915
2916
        summary_not_junk(mainwin->summaryview);
2917
}
2918
2919
static void toolbar_exec_cb        (GtkWidget        *widget,
2920
                                 gpointer         data)
2921
{
2922
        MainWindow *mainwin = (MainWindow *)data;
2923
2924
        summary_execute(mainwin->summaryview);
2925
}
2926
2927
static void toolbar_next_unread_cb        (GtkWidget        *widget,
2928
                                         gpointer         data)
2929
{
2930
        MainWindow *mainwin = (MainWindow *)data;
2931
2932
        next_unread_cb(mainwin, 0, NULL);
2933
}
2934
2935
static void toolbar_prev_unread_cb(GtkWidget *widget, gpointer data)
2936
{
2937
        MainWindow *mainwin = (MainWindow *)data;
2938
2939
        prev_unread_cb(mainwin, 0, NULL);
2940
}
2941
2942
static void toolbar_address_cb(GtkWidget *widget, gpointer data)
2943
{
2944
        MainWindow *mainwin = (MainWindow *)data;
2945
2946
        addressbook_open_cb(mainwin, 0, NULL);
2947
}
2948
2949
static void toolbar_search_cb(GtkWidget *widget, gpointer data)
2950
{
2951
        MainWindow *mainwin = (MainWindow *)data;
2952
2953
        search_cb(mainwin, 1, NULL);
2954
}
2955
2956
static void toolbar_print_cb(GtkWidget *widget, gpointer data)
2957
{
2958
        MainWindow *mainwin = (MainWindow *)data;
2959
2960
        print_cb(mainwin, 0, NULL);
2961
}
2962
2963
static void toolbar_stop_cb(GtkWidget *widget, gpointer data)
2964
{
2965
        MainWindow *mainwin = (MainWindow *)data;
2966
2967
        inc_stop_cb(mainwin, 0, NULL);
2968
}
2969
2970
static void toolbar_prefs_common_cb(GtkWidget *widget, gpointer data)
2971
{
2972
        MainWindow *mainwin = (MainWindow *)data;
2973
2974
        prefs_common_open_cb(mainwin, 0, NULL);
2975
}
2976
2977
static void toolbar_prefs_account_cb(GtkWidget *widget, gpointer data)
2978
{
2979
        MainWindow *mainwin = (MainWindow *)data;
2980
2981
        prefs_account_open_cb(mainwin, 0, NULL);
2982
}
2983
2984
static void toolbar_toggle(GtkWidget *widget, gpointer data)
2985
{
2986
        MainWindow *mainwin = (MainWindow *)data;
2987
        ToolbarStyle style;
2988
2989
        if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)))
2990
                return;
2991
2992
        style = (ToolbarStyle)g_object_get_data(G_OBJECT(widget), MENU_VAL_ID);
2993
        main_window_toolbar_toggle_menu_set_active(mainwin, style);
2994
}
2995
2996
static void toolbar_customize(GtkWidget *widget, gpointer data)
2997
{
2998
        MainWindow *mainwin = (MainWindow *)data;
2999
        gint *visible_items;
3000
        GList *item_list = NULL;
3001
        GtkWidget *toolbar;
3002
        gint ret;
3003
        const gchar *setting;
3004
3005
        if (prefs_common.main_toolbar_setting &&
3006
            *prefs_common.main_toolbar_setting != '\0')
3007
                setting = prefs_common.main_toolbar_setting;
3008
        else
3009
                setting = prefs_toolbar_get_default_main_setting_name_list();
3010
        visible_items = prefs_toolbar_get_id_list_from_name_list(setting);
3011
        ret = prefs_toolbar_open(TOOLBAR_MAIN, visible_items, &item_list);
3012
        g_free(visible_items);
3013
3014
        if (ret == 0) {
3015
                gtk_widget_destroy(mainwin->toolbar);
3016
                toolbar = main_window_toolbar_create_from_list(mainwin,
3017
                                                               item_list);
3018
                gtk_widget_set_size_request(toolbar, 300, -1);
3019
                gtk_box_pack_start(GTK_BOX(mainwin->vbox), toolbar,
3020
                                   FALSE, FALSE, 0);
3021
                gtk_box_reorder_child(GTK_BOX(mainwin->vbox), toolbar, 1);
3022
                mainwin->toolbar = toolbar;
3023
                main_window_set_toolbar_sensitive(mainwin);
3024
                main_window_set_toolbar_button_visibility(mainwin);
3025
                g_free(prefs_common.main_toolbar_setting);
3026
                prefs_common.main_toolbar_setting =
3027
                        prefs_toolbar_get_name_list_from_item_list(item_list);
3028
                g_list_free(item_list);
3029
                prefs_common_write_config();
3030
        }
3031
}
3032
3033
static gboolean toolbar_button_pressed(GtkWidget *widget, GdkEventButton *event,
3034
                                       gpointer data)
3035
{
3036
        MainWindow *mainwin = (MainWindow *)data;
3037
        GtkWidget *menu;
3038
        GtkWidget *menuitem;
3039
3040
        if (!event) return FALSE;
3041
        if (event->button != 3) return FALSE;
3042
3043
        menu = gtk_menu_new();
3044
        gtk_widget_show(menu);
3045
3046
#define SET_TOOLBAR_MENU(text, style, widget)                                \
3047
{                                                                        \
3048
        MENUITEM_ADD_RADIO(menu, menuitem, widget, text, style);        \
3049
        if (prefs_common.toolbar_style == style)                        \
3050
                gtk_check_menu_item_set_active                                \
3051
                        (GTK_CHECK_MENU_ITEM(menuitem), TRUE);                \
3052
        g_signal_connect(G_OBJECT(menuitem), "activate",                \
3053
                         G_CALLBACK(toolbar_toggle), mainwin);                \
3054
}
3055
3056
        SET_TOOLBAR_MENU(_("Icon _and text"), TOOLBAR_BOTH, NULL);
3057
        SET_TOOLBAR_MENU(_("Text at the _right of icon"), TOOLBAR_BOTH_HORIZ,
3058
                         menuitem);
3059
        SET_TOOLBAR_MENU(_("_Icon"), TOOLBAR_ICON, menuitem);
3060
        SET_TOOLBAR_MENU(_("_Text"), TOOLBAR_TEXT, menuitem);
3061
        SET_TOOLBAR_MENU(_("_None"), TOOLBAR_NONE, menuitem);
3062
        MENUITEM_ADD(menu, menuitem, NULL, NULL);
3063
        MENUITEM_ADD_WITH_MNEMONIC(menu, menuitem, _("_Customize toolbar..."),
3064
                                   0);
3065
        g_signal_connect(G_OBJECT(menuitem), "activate",
3066
                         G_CALLBACK(toolbar_customize), mainwin);
3067
3068
        g_signal_connect(G_OBJECT(menu), "selection_done",
3069
                         G_CALLBACK(gtk_widget_destroy), NULL);
3070
3071
        gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
3072
                       event->button, event->time);
3073
3074
        return TRUE;
3075
}
3076
3077
static void online_switch_clicked(GtkWidget *widget, gpointer data)
3078
{
3079
        MainWindow *mainwin = (MainWindow *)data;
3080
        GtkWidget *menuitem;
3081
3082
        debug_print("Toggle online mode: %d -> %d\n", prefs_common.online_mode,
3083
                    !prefs_common.online_mode);
3084
3085
        menuitem = gtk_item_factory_get_item(mainwin->menu_factory,
3086
                                             "/File/Work offline");
3087
3088
        if (prefs_common.online_mode == TRUE) {
3089
                if (folder_remote_folder_active_session_exist()) {
3090
                        debug_print("Active session exist. Cancelling online switch.\n");
3091
                        return;
3092
                }
3093
3094
                prefs_common.online_mode = FALSE;
3095
                gtk_widget_hide(mainwin->online_pixmap);
3096
                gtk_widget_show(mainwin->offline_pixmap);
3097
                gtk_tooltips_set_tip
3098
                        (mainwin->online_tip, mainwin->online_switch,
3099
                         _("You are offline. Click the icon to go online."),
3100
                         NULL);
3101
                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
3102
                                               TRUE);
3103
                inc_autocheck_timer_remove();
3104
                folder_remote_folder_destroy_all_sessions();
3105
        } else {
3106
                prefs_common.online_mode = TRUE;
3107
                gtk_widget_hide(mainwin->offline_pixmap);
3108
                gtk_widget_show(mainwin->online_pixmap);
3109
                gtk_tooltips_set_tip
3110
                        (mainwin->online_tip, mainwin->online_switch,
3111
                         _("You are online. Click the icon to go offline."),
3112
                         NULL);
3113
                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
3114
                                               FALSE);
3115
                inc_autocheck_timer_set();
3116
        }
3117
}
3118
3119
static gboolean ac_label_button_pressed(GtkWidget *widget,
3120
                                        GdkEventButton *event, gpointer data)
3121
{
3122
        MainWindow *mainwin = (MainWindow *)data;
3123
3124
        if (!event) return FALSE;
3125
3126
        gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
3127
        g_object_set_data(G_OBJECT(mainwin->ac_menu), "menu_button", widget);
3128
3129
        gtk_menu_popup(GTK_MENU(mainwin->ac_menu), NULL, NULL,
3130
                       menu_button_position, widget,
3131
                       event->button, event->time);
3132
3133
        return TRUE;
3134
}
3135
3136
static void ac_menu_popup_closed(GtkMenuShell *menu_shell, gpointer data)
3137
{
3138
        MainWindow *mainwin = (MainWindow *)data;
3139
        GtkWidget *button;
3140
3141
        button = g_object_get_data(G_OBJECT(menu_shell), "menu_button");
3142
        if (!button) return;
3143
        gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
3144
        g_object_set_data(G_OBJECT(mainwin->ac_menu), "menu_button", NULL);
3145
        manage_window_focus_in(mainwin->window, NULL, NULL);
3146
}
3147
3148
static gboolean main_window_key_pressed(GtkWidget *widget, GdkEventKey *event,
3149
                                        gpointer data)
3150
{
3151
        MainWindow *mainwin = (MainWindow *)data;
3152
3153
        if (!mainwin)
3154
                return FALSE;
3155
3156
        if (!GTK_WIDGET_HAS_FOCUS(mainwin->summaryview->qsearch->entry))
3157
                return FALSE;
3158
3159
        /* g_print("keyval: %d, state: %d\n", event->keyval, event->state); */
3160
        if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0)
3161
                return FALSE;
3162
        if (event->keyval == GDK_Tab || event->keyval == GDK_KP_Tab ||
3163
            event->keyval == GDK_ISO_Left_Tab)
3164
                return FALSE;
3165
3166
        gtk_window_propagate_key_event(GTK_WINDOW(widget), event);
3167
3168
        return TRUE;
3169
}
3170
3171
static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3172
                                 gpointer data)
3173
{
3174
        MainWindow *mainwin = (MainWindow *)data;
3175
3176
        if (mainwin->lock_count == 0)
3177
                app_exit_cb(data, 0, widget);
3178
3179
        return TRUE;
3180
}
3181
3182
static gint folder_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3183
                                   gpointer data)
3184
{
3185
        MainWindow *mainwin = (MainWindow *)data;
3186
        GtkWidget *menuitem;
3187
3188
        menuitem = gtk_item_factory_get_item
3189
                (mainwin->menu_factory, "/View/Show or hide/Folder tree");
3190
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), FALSE);
3191
3192
        return TRUE;
3193
}
3194
3195
static gint message_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3196
                                    gpointer data)
3197
{
3198
        MainWindow *mainwin = (MainWindow *)data;
3199
        GtkWidget *menuitem;
3200
3201
        menuitem = gtk_item_factory_get_item
3202
                (mainwin->menu_factory, "/View/Show or hide/Message view");
3203
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), FALSE);
3204
3205
        return TRUE;
3206
}
3207
3208
static void main_window_size_allocate_cb(GtkWidget *widget,
3209
                                         GtkAllocation *allocation,
3210
                                         gpointer data)
3211
{
3212
        MainWindow *mainwin = (MainWindow *)data;
3213
3214
        main_window_get_size(mainwin);
3215
}
3216
3217
static void folder_window_size_allocate_cb(GtkWidget *widget,
3218
                                           GtkAllocation *allocation,
3219
                                           gpointer data)
3220
{
3221
        MainWindow *mainwin = (MainWindow *)data;
3222
3223
        main_window_get_size(mainwin);
3224
}
3225
3226
static void message_window_size_allocate_cb(GtkWidget *widget,
3227
                                            GtkAllocation *allocation,
3228
                                            gpointer data)
3229
{
3230
        MainWindow *mainwin = (MainWindow *)data;
3231
3232
        main_window_get_size(mainwin);
3233
}
3234
3235
static gboolean main_window_window_state_cb(GtkWidget *widget,
3236
                                            GdkEventWindowState *event,
3237
                                            gpointer data)
3238
{
3239
        MainWindow *mainwin = (MainWindow *)data;
3240
3241
        if ((event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED) != 0) {
3242
                if ((event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0)
3243
                        prefs_common.mainwin_maximized = TRUE;
3244
                else
3245
                        prefs_common.mainwin_maximized = FALSE;
3246
        }
3247
        if ((event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) != 0) {
3248
                if ((event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) != 0)
3249
                        mainwin->window_hidden = TRUE;
3250
                else
3251
                        mainwin->window_hidden = FALSE;
3252
        }
3253
        if ((event->changed_mask & GDK_WINDOW_STATE_WITHDRAWN) != 0) {
3254
                if ((event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) != 0)
3255
                        mainwin->window_hidden = TRUE;
3256
                else
3257
                        mainwin->window_hidden = FALSE;
3258
        }
3259
3260
        if (mainwin->window_hidden &&
3261
            prefs_common.show_trayicon && prefs_common.minimize_to_tray)
3262
                gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), TRUE);
3263
        else if (!mainwin->window_hidden)
3264
                gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), FALSE);
3265
3266
        return FALSE;
3267
}
3268
3269
static gboolean main_window_visibility_notify_cb(GtkWidget *widget,
3270
                                                 GdkEventVisibility *event,
3271
                                                 gpointer data)
3272
{
3273
        MainWindow *mainwin = (MainWindow *)data;
3274
3275
        mainwin->window_obscured =
3276
                (event->state == GDK_VISIBILITY_FULLY_OBSCURED ||
3277
                 event->state == GDK_VISIBILITY_PARTIAL) ? TRUE : FALSE;
3278
3279
        return FALSE;
3280
}
3281
3282
static void new_folder_cb(MainWindow *mainwin, guint action,
3283
                          GtkWidget *widget)
3284
{
3285
        folderview_new_folder(mainwin->folderview);
3286
}
3287
3288
static void rename_folder_cb(MainWindow *mainwin, guint action,
3289
                             GtkWidget *widget)
3290
{
3291
        folderview_rename_folder(mainwin->folderview);
3292
}
3293
3294
static void move_folder_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3295
{
3296
        folderview_move_folder(mainwin->folderview);
3297
}
3298
3299
static void delete_folder_cb(MainWindow *mainwin, guint action,
3300
                             GtkWidget *widget)
3301
{
3302
        folderview_delete_folder(mainwin->folderview);
3303
}
3304
3305
static void add_mailbox_cb(MainWindow *mainwin, guint action,
3306
                           GtkWidget *widget)
3307
{
3308
        main_window_add_mailbox(mainwin);
3309
}
3310
3311
static void remove_mailbox_cb(MainWindow *mainwin, guint action,
3312
                              GtkWidget *widget)
3313
{
3314
        folderview_remove_mailbox(mainwin->folderview);
3315
}
3316
3317
static void update_folderview_cb(MainWindow *mainwin, guint action,
3318
                                 GtkWidget *widget)
3319
{
3320
        if (action == 0)
3321
                folderview_check_new_selected(mainwin->folderview);
3322
        else
3323
                folderview_check_new_all();
3324
}
3325
3326
static void rebuild_tree_cb(MainWindow *mainwin, guint action,
3327
                            GtkWidget *widget)
3328
{
3329
        folderview_rebuild_tree(mainwin->folderview);
3330
}
3331
3332
static void import_mail_cb(MainWindow *mainwin, guint action,
3333
                           GtkWidget *widget)
3334
{
3335
        import_mail(mainwin->summaryview->folder_item);
3336
        main_window_popup(mainwin);
3337
}
3338
3339
static void export_mail_cb(MainWindow *mainwin, guint action,
3340
                           GtkWidget *widget)
3341
{
3342
        export_mail(mainwin->summaryview->folder_item);
3343
        main_window_popup(mainwin);
3344
}
3345
3346
static void empty_trash_cb(MainWindow *mainwin, guint action,
3347
                           GtkWidget *widget)
3348
{
3349
        main_window_empty_trash(mainwin, TRUE);
3350
}
3351
3352
static void save_as_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3353
{
3354
        MessageView *messageview = mainwin->messageview;
3355
3356
        if (messageview_get_selected_mime_part(messageview) &&
3357
            GTK_WIDGET_HAS_FOCUS(messageview->mimeview->treeview))
3358
                mimeview_save_as(messageview->mimeview);
3359
        else
3360
                summary_save_as(mainwin->summaryview);
3361
}
3362
3363
#if GTK_CHECK_VERSION(2, 10, 0)
3364
static void page_setup_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3365
{
3366
        printing_page_setup_gtk();
3367
}
3368
#endif
3369
3370
static void print_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3371
{
3372
        summary_print(mainwin->summaryview);
3373
}
3374
3375
static void toggle_offline_cb(MainWindow *mainwin, guint action,
3376
                              GtkWidget *widget)
3377
{
3378
        if (GTK_CHECK_MENU_ITEM(widget)->active &&
3379
            folder_remote_folder_active_session_exist()) {
3380
                debug_print("Active session exist. Cancelling online switch.\n");
3381
                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget),
3382
                                               FALSE);
3383
                return;
3384
        }
3385
3386
        main_window_toggle_online
3387
                (mainwin, !GTK_CHECK_MENU_ITEM(widget)->active);
3388
}
3389
3390
static void app_exit_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3391
{
3392
        if (prefs_common.confirm_on_exit) {
3393
                if (alertpanel(_("Exit"), _("Exit this program?"),
3394
                               GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL)
3395
                    != G_ALERTDEFAULT)
3396
                        return;
3397
                manage_window_focus_in(mainwin->window, NULL, NULL);
3398
        }
3399
3400
        app_will_exit(FALSE);
3401
}
3402
3403
static void search_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3404
{
3405
        if (action == 1) {
3406
                FolderItem *item;
3407
3408
                item = folderview_get_selected_item(mainwin->folderview);
3409
                if (item && item->stype == F_VIRTUAL)
3410
                        prefs_search_folder_open(item);
3411
                else
3412
                        query_search(item);
3413
        } else if (action == 2) {
3414
                if (!prefs_common.show_searchbar) {
3415
                        GtkWidget *menuitem;
3416
3417
                        menuitem = gtk_item_factory_get_item
3418
                                (mainwin->menu_factory,
3419
                                 "/View/Show or hide/Search bar");
3420
                        gtk_check_menu_item_set_active
3421
                                (GTK_CHECK_MENU_ITEM(menuitem), TRUE);
3422
                }
3423
                gtk_widget_grab_focus(mainwin->summaryview->qsearch->entry);
3424
        } else
3425
                message_search(mainwin->messageview);
3426
}
3427
3428
static void toggle_folder_cb(MainWindow *mainwin, guint action,
3429
                             GtkWidget *widget)
3430
{
3431
        gboolean active;
3432
3433
        active = GTK_CHECK_MENU_ITEM(widget)->active;
3434
3435
        switch (mainwin->type) {
3436
        case SEPARATE_NONE:
3437
        case SEPARATE_MESSAGE:
3438
#if 0
3439
                if (active)
3440
                        gtk_widget_show(GTK_WIDGET_PTR(mainwin->folderview));
3441
                else
3442
                        gtk_widget_hide(GTK_WIDGET_PTR(mainwin->folderview));
3443
#endif
3444
                break;
3445
        case SEPARATE_FOLDER:
3446
                if (active)
3447
                        gtk_widget_show(mainwin->win.sep_folder.folderwin);
3448
                else
3449
                        gtk_widget_hide(mainwin->win.sep_folder.folderwin);
3450
                break;
3451
        case SEPARATE_BOTH:
3452
                if (active)
3453
                        gtk_widget_show(mainwin->win.sep_both.folderwin);
3454
                else
3455
                        gtk_widget_hide(mainwin->win.sep_both.folderwin);
3456
                break;
3457
        }
3458
3459
        prefs_common.folderview_visible = active;
3460
}
3461
3462
static void toggle_message_cb(MainWindow *mainwin, guint action,
3463
                              GtkWidget *widget)
3464
{
3465
        gboolean active;
3466
3467
        active = GTK_CHECK_MENU_ITEM(widget)->active;
3468
3469
        if (active != messageview_is_visible(mainwin->messageview))
3470
                summary_toggle_view(mainwin->summaryview);
3471
}
3472
3473
static void toggle_toolbar_cb(MainWindow *mainwin, guint action,
3474
                              GtkWidget *widget)
3475
{
3476
        mainwin->toolbar_style = (ToolbarStyle)action;
3477
        prefs_common.toolbar_style = (ToolbarStyle)action;
3478
3479
        main_window_set_toolbar_button_visibility(mainwin);
3480
}
3481
3482
static void toggle_searchbar_cb(MainWindow *mainwin, guint action,
3483
                                GtkWidget *widget)
3484
{
3485
        if (GTK_CHECK_MENU_ITEM(widget)->active) {
3486
                gtk_widget_show(mainwin->summaryview->qsearch->hbox);
3487
                prefs_common.show_searchbar = TRUE;
3488
        } else {
3489
                gtk_widget_hide(mainwin->summaryview->qsearch->hbox);
3490
                summary_qsearch_reset(mainwin->summaryview);
3491
                prefs_common.show_searchbar = FALSE;
3492
        }
3493
}
3494
3495
static void toggle_statusbar_cb(MainWindow *mainwin, guint action,
3496
                                GtkWidget *widget)
3497
{
3498
        if (GTK_CHECK_MENU_ITEM(widget)->active) {
3499
                gtk_widget_show(mainwin->statusbar);
3500
                prefs_common.show_statusbar = TRUE;
3501
        } else {
3502
                gtk_widget_hide(mainwin->statusbar);
3503
                prefs_common.show_statusbar = FALSE;
3504
        }
3505
}
3506
3507
static void toolbar_customize_cb(MainWindow *mainwin, guint action,
3508
                                 GtkWidget *widget)
3509
{
3510
        toolbar_customize(widget, mainwin);
3511
}
3512
3513
static void change_layout_cb(MainWindow *mainwin, guint action,
3514
                             GtkWidget *widget)
3515
{
3516
        LayoutType type = action;
3517
3518
        if (GTK_CHECK_MENU_ITEM(widget)->active)
3519
                main_window_change_layout(mainwin, type, mainwin->type);
3520
}
3521
3522
static void separate_widget_cb(MainWindow *mainwin, guint action,
3523
                               GtkWidget *widget)
3524
{
3525
        SeparateType type;
3526
3527
        if (GTK_CHECK_MENU_ITEM(widget)->active)
3528
                type = mainwin->type | action;
3529
        else
3530
                type = mainwin->type & ~action;
3531
3532
        main_window_change_layout(mainwin, prefs_common.layout_type, type);
3533
3534
        prefs_common.sep_folder = (type & SEPARATE_FOLDER)  != 0;
3535
        prefs_common.sep_msg    = (type & SEPARATE_MESSAGE) != 0;
3536
}
3537
3538
static void addressbook_open_cb(MainWindow *mainwin, guint action,
3539
                                GtkWidget *widget)
3540
{
3541
        addressbook_open(NULL);
3542
}
3543
3544
static void log_window_show_cb(MainWindow *mainwin, guint action,
3545
                               GtkWidget *widget)
3546
{
3547
        log_window_show(mainwin->logwin);
3548
}
3549
3550
static void inc_mail_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3551
{
3552
        inc_mail(mainwin);
3553
}
3554
3555
static void inc_all_account_mail_cb(MainWindow *mainwin, guint action,
3556
                                    GtkWidget *widget)
3557
{
3558
        inc_all_account_mail(mainwin, FALSE);
3559
}
3560
3561
static void inc_stop_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3562
{
3563
        inc_cancel_all();
3564
}
3565
3566
static void rpop3_cb(MainWindow        *mainwin, guint action, GtkWidget *widget)
3567
{
3568
        rpop3_account(cur_account);
3569
}
3570
3571
static void send_queue_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3572
{
3573
        main_window_send_queue(mainwin);
3574
}
3575
3576
static void compose_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3577
{
3578
        PrefsAccount *ac = NULL;
3579
        FolderItem *item = mainwin->summaryview->folder_item;
3580
3581
        if (item) {
3582
                ac = account_find_from_item(item);
3583
                if (ac && ac->protocol == A_NNTP &&
3584
                    FOLDER_TYPE(item->folder) == F_NEWS) {
3585
                        compose_new(ac, item, item->path, NULL);
3586
                        return;
3587
                }
3588
        }
3589
3590
        compose_new(ac, item, NULL, NULL);
3591
}
3592
3593
static void reply_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3594
{
3595
        summary_reply(mainwin->summaryview, (ComposeMode)action);
3596
}
3597
3598
static void move_to_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3599
{
3600
        summary_move_to(mainwin->summaryview);
3601
}
3602
3603
static void copy_to_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3604
{
3605
        summary_copy_to(mainwin->summaryview);
3606
}
3607
3608
static void delete_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3609
{
3610
        summary_delete(mainwin->summaryview);
3611
}
3612
3613
static void open_msg_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3614
{
3615
        summary_open_msg(mainwin->summaryview);
3616
}
3617
3618
static void view_source_cb(MainWindow *mainwin, guint action,
3619
                           GtkWidget *widget)
3620
{
3621
        summary_view_source(mainwin->summaryview);
3622
}
3623
3624
static void show_all_header_cb(MainWindow *mainwin, guint action,
3625
                               GtkWidget *widget)
3626
{
3627
        if (mainwin->menu_lock_count) return;
3628
        summary_display_msg_selected(mainwin->summaryview, FALSE,
3629
                                     GTK_CHECK_MENU_ITEM(widget)->active);
3630
}
3631
3632
static void mark_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3633
{
3634
        summary_mark(mainwin->summaryview);
3635
}
3636
3637
static void unmark_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3638
{
3639
        summary_unmark(mainwin->summaryview);
3640
}
3641
3642
static void mark_as_unread_cb(MainWindow *mainwin, guint action,
3643
                              GtkWidget *widget)
3644
{
3645
        summary_mark_as_unread(mainwin->summaryview);
3646
}
3647
3648
static void mark_as_read_cb(MainWindow *mainwin, guint action,
3649
                            GtkWidget *widget)
3650
{
3651
        summary_mark_as_read(mainwin->summaryview);
3652
}
3653
3654
static void mark_thread_as_read_cb(MainWindow *mainwin, guint action,
3655
                                   GtkWidget *widget)
3656
{
3657
        summary_mark_thread_as_read(mainwin->summaryview);
3658
}
3659
3660
static void mark_all_read_cb(MainWindow *mainwin, guint action,
3661
                             GtkWidget *widget)
3662
{
3663
        summary_mark_all_read(mainwin->summaryview);
3664
}
3665
3666
static void junk_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3667
{
3668
        if (action == 0)
3669
                summary_junk(mainwin->summaryview);
3670
        else
3671
                summary_not_junk(mainwin->summaryview);
3672
}
3673
3674
static void reedit_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3675
{
3676
        summary_reedit(mainwin->summaryview);
3677
}
3678
3679
static void add_address_cb(MainWindow *mainwin, guint action,
3680
                           GtkWidget *widget)
3681
{
3682
        summary_add_address(mainwin->summaryview);
3683
}
3684
3685
static void set_charset_cb(MainWindow *mainwin, guint action,
3686
                           GtkWidget *widget)
3687
{
3688
        const gchar *str;
3689
3690
        if (GTK_CHECK_MENU_ITEM(widget)->active) {
3691
                str = conv_get_charset_str((CharSet)action);
3692
                g_free(prefs_common.force_charset);
3693
                prefs_common.force_charset = str ? g_strdup(str) : NULL;
3694
3695
                summary_redisplay_msg(mainwin->summaryview);
3696
3697
                debug_print("forced charset: %s\n",
3698
                            str ? str : "Auto-Detect");
3699
        }
3700
}
3701
3702
static void thread_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3703
{
3704
        if (mainwin->menu_lock_count) return;
3705
        if (!mainwin->summaryview->folder_item) return;
3706
3707
        if (GTK_CHECK_MENU_ITEM(widget)->active)
3708
                summary_thread_build(mainwin->summaryview);
3709
        else
3710
                summary_unthread(mainwin->summaryview);
3711
}
3712
3713
static void expand_threads_cb(MainWindow *mainwin, guint action,
3714
                              GtkWidget *widget)
3715
{
3716
        summary_expand_threads(mainwin->summaryview);
3717
}
3718
3719
static void collapse_threads_cb(MainWindow *mainwin, guint action,
3720
                                GtkWidget *widget)
3721
{
3722
        summary_collapse_threads(mainwin->summaryview);
3723
}
3724
3725
static void set_display_item_cb(MainWindow *mainwin, guint action,
3726
                                GtkWidget *widget)
3727
{
3728
        prefs_summary_column_open
3729
                (FOLDER_ITEM_IS_SENT_FOLDER(mainwin->summaryview->folder_item));
3730
}
3731
3732
static void sort_summary_cb(MainWindow *mainwin, guint action,
3733
                            GtkWidget *widget)
3734
{
3735
        FolderItem *item = mainwin->summaryview->folder_item;
3736
        GtkWidget *menuitem;
3737
3738
        if (mainwin->menu_lock_count) return;
3739
3740
        if (GTK_CHECK_MENU_ITEM(widget)->active && item) {
3741
                menuitem = gtk_item_factory_get_item
3742
                        (mainwin->menu_factory, "/View/Sort/Ascending");
3743
                summary_sort(mainwin->summaryview, (FolderSortKey)action,
3744
                             GTK_CHECK_MENU_ITEM(menuitem)->active
3745
                             ? SORT_ASCENDING : SORT_DESCENDING);
3746
        }
3747
}
3748
3749
static void sort_summary_type_cb(MainWindow *mainwin, guint action,
3750
                                 GtkWidget *widget)
3751
{
3752
        FolderItem *item = mainwin->summaryview->folder_item;
3753
3754
        if (mainwin->menu_lock_count) return;
3755
3756
        if (GTK_CHECK_MENU_ITEM(widget)->active && item)
3757
                summary_sort(mainwin->summaryview,
3758
                             item->sort_key, (FolderSortType)action);
3759
}
3760
3761
static void attract_by_subject_cb(MainWindow *mainwin, guint action,
3762
                                  GtkWidget *widget)
3763
{
3764
        summary_attract_by_subject(mainwin->summaryview);
3765
}
3766
3767
static void delete_duplicated_cb(MainWindow *mainwin, guint action,
3768
                                 GtkWidget *widget)
3769
{
3770
        summary_delete_duplicated(mainwin->summaryview);
3771
}
3772
3773
static void concat_partial_cb(MainWindow *mainwin, guint action,
3774
                              GtkWidget *widget)
3775
{
3776
        GSList *mlist;
3777
        gchar *file;
3778
        FolderItem *item;
3779
3780
        if (summary_is_locked(mainwin->summaryview))
3781
                return;
3782
3783
        item = mainwin->summaryview->folder_item;
3784
        if (!item)
3785
                return;
3786
        mlist = summary_get_selected_msg_list(mainwin->summaryview);
3787
        if (!mlist)
3788
                return;
3789
3790
        file = get_tmp_file();
3791
        if (procmsg_concat_partial_messages(mlist, file) == 0) {
3792
                folder_item_add_msg(item, file, NULL, TRUE);
3793
                summary_show_queued_msgs(mainwin->summaryview);
3794
        } else {
3795
                alertpanel_error
3796
                        (_("The selected messages could not be combined."));
3797
        }
3798
        g_free(file);
3799
3800
        g_slist_free(mlist);
3801
}
3802
3803
static void filter_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3804
{
3805
        summary_filter(mainwin->summaryview, (gboolean)action);
3806
}
3807
3808
static void filter_junk_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3809
{
3810
        summary_filter_junk(mainwin->summaryview, (gboolean)action);
3811
}
3812
3813
static void execute_summary_cb(MainWindow *mainwin, guint action,
3814
                               GtkWidget *widget)
3815
{
3816
        summary_execute(mainwin->summaryview);
3817
}
3818
3819
static void update_summary_cb(MainWindow *mainwin, guint action,
3820
                              GtkWidget *widget)
3821
{
3822
        if (!mainwin->summaryview->folder_item) return;
3823
3824
        summary_show(mainwin->summaryview, mainwin->summaryview->folder_item,
3825
                     TRUE);
3826
}
3827
3828
static void prev_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3829
{
3830
        MessageView *messageview = mainwin->messageview;
3831
3832
        if (messageview_get_selected_mime_part(messageview) &&
3833
            GTK_WIDGET_HAS_FOCUS(messageview->mimeview->treeview) &&
3834
            mimeview_step(messageview->mimeview, GTK_SCROLL_STEP_BACKWARD))
3835
                return;
3836
3837
        if (summary_step(mainwin->summaryview, GTK_SCROLL_STEP_BACKWARD))
3838
                summary_mark_displayed_read(mainwin->summaryview, NULL);
3839
}
3840
3841
static void next_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3842
{
3843
        MessageView *messageview = mainwin->messageview;
3844
3845
        if (messageview_get_selected_mime_part(messageview) &&
3846
            GTK_WIDGET_HAS_FOCUS(messageview->mimeview->treeview) &&
3847
            mimeview_step(messageview->mimeview, GTK_SCROLL_STEP_FORWARD))
3848
                return;
3849
3850
        if (summary_step(mainwin->summaryview, GTK_SCROLL_STEP_FORWARD))
3851
                summary_mark_displayed_read(mainwin->summaryview, NULL);
3852
}
3853
3854
static void prev_unread_cb(MainWindow *mainwin, guint action,
3855
                           GtkWidget *widget)
3856
{
3857
        summary_select_prev_unread(mainwin->summaryview);
3858
}
3859
3860
static void next_unread_cb(MainWindow *mainwin, guint action,
3861
                           GtkWidget *widget)
3862
{
3863
        summary_select_next_unread(mainwin->summaryview);
3864
}
3865
3866
static void prev_new_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3867
{
3868
        summary_select_prev_new(mainwin->summaryview);
3869
}
3870
3871
static void next_new_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3872
{
3873
        summary_select_next_new(mainwin->summaryview);
3874
}
3875
3876
static void prev_marked_cb(MainWindow *mainwin, guint action,
3877
                           GtkWidget *widget)
3878
{
3879
        summary_select_prev_marked(mainwin->summaryview);
3880
}
3881
3882
static void next_marked_cb(MainWindow *mainwin, guint action,
3883
                           GtkWidget *widget)
3884
{
3885
        summary_select_next_marked(mainwin->summaryview);
3886
}
3887
3888
static void prev_labeled_cb(MainWindow *mainwin, guint action,
3889
                            GtkWidget *widget)
3890
{
3891
        summary_select_prev_labeled(mainwin->summaryview);
3892
}
3893
3894
static void next_labeled_cb(MainWindow *mainwin, guint action,
3895
                            GtkWidget *widget)
3896
{
3897
        summary_select_next_labeled(mainwin->summaryview);
3898
}
3899
3900
static void goto_folder_cb(MainWindow *mainwin, guint action,
3901
                           GtkWidget *widget)
3902
{
3903
        FolderItem *to_folder;
3904
3905
        to_folder = foldersel_folder_sel_full(NULL, FOLDER_SEL_ALL, NULL,
3906
                                              _("Select folder to open"));
3907
3908
        if (to_folder)
3909
                folderview_select(mainwin->folderview, to_folder);
3910
}
3911
3912
static void copy_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3913
{
3914
        messageview_copy_clipboard(mainwin->messageview);
3915
}
3916
3917
static void allsel_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3918
{
3919
        MessageView *msgview = mainwin->messageview;
3920
3921
        if (GTK_WIDGET_HAS_FOCUS(mainwin->summaryview->treeview))
3922
                summary_select_all(mainwin->summaryview);
3923
        else if (GTK_WIDGET_HAS_FOCUS(mainwin->summaryview->qsearch->entry))
3924
                gtk_editable_select_region
3925
                        (GTK_EDITABLE(mainwin->summaryview->qsearch->entry),
3926
                         0, -1);
3927
        else if (messageview_is_visible(msgview) &&
3928
                 (GTK_WIDGET_HAS_FOCUS(msgview->textview->text) ||
3929
                  GTK_WIDGET_HAS_FOCUS(msgview->mimeview->textview->text)))
3930
                messageview_select_all(msgview);
3931
}
3932
3933
static void select_thread_cb(MainWindow *mainwin, guint action,
3934
                             GtkWidget *widget)
3935
{
3936
        summary_select_thread(mainwin->summaryview);
3937
}
3938
3939
static void create_filter_cb(MainWindow *mainwin, guint action,
3940
                             GtkWidget *widget)
3941
{
3942
        summary_filter_open(mainwin->summaryview, (FilterCreateType)action);
3943
}
3944
3945
static void prefs_common_open_cb(MainWindow *mainwin, guint action,
3946
                                 GtkWidget *widget)
3947
{
3948
        prefs_common_open();
3949
}
3950
3951
static void prefs_filter_open_cb(MainWindow *mainwin, guint action,
3952
                                 GtkWidget *widget)
3953
{
3954
        prefs_filter_open(NULL, NULL, NULL);
3955
}
3956
3957
static void prefs_template_open_cb(MainWindow *mainwin, guint action,
3958
                                   GtkWidget *widget)
3959
{
3960
        prefs_template_open();
3961
}
3962
3963
static void plugin_manager_open_cb(MainWindow *mainwin, guint action,
3964
                                   GtkWidget *widget)
3965
{
3966
        plugin_manager_open();
3967
}
3968
3969
#ifndef G_OS_WIN32
3970
static void prefs_actions_open_cb(MainWindow *mainwin, guint action,
3971
                                  GtkWidget *widget)
3972
{
3973
        prefs_actions_open(mainwin);
3974
}
3975
#endif
3976
3977
static void prefs_account_open_cb(MainWindow *mainwin, guint action,
3978
                                  GtkWidget *widget)
3979
{
3980
        if (!cur_account) {
3981
                new_account_cb(mainwin, 0, widget);
3982
        } else {
3983
                account_open(cur_account);
3984
        }
3985
}
3986
3987
static void new_account_cb(MainWindow *mainwin, guint action,
3988
                           GtkWidget *widget)
3989
{
3990
        PrefsAccount *ac;
3991
3992
        if (compose_get_compose_list()) {
3993
                alertpanel_notice(_("Some composing windows are open.\n"
3994
                                    "Please close all the composing windows before editing the accounts."));
3995
                return;
3996
        }
3997
3998
        if ((ac = setup_account())) {
3999
                account_set_menu();
4000
                main_window_reflect_prefs_all();
4001
                account_set_missing_folder();
4002
                folderview_set(mainwin->folderview);
4003
                if (ac->folder)
4004
                        folder_write_list();
4005
        }
4006
}
4007
4008
static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
4009
{
4010
        cur_account = (PrefsAccount *)data;
4011
        main_window_change_cur_account();
4012
}
4013
4014
static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
4015
{
4016
        PrefsAccount *account = (PrefsAccount *)data;
4017
4018
        inc_account_mail(main_window_get(), account);
4019
}
4020
4021
static void manual_open_cb(MainWindow *mainwin, guint action,
4022
                           GtkWidget *widget)
4023
{
4024
        manual_open((ManualLang)action);
4025
}
4026
4027
static void faq_open_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
4028
{
4029
        faq_open((ManualLang)action);
4030
}
4031
4032
static GtkWidget *help_cmdline_window;
4033
4034
static void help_cmdline_ok(GtkWidget *button)
4035
{
4036
        gtk_widget_destroy(gtk_widget_get_toplevel(button));
4037
}
4038
4039
static gboolean help_cmdline_key_pressed(GtkWidget *widget, GdkEventKey *event,
4040
                                         gpointer data)
4041
{
4042
        if (event && event->keyval == GDK_Escape) {
4043
                gtk_widget_destroy(widget);
4044
                return TRUE;
4045
        }
4046
        return FALSE;
4047
}
4048
4049
static gboolean help_cmdline_deleted(GtkWidget *widget, GdkEventAny *event,
4050
                                     gpointer data)
4051
{
4052
        return FALSE;
4053
}
4054
4055
static void help_cmdline_destroyed(GtkWidget *widget, gpointer data)
4056
{
4057
        help_cmdline_window = NULL;
4058
}
4059
4060
static void help_command_line_show(void)
4061
{
4062
        GtkWidget *window;
4063
        GtkWidget *vbox;
4064
        GtkWidget *vbox2;
4065
        GtkWidget *hbox;
4066
        GtkWidget *label;
4067
        GtkWidget *hbbox;
4068
        GtkWidget *ok_btn;
4069
4070
        if (help_cmdline_window) {
4071
                gtk_window_present(GTK_WINDOW(help_cmdline_window));
4072
                return;
4073
        }
4074
4075
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
4076
        gtk_window_set_title(GTK_WINDOW(window), _("Command line options"));
4077
        gtk_container_set_border_width(GTK_CONTAINER(window), 8);
4078
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
4079
        gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE);
4080
        help_cmdline_window = window;
4081
4082
        vbox = gtk_vbox_new(FALSE, 8);
4083
        gtk_container_add(GTK_CONTAINER(window), vbox);
4084
4085
        vbox2 = gtk_vbox_new(FALSE, 8);
4086
        gtk_container_set_border_width(GTK_CONTAINER(vbox2), 8);
4087
        gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0);
4088
4089
        label = gtk_label_new(_("Usage: sylpheed [OPTION]..."));
4090
        gtk_box_pack_start(GTK_BOX(vbox2), label, FALSE, FALSE, 0);
4091
        gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
4092
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
4093
4094
        hbox = gtk_hbox_new(FALSE, 16);
4095
        gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);
4096
4097
        label = gtk_label_new(_("--compose [address]\n"
4098
                                "--attach file1 [file2]...\n"
4099
                                "--receive\n"
4100
                                "--receive-all\n"
4101
                                "--send\n"
4102
                                "--status [folder]...\n"
4103
                                "--status-full [folder]...\n"
4104
                                "--open folderid/msgnum\n"
4105
                                "--configdir dirname\n"
4106
                                "--exit\n"
4107
                                "--debug\n"
4108
                                "--help\n"
4109
                                "--version"));
4110
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
4111
        gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
4112
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
4113
4114
        label = gtk_label_new(_("open composition window\n"
4115
                                "open composition window with specified files attached\n"
4116
                                "receive new messages\n"
4117
                                "receive new messages of all accounts\n"
4118
                                "send all queued messages\n"
4119
                                "show the total number of messages\n"
4120
                                "show the status of each folder\n"
4121
                                "open message in new window\n"
4122
                                "specify directory which stores configuration files\n"
4123
                                "exit Sylpheed\n"
4124
                                "debug mode\n"
4125
                                "display this help and exit\n"
4126
                                "output version information and exit"));
4127
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
4128
        gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
4129
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
4130
4131
#ifdef G_OS_WIN32
4132
        label = gtk_label_new(_("Windows-only option:"));
4133
        gtk_box_pack_start(GTK_BOX(vbox2), label, FALSE, FALSE, 0);
4134
        gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
4135
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
4136
4137
        hbox = gtk_hbox_new(FALSE, 32);
4138
        gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);
4139
4140
        label = gtk_label_new(_("--ipcport portnum"));
4141
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
4142
        gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
4143
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
4144
4145
        label = gtk_label_new(_("specify port for IPC remote commands"));
4146
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
4147
        gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
4148
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
4149
#endif
4150
4151
        gtkut_stock_button_set_create(&hbbox, &ok_btn, GTK_STOCK_OK,
4152
                                      NULL, NULL, NULL, NULL);
4153
        gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
4154
        gtk_widget_grab_default(ok_btn);
4155
4156
        g_signal_connect(G_OBJECT(ok_btn), "clicked",
4157
                         G_CALLBACK(help_cmdline_ok), NULL);
4158
        g_signal_connect(G_OBJECT(window), "key_press_event",
4159
                         G_CALLBACK(help_cmdline_key_pressed), NULL);
4160
        g_signal_connect(G_OBJECT(window), "delete_event",
4161
                         G_CALLBACK(help_cmdline_deleted), NULL);
4162
        g_signal_connect(G_OBJECT(window), "destroy",
4163
                         G_CALLBACK(help_cmdline_destroyed), NULL);
4164
4165
        gtk_widget_show_all(window);
4166
}
4167
4168
static void help_cmdline_cb(MainWindow *mainwin, guint action,
4169
                            GtkWidget *widget)
4170
{
4171
        help_command_line_show();
4172
}
4173
4174
#if USE_UPDATE_CHECK
4175
static void update_check_cb(MainWindow *mainwin, guint action,
4176
                            GtkWidget *widget)
4177
{
4178
        update_check(TRUE);
4179
}
4180
4181
#ifdef USE_UPDATE_CHECK_PLUGIN
4182
static void update_check_plugin_cb(MainWindow *mainwin, guint action,
4183
                                   GtkWidget *widget)
4184
{
4185
        update_check_plugin(TRUE);
4186
}
4187
#endif
4188
#endif
4189
4190
static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
4191
{
4192
        MainWindow *mainwin = (MainWindow *)data;
4193
        gchar *str;
4194
4195
        if (item->path)
4196
                str = g_strdup_printf(_("Scanning folder %s%c%s ..."),
4197
                                      LOCAL_FOLDER(folder)->rootpath,
4198
                                      G_DIR_SEPARATOR,
4199
                                      item->path);
4200
        else
4201
                str = g_strdup_printf(_("Scanning folder %s ..."),
4202
                                      LOCAL_FOLDER(folder)->rootpath);
4203
4204
        STATUSBAR_PUSH(mainwin, str);
4205
        STATUSBAR_POP(mainwin);
4206
        g_free(str);
4207
}