Statistics
| Revision:

root / src / account_dialog.c @ 2164

History | View | Annotate | Download (21.5 kB)

1
/*
2
 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3
 * Copyright (C) 1999-2005 Hiroyuki Yamamoto
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
 */
19
20
#ifdef HAVE_CONFIG_H
21
#  include "config.h"
22
#endif
23
24
#include "defs.h"
25
26
#include <glib.h>
27
#include <glib/gi18n.h>
28
#include <gtk/gtk.h>
29
#include <gdk/gdkkeysyms.h>
30
#include <stdio.h>
31
#include <errno.h>
32
33
#include "main.h"
34
#include "mainwindow.h"
35
#include "folderview.h"
36
#include "folder.h"
37
#include "account.h"
38
#include "prefs.h"
39
#include "prefs_account.h"
40
#include "prefs_account_dialog.h"
41
#include "procmsg.h"
42
#include "procheader.h"
43
#include "compose.h"
44
#include "manage_window.h"
45
#include "stock_pixmap.h"
46
#include "statusbar.h"
47
#include "inc.h"
48
#include "gtkutils.h"
49
#include "utils.h"
50
#include "alertpanel.h"
51
52
enum
53
{
54
        COL_DEFAULT,
55
        COL_GETALL,
56
        COL_NAME,
57
        COL_PROTOCOL,
58
        COL_SERVER,
59
        COL_ACCOUNT,
60
        COL_CAN_GETALL,
61
        N_COLS
62
};
63
64
#define PREFSBUFSIZE                1024
65
66
static struct EditAccount {
67
        GtkWidget *window;
68
69
        GtkWidget *treeview;
70
        GtkListStore *store;
71
        GtkTreeSelection *selection;
72
73
        GtkWidget *close_btn;
74
} edit_account;
75
76
static void account_edit_create                (void);
77
78
static void account_edit_prefs                (void);
79
static void account_delete                (void);
80
81
static void account_up                        (void);
82
static void account_down                (void);
83
84
static void account_set_default                (void);
85
86
static void account_edit_close                (void);
87
88
static gboolean account_selected        (GtkTreeSelection        *selection,
89
                                         GtkTreeModel                *model,
90
                                         GtkTreePath                *path,
91
                                         gboolean                 cur_selected,
92
                                         gpointer                 data);
93
94
static void account_default_toggled        (GtkCellRenderer        *cell,
95
                                         gchar                        *path,
96
                                         gpointer                 data);
97
static void account_getall_toggled        (GtkCellRenderer        *cell,
98
                                         gchar                        *path,
99
                                         gpointer                 data);
100
101
static void account_row_activated        (GtkTreeView                *treeview,
102
                                         GtkTreePath                *path,
103
                                         GtkTreeViewColumn        *column,
104
                                         gpointer                 data);
105
static void account_row_reordered        (GtkTreeModel                *model,
106
                                         GtkTreePath                *path,
107
                                         GtkTreeIter                *iter,
108
                                         gpointer                 data);
109
110
static gint account_delete_event        (GtkWidget        *widget,
111
                                         GdkEventAny        *event,
112
                                         gpointer         data);
113
static gboolean account_key_pressed        (GtkWidget        *widget,
114
                                         GdkEventKey        *event,
115
                                         gpointer         data);
116
117
static void account_set_row                (PrefsAccount        *ac_prefs,
118
                                         GtkTreeIter        *iter,
119
                                         GtkTreeIter        *new,
120
                                         gboolean         move_view);
121
static void account_set_dialog                (void);
122
static void account_update_dialog        (void);
123
124
static void account_set_list                (void);
125
126
127
void account_set_menu(void)
128
{
129
        main_window_set_account_menu(account_get_list());
130
}
131
132
void account_edit_open(void)
133
{
134
        inc_lock();
135
136
        if (compose_get_compose_list()) {
137
                alertpanel_notice(_("Some composing windows are open.\n"
138
                                    "Please close all the composing windows before editing the accounts."));
139
                inc_unlock();
140
                return;
141
        }
142
143
        debug_print(_("Opening account edit window...\n"));
144
145
        if (!edit_account.window)
146
                account_edit_create();
147
148
        account_set_dialog();
149
150
        manage_window_set_transient(GTK_WINDOW(edit_account.window));
151
        gtk_widget_grab_focus(edit_account.close_btn);
152
        gtk_widget_show(edit_account.window);
153
154
        manage_window_focus_in(edit_account.window, NULL, NULL);
155
}
156
157
void account_add(void)
158
{
159
        PrefsAccount *ac_prefs;
160
161
        ac_prefs = prefs_account_open(NULL);
162
        gtk_window_present(GTK_WINDOW(edit_account.window));
163
164
        if (!ac_prefs) return;
165
166
        account_append(ac_prefs);
167
168
        if (ac_prefs->is_default)
169
                account_set_as_default(ac_prefs);
170
171
        account_set_row(ac_prefs, NULL, NULL, TRUE);
172
173
        if (ac_prefs->protocol == A_IMAP4 || ac_prefs->protocol == A_NNTP) {
174
                Folder *folder;
175
176
                if (ac_prefs->protocol == A_IMAP4) {
177
                        folder = folder_new(F_IMAP, ac_prefs->account_name,
178
                                            ac_prefs->recv_server);
179
                } else {
180
                        folder = folder_new(F_NEWS, ac_prefs->account_name,
181
                                            ac_prefs->nntp_server);
182
                }
183
184
                folder->account = ac_prefs;
185
                ac_prefs->folder = REMOTE_FOLDER(folder);
186
                folder_add(folder);
187
                if (ac_prefs->protocol == A_IMAP4) {
188
                        if (main_window_toggle_online_if_offline
189
                                (main_window_get())) {
190
                                folder->klass->create_tree(folder);
191
                                statusbar_pop_all();
192
                        }
193
                }
194
                folderview_set_all();
195
        }
196
}
197
198
void account_open(PrefsAccount *ac_prefs)
199
{
200
        gboolean prev_default;
201
        gchar *ac_name;
202
203
        g_return_if_fail(ac_prefs != NULL);
204
205
        prev_default = ac_prefs->is_default;
206
        Xstrdup_a(ac_name, ac_prefs->account_name ? ac_prefs->account_name : "",
207
                  return);
208
209
        prefs_account_open(ac_prefs);
210
        if (edit_account.window && GTK_WIDGET_VISIBLE(edit_account.window))
211
                gtk_window_present(GTK_WINDOW(edit_account.window));
212
        else
213
                main_window_popup(main_window_get());
214
215
        if (!prev_default && ac_prefs->is_default)
216
                account_set_as_default(ac_prefs);
217
218
        if (ac_prefs->folder && strcmp2(ac_name, ac_prefs->account_name) != 0) {
219
                folder_set_name(FOLDER(ac_prefs->folder),
220
                                ac_prefs->account_name);
221
                folderview_set_all();
222
        }
223
224
        account_write_config_all();
225
        account_set_menu();
226
        main_window_reflect_prefs_all();
227
        account_updated();
228
}
229
230
void account_set_missing_folder(void)
231
{
232
        PrefsAccount *ap;
233
        GList *cur;
234
235
        for (cur = account_get_list(); cur != NULL; cur = cur->next) {
236
                ap = (PrefsAccount *)cur->data;
237
                if ((ap->protocol == A_IMAP4 || ap->protocol == A_NNTP) &&
238
                    !ap->folder) {
239
                        Folder *folder;
240
241
                        if (ap->protocol == A_IMAP4) {
242
                                folder = folder_new(F_IMAP, ap->account_name,
243
                                                    ap->recv_server);
244
                        } else {
245
                                folder = folder_new(F_NEWS, ap->account_name,
246
                                                    ap->nntp_server);
247
                        }
248
249
                        folder->account = ap;
250
                        ap->folder = REMOTE_FOLDER(folder);
251
                        folder_add(folder);
252
                        if (ap->protocol == A_IMAP4) {
253
                                if (main_window_toggle_online_if_offline
254
                                        (main_window_get())) {
255
                                        folder->klass->create_tree(folder);
256
                                        statusbar_pop_all();
257
                                }
258
                        }
259
                }
260
        }
261
}
262
263
static void account_edit_create(void)
264
{
265
        GtkWidget *window;
266
        GtkWidget *vbox;
267
        GtkWidget *label;
268
        GtkWidget *hbox;
269
        GtkWidget *scrolledwin;
270
        GtkWidget *treeview;
271
        GtkListStore *store;
272
        GtkTreeSelection *selection;
273
        GtkTreeViewColumn *column;
274
        GtkCellRenderer *renderer;
275
276
        GtkWidget *vbox2;
277
        GtkWidget *add_btn;
278
        GtkWidget *edit_btn;
279
        GtkWidget *del_btn;
280
        GtkWidget *up_btn;
281
        GtkWidget *down_btn;
282
283
        GtkWidget *default_btn;
284
285
        GtkWidget *hbbox;
286
        GtkWidget *close_btn;
287
288
        debug_print(_("Creating account edit window...\n"));
289
290
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
291
        gtk_widget_set_size_request (window, 500, 320);
292
        gtk_container_set_border_width (GTK_CONTAINER (window), 8);
293
        gtk_window_set_title (GTK_WINDOW (window), _("Edit accounts"));
294
        gtk_window_set_position (GTK_WINDOW (window),
295
                                 GTK_WIN_POS_CENTER_ON_PARENT);
296
        gtk_window_set_modal (GTK_WINDOW (window), TRUE);
297
        g_signal_connect (G_OBJECT (window), "delete_event",
298
                          G_CALLBACK (account_delete_event), NULL);
299
        g_signal_connect (G_OBJECT (window), "key_press_event",
300
                          G_CALLBACK (account_key_pressed), NULL);
301
        MANAGE_WINDOW_SIGNALS_CONNECT (window);
302
        gtk_widget_realize(window);
303
304
        vbox = gtk_vbox_new (FALSE, 10);
305
        gtk_widget_show (vbox);
306
        gtk_container_add (GTK_CONTAINER (window), vbox);
307
308
        hbox = gtk_hbox_new (FALSE, 0);
309
        gtk_widget_show (hbox);
310
        gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
311
312
        label = gtk_label_new
313
                (_("New messages will be checked in this order. Check the boxes\n"
314
                   "on the `G' column to enable message retrieval by `Get all'."));
315
        gtk_widget_show (label);
316
        gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4);
317
        gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
318
319
        hbox = gtk_hbox_new (FALSE, 8);
320
        gtk_widget_show (hbox);
321
        gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
322
        gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
323
324
        scrolledwin = gtk_scrolled_window_new(NULL, NULL);
325
        gtk_widget_show(scrolledwin);
326
        gtk_box_pack_start(GTK_BOX(hbox), scrolledwin, TRUE, TRUE, 0);
327
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
328
                                       GTK_POLICY_AUTOMATIC,
329
                                       GTK_POLICY_AUTOMATIC);
330
        gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin),
331
                                            GTK_SHADOW_IN);
332
333
        store = gtk_list_store_new
334
                (N_COLS, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_STRING,
335
                 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN);
336
337
        treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
338
        g_object_unref(G_OBJECT(store));
339
        gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE);
340
        gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
341
        gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview), COL_NAME);
342
        gtk_tree_view_set_reorderable(GTK_TREE_VIEW(treeview), TRUE);
343
344
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
345
        gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
346
        gtk_tree_selection_set_select_function(selection, account_selected,
347
                                               NULL, NULL);
348
349
        renderer = gtk_cell_renderer_toggle_new();
350
        gtk_cell_renderer_toggle_set_radio(GTK_CELL_RENDERER_TOGGLE(renderer),
351
                                           TRUE);
352
        g_signal_connect(renderer, "toggled",
353
                         G_CALLBACK(account_default_toggled), NULL);
354
        column = gtk_tree_view_column_new_with_attributes
355
                ("D", renderer, "active", COL_DEFAULT, NULL);
356
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
357
358
        renderer = gtk_cell_renderer_toggle_new();
359
        g_signal_connect(renderer, "toggled",
360
                         G_CALLBACK(account_getall_toggled), NULL);
361
        column = gtk_tree_view_column_new_with_attributes
362
                ("G", renderer, "active", COL_GETALL, "visible", COL_CAN_GETALL,
363
                 NULL);
364
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
365
366
        renderer = gtk_cell_renderer_text_new();
367
        column = gtk_tree_view_column_new_with_attributes
368
                 (_("Name"), renderer, "text", COL_NAME, NULL);
369
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
370
371
        renderer = gtk_cell_renderer_text_new();
372
        column = gtk_tree_view_column_new_with_attributes
373
                 (_("Protocol"), renderer, "text", COL_PROTOCOL, NULL);
374
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
375
376
        renderer = gtk_cell_renderer_text_new();
377
        column = gtk_tree_view_column_new_with_attributes
378
                 (_("Server"), renderer, "text", COL_SERVER, NULL);
379
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
380
381
        gtk_widget_show(treeview);
382
        gtk_container_add(GTK_CONTAINER(scrolledwin), treeview);
383
384
        g_signal_connect(G_OBJECT(treeview), "row-activated",
385
                         G_CALLBACK(account_row_activated), NULL);
386
        g_signal_connect_after(G_OBJECT(store), "rows-reordered",
387
                               G_CALLBACK(account_row_reordered), NULL);
388
389
        vbox2 = gtk_vbox_new (FALSE, 0);
390
        gtk_widget_show (vbox2);
391
        gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
392
393
        add_btn = gtk_button_new_from_stock (GTK_STOCK_ADD);
394
        gtk_widget_show (add_btn);
395
        gtk_box_pack_start (GTK_BOX (vbox2), add_btn, FALSE, FALSE, 4);
396
        g_signal_connect (G_OBJECT(add_btn), "clicked",
397
                          G_CALLBACK (account_add), NULL);
398
399
#ifdef GTK_STOCK_EDIT
400
        edit_btn = gtk_button_new_from_stock (GTK_STOCK_EDIT);
401
#else
402
        edit_btn = gtk_button_new_with_label (_("Edit"));
403
#endif
404
        gtk_widget_show (edit_btn);
405
        gtk_box_pack_start (GTK_BOX (vbox2), edit_btn, FALSE, FALSE, 4);
406
        g_signal_connect (G_OBJECT(edit_btn), "clicked",
407
                          G_CALLBACK (account_edit_prefs), NULL);
408
409
        del_btn = gtk_button_new_from_stock (GTK_STOCK_DELETE);
410
        gtk_widget_show (del_btn);
411
        gtk_box_pack_start (GTK_BOX (vbox2), del_btn, FALSE, FALSE, 4);
412
        g_signal_connect (G_OBJECT(del_btn), "clicked",
413
                          G_CALLBACK (account_delete), NULL);
414
415
        down_btn = gtk_button_new_from_stock (GTK_STOCK_GO_DOWN);
416
        gtk_widget_show (down_btn);
417
        gtk_box_pack_end (GTK_BOX (vbox2), down_btn, FALSE, FALSE, 4);
418
        g_signal_connect (G_OBJECT(down_btn), "clicked",
419
                          G_CALLBACK (account_down), NULL);
420
421
        up_btn = gtk_button_new_from_stock (GTK_STOCK_GO_UP);
422
        gtk_widget_show (up_btn);
423
        gtk_box_pack_end (GTK_BOX (vbox2), up_btn, FALSE, FALSE, 4);
424
        g_signal_connect (G_OBJECT(up_btn), "clicked",
425
                          G_CALLBACK (account_up), NULL);
426
427
        hbox = gtk_hbox_new (FALSE, 8);
428
        gtk_widget_show (hbox);
429
        gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
430
431
        vbox2 = gtk_vbox_new(FALSE, 0);
432
        gtk_widget_show (vbox2);
433
        gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
434
435
        default_btn = gtk_button_new_with_mnemonic
436
                (_(" _Set as default account "));
437
        gtk_widget_show (default_btn);
438
        gtk_box_pack_start (GTK_BOX (vbox2), default_btn, TRUE, FALSE, 0);
439
        g_signal_connect (G_OBJECT(default_btn), "clicked",
440
                          G_CALLBACK (account_set_default), NULL);
441
442
        gtkut_stock_button_set_create(&hbbox, &close_btn, GTK_STOCK_CLOSE,
443
                                      NULL, NULL, NULL, NULL);
444
        gtk_widget_show(hbbox);
445
        gtk_box_pack_end (GTK_BOX (hbox), hbbox, FALSE, FALSE, 0);
446
        gtk_widget_grab_default (close_btn);
447
448
        g_signal_connect (G_OBJECT (close_btn), "clicked",
449
                          G_CALLBACK (account_edit_close), NULL);
450
451
        edit_account.window    = window;
452
        edit_account.treeview  = treeview;
453
        edit_account.store     = store;
454
        edit_account.selection = selection;
455
        edit_account.close_btn = close_btn;
456
}
457
458
static void account_edit_prefs(void)
459
{
460
        GtkTreeIter iter;
461
        PrefsAccount *ac_prefs;
462
463
        if (!gtk_tree_selection_get_selected(edit_account.selection,
464
                                             NULL, &iter))
465
                return;
466
467
        gtk_tree_model_get(GTK_TREE_MODEL(edit_account.store), &iter,
468
                           COL_ACCOUNT, &ac_prefs, -1);
469
        account_open(ac_prefs);
470
471
        account_set_row(ac_prefs, &iter, NULL, FALSE);
472
}
473
474
static void account_delete(void)
475
{
476
        GtkTreeIter iter;
477
        PrefsAccount *ac_prefs;
478
        gchar buf[BUFFSIZE];
479
480
        if (!gtk_tree_selection_get_selected(edit_account.selection,
481
                                             NULL, &iter))
482
                return;
483
484
        gtk_tree_model_get(GTK_TREE_MODEL(edit_account.store), &iter,
485
                           COL_ACCOUNT, &ac_prefs, -1);
486
        g_return_if_fail(ac_prefs != NULL);
487
488
        g_snprintf(buf, sizeof(buf),
489
                   _("Do you really want to delete the account '%s'?"),
490
                   ac_prefs->account_name ? ac_prefs->account_name :
491
                   _("(Untitled)"));
492
        if (alertpanel_full(_("Delete account"), buf,
493
                            ALERT_QUESTION, G_ALERTALTERNATE, FALSE,
494
                            GTK_STOCK_YES, GTK_STOCK_NO, NULL)
495
            != G_ALERTDEFAULT)
496
                return;
497
498
        if (ac_prefs->folder) {
499
                FolderItem *item;
500
501
                item = main_window_get()->summaryview->folder_item;
502
                if (item && item->folder == FOLDER(ac_prefs->folder))
503
                        summary_clear_all(main_window_get()->summaryview);
504
                folder_destroy(FOLDER(ac_prefs->folder));
505
                folderview_set_all();
506
        }
507
508
        account_destroy(ac_prefs);
509
        gtk_list_store_remove(edit_account.store, &iter);
510
        account_update_dialog();
511
}
512
513
static void account_up(void)
514
{
515
        GtkTreeModel *model = GTK_TREE_MODEL(edit_account.store);
516
        GtkTreeIter iter, prev;
517
        GtkTreePath *path;
518
519
        if (!gtk_tree_selection_get_selected(edit_account.selection,
520
                                             NULL, &iter))
521
                return;
522
523
        path = gtk_tree_model_get_path(model, &iter);
524
        if (gtk_tree_path_prev(path)) {
525
                gtk_tree_model_get_iter(model, &prev, path);
526
                gtk_list_store_swap(edit_account.store, &iter, &prev);
527
        }
528
        gtk_tree_path_free(path);
529
}
530
531
static void account_down(void)
532
{
533
        GtkTreeIter iter, next;
534
535
        if (!gtk_tree_selection_get_selected(edit_account.selection,
536
                                             NULL, &iter))
537
                return;
538
539
        next = iter;
540
        if (gtk_tree_model_iter_next(GTK_TREE_MODEL(edit_account.store),
541
                                     &next))
542
                gtk_list_store_swap(edit_account.store, &iter, &next);
543
}
544
545
static void account_set_default(void)
546
{
547
        GtkTreeIter iter;
548
        PrefsAccount *ac_prefs;
549
550
        if (!gtk_tree_selection_get_selected(edit_account.selection,
551
                                             NULL, &iter))
552
                return;
553
554
        gtk_tree_model_get(GTK_TREE_MODEL(edit_account.store), &iter,
555
                           COL_ACCOUNT, &ac_prefs, -1);
556
        g_return_if_fail(ac_prefs != NULL);
557
558
        account_set_as_default(ac_prefs);
559
        account_update_dialog();
560
561
        cur_account = ac_prefs;
562
        account_set_menu();
563
        main_window_reflect_prefs_all();
564
}
565
566
static void account_edit_close(void)
567
{
568
        GList *account_list;
569
570
        account_set_list();
571
        account_write_config_all();
572
573
        account_list = account_get_list();
574
575
        if (!cur_account && account_list) {
576
                PrefsAccount *ac_prefs = (PrefsAccount *)account_list->data;
577
                account_set_as_default(ac_prefs);
578
                cur_account = ac_prefs;
579
        }
580
581
        account_set_menu();
582
        main_window_reflect_prefs_all();
583
584
        gtk_widget_hide(edit_account.window);
585
        main_window_popup(main_window_get());
586
587
        inc_unlock();
588
}
589
590
static gint account_delete_event(GtkWidget *widget, GdkEventAny *event,
591
                                 gpointer data)
592
{
593
        account_edit_close();
594
        return TRUE;
595
}
596
597
static gboolean account_selected(GtkTreeSelection *selection,
598
                                 GtkTreeModel *model, GtkTreePath *path,
599
                                 gboolean cur_selected, gpointer data)
600
{
601
        return TRUE;
602
}
603
604
static void account_default_toggled(GtkCellRenderer *cell, gchar *path_str,
605
                                    gpointer data)
606
{
607
        GtkTreeIter iter;
608
        PrefsAccount *ac;
609
        GtkTreePath *path;
610
611
        path = gtk_tree_path_new_from_string(path_str);
612
        gtk_tree_model_get_iter(GTK_TREE_MODEL(edit_account.store),
613
                                &iter, path);
614
        gtk_tree_path_free(path);
615
        gtk_tree_model_get(GTK_TREE_MODEL(edit_account.store), &iter,
616
                           COL_ACCOUNT, &ac, -1);
617
618
        account_set_as_default(ac);
619
        account_update_dialog();
620
}
621
622
static void account_getall_toggled(GtkCellRenderer *cell, gchar *path_str,
623
                                   gpointer data)
624
{
625
        GtkTreeIter iter;
626
        PrefsAccount *ac;
627
        GtkTreePath *path;
628
        gboolean can_getall;
629
630
        path = gtk_tree_path_new_from_string(path_str);
631
        gtk_tree_model_get_iter(GTK_TREE_MODEL(edit_account.store),
632
                                &iter, path);
633
        gtk_tree_path_free(path);
634
        gtk_tree_model_get(GTK_TREE_MODEL(edit_account.store), &iter,
635
                           COL_ACCOUNT, &ac, COL_CAN_GETALL, &can_getall, -1);
636
637
        if (can_getall) {
638
                ac->recv_at_getall ^= TRUE;
639
                account_set_row(ac, &iter, NULL, FALSE);
640
        }
641
}
642
643
static void account_row_activated(GtkTreeView *treeview, GtkTreePath *path,
644
                                  GtkTreeViewColumn *column, gpointer data)
645
{
646
        account_edit_prefs();
647
}
648
649
static void account_row_reordered        (GtkTreeModel                *model,
650
                                         GtkTreePath                *path,
651
                                         GtkTreeIter                *iter,
652
                                         gpointer                 data)
653
{
654
        GtkTreeIter iter_;
655
        GtkTreePath *path_;
656
657
        if (!gtk_tree_selection_get_selected(edit_account.selection,
658
                                             NULL, &iter_))
659
                return;
660
        path_ = gtk_tree_model_get_path
661
                (GTK_TREE_MODEL(edit_account.store), &iter_);
662
        gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(edit_account.treeview),
663
                                     path_, NULL, FALSE, 0.0, 0.0);
664
        gtk_tree_path_free(path_);
665
}
666
667
static gboolean account_key_pressed(GtkWidget *widget, GdkEventKey *event,
668
                                    gpointer data)
669
{
670
        if (event && event->keyval == GDK_Escape)
671
                account_edit_close();
672
        return FALSE;
673
}
674
675
static void account_set_row(PrefsAccount *ac_prefs, GtkTreeIter *iter,
676
                            GtkTreeIter *new, gboolean move_view)
677
{
678
        GtkListStore *store = edit_account.store;
679
        GtkTreeIter iter_;
680
        const gchar *protocol, *server;
681
        gboolean has_getall;
682
683
        g_return_if_fail(ac_prefs != NULL);
684
685
#if USE_SSL
686
        protocol = ac_prefs->protocol == A_POP3 ?
687
                   (ac_prefs->ssl_pop == SSL_TUNNEL ?
688
                    "POP3 (SSL)" :
689
                    ac_prefs->ssl_pop == SSL_STARTTLS ?
690
                    "POP3 (TLS)" : "POP3") :
691
                   ac_prefs->protocol == A_IMAP4 ?
692
                   (ac_prefs->ssl_imap == SSL_TUNNEL ?
693
                    "IMAP4 (SSL)" :
694
                    ac_prefs->ssl_imap == SSL_STARTTLS ?
695
                    "IMAP4 (TLS)" : "IMAP4") :
696
                   ac_prefs->protocol == A_NNTP ?
697
                   (ac_prefs->ssl_nntp == SSL_TUNNEL ?
698
                    "NNTP (SSL)" : "NNTP") :
699
                   "";
700
#else
701
        protocol = ac_prefs->protocol == A_POP3  ? "POP3" :
702
                   ac_prefs->protocol == A_IMAP4 ? "IMAP4" :
703
                   ac_prefs->protocol == A_NNTP  ? "NNTP" : "";
704
#endif
705
        server = ac_prefs->protocol == A_NNTP ?
706
                ac_prefs->nntp_server : ac_prefs->recv_server;
707
708
        has_getall = (ac_prefs->protocol == A_POP3  ||
709
                      ac_prefs->protocol == A_IMAP4 ||
710
                      ac_prefs->protocol == A_NNTP);
711
712
        if (!iter)
713
                gtk_list_store_append(store, &iter_);
714
        else
715
                iter_ = *iter;
716
717
        gtk_list_store_set(store, &iter_,
718
                           COL_DEFAULT, ac_prefs->is_default,
719
                           COL_GETALL, has_getall && ac_prefs->recv_at_getall,
720
                           COL_NAME, ac_prefs->account_name,
721
                           COL_PROTOCOL, protocol,
722
                           COL_SERVER, server,
723
                           COL_ACCOUNT, ac_prefs,
724
                           COL_CAN_GETALL, has_getall,
725
                           -1);
726
727
        if (new)
728
                *new = iter_;
729
730
        if (move_view) {
731
                GtkTreePath *path;
732
733
                path = gtk_tree_model_get_path
734
                        (GTK_TREE_MODEL(edit_account.store), &iter_);
735
                gtk_tree_view_scroll_to_cell
736
                        (GTK_TREE_VIEW(edit_account.treeview),
737
                         path, NULL, TRUE, 0.5, 0.0);
738
                gtk_tree_path_free(path);
739
        }
740
}
741
742
/* set dialog from account list */
743
static void account_set_dialog(void)
744
{
745
        GList *cur;
746
        GtkTreeIter iter;
747
        GtkTreePath *path;
748
749
        gtk_list_store_clear(edit_account.store);
750
751
        for (cur = account_get_list(); cur != NULL; cur = cur->next) {
752
                account_set_row((PrefsAccount *)cur->data, NULL, &iter, FALSE);
753
                if ((PrefsAccount *)cur->data == cur_account) {
754
                        gtk_tree_selection_select_iter(edit_account.selection,
755
                                                       &iter);
756
                }
757
        }
758
759
        if (!gtk_tree_selection_get_selected(edit_account.selection, NULL,
760
                                             &iter))
761
                return;
762
        path = gtk_tree_model_get_path(GTK_TREE_MODEL(edit_account.store),
763
                                       &iter);
764
        gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(edit_account.treeview),
765
                                     path, NULL, FALSE, 0.0, 0.0);
766
        gtk_tree_path_free(path);
767
}
768
769
/* update dialog to the latest state */
770
static void account_update_dialog(void)
771
{
772
        GtkTreeIter iter;
773
        GtkTreeModel *model = GTK_TREE_MODEL(edit_account.store);
774
        PrefsAccount *ac;
775
776
        if (!gtk_tree_model_get_iter_first(model, &iter))
777
                return;
778
779
        do {
780
                gtk_tree_model_get(model, &iter, COL_ACCOUNT, &ac, -1);
781
                if (ac)
782
                        account_set_row(ac, &iter, NULL, FALSE);
783
        } while (gtk_tree_model_iter_next(model, &iter));
784
}
785
786
/* set account list from dialog */
787
static void account_set_list(void)
788
{
789
        GtkTreeIter iter;
790
        GtkTreeModel *model = GTK_TREE_MODEL(edit_account.store);
791
        PrefsAccount *ac;
792
793
        account_list_free();
794
795
        if (!gtk_tree_model_get_iter_first(model, &iter))
796
                return;
797
798
        do {
799
                gtk_tree_model_get(model, &iter, COL_ACCOUNT, &ac, -1);
800
                if (ac)
801
                        account_append(ac);
802
        } while (gtk_tree_model_iter_next(model, &iter));
803
}