Statistics
| Revision:

root / src / mainwindow.c @ 1697

History | View | Annotate | Download (116.2 kB)

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