75
74
#include "smime/gui/e-cert-selector.h"
77
/* Option widgets whose sensitivity depends on another widget, such
78
* as a checkbox being active, are indented to the right slightly for
79
* better visual clarity. This specifies how far to the right. */
80
#define INDENT_MARGIN 24
80
84
static ServerData mail_servers[] = {
81
{"gmail", "imap.gmail.com", "smtp.gmail.com", "imap", "always"},
82
{"googlemail", "imap.gmail.com", "smtp.gmail.com", "imap", "always"},
83
{"yahoo", "pop3.yahoo.com", "smtp.yahoo.com", "pop", "never"},
84
{"aol", "imap.aol.com", "smtp.aol.com", "imap", "never"},
85
{"msn", "pop3.email.msn.com", "smtp.email.msn.com", "pop", "never", "@", "@"},
86
{"hotmail", "pop3.live.com", "smtp.live.com", "pop", "always", "@", "@"},
87
{"live.com", "pop3.live.com", "smtp.live.com", "pop", "always", "@", "@"},
85
{ "gmail", "imap.gmail.com", "smtp.gmail.com", "imap",
86
CAMEL_NETWORK_SECURITY_METHOD_SSL_ON_ALTERNATE_PORT },
87
{ "googlemail", "imap.gmail.com", "smtp.gmail.com", "imap",
88
CAMEL_NETWORK_SECURITY_METHOD_SSL_ON_ALTERNATE_PORT },
89
{ "yahoo", "pop3.yahoo.com", "smtp.yahoo.com", "pop",
90
CAMEL_NETWORK_SECURITY_METHOD_NONE },
91
{ "aol", "imap.aol.com", "smtp.aol.com", "imap",
92
CAMEL_NETWORK_SECURITY_METHOD_NONE },
93
{ "msn", "pop3.email.msn.com", "smtp.email.msn.com", "pop",
94
CAMEL_NETWORK_SECURITY_METHOD_NONE, "@", "@"},
95
{ "hotmail", "pop3.live.com", "smtp.live.com", "pop",
96
CAMEL_NETWORK_SECURITY_METHOD_SSL_ON_ALTERNATE_PORT, "@", "@"},
97
{ "live.com", "pop3.live.com", "smtp.live.com", "pop",
98
CAMEL_NETWORK_SECURITY_METHOD_SSL_ON_ALTERNATE_PORT, "@", "@"},
1487
emae_hostname_changed (GtkEntry *entry, EMAccountEditorService *service)
1532
emae_hostname_changed (GtkEntry *entry,
1533
EMAccountEditorService *service)
1489
1535
emae_service_url_changed (service, emae_url_set_host, GTK_WIDGET (entry));
1493
emae_port_changed (EPortEntry *pentry, EMAccountEditorService *service)
1539
emae_port_changed (EPortEntry *pentry,
1540
EMAccountEditorService *service)
1495
1542
emae_service_url_changed (service, emae_url_set_port, GTK_WIDGET (pentry));
1499
emae_username_changed (GtkEntry *entry, EMAccountEditorService *service)
1546
emae_username_changed (GtkEntry *entry,
1547
EMAccountEditorService *service)
1501
1549
emae_service_url_changed (service, camel_url_set_user, GTK_WIDGET (entry));
1505
emae_path_changed (GtkWidget *widget, EMAccountEditorService *service)
1553
emae_path_changed (GtkWidget *widget,
1554
EMAccountEditorService *service)
1507
1556
emae_service_url_path_changed (service, camel_url_set_path, widget);
1511
emae_ssl_update (EMAccountEditorService *service, CamelURL *url)
1560
emae_ssl_changed (GtkComboBox *dropdown,
1561
EMAccountEditorService *service)
1513
gint id = gtk_combo_box_get_active (service->use_ssl);
1514
GtkTreeModel *model;
1521
model = gtk_combo_box_get_model (service->use_ssl);
1522
if (gtk_tree_model_iter_nth_child (model, &iter, NULL, id)) {
1523
gtk_tree_model_get (model, &iter, 1, &ssl, -1);
1524
if (!strcmp (ssl, "none"))
1527
e_port_entry_security_port_changed (service->port, ssl);
1529
camel_url_set_param (url, "use_ssl", ssl);
1530
camel_url_set_port (url, e_port_entry_get_port (service->port));
1565
url = emae_account_url (
1567
emae_service_info[service->type].account_uri_key);
1568
camel_url_set_port (url, e_port_entry_get_port (service->port));
1569
emae_uri_changed (service, url);
1570
camel_url_free (url);
1538
emae_ssl_changed (GtkComboBox *dropdown, EMAccountEditorService *service)
1574
emae_setup_settings (EMAccountEditorService *service)
1540
CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key);
1542
if (emae_ssl_update (service, url))
1543
emae_uri_changed (service, url);
1577
EMConfigTargetAccount *target;
1578
CamelServiceClass *class;
1582
url = emae_account_url (
1584
emae_service_info[service->type].account_uri_key);
1586
/* Destroy any old CamelSettings instances.
1587
* Changing CamelProviders invalidates them. */
1589
if (service->settings != NULL) {
1590
camel_settings_save_to_url (service->settings, url);
1591
g_object_unref (service->settings);
1592
service->settings = NULL;
1595
g_return_if_fail (service->provider != NULL);
1597
service_type = service->provider->object_types[service->type];
1598
g_return_if_fail (g_type_is_a (service_type, CAMEL_TYPE_SERVICE));
1600
class = g_type_class_ref (service_type);
1602
if (g_type_is_a (class->settings_type, CAMEL_TYPE_SETTINGS)) {
1603
service->settings = g_object_new (class->settings_type, NULL);
1604
camel_settings_load_from_url (service->settings, url);
1607
g_type_class_unref (class);
1544
1608
camel_url_free (url);
1610
/* If settings implements CamelNetworkSettings, bind the
1611
* "security-method" property to the security combo box
1612
* and to the EPortEntry widget. */
1613
if (CAMEL_IS_NETWORK_SETTINGS (service->settings)) {
1614
g_object_bind_property_full (
1615
service->settings, "security-method",
1616
service->use_ssl, "active-id",
1617
G_BINDING_BIDIRECTIONAL |
1618
G_BINDING_SYNC_CREATE,
1619
e_binding_transform_enum_value_to_nick,
1620
e_binding_transform_enum_nick_to_value,
1621
NULL, (GDestroyNotify) NULL);
1623
g_object_bind_property (
1624
service->settings, "security-method",
1625
service->port, "security-method",
1626
G_BINDING_SYNC_CREATE);
1629
/* Update the EConfigTarget so it has the latest CamelSettings. */
1631
config = E_CONFIG (service->emae->priv->config);
1632
target = (EMConfigTargetAccount *) config->target;
1634
em_config_target_new_account_update_settings (
1635
config, target, service->emae->priv->source.settings);
2421
emae_option_toggle_changed (GtkToggleButton *toggle,
2422
EMAccountEditorService *service)
2424
const gchar *name = g_object_get_data ((GObject *)toggle, "option-name");
2425
GSList *depl = g_object_get_data ((GObject *)toggle, "dependent-list");
2426
gint active = gtk_toggle_button_get_active (toggle);
2427
CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key);
2429
for (;depl;depl = g_slist_next (depl))
2430
gtk_widget_set_sensitive ((GtkWidget *) depl->data, active);
2432
camel_url_set_param (url, name, active?"":NULL);
2433
emae_uri_changed (service, url);
2434
camel_url_free (url);
2437
2504
static GtkWidget *
2438
2505
emae_option_toggle (EMAccountEditorService *service,
2445
w = gtk_check_button_new_with_mnemonic (text);
2446
g_object_set_data ((GObject *)w, "option-name", (gpointer)name);
2447
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), camel_url_get_param (url, name) != NULL);
2448
g_signal_connect (w, "toggled", G_CALLBACK(emae_option_toggle_changed), service);
2449
gtk_widget_show (w);
2455
emae_option_entry_changed (GtkEntry *entry,
2456
EMAccountEditorService *service)
2458
const gchar *name = g_object_get_data ((GObject *)entry, "option-name");
2459
const gchar *text = gtk_entry_get_text (entry);
2460
CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key);
2462
camel_url_set_param (url, name, text && text[0]?text:NULL);
2463
emae_uri_changed (service, url);
2464
camel_url_free (url);
2506
CamelProviderConfEntry *conf)
2510
widget = gtk_check_button_new_with_mnemonic (conf->text);
2512
g_object_bind_property (
2513
service->settings, conf->name,
2515
G_BINDING_BIDIRECTIONAL |
2516
G_BINDING_SYNC_CREATE);
2518
if (conf->depname != NULL) {
2519
g_object_bind_property (
2520
service->settings, conf->depname,
2521
widget, "sensitive",
2522
G_BINDING_SYNC_CREATE);
2523
gtk_widget_set_margin_left (widget, INDENT_MARGIN);
2467
2529
static GtkWidget *
2468
2530
emae_option_entry (EMAccountEditorService *service,
2531
CamelProviderConfEntry *conf,
2471
2532
GtkLabel *label_for_mnemonic)
2473
2534
GtkWidget *widget;
2474
const gchar *val = camel_url_get_param (url, name);
2479
widget = g_object_new (GTK_TYPE_ENTRY, "text", val, NULL);
2536
widget = gtk_entry_new ();
2480
2537
gtk_label_set_mnemonic_widget (label_for_mnemonic, widget);
2481
g_object_set_data (G_OBJECT (widget), "option-name", (gpointer) name);
2484
G_CALLBACK (emae_option_entry_changed), service);
2485
gtk_widget_show (widget);
2539
g_object_bind_property (
2540
service->settings, conf->name,
2542
G_BINDING_BIDIRECTIONAL |
2543
G_BINDING_SYNC_CREATE);
2545
if (conf->depname != NULL) {
2546
g_object_bind_property (
2547
service->settings, conf->depname,
2548
widget, "sensitive",
2549
G_BINDING_SYNC_CREATE);
2550
gtk_widget_set_margin_left (
2551
GTK_WIDGET (label_for_mnemonic), INDENT_MARGIN);
2554
g_object_bind_property (
2555
widget, "sensitive",
2556
label_for_mnemonic, "sensitive",
2557
G_BINDING_SYNC_CREATE);
2491
emae_option_checkspin_changed (GtkSpinButton *spin,
2492
EMAccountEditorService *service)
2494
const gchar *name = g_object_get_data ((GObject *)spin, "option-name");
2496
CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key);
2498
sprintf (value, "%d", gtk_spin_button_get_value_as_int (spin));
2499
camel_url_set_param (url, name, value);
2500
emae_uri_changed (service, url);
2501
camel_url_free (url);
2505
emae_option_checkspin_check_changed (GtkToggleButton *toggle,
2506
EMAccountEditorService *service)
2508
const gchar *name = g_object_get_data ((GObject *)toggle, "option-name");
2509
GtkSpinButton *spin = g_object_get_data ((GObject *)toggle, "option-target");
2511
if (gtk_toggle_button_get_active (toggle)) {
2512
gtk_widget_set_sensitive ((GtkWidget *) spin, TRUE);
2513
emae_option_checkspin_changed (spin, service);
2515
CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key);
2517
camel_url_set_param (url, name, NULL);
2518
gtk_widget_set_sensitive ((GtkWidget *) spin, FALSE);
2519
emae_uri_changed (service, url);
2520
camel_url_free (url);
2525
parse_checkspin_format (const gchar *str,
2533
/* FIXME: this is a fugly api. */
2535
|| sscanf (str, "%c:%lf:%lf:%lf", &on, min_ret, def_ret, max_ret) != 4) {
2536
*on_ret = FALSE; /* FIXME: we could do better error handling here... */
2543
*on_ret = (on == 'y');
2546
2562
static GtkWidget *
2547
2563
emae_option_checkspin (EMAccountEditorService *service,
2564
CamelProviderConfEntry *conf)
2553
GtkWidget *hbox, *check, *spin, *label = NULL;
2554
gdouble min, def, max;
2566
GObjectClass *class;
2568
GParamSpec *use_pspec;
2569
GtkAdjustment *adjustment;
2570
GtkWidget *hbox, *spin;
2572
gchar *use_property_name;
2555
2573
gchar *pre, *post;
2559
pre = g_alloca (strlen (fmt)+1);
2575
/* The conf->name property (e.g. "foo") should be numeric for the
2576
* spin button. If a "use" boolean property exists (e.g. "use-foo")
2577
* then a checkbox is also shown. */
2579
g_return_val_if_fail (conf->name != NULL, NULL);
2581
class = G_OBJECT_GET_CLASS (service->settings);
2582
pspec = g_object_class_find_property (class, conf->name);
2583
g_return_val_if_fail (pspec != NULL, NULL);
2585
use_property_name = g_strconcat ("use-", conf->name, NULL);
2586
use_pspec = g_object_class_find_property (class, use_property_name);
2587
if (use_pspec != NULL && use_pspec->value_type != G_TYPE_BOOLEAN)
2589
g_free (use_property_name);
2591
/* Make sure we can convert to and from doubles. */
2592
g_return_val_if_fail (
2593
g_value_type_transformable (
2594
pspec->value_type, G_TYPE_DOUBLE), NULL);
2595
g_return_val_if_fail (
2596
g_value_type_transformable (
2597
G_TYPE_DOUBLE, pspec->value_type), NULL);
2599
if (G_IS_PARAM_SPEC_CHAR (pspec)) {
2600
GParamSpecChar *pspec_char;
2601
pspec_char = G_PARAM_SPEC_CHAR (pspec);
2602
adjustment = gtk_adjustment_new (
2603
(gdouble) pspec_char->default_value,
2604
(gdouble) pspec_char->minimum,
2605
(gdouble) pspec_char->maximum,
2608
} else if (G_IS_PARAM_SPEC_UCHAR (pspec)) {
2609
GParamSpecUChar *pspec_uchar;
2610
pspec_uchar = G_PARAM_SPEC_UCHAR (pspec);
2611
adjustment = gtk_adjustment_new (
2612
(gdouble) pspec_uchar->default_value,
2613
(gdouble) pspec_uchar->minimum,
2614
(gdouble) pspec_uchar->maximum,
2617
} else if (G_IS_PARAM_SPEC_INT (pspec)) {
2618
GParamSpecInt *pspec_int;
2619
pspec_int = G_PARAM_SPEC_INT (pspec);
2620
adjustment = gtk_adjustment_new (
2621
(gdouble) pspec_int->default_value,
2622
(gdouble) pspec_int->minimum,
2623
(gdouble) pspec_int->maximum,
2626
} else if (G_IS_PARAM_SPEC_UINT (pspec)) {
2627
GParamSpecUInt *pspec_uint;
2628
pspec_uint = G_PARAM_SPEC_UINT (pspec);
2629
adjustment = gtk_adjustment_new (
2630
(gdouble) pspec_uint->default_value,
2631
(gdouble) pspec_uint->minimum,
2632
(gdouble) pspec_uint->maximum,
2635
} else if (G_IS_PARAM_SPEC_LONG (pspec)) {
2636
GParamSpecLong *pspec_long;
2637
pspec_long = G_PARAM_SPEC_LONG (pspec);
2638
adjustment = gtk_adjustment_new (
2639
(gdouble) pspec_long->default_value,
2640
(gdouble) pspec_long->minimum,
2641
(gdouble) pspec_long->maximum,
2644
} else if (G_IS_PARAM_SPEC_ULONG (pspec)) {
2645
GParamSpecULong *pspec_ulong;
2646
pspec_ulong = G_PARAM_SPEC_ULONG (pspec);
2647
adjustment = gtk_adjustment_new (
2648
(gdouble) pspec_ulong->default_value,
2649
(gdouble) pspec_ulong->minimum,
2650
(gdouble) pspec_ulong->maximum,
2653
} else if (G_IS_PARAM_SPEC_FLOAT (pspec)) {
2654
GParamSpecFloat *pspec_float;
2655
pspec_float = G_PARAM_SPEC_FLOAT (pspec);
2656
adjustment = gtk_adjustment_new (
2657
(gdouble) pspec_float->default_value,
2658
(gdouble) pspec_float->minimum,
2659
(gdouble) pspec_float->maximum,
2662
} else if (G_IS_PARAM_SPEC_DOUBLE (pspec)) {
2663
GParamSpecDouble *pspec_double;
2664
pspec_double = G_PARAM_SPEC_DOUBLE (pspec);
2665
adjustment = gtk_adjustment_new (
2666
(gdouble) pspec_double->default_value,
2667
(gdouble) pspec_double->minimum,
2668
(gdouble) pspec_double->maximum,
2672
g_return_val_if_reached (NULL);
2674
pre = g_alloca (strlen (conf->text) + 1);
2675
strcpy (pre, conf->text);
2561
2676
post = strstr (pre, "%s");
2567
/* FIXME: the following sucks. The CamelURL may contain a default value
2568
* already (or if it doesn't, it means that the option is turned off).
2569
* However, the URL doesn't have information about the range for the
2570
* value (min, max). So we need to parse that out of the original
2571
* description for the option from the CamelProvider.
2574
parse_checkspin_format (info, &on, &min, &def, &max);
2576
val = camel_url_get_param (url, name);
2579
def = strtod (val, NULL);
2583
hbox = gtk_hbox_new (FALSE, 0);
2584
check = g_object_new (gtk_check_button_get_type (), "label", pre, "use_underline", TRUE, "active", on, NULL);
2586
spin = gtk_spin_button_new ((GtkAdjustment *) gtk_adjustment_new (def, min, max, 1, 1, 0), 1, 0);
2588
label = gtk_label_new_with_mnemonic (post);
2589
gtk_label_set_mnemonic_widget (GTK_LABEL (label), check);
2591
gtk_box_pack_start ((GtkBox *) hbox, check, FALSE, TRUE, 0);
2592
gtk_box_pack_start ((GtkBox *) hbox, spin, FALSE, TRUE, 0);
2594
gtk_box_pack_start ((GtkBox *) hbox, label, FALSE, TRUE, 4);
2596
g_object_set_data ((GObject *)spin, "option-name", (gpointer)name);
2597
g_object_set_data ((GObject *)check, "option-name", (gpointer)name);
2598
g_object_set_data ((GObject *)check, "option-target", (gpointer)spin);
2600
g_signal_connect (spin, "value_changed", G_CALLBACK(emae_option_checkspin_changed), service);
2601
g_signal_connect (check, "toggled", G_CALLBACK(emae_option_checkspin_check_changed), service);
2603
gtk_widget_show_all (hbox);
2682
hbox = gtk_hbox_new (FALSE, 3);
2684
if (use_pspec != NULL) {
2685
prefix = gtk_check_button_new_with_mnemonic (pre);
2687
g_object_bind_property (
2688
service->settings, use_pspec->name,
2690
G_BINDING_BIDIRECTIONAL |
2691
G_BINDING_SYNC_CREATE);
2693
prefix = gtk_label_new_with_mnemonic (pre);
2695
gtk_box_pack_start (GTK_BOX (hbox), prefix, FALSE, TRUE, 0);
2696
gtk_widget_show (prefix);
2698
spin = gtk_spin_button_new (adjustment, 1.0, 0);
2699
gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, TRUE, 0);
2700
gtk_widget_show (spin);
2702
g_object_bind_property (
2703
service->settings, conf->name,
2705
G_BINDING_BIDIRECTIONAL |
2706
G_BINDING_SYNC_CREATE);
2708
if (use_pspec != NULL)
2709
g_object_bind_property (
2712
G_BINDING_SYNC_CREATE);
2715
GtkWidget *label = gtk_label_new_with_mnemonic (post);
2716
gtk_label_set_mnemonic_widget (GTK_LABEL (label), prefix);
2717
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2718
gtk_widget_show (label);
2721
if (conf->depname != NULL) {
2722
g_object_bind_property (
2723
service->settings, conf->depname,
2725
G_BINDING_SYNC_CREATE);
2726
gtk_widget_set_margin_left (hbox, INDENT_MARGIN);
2609
emae_option_options_changed (GtkComboBox *options,
2610
EMAccountEditorService *service)
2612
const gchar *name = g_object_get_data (G_OBJECT (options), "option-name");
2613
gchar *value = NULL;
2614
CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key);
2615
gint id = gtk_combo_box_get_active (options);
2618
GtkTreeModel *model;
2621
model = gtk_combo_box_get_model (options);
2622
if (gtk_tree_model_iter_nth_child (model, &iter, NULL, id)) {
2623
gtk_tree_model_get (model, &iter, 0, &value, -1);
2627
camel_url_set_param (url, name, value);
2628
emae_uri_changed (service, url);
2629
camel_url_free (url);
2633
/* 'values' is in format "value0:caption0:value2:caption2:...valueN:captionN" */
2732
/* 'values' is in format "nick0:caption0:nick1:caption1:...nickN:captionN"
2733
* where 'nick' is the nickname of a GEnumValue belonging to a GEnumClass
2734
* determined by the type of the GObject property named "name". */
2634
2735
static GtkWidget *
2635
2736
emae_option_options (EMAccountEditorService *service,
2638
const gchar *values,
2737
CamelProviderConfEntry *conf,
2639
2738
GtkLabel *label)
2642
2741
GtkListStore *store;
2643
2742
GtkTreeIter iter;
2644
const gchar *p, *value, *caption;
2645
GtkCellRenderer *cell;
2646
gint active = 0; /* the first item entered is always a default item */
2648
const gchar *val = camel_url_get_param (url, name);
2650
w = GTK_COMBO_BOX (gtk_combo_box_new ());
2652
/* value and caption */
2744
GtkCellRenderer *renderer;
2746
/* nick and caption */
2653
2747
store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
2655
for (p = values, i = 0; p; i++) {
2752
const gchar *caption;
2656
2753
gchar *vl, *cp;
2659
2756
caption = strchr (p, ':');
3033
emae_get_checkable_folder_keys_widgets (EMAccountEditor *emae, guint32 flag, GtkWidget **check, GtkWidget **button, const gchar **param_key)
3035
g_return_if_fail (emae != NULL);
3036
g_return_if_fail (flag == CAMEL_PROVIDER_ALLOW_REAL_TRASH_FOLDER || flag == CAMEL_PROVIDER_ALLOW_REAL_JUNK_FOLDER);
3038
if (flag == CAMEL_PROVIDER_ALLOW_REAL_TRASH_FOLDER) {
3039
if (check) *check = (GtkWidget *) emae->priv->trash_folder_check;
3040
if (button) *button = (GtkWidget *) emae->priv->trash_folder_button;
3041
if (param_key) *param_key = "real_trash_path";
3043
if (check) *check = (GtkWidget *) emae->priv->junk_folder_check;
3044
if (button) *button = (GtkWidget *) emae->priv->junk_folder_button;
3045
if (param_key) *param_key = "real_junk_path";
3050
emae_real_url_toggled (GtkToggleButton *check, EMAccountEditor *emae)
3053
GtkWidget *butt = NULL;
3055
const gchar *param_key;
3057
g_return_if_fail (check != NULL);
3058
g_return_if_fail (emae != NULL);
3060
if (!gtk_widget_is_sensitive (GTK_WIDGET (check)) || !gtk_widget_get_visible (GTK_WIDGET (check)))
3063
flag = GPOINTER_TO_INT (g_object_get_data ((GObject *)check, "url-flag"));
3064
g_return_if_fail (flag == CAMEL_PROVIDER_ALLOW_REAL_TRASH_FOLDER || flag == CAMEL_PROVIDER_ALLOW_REAL_JUNK_FOLDER);
3066
emae_get_checkable_folder_keys_widgets (emae, flag, NULL, &butt, ¶m_key);
3068
checked = gtk_toggle_button_get_active (check);
3069
gtk_widget_set_sensitive (butt, checked);
3074
url = emae_account_url (emae, emae_service_info[emae->priv->source.type].account_uri_key);
3075
camel_url_set_param (url, param_key, NULL);
3076
emae_uri_changed (&emae->priv->source, url);
3077
camel_url_free (url);
3079
/* clear the previous selection */
3080
em_folder_selection_button_set_folder_uri ((EMFolderSelectionButton *)butt, "");
3085
emae_real_url_folder_changed (EMFolderSelectionButton *folder,
3086
EMAccountEditor *emae)
3090
GtkWidget *check = NULL;
3091
const gchar *param_key = NULL, *curi_selected;
3093
g_return_if_fail (folder != NULL);
3094
g_return_if_fail (emae != NULL);
3096
if (!gtk_widget_is_sensitive (GTK_WIDGET (folder)) || !gtk_widget_get_visible (GTK_WIDGET (folder)))
3099
flag = GPOINTER_TO_INT (g_object_get_data ((GObject *)folder, "url-flag"));
3100
g_return_if_fail (flag == CAMEL_PROVIDER_ALLOW_REAL_TRASH_FOLDER || flag == CAMEL_PROVIDER_ALLOW_REAL_JUNK_FOLDER);
3102
emae_get_checkable_folder_keys_widgets (emae, flag, &check, NULL, ¶m_key);
3104
if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)))
3107
url = emae_account_url (emae, emae_service_info[emae->priv->source.type].account_uri_key);
3109
curi_selected = em_folder_selection_button_get_folder_uri (folder);
3110
if (!curi_selected || !*curi_selected) {
3111
camel_url_set_param (url, param_key, NULL);
3113
gchar *selected_folder_name = NULL;
3114
CamelStore *selected_store = NULL;
3115
EMailBackend *backend;
3102
emae_real_url_toggled (GtkToggleButton *check,
3103
EMFolderSelectionButton *button)
3105
if (!gtk_toggle_button_get_active (check))
3106
em_folder_selection_button_set_folder_uri (button, "");
3110
set_real_folder_path (GtkButton *folder_button,
3111
CamelSettings *settings,
3112
const gchar *settings_prop,
3115
gchar *path = NULL, *uri;
3116
gchar *encoded_name;
3118
const gchar *folder_name;
3120
g_return_if_fail (folder_button != NULL);
3121
g_return_if_fail (settings != NULL);
3122
g_return_if_fail (settings_prop != NULL);
3123
g_return_if_fail (account != NULL);
3125
g_object_get (G_OBJECT (settings), settings_prop, &path, NULL);
3127
if (!path || !*path) {
3134
/* Skip the leading slash, if present. */
3135
if (*folder_name == '/')
3138
encoded_uid = camel_url_encode (account->uid, ":;@/");
3139
encoded_name = camel_url_encode (folder_name, "#");
3141
uri = g_strdup_printf ("folder://%s/%s", encoded_uid, encoded_name);
3143
g_free (encoded_uid);
3144
g_free (encoded_name);
3147
em_folder_selection_button_set_folder_uri (EM_FOLDER_SELECTION_BUTTON (folder_button), uri);
3153
update_real_folder_cb (GtkButton *folder_button,
3154
GParamSpec *par_spec,
3155
EMAccountEditor *emae)
3157
EMFolderSelectionButton *sel_button;
3158
CamelSettings *settings;
3159
const gchar *prop_name = NULL;
3160
const gchar *folder_uri;
3163
g_return_if_fail (folder_button != NULL);
3164
g_return_if_fail (emae != NULL);
3165
g_return_if_fail (emae->priv != NULL);
3167
settings = emae->priv->source.settings;
3168
if (folder_button == emae->priv->trash_folder_button)
3169
prop_name = "real-trash-path";
3170
else if (folder_button == emae->priv->junk_folder_button)
3171
prop_name = "real-junk-path";
3173
g_return_if_fail (prop_name != NULL);
3175
sel_button = EM_FOLDER_SELECTION_BUTTON (folder_button);
3176
g_return_if_fail (sel_button != NULL);
3178
folder_uri = em_folder_selection_button_get_folder_uri (sel_button);
3179
if (folder_uri && *folder_uri) {
3116
3180
EMailSession *session;
3119
backend = em_account_editor_get_backend (emae);
3120
session = e_mail_backend_get_session (backend);
3122
valid = e_mail_folder_uri_parse (
3123
CAMEL_SESSION (session), curi_selected,
3124
&selected_store, &selected_folder_name, NULL);
3125
g_return_if_fail (valid);
3127
if (*selected_folder_name == '/')
3128
camel_url_set_param (
3129
url, param_key, selected_folder_name + 1);
3131
camel_url_set_param (
3132
url, param_key, selected_folder_name);
3134
g_free (selected_folder_name);
3136
g_object_unref (selected_store);
3139
emae_uri_changed (&emae->priv->source, url);
3140
camel_url_free (url);
3144
setup_checkable_folder (EMAccountEditor *emae,
3151
EMFolderSelectionButton *folderbutt;
3153
const gchar *value, *param_key = NULL;
3155
g_return_if_fail (emae != NULL);
3156
g_return_if_fail (check != NULL);
3157
g_return_if_fail (button != NULL);
3158
g_return_if_fail (flag == CAMEL_PROVIDER_ALLOW_REAL_TRASH_FOLDER || flag == CAMEL_PROVIDER_ALLOW_REAL_JUNK_FOLDER);
3160
account = em_account_editor_get_modified_account (emae);
3161
g_return_if_fail (account != NULL);
3163
folderbutt = EM_FOLDER_SELECTION_BUTTON (button);
3164
url = emae_account_url (emae, emae_service_info[emae->priv->source.type].account_uri_key);
3166
emae_get_checkable_folder_keys_widgets (emae, flag, NULL, NULL, ¶m_key);
3168
value = camel_url_get_param (url, param_key);
3169
available = account->enabled;
3170
gtk_widget_set_sensitive (check, available);
3172
if (value && *value) {
3173
gchar *url_string = camel_url_to_string (url, CAMEL_URL_HIDE_ALL);
3175
em_folder_selection_button_set_folder_uri (folderbutt, "");
3177
CamelURL *copy = camel_url_new (url_string, NULL);
3180
g_free (copy->path);
3181
copy->path = g_strconcat ("/", value, NULL);
3182
g_free (url_string);
3184
url_string = camel_url_to_string (copy, CAMEL_URL_HIDE_ALL);
3185
em_folder_selection_button_set_folder_uri (folderbutt, url_string ? url_string : "");
3186
g_free (url_string);
3189
em_folder_selection_button_set_folder_uri (folderbutt, "");
3192
value = em_folder_selection_button_get_folder_uri (folderbutt);
3193
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), value && *value);
3194
gtk_widget_set_sensitive (button, available && value && *value);
3196
g_object_set_data ((GObject *)check, "url-flag", GINT_TO_POINTER(flag));
3197
g_object_set_data ((GObject *)folderbutt, "url-flag", GINT_TO_POINTER(flag));
3199
g_signal_connect (check, "toggled", G_CALLBACK (emae_real_url_toggled), emae);
3200
g_signal_connect (folderbutt, "selected", G_CALLBACK (emae_real_url_folder_changed), emae);
3202
available = emae->priv->source.provider && ((emae->priv->source.provider->flags & flag) == flag);
3204
gtk_widget_show (check);
3205
gtk_widget_show (button);
3207
gtk_widget_hide (check);
3208
gtk_widget_hide (button);
3211
camel_url_free (url);
3182
session = e_mail_backend_get_session (em_folder_selection_button_get_backend (sel_button));
3183
if (!e_mail_folder_uri_parse (CAMEL_SESSION (session), folder_uri, NULL, &path, NULL))
3187
g_object_set (G_OBJECT (settings), prop_name, path, NULL);
3214
3191
static GtkWidget *
3260
3257
widget = e_builder_get_widget (builder, "trash_folder_butt");
3261
3258
button = EM_FOLDER_SELECTION_BUTTON (widget);
3262
em_folder_selection_button_set_account (button, account);
3263
3259
em_folder_selection_button_set_backend (button, backend);
3260
em_folder_selection_button_set_store (button, store);
3264
3261
priv->trash_folder_button = GTK_BUTTON (button);
3266
setup_checkable_folder (
3267
emae, CAMEL_PROVIDER_ALLOW_REAL_TRASH_FOLDER,
3268
GTK_WIDGET (priv->trash_folder_check),
3269
GTK_WIDGET (priv->trash_folder_button));
3264
priv->trash_folder_check, "toggled",
3265
G_CALLBACK (emae_real_url_toggled),
3266
priv->trash_folder_button);
3268
g_object_bind_property (
3269
priv->trash_folder_check, "active",
3270
priv->trash_folder_button, "sensitive",
3271
G_BINDING_SYNC_CREATE);
3273
pspec = !settings ? NULL : g_object_class_find_property (
3274
G_OBJECT_GET_CLASS (settings), "use-real-trash-path");
3277
g_object_bind_property (
3278
settings, "use-real-trash-path",
3279
priv->trash_folder_check, "active",
3280
G_BINDING_BIDIRECTIONAL |
3281
G_BINDING_SYNC_CREATE);
3283
pspec = !settings ? NULL : g_object_class_find_property (
3284
G_OBJECT_GET_CLASS (settings), "real-trash-path");
3286
if (pspec != NULL) {
3287
set_real_folder_path (priv->trash_folder_button, settings, "real-trash-path", account);
3288
g_signal_connect (priv->trash_folder_button, "notify::folder-uri", G_CALLBACK (update_real_folder_cb), emae);
3291
flags = CAMEL_PROVIDER_ALLOW_REAL_TRASH_FOLDER;
3292
visible = (emae->priv->source.provider != NULL) &&
3293
((emae->priv->source.provider->flags & flags) != 0);
3294
widget = GTK_WIDGET (priv->trash_folder_check);
3295
gtk_widget_set_visible (widget, visible);
3296
widget = GTK_WIDGET (priv->trash_folder_button);
3297
gtk_widget_set_visible (widget, visible);
3271
3299
widget = e_builder_get_widget (builder, "junk_folder_check");
3272
3300
priv->junk_folder_check = GTK_TOGGLE_BUTTON (widget);
3274
3302
widget = e_builder_get_widget (builder, "junk_folder_butt");
3275
3303
button = EM_FOLDER_SELECTION_BUTTON (widget);
3276
em_folder_selection_button_set_account (button, account);
3277
3304
em_folder_selection_button_set_backend (button, backend);
3305
em_folder_selection_button_set_store (button, store);
3278
3306
priv->junk_folder_button = GTK_BUTTON (button);
3280
setup_checkable_folder (
3281
emae, CAMEL_PROVIDER_ALLOW_REAL_JUNK_FOLDER,
3282
GTK_WIDGET (priv->junk_folder_check),
3283
GTK_WIDGET (priv->junk_folder_button));
3309
priv->junk_folder_check, "toggled",
3310
G_CALLBACK (emae_real_url_toggled),
3311
priv->junk_folder_button);
3313
g_object_bind_property (
3314
priv->junk_folder_check, "active",
3315
priv->junk_folder_button, "sensitive",
3316
G_BINDING_SYNC_CREATE);
3318
pspec = !settings ? NULL : g_object_class_find_property (
3319
G_OBJECT_GET_CLASS (settings), "use-real-junk-path");
3322
g_object_bind_property (
3323
settings, "use-real-junk-path",
3324
priv->junk_folder_check, "active",
3325
G_BINDING_BIDIRECTIONAL |
3326
G_BINDING_SYNC_CREATE);
3328
pspec = !settings ? NULL : g_object_class_find_property (
3329
G_OBJECT_GET_CLASS (settings), "real-junk-path");
3331
if (pspec != NULL) {
3332
set_real_folder_path (priv->junk_folder_button, settings, "real-junk-path", account);
3333
g_signal_connect (priv->junk_folder_button, "notify::folder-uri", G_CALLBACK (update_real_folder_cb), emae);
3336
flags = CAMEL_PROVIDER_ALLOW_REAL_JUNK_FOLDER;
3337
visible = (emae->priv->source.provider != NULL) &&
3338
((emae->priv->source.provider->flags & flags) != 0);
3339
widget = GTK_WIDGET (priv->junk_folder_check);
3340
gtk_widget_set_visible (widget, visible);
3341
widget = GTK_WIDGET (priv->junk_folder_button);
3342
gtk_widget_set_visible (widget, visible);
3285
3344
/* Special Folders "Reset Defaults" button */
3286
3345
priv->restore_folders_button = (GtkButton *)e_builder_get_widget (builder, "default_folders_button");