From b54ca9c03e98c7cf3baa11d452cee75f6bb79d9c Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Sat, 3 Feb 2007 13:08:52 +0000 Subject: [PATCH] * all: - implement i016: default button * modest-account-view-widget.[ch]: * modest-account-view-windows.[ch]: - add 'last updated' column - use ModestServerData - understand 'default'; make default account bold - add buttons - cleanup * modest-tny-account-store.c, modest-store-widget.[ch], modest-account-assistant.[ch]: - support Maildir/Mbox store accounts - choose a unique new name for server accounts * modest-ui.c: - remove some unused crap * modest-account-mgr.[ch]: - add _add_server_account base on (Camel)URI - re-emit ModestConf signals for default account * modest-text-utils.[ch]: - remove bogus caching from display_date * modest-account-mgr-helper.[ch]: - put default / last updated in ModestServerData as well pmo-trunk-r785 --- src/TODO | 2 +- src/gtk/modest-account-assistant.c | 88 ++++++++++++---- src/gtk/modest-account-view-window.c | 76 ++++++++++---- src/gtk/modest-store-widget.c | 33 +++++- src/gtk/modest-store-widget.h | 2 + src/modest-account-mgr-helpers.c | 19 +++- src/modest-account-mgr-helpers.h | 27 ++--- src/modest-account-mgr.c | 60 ++++++++++- src/modest-account-mgr.h | 17 +++ src/modest-defs.h | 3 + src/modest-text-utils.c | 33 +----- src/modest-text-utils.h | 6 +- src/modest-tny-account-store.c | 52 ++++----- src/modest-ui.c | 7 -- src/widgets/modest-account-view.c | 175 ++++++++++++++++++------------- src/widgets/modest-header-view-render.c | 16 +-- 16 files changed, 401 insertions(+), 215 deletions(-) diff --git a/src/TODO b/src/TODO index 95bc5e9..7e7b9b7 100644 --- a/src/TODO +++ b/src/TODO @@ -21,7 +21,7 @@ i012: use the platform icons (don't ship icons unlesss not provide by platform) i013: maemo: make tnymaemodevice track online/offline correctly i014: maemo: make all the platform integration stuff work (icons, .desktop, .service) i015: add 'edit' support to the account editor -i016: add 'make default' to the account editor +done: i016:: add 'make default' to the account editor i017: port account setup / editor to maemo i018: make d&d work diff --git a/src/gtk/modest-account-assistant.c b/src/gtk/modest-account-assistant.c index 0fbd6d5..3ad502b 100644 --- a/src/gtk/modest-account-assistant.c +++ b/src/gtk/modest-account-assistant.c @@ -559,13 +559,61 @@ on_close (ModestAccountAssistant *self, gpointer user_data) gtk_widget_hide (GTK_WIDGET (self)); } + +/* + * FIXME: hmmmm this a Camel internal thing, should move this + * somewhere else + */ +static gchar* +get_account_uri (ModestProtocol proto, const gchar* path) +{ + CamelURL *url; + gchar *uri; + + switch (proto) { + case MODEST_PROTOCOL_STORE_MBOX: + url = camel_url_new ("mbox:", NULL); break; + case MODEST_PROTOCOL_STORE_MAILDIR: + url = camel_url_new ("maildir:", NULL); break; + default: + g_return_val_if_reached (NULL); + } + camel_url_set_path (url, path); + uri = camel_url_to_string (url, 0); + camel_url_free (url); + + return uri; +} + +static gchar* +get_new_server_account_name (ModestAccountMgr* acc_mgr, ModestProtocol proto, + const gchar* username, const gchar *servername) +{ + gchar *name; + gint i = 0; + + while (TRUE) { + name = g_strdup_printf ("%s:%s@%s:%d", + modest_protocol_info_get_protocol_name(proto), + username ? username : "", + servername ? servername : "", + i++); + if (modest_account_mgr_account_exists (acc_mgr, name, TRUE, NULL)) + g_free (name); + else + break; + } + return name; +} + + static void on_apply (ModestAccountAssistant *self, gpointer user_data) { ModestAccountAssistantPrivate *priv; ModestProtocol proto; gchar *store_name, *transport_name; - const gchar *account_name, *username, *servername; + const gchar *account_name, *username, *servername, *path; ModestStoreWidget *store; ModestTransportWidget *transport; @@ -576,35 +624,33 @@ on_apply (ModestAccountAssistant *self, gpointer user_data) proto = modest_store_widget_get_proto (store); username = modest_store_widget_get_username (store); servername = modest_store_widget_get_servername (store); - store_name = g_strdup_printf ("%s:%s@%s", modest_protocol_info_get_protocol_name(proto), - username, servername); - - modest_account_mgr_add_server_account (priv->account_mgr, store_name, servername, - username, NULL, proto); - + path = modest_store_widget_get_path (store); + store_name = get_new_server_account_name (priv->account_mgr, proto,username, servername); + + if (proto == MODEST_PROTOCOL_STORE_MAILDIR || + proto == MODEST_PROTOCOL_STORE_MBOX) { + gchar *uri = get_account_uri (proto, path); + modest_account_mgr_add_server_account_uri (priv->account_mgr, store_name, proto, uri); + g_free (uri); + } else + modest_account_mgr_add_server_account (priv->account_mgr, store_name, servername, + username, NULL, proto); + /* create server account -> transport */ transport = MODEST_TRANSPORT_WIDGET(priv->transport_widget); proto = modest_transport_widget_get_proto (transport); - + username = NULL; + servername = NULL; if (proto == MODEST_PROTOCOL_TRANSPORT_SMTP) { servername = modest_transport_widget_get_servername (transport); if (modest_transport_widget_get_requires_auth (transport)) username = modest_transport_widget_get_username (transport); - else - username = g_get_user_name (); - } else { - username = g_get_user_name (); - servername = "localhost"; - } - transport_name = g_strdup_printf ("%s:%s@%s", - modest_protocol_info_get_protocol_name(proto), - username, servername); + + transport_name = get_new_server_account_name (priv->account_mgr, proto,username, servername); modest_account_mgr_add_server_account (priv->account_mgr, - transport_name, - servername, - username, - NULL, + transport_name, servername, + username, NULL, proto); /* create account */ diff --git a/src/gtk/modest-account-view-window.c b/src/gtk/modest-account-view-window.c index aaa9655..e493593 100644 --- a/src/gtk/modest-account-view-window.c +++ b/src/gtk/modest-account-view-window.c @@ -29,6 +29,8 @@ #include #include +#include +#include #include "modest-account-view-window.h" #include "modest-account-assistant.h" #include "modest-tny-platform-factory.h" @@ -49,8 +51,10 @@ enum { typedef struct _ModestAccountViewWindowPrivate ModestAccountViewWindowPrivate; struct _ModestAccountViewWindowPrivate { ModestWidgetFactory *widget_factory; + GtkWidget *add_button; GtkWidget *edit_button; GtkWidget *remove_button; + GtkWidget *default_button; ModestAccountView *account_view; }; #define MODEST_ACCOUNT_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -138,7 +142,9 @@ on_selection_changed (GtkTreeSelection *sel, ModestAccountViewWindow *self) GtkTreeModel *model; GtkTreeIter iter; gboolean has_selection; - + const gchar *account_name; + gchar *default_account_name; + priv = MODEST_ACCOUNT_VIEW_WINDOW_GET_PRIVATE(self); has_selection = @@ -146,6 +152,14 @@ on_selection_changed (GtkTreeSelection *sel, ModestAccountViewWindow *self) gtk_widget_set_sensitive (priv->edit_button, has_selection); gtk_widget_set_sensitive (priv->remove_button, has_selection); + + account_name = modest_account_view_get_selected_account (priv->account_view); + default_account_name = modest_account_mgr_get_default_account( + modest_runtime_get_account_mgr()); + gtk_widget_set_sensitive (priv->default_button, + default_account_name == NULL || account_name == NULL || + strcmp (default_account_name, account_name) != 0); + g_free (default_account_name); } static void @@ -222,6 +236,23 @@ on_add_button_clicked (GtkWidget *button, ModestAccountViewWindow *self) static void +on_default_button_clicked (GtkWidget *button, ModestAccountViewWindow *self) +{ + ModestAccountViewWindowPrivate *priv; + ModestAccountMgr *account_mgr; + const gchar *account_name; + + priv = MODEST_ACCOUNT_VIEW_WINDOW_GET_PRIVATE(self); + + account_mgr = modest_runtime_get_account_mgr(); + account_name = modest_account_view_get_selected_account (priv->account_view); + + modest_account_mgr_set_default_account (account_mgr, account_name); +} + + + +static void on_close_button_clicked (GtkWidget *button, ModestAccountViewWindow *self) { gtk_widget_destroy (GTK_WIDGET(self)); @@ -234,7 +265,6 @@ button_box_new (ModestAccountViewWindow *self) { GtkWidget *button_box; - GtkWidget *add_button, *remove_button, *edit_button; ModestAccountViewWindowPrivate *priv; priv = MODEST_ACCOUNT_VIEW_WINDOW_GET_PRIVATE(self); @@ -243,32 +273,33 @@ button_box_new (ModestAccountViewWindow *self) gtk_button_box_set_spacing (GTK_BUTTON_BOX (button_box), 6); gtk_button_box_set_layout (GTK_BUTTON_BOX (button_box), GTK_BUTTONBOX_START); - - add_button = gtk_button_new_from_stock(GTK_STOCK_ADD); - remove_button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); - edit_button = gtk_button_new_from_stock(GTK_STOCK_EDIT); - - g_signal_connect (G_OBJECT(add_button), "clicked", + + priv->add_button = gtk_button_new_from_stock(GTK_STOCK_ADD); + priv->default_button = gtk_button_new_with_label(_("Make default")); + priv->remove_button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); + priv->edit_button = gtk_button_new_from_stock(GTK_STOCK_EDIT); + + g_signal_connect (G_OBJECT(priv->add_button), "clicked", G_CALLBACK(on_add_button_clicked), self); - g_signal_connect (G_OBJECT(remove_button), "clicked", + g_signal_connect (G_OBJECT(priv->remove_button), "clicked", G_CALLBACK(on_remove_button_clicked), self); - g_signal_connect (G_OBJECT(edit_button), "clicked", + g_signal_connect (G_OBJECT(priv->edit_button), "clicked", G_CALLBACK(on_edit_button_clicked), self); - - gtk_box_pack_start (GTK_BOX(button_box), add_button, FALSE, FALSE,2); - gtk_box_pack_start (GTK_BOX(button_box), remove_button, FALSE, FALSE,2); - gtk_box_pack_start (GTK_BOX(button_box), edit_button, FALSE, FALSE,2); - - gtk_widget_set_sensitive (edit_button, FALSE); - gtk_widget_set_sensitive (remove_button, FALSE); - - /* remember these, so we can deactivate them when nothing is - * selected */ - priv->remove_button = remove_button; - priv->edit_button = edit_button; + g_signal_connect (G_OBJECT(priv->default_button), "clicked", + G_CALLBACK(on_default_button_clicked), + self); + + gtk_box_pack_start (GTK_BOX(button_box), priv->add_button, FALSE, FALSE,2); + gtk_box_pack_start (GTK_BOX(button_box), priv->default_button, FALSE, FALSE,2); + gtk_box_pack_start (GTK_BOX(button_box), priv->remove_button, FALSE, FALSE,2); + gtk_box_pack_start (GTK_BOX(button_box), priv->edit_button, FALSE, FALSE,2); + + gtk_widget_set_sensitive (priv->edit_button, FALSE); + gtk_widget_set_sensitive (priv->remove_button, FALSE); + gtk_widget_set_sensitive (priv->default_button, FALSE); return button_box; } @@ -304,7 +335,6 @@ window_vbox_new (ModestAccountViewWindow *self) gtk_box_pack_start (GTK_BOX(main_vbox), main_hbox, TRUE, TRUE, 2); - close_button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); g_signal_connect (G_OBJECT(close_button), "clicked", G_CALLBACK(on_close_button_clicked), diff --git a/src/gtk/modest-store-widget.c b/src/gtk/modest-store-widget.c index 85986c4..66b2586 100644 --- a/src/gtk/modest-store-widget.c +++ b/src/gtk/modest-store-widget.c @@ -317,10 +317,12 @@ modest_store_widget_get_remember_password (ModestStoreWidget *self) g_return_val_if_fail (self, FALSE); priv = MODEST_STORE_WIDGET_GET_PRIVATE(self); - return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(priv->remember_pwd)); + if (GTK_IS_TOGGLE_BUTTON(priv->remember_pwd)) + return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(priv->remember_pwd)); + else + return FALSE; } - const gchar* modest_store_widget_get_username (ModestStoreWidget *self) { @@ -328,8 +330,11 @@ modest_store_widget_get_username (ModestStoreWidget *self) g_return_val_if_fail (self, NULL); priv = MODEST_STORE_WIDGET_GET_PRIVATE(self); - - return gtk_entry_get_text (GTK_ENTRY(priv->username)); + + if (GTK_IS_ENTRY(priv->username)) + return gtk_entry_get_text (GTK_ENTRY(priv->username)); + else + return NULL; } const gchar* @@ -340,7 +345,10 @@ modest_store_widget_get_servername (ModestStoreWidget *self) g_return_val_if_fail (self, NULL); priv = MODEST_STORE_WIDGET_GET_PRIVATE(self); - return gtk_entry_get_text (GTK_ENTRY(priv->servername)); + if (GTK_IS_ENTRY(priv->servername)) + return gtk_entry_get_text (GTK_ENTRY(priv->servername)); + else + return NULL; } @@ -354,3 +362,18 @@ modest_store_widget_get_proto (ModestStoreWidget *self) return priv->proto; } + + +gchar * +modest_store_widget_get_path (ModestStoreWidget *self) +{ + ModestStoreWidgetPrivate *priv; + + g_return_val_if_fail (self, MODEST_PROTOCOL_UNKNOWN); + priv = MODEST_STORE_WIDGET_GET_PRIVATE(self); + + if (GTK_IS_FILE_CHOOSER(priv->chooser)) + return gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(priv->chooser)); + else + return NULL; +} diff --git a/src/gtk/modest-store-widget.h b/src/gtk/modest-store-widget.h index 15a0d2b..076532d 100644 --- a/src/gtk/modest-store-widget.h +++ b/src/gtk/modest-store-widget.h @@ -40,6 +40,8 @@ gboolean modest_store_widget_get_remember_password (ModestStoreWidget *se const gchar* modest_store_widget_get_username (ModestStoreWidget *self); const gchar* modest_store_widget_get_servername (ModestStoreWidget *self); ModestProtocol modest_store_widget_get_proto (ModestStoreWidget *self); +gchar * modest_store_widget_get_path (ModestStoreWidget *self); + G_END_DECLS diff --git a/src/modest-account-mgr-helpers.c b/src/modest-account-mgr-helpers.c index 74766fd..e719c72 100644 --- a/src/modest-account-mgr-helpers.c +++ b/src/modest-account-mgr-helpers.c @@ -74,11 +74,19 @@ modest_account_mgr_get_server_account_data (ModestAccountMgr *self, const gchar* TRUE, NULL); data->proto = modest_protocol_info_get_protocol (proto); g_free (proto); + + + data->last_updated = modest_account_mgr_get_int (self, name, + MODEST_ACCOUNT_LAST_UPDATED, + TRUE, NULL); data->password = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_PASSWORD, TRUE, NULL); - + + data->uri = modest_account_mgr_get_string (self, name, + MODEST_ACCOUNT_URI, + TRUE, NULL); data->options = modest_account_mgr_get_list (self, name, MODEST_ACCOUNT_OPTIONS, MODEST_CONF_VALUE_STRING, @@ -125,6 +133,7 @@ modest_account_mgr_get_account_data (ModestAccountMgr *self, const gchar* na { ModestAccountData *data; gchar *server_account; + gchar *default_account; g_return_val_if_fail (self, NULL); g_return_val_if_fail (name, NULL); @@ -137,13 +146,17 @@ modest_account_mgr_get_account_data (ModestAccountMgr *self, const gchar* na data->display_name = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_DISPLAY_NAME, FALSE, NULL); - data->fullname = modest_account_mgr_get_string (self, name, + data->fullname = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_FULLNAME, FALSE, NULL); data->email = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_EMAIL, FALSE, NULL); - data->enabled = modest_account_mgr_get_enabled (self, name); + data->is_enabled = modest_account_mgr_get_enabled (self, name); + + default_account = modest_account_mgr_get_default_account (self); + data->is_default = (default_account && strcmp (default_account, name) == 0); + g_free (default_account); /* store */ server_account = modest_account_mgr_get_string (self, name, diff --git a/src/modest-account-mgr-helpers.h b/src/modest-account-mgr-helpers.h index 61cef7d..c4411dd 100644 --- a/src/modest-account-mgr-helpers.h +++ b/src/modest-account-mgr-helpers.h @@ -41,21 +41,24 @@ G_BEGIN_DECLS typedef struct { - TnyAccount *tny_account; - gchar *account_name; - gchar *hostname; - gchar *username; - ModestProtocol proto; - gchar *password; - GSList *options; + TnyAccount *tny_account; + gchar *account_name; + gchar *hostname; + gchar *username; + gchar *uri; + ModestProtocol proto; + gchar *password; + time_t last_updated; + GSList *options; } ModestServerAccountData; typedef struct { - gchar *account_name; - gchar *display_name; - gchar *fullname; - gchar *email; - gboolean enabled; + gchar *account_name; + gchar *display_name; + gchar *fullname; + gchar *email; + gboolean is_enabled; + gboolean is_default; ModestServerAccountData *transport_account; ModestServerAccountData *store_account; } ModestAccountData; diff --git a/src/modest-account-mgr.c b/src/modest-account-mgr.c index ebbf2fb..85b4a8b 100644 --- a/src/modest-account-mgr.c +++ b/src/modest-account-mgr.c @@ -62,9 +62,20 @@ on_key_change (ModestConf *conf, const gchar *key, ModestConfEvent event, gpoint self = MODEST_ACCOUNT_MGR (user_data); priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self); + + /* there is only one not-really-account key which will still emit + * a signal: a change in MODEST_CONF_DEFAULT_ACCOUNT */ + if (key && strcmp (key, MODEST_CONF_DEFAULT_ACCOUNT) == 0) { + gchar *default_account = + modest_account_mgr_get_default_account (self); + g_signal_emit (G_OBJECT(self), signals[ACCOUNT_CHANGED_SIGNAL], 0, + default_account, key, FALSE); + g_free (default_account); + return; + } account = _modest_account_mgr_account_from_key (key, &is_account_key, &is_server_account); - + /* if this is not an account-related key change, ignore */ if (!account) return; @@ -83,10 +94,12 @@ on_key_change (ModestConf *conf, const gchar *key, ModestConfEvent event, gpoint else enabled = modest_account_mgr_get_enabled (self, account); - /* account was changed. + /* server account was changed, default account was changed * and always notify when enabled/disabled changes */ - if (enabled || g_str_has_suffix (key, MODEST_ACCOUNT_ENABLED)) + if (enabled || + g_str_has_suffix (key, MODEST_ACCOUNT_ENABLED) || + strcmp (key, MODEST_CONF_DEFAULT_ACCOUNT) == 0) g_signal_emit (G_OBJECT(self), signals[ACCOUNT_CHANGED_SIGNAL], 0, account, key, is_server_account); @@ -175,6 +188,7 @@ modest_account_mgr_finalize (GObject * obj) G_OBJECT_CLASS(parent_class)->finalize (obj); } + ModestAccountMgr * modest_account_mgr_new (ModestConf * conf) { @@ -214,7 +228,8 @@ modest_account_mgr_add_account (ModestAccountMgr *self, ModestAccountMgrPrivate *priv; gchar *key; gboolean ok; - + gchar *default_account; + g_return_val_if_fail (self, FALSE); g_return_val_if_fail (name, FALSE); g_return_val_if_fail (strchr(name, '/') == NULL, FALSE); @@ -261,6 +276,12 @@ modest_account_mgr_add_account (ModestAccountMgr *self, } } modest_account_mgr_set_enabled (self, name, TRUE); + + /* if no default account has been defined yet, do so now */ + default_account = modest_account_mgr_get_default_account (self); + if (!default_account) + modest_account_mgr_set_default_account (self, name); + g_free (default_account); return TRUE; } @@ -320,6 +341,37 @@ modest_account_mgr_add_server_account (ModestAccountMgr * self, } +gboolean +modest_account_mgr_add_server_account_uri (ModestAccountMgr * self, + const gchar *name, ModestProtocol proto, + const gchar *uri) +{ + ModestAccountMgrPrivate *priv; + gchar *key; + + g_return_val_if_fail (self, FALSE); + g_return_val_if_fail (name, FALSE); + g_return_val_if_fail (strchr(name, '/') == NULL, FALSE); + g_return_val_if_fail (uri, FALSE); + + priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self); + + + /* proto */ + key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_PROTO, TRUE); + modest_conf_set_string (priv->modest_conf, key, + modest_protocol_info_get_protocol_name(proto), NULL); + g_free (key); + + /* uri */ + key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_URI, TRUE); + modest_conf_set_string (priv->modest_conf, key, uri, NULL); + g_free (key); + + return TRUE; +} + + gboolean modest_account_mgr_remove_account (ModestAccountMgr * self, diff --git a/src/modest-account-mgr.h b/src/modest-account-mgr.h index 48e56bf..a1d3113 100644 --- a/src/modest-account-mgr.h +++ b/src/modest-account-mgr.h @@ -125,6 +125,23 @@ gboolean modest_account_mgr_add_server_account (ModestAccountMgr *self, const gchar *password, ModestProtocol proto); + +/** + * modest_account_mgr_add_server_account_uri: + * @self: a ModestAccountMgr instance + * @name: name (id) of the account, which is a valid UTF8 string that does not contain '/' + * @proto: the protocol (imap, smtp, ...) used for this account + * @uri: the URI + * + * add a server account to the configuration, based on the account-URI + * + * Returns: TRUE if succeeded, FALSE otherwise, + */ +gboolean modest_account_mgr_add_server_account_uri (ModestAccountMgr *self, + const gchar *name, + ModestProtocol proto, + const gchar* uri); + /** * modest_account_mgr_remove_account: * @self: a ModestAccountMgr instance diff --git a/src/modest-defs.h b/src/modest-defs.h index b92d044..e0dbc52 100644 --- a/src/modest-defs.h +++ b/src/modest-defs.h @@ -87,9 +87,12 @@ enum { #define MDOEST_ACCOUNT_REMEMBER_PWD "remember_pwd" /* boolean */ #define MODEST_ACCOUNT_HOSTNAME "hostname" /* string */ #define MODEST_ACCOUNT_USERNAME "username" /* string */ +#define MODEST_ACCOUNT_URI "uri" /* string */ + #define MODEST_ACCOUNT_PROTO "proto" /* string */ #define MODEST_ACCOUNT_ENABLED "enabled" /* boolean */ #define MODEST_ACCOUNT_TYPE "type" /* string */ +#define MODEST_ACCOUNT_LAST_UPDATED "last_updated" /* int */ #define MODEST_ACCOUNT_LEAVE_ON_SERVER "leave_on_server" /* boolean */ #define MODEST_ACCOUNT_PREFERRED_CNX "preferred_cnx" /* string */ diff --git a/src/modest-text-utils.c b/src/modest-text-utils.c index 0bcc66c..1d3c6e7 100644 --- a/src/modest-text-utils.c +++ b/src/modest-text-utils.c @@ -769,48 +769,25 @@ modest_text_utils_utf8_strcmp (const gchar* s1, const gchar *s2, gboolean insens return result; } -static GHashTable* -get_display_date_cache (void) -{ - return modest_cache_mgr_get_cache (modest_runtime_get_cache_mgr (), - MODEST_CACHE_MGR_CACHE_TYPE_DATE_STRING); -} - - -const gchar* +gchar* modest_text_utils_get_display_date (time_t date) { - static GHashTable *date_cache = NULL; - time_t now; const guint BUF_SIZE = 64; gchar date_buf[BUF_SIZE]; gchar now_buf [BUF_SIZE]; - gchar* cached_val; - if (G_UNLIKELY(!date_cache)) - date_cache = get_display_date_cache (); - - cached_val = g_hash_table_lookup (date_cache, &date); - if (cached_val) - return cached_val; - now = time (NULL); - - /* get today's date */ - modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date); - modest_text_utils_strftime (now_buf, BUF_SIZE, "%x", now); - /* today */ + modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date); + modest_text_utils_strftime (now_buf, BUF_SIZE, "%x", now); /* today */ + /* if this is today, get the time instead of the date */ if (strcmp (date_buf, now_buf) == 0) modest_text_utils_strftime (date_buf, BUF_SIZE, _("%X"), date); - - cached_val = g_strdup(date_buf); - g_hash_table_insert (date_cache, (gpointer)&date, (gpointer)cached_val); - return cached_val; + return g_strdup(date_buf); } gboolean diff --git a/src/modest-text-utils.h b/src/modest-text-utils.h index 2a3002b..27b1407 100644 --- a/src/modest-text-utils.h +++ b/src/modest-text-utils.h @@ -193,10 +193,10 @@ gint modest_text_utils_utf8_strcmp (const gchar* s1, const gchar *s2, gboolean i * * get a string representation for a date. * - * Returns: the new display date, as a constant string. - * must NOT be freed + * Returns: the new display date, as a newly allocated string; + * free with g_free */ -const gchar* modest_text_utils_get_display_date (time_t date); +gchar* modest_text_utils_get_display_date (time_t date); /** diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index feacae2..98d63c7 100644 --- a/src/modest-tny-account-store.c +++ b/src/modest-tny-account-store.c @@ -419,7 +419,9 @@ tny_account_for_proto (ModestProtocol proto) tny_account = TNY_ACCOUNT(tny_camel_pop_store_account_new ()); else if (proto == MODEST_PROTOCOL_STORE_IMAP) tny_account = TNY_ACCOUNT(tny_camel_imap_store_account_new ()); - else + else if (proto == MODEST_PROTOCOL_STORE_MAILDIR || proto == MODEST_PROTOCOL_STORE_MBOX) + tny_account = TNY_ACCOUNT(tny_camel_store_account_new()); + else g_return_val_if_reached (NULL); return tny_account; @@ -447,47 +449,39 @@ get_tny_account_from_server_account (ModestTnyAccountStore *self, account_data->account_name); return NULL; } - tny_account = tny_account_for_proto (account_data->proto); if (!tny_account) { g_printerr ("modest: could not create tny account for '%s'\n", account_data->account_name); return NULL; } - - /* Set account store, session and id */ - tny_camel_account_set_session (TNY_CAMEL_ACCOUNT(tny_account), /* session */ - priv->tny_session_camel); + tny_account_set_id (tny_account, account_data->account_name); + tny_camel_account_set_session (TNY_CAMEL_ACCOUNT(tny_account), priv->tny_session_camel); + tny_account_set_forget_pass_func (tny_account, forget_password); + tny_account_set_pass_func (tny_account, get_password); /* Proto */ tny_account_set_proto (tny_account, modest_protocol_info_get_protocol_name(account_data->proto)); - g_object_set_data (G_OBJECT(tny_account), "account_store", (gpointer)self); - /* Options */ - if (account_data->options) { - GSList *tmp = account_data->options; - while (tmp) { - tny_camel_account_add_option (TNY_CAMEL_ACCOUNT (tny_account), - tmp->data); - tmp = g_slist_next (tmp); + + if (account_data->uri) + tny_account_set_url_string (TNY_ACCOUNT(tny_account), account_data->uri); + else { + if (account_data->options) { + GSList *options = account_data->options; + while (options) { + tny_camel_account_add_option (TNY_CAMEL_ACCOUNT (tny_account), + options->data); + options = g_slist_next (options); + } } + if (account_data->username) + tny_account_set_user (tny_account, account_data->username); + if (account_data->hostname) + tny_account_set_hostname (tny_account, account_data->hostname); } - /* id */ - tny_account_set_id (tny_account, account_data->account_name); - - /* Hostname & Username */ - if (account_data->username) - tny_account_set_user (tny_account, account_data->username); - - if (account_data->hostname) - tny_account_set_hostname (tny_account, account_data->hostname); - - /* Password functions */ - tny_account_set_forget_pass_func (tny_account, forget_password); - tny_account_set_pass_func (tny_account, get_password); - return tny_account; } @@ -640,7 +634,7 @@ modest_tny_account_store_get_accounts (TnyAccountStore *account_store, TnyList ModestAccountData *account_data = modest_account_mgr_get_account_data (priv->account_mgr, (gchar*)cursor->data); - if (account_data && account_data->enabled) { + if (account_data && account_data->is_enabled) { tny_account = get_tny_account_from_account (self, account_data, type); if (tny_account) tny_list_prepend (list, G_OBJECT(tny_account)); diff --git a/src/modest-ui.c b/src/modest-ui.c index d236c4c..5733df8 100644 --- a/src/modest-ui.c +++ b/src/modest-ui.c @@ -854,13 +854,6 @@ _modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, /* * below some stuff to clearup statusbar messages after 1,5 seconds.... */ -typedef struct { - GtkWidget *status_bar; - GtkWidget *progress_bar; - guint msg_id; -} StatusRemoveData; - - static gboolean progress_bar_clean (GtkWidget *bar) { diff --git a/src/widgets/modest-account-view.c b/src/widgets/modest-account-view.c index cfaa5e6..24e735b 100644 --- a/src/widgets/modest-account-view.c +++ b/src/widgets/modest-account-view.c @@ -32,6 +32,7 @@ #include #include +#include #include #include @@ -44,13 +45,16 @@ static void modest_account_view_init (ModestAccountView *obj); static void modest_account_view_finalize (GObject *obj); -enum _AccountViewColumns { - ENABLED_COLUMN, - NAME_COLUMN, - PROTO_COLUMN, - N_COLUMNS -}; -typedef enum _AccountViewColumns AccountViewColumns; +typedef enum { + MODEST_ACCOUNT_VIEW_NAME_COLUMN, + MODEST_ACCOUNT_VIEW_DISPLAY_NAME_COLUMN, + MODEST_ACCOUNT_VIEW_IS_ENABLED_COLUMN, + MODEST_ACCOUNT_VIEW_IS_DEFAULT_COLUMN, + MODEST_ACCOUNT_VIEW_PROTO_COLUMN, + MODEST_ACCOUNT_VIEW_LAST_UPDATED_COLUMN, + + MODEST_ACCOUNT_VIEW_COLUMN_NUM +} AccountViewColumns; /* list my signals */ @@ -128,11 +132,6 @@ modest_account_view_finalize (GObject *obj) priv = MODEST_ACCOUNT_VIEW_GET_PRIVATE(obj); - g_signal_handler_disconnect (G_OBJECT(priv->account_mgr), - priv->sig1); - g_signal_handler_disconnect (G_OBJECT(priv->account_mgr), - priv->sig2); - if (priv->account_mgr) { g_object_unref (G_OBJECT(priv->account_mgr)); priv->account_mgr = NULL; @@ -156,42 +155,46 @@ update_account_view (ModestAccountMgr *account_mgr, ModestAccountView *view) modest_account_mgr_account_names (account_mgr, NULL); while (cursor) { - gchar *proto = NULL; - gchar *store, *account_name, *display_name; - gboolean enabled; - + gchar *account_name; + ModestAccountData *account_data; + account_name = (gchar*)cursor->data; - display_name = modest_account_mgr_get_string (account_mgr, - account_name, - MODEST_ACCOUNT_DISPLAY_NAME, - FALSE, NULL); + account_data = modest_account_mgr_get_account_data (account_mgr, account_name); + if (!account_data) { + g_printerr ("modest: failed to get account data for %s\n", account_name); + continue; + } + /* don't display accounts without stores */ - if (display_name) { - store = modest_account_mgr_get_string (account_mgr, - account_name, - MODEST_ACCOUNT_STORE_ACCOUNT, - FALSE, NULL); - if (store) { - proto = modest_account_mgr_get_string (account_mgr, - store, - MODEST_ACCOUNT_PROTO, - TRUE, NULL); - g_free(store); - } - - enabled = modest_account_mgr_get_enabled (account_mgr, account_name); + if (account_data->store_account) { + + time_t last_updated; + gchar *last_updated_string; + + /* FIXME: let's assume that 'last update' applies to the store account... */ + last_updated = account_data->store_account->last_updated; + if (last_updated > 0) + last_updated_string = modest_text_utils_get_display_date(last_updated); + else + last_updated_string = g_strdup (_("Never")); + gtk_list_store_insert_with_values ( model, NULL, 0, - ENABLED_COLUMN, enabled, - NAME_COLUMN, display_name, - PROTO_COLUMN, proto, + MODEST_ACCOUNT_VIEW_NAME_COLUMN, account_name, + MODEST_ACCOUNT_VIEW_DISPLAY_NAME_COLUMN, account_data->display_name, + MODEST_ACCOUNT_VIEW_IS_ENABLED_COLUMN, account_data->is_enabled, + MODEST_ACCOUNT_VIEW_IS_DEFAULT_COLUMN, account_data->is_default, + + MODEST_ACCOUNT_VIEW_PROTO_COLUMN, + modest_protocol_info_get_protocol_name (account_data->store_account->proto), + + MODEST_ACCOUNT_VIEW_LAST_UPDATED_COLUMN, last_updated_string, -1); + g_free (last_updated_string); } - g_free (display_name); - g_free (account_name); - g_free (proto); - + + modest_account_mgr_free_account_data (account_mgr, account_data); cursor = cursor->next; } g_slist_free (account_names); @@ -235,9 +238,8 @@ on_account_enable_toggled (GtkCellRendererToggle *cell_renderer, gchar *path, g_printerr ("modest: cannot find iterator\n"); return; } - - gtk_tree_model_get (model, &iter, ENABLED_COLUMN, &enabled, - NAME_COLUMN, &account_name, + gtk_tree_model_get (model, &iter, MODEST_ACCOUNT_VIEW_IS_ENABLED_COLUMN, &enabled, + MODEST_ACCOUNT_VIEW_NAME_COLUMN, &account_name, -1); /* toggle enabled / disabled */ @@ -245,49 +247,77 @@ on_account_enable_toggled (GtkCellRendererToggle *cell_renderer, gchar *path, g_free (account_name); } + +void +bold_if_default_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, + GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) +{ + gboolean is_default; + gtk_tree_model_get (tree_model, iter, MODEST_ACCOUNT_VIEW_IS_DEFAULT_COLUMN, + &is_default, -1); + g_object_set (G_OBJECT(renderer), + "weight", is_default ? 800: 400, + NULL); +} + + static void init_view (ModestAccountView *self) { ModestAccountViewPrivate *priv; - GtkCellRenderer *renderer; + GtkCellRenderer *toggle_renderer, *text_renderer; GtkListStore *model; + GtkTreeViewColumn *column; priv = MODEST_ACCOUNT_VIEW_GET_PRIVATE(self); - model = gtk_list_store_new (3, - G_TYPE_BOOLEAN, /* checkbox */ + model = gtk_list_store_new (6, G_TYPE_STRING, /* account name */ - G_TYPE_STRING); /* account type (pop, imap,...) */ + G_TYPE_STRING, /* account display name */ + G_TYPE_BOOLEAN, /* is-enabled */ + G_TYPE_BOOLEAN, /* is-default */ + G_TYPE_STRING, /* account proto (pop, imap,...) */ + G_TYPE_STRING /* last updated (time_t) */ + ); gtk_tree_view_set_model (GTK_TREE_VIEW(self), GTK_TREE_MODEL(model)); - renderer = gtk_cell_renderer_toggle_new (); - g_object_set (G_OBJECT(renderer), "activatable", TRUE,"radio", FALSE, NULL); + toggle_renderer = gtk_cell_renderer_toggle_new (); + text_renderer = gtk_cell_renderer_text_new (); - g_signal_connect (G_OBJECT(renderer), "toggled", - G_CALLBACK(on_account_enable_toggled), + /* the is_enabled column */ + g_object_set (G_OBJECT(toggle_renderer), "activatable", TRUE,"radio", FALSE, NULL); + g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK(on_account_enable_toggled), self); - - gtk_tree_view_append_column (GTK_TREE_VIEW(self), - gtk_tree_view_column_new_with_attributes ( - _("Enabled"), renderer, - "active", ENABLED_COLUMN, NULL)); gtk_tree_view_append_column (GTK_TREE_VIEW(self), gtk_tree_view_column_new_with_attributes ( - _("Account"), - gtk_cell_renderer_text_new (), - "text", NAME_COLUMN, NULL)); - gtk_tree_view_append_column (GTK_TREE_VIEW(self), - gtk_tree_view_column_new_with_attributes ( - _("Type"), - gtk_cell_renderer_text_new (), - "text", PROTO_COLUMN, NULL)); - - priv->sig1 = g_signal_connect (G_OBJECT(priv->account_mgr), - "account_removed", + _("Enabled"), toggle_renderer, + "active", MODEST_ACCOUNT_VIEW_IS_ENABLED_COLUMN, NULL)); + + /* account name */ + column = gtk_tree_view_column_new_with_attributes (_("Account"), text_renderer,"text", + MODEST_ACCOUNT_VIEW_DISPLAY_NAME_COLUMN, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(self),column); + gtk_tree_view_column_set_cell_data_func(column, text_renderer, bold_if_default_cell_data, + NULL, NULL); + + /* account type */ + column = gtk_tree_view_column_new_with_attributes (_("Type"), text_renderer,"text", + MODEST_ACCOUNT_VIEW_PROTO_COLUMN, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(self),column); + gtk_tree_view_column_set_cell_data_func(column, text_renderer, bold_if_default_cell_data, + NULL, NULL); + + /* last update for this account */ + column = gtk_tree_view_column_new_with_attributes (_("Last update"), text_renderer,"text", + MODEST_ACCOUNT_VIEW_LAST_UPDATED_COLUMN, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(self),column); + gtk_tree_view_column_set_cell_data_func(column, text_renderer, bold_if_default_cell_data, + NULL, NULL); + + g_signal_connect (G_OBJECT(priv->account_mgr),"account_removed", G_CALLBACK(on_account_removed), self); - priv->sig2 = g_signal_connect (G_OBJECT(priv->account_mgr), - "account_changed", + g_signal_connect (G_OBJECT(priv->account_mgr), "account_changed", G_CALLBACK(on_account_changed), self); } @@ -322,11 +352,10 @@ modest_account_view_get_selected_account (ModestAccountView *self) GtkTreeIter iter; g_return_val_if_fail (MODEST_IS_ACCOUNT_VIEW (self), NULL); - + sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (self)); if (gtk_tree_selection_get_selected (sel, &model, &iter)) { - gtk_tree_model_get (model, &iter, - NAME_COLUMN, &account_name, + gtk_tree_model_get (model, &iter, MODEST_ACCOUNT_VIEW_NAME_COLUMN, &account_name, -1); } diff --git a/src/widgets/modest-header-view-render.c b/src/widgets/modest-header-view-render.c index b5aeace..2031c5d 100644 --- a/src/widgets/modest-header-view-render.c +++ b/src/widgets/modest-header-view-render.c @@ -157,6 +157,7 @@ _modest_header_view_date_cell_data (GtkTreeViewColumn *column, GtkCellRenderer { TnyHeaderFlags flags; guint date, date_col; + gchar *display_date; gboolean received = GPOINTER_TO_INT(user_data); if (received) @@ -168,13 +169,15 @@ _modest_header_view_date_cell_data (GtkTreeViewColumn *column, GtkCellRenderer TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, date_col, &date, -1); - + + display_date = modest_text_utils_get_display_date (date); g_object_set (G_OBJECT(renderer), "weight", (flags & TNY_HEADER_FLAG_SEEN) ? 400: 800, "style", (flags & TNY_HEADER_FLAG_DELETED) ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL, - "text", modest_text_utils_get_display_date (date), + "text", display_date, NULL); + g_free (display_date); } @@ -218,7 +221,7 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe { GObject *rendobj; TnyHeaderFlags flags; - gchar *address, *subject, *header; + gchar *address, *subject, *header, *display_date; time_t date; gboolean is_incoming; @@ -240,13 +243,14 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date, -1); - rendobj = G_OBJECT(renderer); + rendobj = G_OBJECT(renderer); + display_date = modest_text_utils_get_display_date (date); header = g_strdup_printf ("%s %s\n%s", modest_text_utils_get_display_address (address), - modest_text_utils_get_display_date (date), - subject); + display_date, subject); g_free (address); g_free (subject); + g_free (display_date); g_object_set (G_OBJECT(renderer), "text", header, -- 1.7.9.5