From: Sergio Villar Senin Date: Tue, 21 Nov 2006 17:59:34 +0000 (+0000) Subject: * Added new store actions: create/remove/rename/delete folder X-Git-Tag: git_migration_finished~4393 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=bc7bfc2a42a7fb701a57365c8dfc4b6faa9a03a1 * Added new store actions: create/remove/rename/delete folder * Added two new account keys, forward_type, reply_type * src/gtk/modest-edit-msg-window.c: the From field is now selected from the combo selection * src/gtk/main-window.c: added reply/forward support through ModestConf. Updated to the new MailOperation API. Added a method to handle presses on to the delete button * src/widgets/modest-msg-view.c * src/modest-mail-operation.c: updated to the new TnyMimePart API * src/modest-widget-factory.c: added a new handler for key presses over the folder view. Updated to the new TnyGtkAccountTreeModel API. * src/widgets/modest-combo-box.c: added the inheritance from GtkComboBox. Added a new function to get the active display name. Some refactorings. * src/widgets/modest-folder-view: added/removed some members of the priv structure. Added get_selected_account method. Added handler for subscription_changed signal. Some other utility functions added. * src/modest-tny-msg-actions.c: added modest_tny_msg_actions_copy, modest_tny_msg_actions_move methods to transfer messages. Added modest_tny_msg_actions_remove to remove messages pmo-trunk-r486 --- diff --git a/src/Makefile.am b/src/Makefile.am index 60b349b..b8144e1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -44,6 +44,8 @@ modest_SOURCES=\ modest-tny-account-store.c\ modest-tny-msg-actions.h\ modest-tny-msg-actions.c\ + modest-tny-store-actions.c\ + modest-tny-store-actions.h\ modest-protocol-mgr.h\ modest-protocol-mgr.c\ modest-ui.h\ @@ -61,7 +63,6 @@ modest_SOURCES=\ modest-tny-platform-factory.c \ modest-tny-platform-factory.h - modest_LDADD = \ $(MODEST_GSTUFF_LIBS) \ $(MODEST_LIBTINYMAIL_GNOME_DESKTOP_LIBS) \ diff --git a/src/gtk/modest-edit-msg-window.c b/src/gtk/modest-edit-msg-window.c index 840366e..d6baa82 100644 --- a/src/gtk/modest-edit-msg-window.c +++ b/src/gtk/modest-edit-msg-window.c @@ -241,19 +241,21 @@ menubar_new (ModestEditMsgWindow *self) static void send_mail (ModestEditMsgWindow *self) { - const gchar *from, *to, *cc, *bcc, *subject; - gchar *body; + const gchar *to, *cc, *bcc, *subject; + gchar *body, *from; ModestEditMsgWindowPrivate *priv; TnyTransportAccount *transport_account; ModestMailOperation *mail_operation; + ModestAccountData *data; GtkTextBuffer *buf; GtkTextIter b, e; priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(self); + data = modest_combo_box_get_active_id (MODEST_COMBO_BOX (priv->from_field)); - /* don't free these */ - from = "djcb@djcbsoftware.nl"; + /* don't free these (except from) */ + from = g_strdup_printf ("%s <%s>", data->full_name, data->email) ; to = gtk_entry_get_text (GTK_ENTRY(priv->to_field)); cc = gtk_entry_get_text (GTK_ENTRY(priv->cc_field)); bcc = gtk_entry_get_text (GTK_ENTRY(priv->bcc_field)); @@ -298,6 +300,7 @@ send_mail (ModestEditMsgWindow *self) subject, body, NULL); /* Clean up */ g_object_unref (mail_operation); + g_free (from); g_free (body); } @@ -483,6 +486,11 @@ modest_edit_msg_window_new (ModestWidgetFactory *factory, gtk_text_buffer_set_text (buf, (const gchar *) modest_tny_msg_actions_find_body (msg, FALSE), -1); + + /* TODO: lower priority, select in the From: combo to + the value that comes from msg */ + + /* TODO: set attachments */ } return GTK_WIDGET (obj); diff --git a/src/gtk/modest-main-window.c b/src/gtk/modest-main-window.c index 3613797..88a9732 100644 --- a/src/gtk/modest-main-window.c +++ b/src/gtk/modest-main-window.c @@ -43,6 +43,7 @@ #include "modest-edit-msg-window.h" #include "modest-icon-names.h" #include "modest-tny-platform-factory.h" +#include "modest-tny-msg-actions.h" #include "modest-mail-operation.h" /* 'private'/'protected' functions */ @@ -224,16 +225,44 @@ on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget) ModestHeaderView *header_view; TnyList *header_list; TnyIterator *iter; + const gchar *from; + gchar *reply_key, *forward_key; + ModestMailOperationReplyType reply_type; + ModestMailOperationForwardType forward_type; + ModestConf *conf; + GError *error; priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory); header_view = modest_widget_factory_get_header_view (priv->widget_factory); header_list = modest_header_view_get_selected_headers (header_view); + /* Get reply and forward types */ + error = NULL; + reply_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_REPLY_TYPE); + reply_type = modest_conf_get_int (conf, reply_key, &error); + if (error) { + g_warning (N_("Key %s not defined"), reply_key); + reply_type = MODEST_MAIL_OPERATION_REPLY_TYPE_CITE; + g_error_free (error); + error = NULL; + } + g_free (reply_key); + + forward_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_FORWARD_TYPE); + forward_type = modest_conf_get_int (conf, forward_key, NULL); + if (error) { + g_warning (N_("Key %s not defined"), forward_key); + reply_type = MODEST_MAIL_OPERATION_FORWARD_TYPE_INLINE; + g_error_free (error); + } + g_free (forward_key); + if (header_list) { iter = tny_list_create_iterator (header_list); do { - TnyHeader *header; + TnyHeader *header, *new_header; TnyFolder *folder; TnyMsg *msg, *new_msg; ModestEditType edit_type; @@ -243,32 +272,34 @@ on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget) folder = tny_header_get_folder (header); msg = tny_folder_get_msg (folder, header); + from = modest_folder_view_get_selected_account (priv->folder_view); + /* FIXME: select proper action */ switch (action) { case 1: - /* TODO: get reply type from config */ new_msg = - modest_mail_operation_create_reply_mail (msg, - MODEST_MAIL_OPERATION_REPLY_TYPE_CITE, + modest_mail_operation_create_reply_mail (msg, from, reply_type, MODEST_MAIL_OPERATION_REPLY_MODE_SENDER); edit_type = MODEST_EDIT_TYPE_REPLY; break; case 2: - /* TODO: get reply type from config */ new_msg = - modest_mail_operation_create_reply_mail (msg, - MODEST_MAIL_OPERATION_REPLY_TYPE_QUOTE, + modest_mail_operation_create_reply_mail (msg, from, reply_type, MODEST_MAIL_OPERATION_REPLY_MODE_ALL); edit_type = MODEST_EDIT_TYPE_REPLY; break; case 3: - /* TODO: get forward type from config */ new_msg = - modest_mail_operation_create_forward_mail (msg, - MODEST_MAIL_OPERATION_FORWARD_TYPE_INLINE); + modest_mail_operation_create_forward_mail (msg, from, forward_type); edit_type = MODEST_EDIT_TYPE_FORWARD; break; } + + /* Set from */ + new_header = tny_msg_get_header (new_msg); + tny_header_set_from (new_header, + modest_folder_view_get_selected_account (priv->folder_view)); + /* Show edit window */ msg_win = modest_edit_msg_window_new (priv->widget_factory, edit_type, @@ -290,6 +321,43 @@ on_menu_quit (ModestMainWindow *self, guint action, GtkWidget *widget) gtk_widget_destroy (GTK_WIDGET(self)); } +static void +on_menu_delete (ModestMainWindow *self, guint action, GtkWidget *widget) +{ + ModestMainWindowPrivate *priv; + ModestHeaderView *header_view; + TnyList *header_list; + TnyIterator *iter; + GtkTreeModel *model; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + + header_view = modest_widget_factory_get_header_view (priv->widget_factory); + header_list = modest_header_view_get_selected_headers (header_view); + + if (header_list) { + iter = tny_list_create_iterator (header_list); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)); + if (GTK_IS_TREE_MODEL_SORT (model)) + model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model)); + do { + TnyHeader *header; + + header = TNY_HEADER (tny_iterator_get_current (iter)); + + /* Remove from tree model */ + tny_list_remove (TNY_LIST (model), G_OBJECT (header)); + + /* Remove from server */ + modest_tny_msg_actions_remove (header); + + g_object_unref (header); + tny_iterator_next (iter); + + } while (!tny_iterator_is_done (iter)); + } +} + /* Our menu, an array of GtkItemFactoryEntry structures that defines each menu item */ static GtkItemFactoryEntry menu_items[] = { @@ -315,8 +383,8 @@ static GtkItemFactoryEntry menu_items[] = { { "/_Actions", NULL, NULL, 0, "" ,NULL}, { "/Actions/_New Message", NULL, on_menu_new_message, 0, "",NULL }, - { "/Actions/_Reply", NULL, NULL, 0, "" ,NULL}, - { "/Actions/_Forward", NULL, NULL, 0, "" ,NULL}, + { "/Actions/_Reply", NULL, on_menu_reply_forward, 1, "" ,NULL}, + { "/Actions/_Forward", NULL, on_menu_reply_forward, 3, "" ,NULL}, { "/Actions/_Bounce", NULL, NULL, 0, "",NULL }, { "/_Options", NULL, NULL, 0, "" ,NULL}, @@ -430,6 +498,8 @@ on_toolbar_button_clicked (ModestToolbar *toolbar, ModestToolbarButton button_id break; case MODEST_TOOLBAR_BUTTON_DELETE: + on_menu_delete (self, 0, GTK_WIDGET (toolbar)); + break; default: g_printerr ("modest: key %d pressed\n", button_id); diff --git a/src/gtk/modest-store-widget.h b/src/gtk/modest-store-widget.h index 5807476..b6e3f96 100644 --- a/src/gtk/modest-store-widget.h +++ b/src/gtk/modest-store-widget.h @@ -42,10 +42,6 @@ const gchar* modest_store_widget_get_username (ModestStoreWidget *sel const gchar* modest_store_widget_get_servername (ModestStoreWidget *self); const gchar* modest_store_widget_get_proto (ModestStoreWidget *self); - - - - G_END_DECLS #endif /* __MODEST_STORE_WIDGET_H__ */ diff --git a/src/modest-account-keys.h b/src/modest-account-keys.h index 345fea1..d12c729 100644 --- a/src/modest-account-keys.h +++ b/src/modest-account-keys.h @@ -39,6 +39,8 @@ /* configuration key definitions for modest */ #define MODEST_ACCOUNT_NAMESPACE MODEST_CONF_NAMESPACE "/" "accounts" #define MODEST_SERVER_ACCOUNT_NAMESPACE MODEST_CONF_NAMESPACE "/" "server_accounts" +#define MODEST_CONF_REPLY_TYPE "reply_type" /* int */ +#define MODEST_CONF_FORWARD_TYPE "forward_type" /* int */ /* per-account data */ #define MODEST_ACCOUNT_DISPLAY_NAME "display_name" /* string */ @@ -47,7 +49,6 @@ #define MODEST_ACCOUNT_FULLNAME "fullname" #define MODEST_ACCOUNT_EMAIL "email" - /* server account keys */ #define MODEST_ACCOUNT_PASSWORD "password" /* string */ #define MDOEST_ACCOUNT_REMEMBER_PWD "remember_pwd" /* boolean */ diff --git a/src/modest-account-mgr.c b/src/modest-account-mgr.c index 8a05785..02db2d0 100644 --- a/src/modest-account-mgr.c +++ b/src/modest-account-mgr.c @@ -803,7 +803,6 @@ modest_account_mgr_account_exists (ModestAccountMgr * self, const gchar * name, return retval; } - /* must be freed by caller */ static gchar * get_account_keyname (const gchar * accname, const gchar * name, gboolean server_account) diff --git a/src/modest-account-mgr.h b/src/modest-account-mgr.h index 03c63d4..c03894a 100644 --- a/src/modest-account-mgr.h +++ b/src/modest-account-mgr.h @@ -386,9 +386,6 @@ gboolean modest_account_mgr_set_bool (ModestAccountMgr *self, const gchar *key, gboolean val, gboolean server_account, GError **err); - - - G_END_DECLS #endif /* __MODEST_ACCOUNT_MGR_H__ */ diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 42a2539..f5cb15c 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -36,6 +36,7 @@ #include #include #include +#include "modest-tny-platform-factory.h" /* 'private'/'protected' functions */ static void modest_mail_operation_class_init (ModestMailOperationClass *klass); @@ -52,16 +53,25 @@ enum _ModestMailOperationErrorCode { MODEST_MAIL_OPERATION_NUM_ERROR_CODES }; -static void set_error (ModestMailOperation *mail_operation, - ModestMailOperationErrorCode error_code, - const gchar *fmt, ...); -static void status_update_cb (TnyFolder *folder, const gchar *what, - gint status, gpointer user_data); -static void folder_refresh_cb (TnyFolder *folder, gboolean cancelled, - gpointer user_data); -static void add_attachments (TnyMsg *msg, const GList *attachments_list); -static TnyMimePart * add_body_part (TnyMsg *msg, const gchar *body, - const gchar *content_type, gboolean has_attachments); +static void set_error (ModestMailOperation *mail_operation, + ModestMailOperationErrorCode error_code, + const gchar *fmt, ...); +static void status_update_cb (TnyFolder *folder, + const gchar *what, + gint status, + gpointer user_data); +static void folder_refresh_cb (TnyFolder *folder, + gboolean cancelled, + gpointer user_data); +static void add_attachments (TnyMsg *msg, + const GList *attachments_list); + + +static TnyMimePart * add_body_part (TnyMsg *msg, + const gchar *body, + const gchar *content_type, + gboolean has_attachments); + /* list my signals */ enum { @@ -157,7 +167,7 @@ modest_mail_operation_finalize (GObject *obj) priv->account = NULL; } if (priv->error) { - g_object_unref (priv->error); + g_error_free (priv->error); priv->error = NULL; } @@ -242,7 +252,7 @@ modest_mail_operation_send_new_mail (ModestMailOperation *mail_operation, new_msg = TNY_MSG (tny_camel_msg_new ()); header = TNY_HEADER (tny_camel_header_new ()); - /* IMPORTANT: set the header before assign values to it */ + /* WARNING: set the header before assign values to it */ tny_msg_set_header (new_msg, header); tny_header_set_from (TNY_HEADER (header), from); tny_header_set_to (TNY_HEADER (header), to); @@ -279,6 +289,7 @@ modest_mail_operation_send_new_mail (ModestMailOperation *mail_operation, **/ TnyMsg* modest_mail_operation_create_forward_mail (TnyMsg *msg, + const gchar *from, ModestMailOperationForwardType forward_type) { TnyMsg *new_msg; @@ -290,7 +301,6 @@ modest_mail_operation_create_forward_mail (TnyMsg *msg, TnyList *parts; TnyIterator *iter; - /* Create new objects */ new_msg = TNY_MSG (tny_camel_msg_new ()); new_header = TNY_HEADER (tny_camel_header_new ()); @@ -299,8 +309,7 @@ modest_mail_operation_create_forward_mail (TnyMsg *msg, /* Fill the header */ tny_msg_set_header (new_msg, new_header); - /* FIXME: set it from default account, current account ... */ - tny_header_set_from (new_header, ""); + tny_header_set_from (new_header, from); /* Change the subject */ new_subject = (gchar *) modest_text_utils_create_forward_subject (tny_header_get_subject(header)); @@ -317,7 +326,7 @@ modest_mail_operation_create_forward_mail (TnyMsg *msg, /* Create the list of attachments */ parts = TNY_LIST (tny_simple_list_new()); - tny_msg_get_parts (msg, parts); + tny_mime_part_get_parts (TNY_MIME_PART (msg), parts); iter = tny_list_create_iterator (parts); attachments_list = NULL; @@ -366,9 +375,9 @@ modest_mail_operation_create_forward_mail (TnyMsg *msg, } /* Clean */ - g_object_unref (parts); if (attachments_list) g_list_free (attachments_list); - if (text_body_part) g_object_unref (text_body_part); + g_object_unref (parts); + if (text_body_part) g_free (text_body_part); g_free (content_type); g_free (new_body); @@ -387,6 +396,7 @@ modest_mail_operation_create_forward_mail (TnyMsg *msg, **/ TnyMsg* modest_mail_operation_create_reply_mail (TnyMsg *msg, + const gchar *from, ModestMailOperationReplyType reply_type, ModestMailOperationReplyMode reply_mode) { @@ -396,26 +406,16 @@ modest_mail_operation_create_reply_mail (TnyMsg *msg, gchar *new_subject, *new_body, *content_type, *quoted; TnyList *parts; TnyMimePart *text_body_part; - gchar *my_email = NULL; /* Create new objects */ new_msg = TNY_MSG (tny_camel_msg_new ()); new_header = TNY_HEADER (tny_camel_header_new ()); - - header = tny_msg_get_header (msg); + header = tny_msg_get_header (msg); /* Fill the header */ tny_msg_set_header (new_msg, new_header); tny_header_set_to (new_header, tny_header_get_from (header)); - /* TODO: set "From:" from my current account */ -/* current_account = modest_account_mgr_get_current_account (account_mgr); */ -/* my_email = modest_account_mgr_get_string (account_mgr, */ -/* current_account, */ -/* MODEST_ACCOUNT_EMAIL, */ -/* FALSE, */ -/* NULL); */ -/* tny_header_set_from (new_header, email); */ - my_email = g_strdup ("svsdrozo@terra.es"); + tny_header_set_from (new_header, from); switch (reply_mode) { gchar *new_cc = NULL; @@ -440,7 +440,7 @@ modest_mail_operation_create_reply_mail (TnyMsg *msg, /* Remove my own address from the cc list */ new_cc = (gchar *) modest_text_utils_remove_mail_from_mail_list ((const gchar *) tmp->str, - (const gchar *) my_email); + (const gchar *) from); /* FIXME: remove also the mails from the new To: */ tny_header_set_cc (new_header, new_cc); @@ -449,7 +449,6 @@ modest_mail_operation_create_reply_mail (TnyMsg *msg, g_free (new_cc); break; } - g_free (my_email); /* Change the subject */ new_subject = (gchar*) modest_text_utils_create_reply_subject (tny_header_get_subject(header)); @@ -490,7 +489,7 @@ modest_mail_operation_create_reply_mail (TnyMsg *msg, (const gchar *) content_type, TRUE); /* Clean */ - g_object_unref (G_OBJECT(text_body_part)); +/* g_free (text_body_part); */ g_free (content_type); g_free (new_body); @@ -526,7 +525,7 @@ modest_mail_operation_update_account (ModestMailOperation *mail_operation) query = tny_folder_store_query_new (); tny_folder_store_query_add_item (query, NULL, TNY_FOLDER_STORE_QUERY_OPTION_SUBSCRIBED); tny_folder_store_get_folders (TNY_FOLDER_STORE (storage_account), - folders, NULL); + folders, query); g_object_unref (query); ifolders = tny_list_create_iterator (folders); @@ -687,8 +686,8 @@ add_attachments (TnyMsg *msg, const GList *attachments_list) tny_mime_part_set_filename (attachment_part, attachment_filename); - tny_msg_add_part (msg, attachment_part); - g_object_unref(G_OBJECT(attachment_part)); + tny_mime_part_add_part (TNY_MIME_PART (msg), attachment_part); +/* g_object_unref (attachment_part); */ } } @@ -722,7 +721,7 @@ add_body_part (TnyMsg *msg, /* Add part if needed */ if (has_attachments) { - tny_msg_add_part (msg, text_body_part); + tny_mime_part_add_part (TNY_MIME_PART (msg), text_body_part); g_object_unref (G_OBJECT(text_body_part)); } diff --git a/src/modest-mail-operation.h b/src/modest-mail-operation.h index ea7519e..444bed5 100644 --- a/src/modest-mail-operation.h +++ b/src/modest-mail-operation.h @@ -53,12 +53,12 @@ typedef enum _ModestMailOperationReplyMode ModestMailOperationReplyMode; typedef enum _ModestMailOperationStatus ModestMailOperationStatus; enum _ModestMailOperationForwardType { - MODEST_MAIL_OPERATION_FORWARD_TYPE_INLINE, + MODEST_MAIL_OPERATION_FORWARD_TYPE_INLINE = 1, MODEST_MAIL_OPERATION_FORWARD_TYPE_ATTACHMENT }; enum _ModestMailOperationReplyType { - MODEST_MAIL_OPERATION_REPLY_TYPE_CITE, + MODEST_MAIL_OPERATION_REPLY_TYPE_CITE = 1, MODEST_MAIL_OPERATION_REPLY_TYPE_QUOTE }; @@ -107,9 +107,11 @@ void modest_mail_operation_send_new_mail (ModestMailOperation const GList *attachments_list); TnyMsg* modest_mail_operation_create_forward_mail (TnyMsg *msg, + const gchar *from, ModestMailOperationForwardType forward_type); TnyMsg* modest_mail_operation_create_reply_mail (TnyMsg *msg, + const gchar *from, ModestMailOperationReplyType reply_type, ModestMailOperationReplyMode reply_mode); diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index 43279ae..f488124 100644 --- a/src/modest-tny-account-store.c +++ b/src/modest-tny-account-store.c @@ -38,6 +38,7 @@ #include #include #include +#include #include "modest-account-mgr.h" #include "modest-tny-account-store.h" #include "modest-tny-platform-factory.h" @@ -226,24 +227,17 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel) priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); /* is it in the hash? if it's already there, it must be wrong... */ -// already_asked = g_hash_table_lookup (priv->password_hash, key) != NULL; -/* if (already_asked) */ -/* g_warning ("password already asked for or in config (%s)", */ -/* key); */ -/* else */ -/* g_warning ("password not yet asked for or in config (%s)", */ -/* key); */ + already_asked = g_hash_table_lookup (priv->password_hash, key) != NULL; /* if the password is not already there, try ModestConf */ -// if (!already_asked) +/* if (!already_asked) */ pwd = modest_account_mgr_get_string (priv->account_mgr, key, MODEST_ACCOUNT_PASSWORD, TRUE, NULL); - /* if it was already asked, it must have been wrong, so ask again */ -/* if (!already_asked || !pwd || strlen(pwd) == 0) { */ -/* g_warning ("emit signal to get pass for %s", key); */ - +/* /\* if it was already asked, it must have been wrong, so ask again *\/ */ +/* if (!already_asked || !pwd || strlen(pwd) == 0) { */ + /* /\* we don't have it yet. we emit a signal to get the password somewhere *\/ */ /* const gchar* name = tny_account_get_name (account); */ /* *cancel = TRUE; */ @@ -257,7 +251,7 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel) /* } else */ /* *cancel = FALSE; */ -// g_hash_table_insert (priv->password_hash, (gpointer)key, (gpointer)pwd); +/* g_hash_table_insert (priv->password_hash, key, pwd); */ return pwd; } diff --git a/src/modest-tny-msg-actions.c b/src/modest-tny-msg-actions.c index 46c1f0d..123c686 100644 --- a/src/modest-tny-msg-actions.c +++ b/src/modest-tny-msg-actions.c @@ -31,10 +31,8 @@ #include #include #include -#include -#include -#include #include +#include #ifdef HAVE_CONFIG_H #include @@ -43,6 +41,10 @@ #include "modest-tny-msg-actions.h" #include "modest-text-utils.h" +static void modest_tny_msg_actions_xfer (TnyHeader *header, TnyFolder *folder, + gboolean delete_original); + + static const gchar * get_body_text (TnyMsg *msg, gboolean want_html) { @@ -110,7 +112,7 @@ modest_tny_msg_actions_find_body_part (TnyMsg *msg, gboolean want_html) return NULL; parts = TNY_LIST (tny_simple_list_new()); - tny_msg_get_parts ((TnyMsg*)msg, parts); + tny_mime_part_get_parts (TNY_MIME_PART (msg), parts); iter = tny_list_create_iterator(parts); @@ -155,7 +157,7 @@ modest_tny_msg_actions_find_nth_part (TnyMsg *msg, gint index) g_return_val_if_fail (index > 0, NULL); parts = TNY_LIST(tny_simple_list_new()); - tny_msg_get_parts ((TnyMsg*)msg, parts); + tny_mime_part_get_parts (TNY_MIME_PART(msg), parts); iter = tny_list_create_iterator (parts); part = NULL; @@ -183,3 +185,58 @@ modest_tny_msg_actions_find_body (TnyMsg *msg, gboolean want_html) else return NULL; } + + +static void +modest_tny_msg_actions_xfer (TnyHeader *header, TnyFolder *folder, + gboolean delete_original) +{ + TnyFolder *src_folder; + TnyList *headers; + + src_folder = tny_header_get_folder (header); + headers = tny_simple_list_new (); + + /* Move */ + tny_list_prepend (headers, G_OBJECT (header)); + tny_folder_transfer_msgs (src_folder, headers, folder, delete_original); + + /* Free */ + g_object_unref (headers); + g_object_unref (folder); +} + +void +modest_tny_msg_actions_copy (TnyHeader *header, TnyFolder *folder) +{ + g_return_if_fail (TNY_IS_HEADER (header)); + g_return_if_fail (TNY_IS_FOLDER (folder)); + + modest_tny_msg_actions_xfer (header, folder, FALSE); +} + +void +modest_tny_msg_actions_move (TnyHeader *header, TnyFolder *folder) +{ + g_return_if_fail (TNY_IS_HEADER (header)); + g_return_if_fail (TNY_IS_FOLDER (folder)); + + modest_tny_msg_actions_xfer (header, folder, TRUE); +} + +void +modest_tny_msg_actions_remove (TnyHeader *header) +{ + TnyFolder *folder; + + g_return_if_fail (TNY_IS_HEADER (header)); + + folder = tny_header_get_folder (header); + + /* Remove */ + tny_folder_remove_msg (folder, header); + tny_folder_expunge (folder); + + /* Free */ + g_object_unref (folder); +} diff --git a/src/modest-tny-msg-actions.h b/src/modest-tny-msg-actions.h index bed606a..9e4bb23 100644 --- a/src/modest-tny-msg-actions.h +++ b/src/modest-tny-msg-actions.h @@ -75,4 +75,10 @@ TnyMimePart* modest_tny_msg_actions_find_nth_part (TnyMsg *msg, gint index); gchar* modest_tny_msg_actions_find_body (TnyMsg *self, gboolean want_html); +void modest_tny_msg_actions_copy (TnyHeader *header, TnyFolder *folder); + +void modest_tny_msg_actions_move (TnyHeader *header, TnyFolder *folder); + +void modest_tny_msg_actions_remove (TnyHeader *header); + #endif /* __MODEST_TNY_MSG_ACTIONS_H__ */ diff --git a/src/modest-tny-store-actions.c b/src/modest-tny-store-actions.c index 1903a13..a1e93ca 100644 --- a/src/modest-tny-store-actions.c +++ b/src/modest-tny-store-actions.c @@ -27,6 +27,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +#include #include #include #include @@ -37,45 +39,60 @@ #include #include #include -#include -#include -#include -#include +#include "modest-tny-store-actions.h" + +TnyFolder * +modest_tny_store_actions_create_folder (TnyFolderStore *parent, + const gchar *name) +{ + g_return_val_if_fail (TNY_IS_FOLDER_STORE (parent), NULL); + g_return_val_if_fail (name, NULL); + TnyFolder *new_folder = NULL; + TnyStoreAccount *store_account; -#include -#include "modest-tny-store-actions.h" + /* Create the folder */ + new_folder = tny_folder_store_create_folder (parent, name); + if (!new_folder) + return NULL; + /* Subscribe to folder */ + if (!tny_folder_is_subscribed (new_folder)) { + store_account = tny_folder_get_account (TNY_FOLDER (parent)); + tny_store_account_subscribe (store_account, new_folder); + } + + return new_folder; +} void -modest_tny_store_actions_update_folders (TnyStoreAccount *storage_account) +modest_tny_store_actions_remove_folder (TnyFolder *folder) { + TnyFolderStore *folder_store; -// FIXME TODO: This results in failure on folder change. + g_return_if_fail (TNY_IS_FOLDER (folder)); - TnyList *folders; - TnyIterator *ifolders; - const TnyFolder *cur_folder; - TnyFolderStoreQuery *query; + /* Get folder store */ + folder_store = TNY_FOLDER_STORE (tny_folder_get_account (folder)); -/* folders = tny_store_account_get_folders (storage_account, */ -/* TNY_STORE_ACCOUNT_FOLDER_TYPE_SUBSCRIBED); */ - query = tny_folder_store_query_new (); - tny_folder_store_query_add_item (query, NULL, TNY_FOLDER_STORE_QUERY_OPTION_SUBSCRIBED); - tny_folder_store_get_folders (TNY_FOLDER_STORE (storage_account), - folders, NULL); - g_object_unref (query); - - ifolders = tny_list_create_iterator (folders); - - for (tny_iterator_first (ifolders); - !tny_iterator_is_done (ifolders); - tny_iterator_next (ifolders)) { - - cur_folder = TNY_FOLDER(tny_iterator_get_current (ifolders)); - tny_folder_refresh (cur_folder); - } - - g_object_unref (ifolders); + /* Remove folder */ + tny_folder_store_remove_folder (folder_store, folder); + + /* Free instance */ + g_object_unref (G_OBJECT (folder)); } +void modest_tny_store_actions_rename_folder (TnyFolder *folder, + const gchar *name) +{ + g_return_if_fail (TNY_IS_FOLDER (folder)); + g_return_if_fail (name); + + tny_folder_set_name (folder, name); +} + +void modest_tny_store_actions_move_folder (TnyFolder *folder, + TnyFolderStore *parent) +{ + /* TODO: set parent as parent */ +} diff --git a/src/modest-tny-store-actions.h b/src/modest-tny-store-actions.h index 4751bca..a3c2f3c 100644 --- a/src/modest-tny-store-actions.h +++ b/src/modest-tny-store-actions.h @@ -34,11 +34,20 @@ #define __MODEST_TNY_STORE_ACTIONS_H__ #include -#include +#include G_BEGIN_DECLS -void modest_tny_store_actions_update_folders (TnyStoreAccount *storage_account); +TnyFolder* modest_tny_store_actions_create_folder (TnyFolderStore *parent, + const gchar *name); + +void modest_tny_store_actions_remove_folder (TnyFolder *folder); + +void modest_tny_store_actions_rename_folder (TnyFolder *folder, + const gchar *name); + +void modest_tny_store_actions_move_folder (TnyFolder *folder, + TnyFolderStore *parent); G_END_DECLS diff --git a/src/modest-widget-factory.c b/src/modest-widget-factory.c index d6b8d7f..ee5c052 100644 --- a/src/modest-widget-factory.c +++ b/src/modest-widget-factory.c @@ -28,13 +28,15 @@ */ #include +#include #include "modest-widget-factory.h" #include #include #include #include "modest-tny-platform-factory.h" #include "modest-account-mgr.h" - +/* Test: REMOVE */ +#include /* 'private'/'protected' functions */ static void modest_widget_factory_class_init (ModestWidgetFactoryClass *klass); static void modest_widget_factory_init (ModestWidgetFactory *obj); @@ -45,6 +47,9 @@ static void modest_widget_factory_finalize (GObject *obj); static void on_folder_selected (ModestFolderView *folder_view, TnyFolder *folder, ModestWidgetFactory *self); +static void on_folder_key_press_event (ModestFolderView *header_view, + GdkEventKey *event, + gpointer user_data); static void on_message_selected (ModestHeaderView *header_view, TnyMsg *msg, ModestWidgetFactory *self); static void on_header_status_update (ModestHeaderView *header_view, const gchar *msg, @@ -181,6 +186,8 @@ init_signals (ModestWidgetFactory *self) /* folder view */ g_signal_connect (G_OBJECT(priv->folder_view), "folder_selected", G_CALLBACK(on_folder_selected), self); + g_signal_connect (G_OBJECT(priv->folder_view), "key-press-event", + G_CALLBACK(on_folder_key_press_event), self); /* header view */ g_signal_connect (G_OBJECT(priv->header_view), "status_update", @@ -222,15 +229,20 @@ static gboolean init_widgets (ModestWidgetFactory *self) { ModestWidgetFactoryPrivate *priv; + TnyFolderStoreQuery *query; priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); /* folder view */ + query = tny_folder_store_query_new (); + tny_folder_store_query_add_item (query, NULL, TNY_FOLDER_STORE_QUERY_OPTION_SUBSCRIBED); if (!(priv->folder_view = - MODEST_FOLDER_VIEW(modest_folder_view_new (MODEST_TNY_ACCOUNT_STORE (priv->account_store))))) { + MODEST_FOLDER_VIEW(modest_folder_view_new (MODEST_TNY_ACCOUNT_STORE (priv->account_store), + query)))) { g_printerr ("modest: cannot instantiate folder view\n"); return FALSE; } + g_object_unref (G_OBJECT (query)); /* header view */ if (!(priv->header_view = @@ -267,7 +279,6 @@ modest_widget_factory_new (void) { GObject *obj; ModestWidgetFactoryPrivate *priv; - ModestAccountMgr *account_mgr; obj = g_object_new (MODEST_TYPE_WIDGET_FACTORY, NULL); priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(obj); @@ -362,8 +373,8 @@ get_transports (ModestWidgetFactory *self) data = modest_account_mgr_get_account_data (account_mgr, account_name); if (data && data->transport_account) { gchar *display_name = g_strdup_printf ("%s (%s)", data->email, account_name); - ModestPair *pair = modest_pair_new ((gpointer)account_name, - (gpointer)display_name , TRUE); + ModestPair *pair = modest_pair_new ((gpointer) data, + (gpointer) display_name , TRUE); transports = g_slist_append (transports, pair); } /* don't free account name; it's freed when the transports list is freed */ @@ -475,7 +486,7 @@ on_folder_selected (ModestFolderView *folder_view, TnyFolder *folder, guint num, unread; num = tny_folder_get_all_count (folder); - unread = tny_folder_get_unread_count (folder); + unread = tny_folder_get_unread_count (folder); txt = g_strdup_printf (_("%d %s, %d unread"), num, num==1 ? _("item") : _("items"), unread); @@ -483,9 +494,39 @@ on_folder_selected (ModestFolderView *folder_view, TnyFolder *folder, gtk_label_set_label (GTK_LABEL(priv->folder_info_label), txt); g_free (txt); } else - gtk_label_set_label (GTK_LABEL(priv->folder_info_label), ""); + gtk_label_set_label (GTK_LABEL(priv->folder_info_label), ""); } +/*********************** Test code ********************/ +static void +on_folder_key_press_event (ModestFolderView *folder_view, GdkEventKey *event, gpointer user_data) +{ + if (event->keyval == GDK_C || event->keyval == GDK_c) { + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + const gchar *name; + TnyFolderStore *folder; + gint type; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view)); + gtk_tree_selection_get_selected (selection, &model, &iter); + + gtk_tree_model_get (model, &iter, + TNY_GTK_ACCOUNT_TREE_MODEL_TYPE_COLUMN, &type, + TNY_GTK_ACCOUNT_TREE_MODEL_INSTANCE_COLUMN, &folder, + -1); + + if (type == TNY_FOLDER_TYPE_ROOT) { + name = tny_account_get_name (TNY_ACCOUNT (folder)); + } else { + name = tny_folder_get_name (TNY_FOLDER (folder)); + modest_tny_store_actions_create_folder (TNY_FOLDER_STORE (folder), + "New"); + } + } +} +/****************************************************/ static void on_message_selected (ModestHeaderView *folder_view, TnyMsg *msg, @@ -689,7 +730,7 @@ on_password_requested (ModestTnyAccountStore *account_store, const gchar* accoun gchar **password, gboolean *cancel, ModestWidgetFactory *self) { gchar *txt; - GtkWidget *dialog, *entry; + GtkWidget *dialog, *entry, *remember_pass_check; dialog = gtk_dialog_new_with_buttons (_("Password requested"), NULL, @@ -703,7 +744,7 @@ on_password_requested (ModestTnyAccountStore *account_store, const gchar* accoun txt = g_strdup_printf (_("Please enter your password for %s"), account_name); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt), FALSE, FALSE, 0); - g_free (txt); + g_free (txt); entry = gtk_entry_new_with_max_length (40); gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE); @@ -711,7 +752,11 @@ on_password_requested (ModestTnyAccountStore *account_store, const gchar* accoun gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry, TRUE, FALSE, 0); - + + remember_pass_check = gtk_check_button_new_with_label (_("Remember password")); + gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check, + TRUE, FALSE, 0); + gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { @@ -720,7 +765,7 @@ on_password_requested (ModestTnyAccountStore *account_store, const gchar* accoun } else { *password = NULL; *cancel = TRUE; - } + } gtk_widget_destroy (dialog); } diff --git a/src/widgets/modest-combo-box.c b/src/widgets/modest-combo-box.c index 3132d1a..6c94359 100644 --- a/src/widgets/modest-combo-box.c +++ b/src/widgets/modest-combo-box.c @@ -27,7 +27,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - +#include +#include #include "modest-combo-box.h" /* 'private'/'protected' functions */ @@ -79,7 +80,7 @@ modest_combo_box_get_type (void) (GInstanceInitFunc) modest_combo_box_init, NULL }; - my_type = g_type_register_static (G_TYPE_OBJECT, + my_type = g_type_register_static (GTK_TYPE_COMBO_BOX, "ModestComboBox", &my_info, 0); } @@ -175,27 +176,45 @@ modest_combo_box_new (const GSList *pairs) -gpointer -modest_combo_box_get_active_id (ModestComboBox *self) +static void +get_active (ModestComboBox *self, GValue *val, gint column) { GtkTreeIter iter; - gpointer retval; - g_return_val_if_fail (self, NULL); + g_return_if_fail (self); - if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX(self), &iter)) - retval = NULL; /* nothing found */ - else { + if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX(self), &iter)) { GtkTreeModel *model; - GValue val; model = gtk_combo_box_get_model (GTK_COMBO_BOX(self)); + gtk_tree_model_get_value (model, &iter, column, val); + } +} + +gpointer +modest_combo_box_get_active_id (ModestComboBox *self) +{ + g_return_val_if_fail (self, NULL); + GValue val = {0,}; + gpointer retval; - g_value_init (&val, G_TYPE_POINTER); - gtk_tree_model_get_value (model, &iter, COLUMN_ID, &val); + /* Do not unset the GValue */ + get_active (self, &val, COLUMN_ID); + retval = g_value_peek_pointer (&val); + + return retval; +} + +gpointer +modest_combo_box_get_active_display_name (ModestComboBox *self) +{ + g_return_val_if_fail (self, NULL); + GValue val = {0,}; + gpointer retval; + + /* Do not unset the GValue */ + get_active (self, &val, COLUMN_DISPLAY_NAME); + retval = g_value_peek_pointer (&val); - retval = g_value_get_pointer (&val); - g_value_unset (&val); - } return retval; } diff --git a/src/widgets/modest-combo-box.h b/src/widgets/modest-combo-box.h index 3a6ab75..9ce1349 100644 --- a/src/widgets/modest-combo-box.h +++ b/src/widgets/modest-combo-box.h @@ -30,7 +30,7 @@ #ifndef __MODEST_COMBO_BOX_H__ #define __MODEST_COMBO_BOX_H__ -#include +#include #include G_BEGIN_DECLS @@ -47,12 +47,12 @@ typedef struct _ModestComboBox ModestComboBox; typedef struct _ModestComboBoxClass ModestComboBoxClass; struct _ModestComboBox { - GObject parent; + GtkComboBox parent; /* insert public members, if any */ }; struct _ModestComboBoxClass { - GObjectClass parent_class; + GtkComboBoxClass parent_class; /* insert signal callback declarations, eg. */ /* void (* my_event) (ModestComboBox* obj); */ }; @@ -82,6 +82,17 @@ GtkWidget* modest_combo_box_new (const GSList *hash); */ gpointer modest_combo_box_get_active_id (ModestComboBox *self); +/** + * modest_combo_box_get_active_display_name + * @self: a valid ModestComboBox instance + * + * get the display name for the currently active lemma, or NULL if + * there's nothing chosen + * + * Returns: the display name or NULL if there's nothing chosen. + */ +gpointer modest_combo_box_get_active_display_name (ModestComboBox *self); + G_END_DECLS #endif /* __MODEST_COMBO_BOX_H__ */ diff --git a/src/widgets/modest-folder-view.c b/src/widgets/modest-folder-view.c index 291b7e3..5b1f5e5 100644 --- a/src/widgets/modest-folder-view.c +++ b/src/widgets/modest-folder-view.c @@ -46,12 +46,19 @@ static void modest_folder_view_class_init (ModestFolderViewClass *klass); static void modest_folder_view_init (ModestFolderView *obj); static void modest_folder_view_finalize (GObject *obj); -static gboolean update_model (ModestFolderView *self, - ModestTnyAccountStore *account_store); -static gboolean update_model_empty (ModestFolderView *self); -static void on_selection_changed (GtkTreeSelection *sel, gpointer data); -static gboolean modest_folder_view_update_model (ModestFolderView *self, - TnyAccountStoreIface *account_store); +static gboolean update_model (ModestFolderView *self, + ModestTnyAccountStore *account_store); +static gboolean update_model_empty (ModestFolderView *self); + +static void on_selection_changed (GtkTreeSelection *sel, gpointer data); +static void on_subscription_changed (TnyStoreAccount *store_account, TnyFolder *folder, + ModestFolderView *self); + +static gboolean modest_folder_view_update_model (ModestFolderView *self, + TnyAccountStore *account_store); +static const gchar *get_account_name_from_folder (GtkTreeModel *model, GtkTreeIter iter); + +static void modest_folder_view_disconnect_store_account_handlers (GtkTreeView *self); enum { FOLDER_SELECTED_SIGNAL, @@ -61,12 +68,16 @@ enum { typedef struct _ModestFolderViewPrivate ModestFolderViewPrivate; struct _ModestFolderViewPrivate { - TnyAccountStoreIface *account_store; - TnyFolder *cur_folder; + TnyAccountStore *account_store; + TnyFolder *cur_folder; gboolean view_is_empty; gulong sig1, sig2; - GMutex *lock; + gulong *store_accounts_handlers; + GMutex *lock; + GtkTreeSelection *cur_selection; + TnyFolderStoreQuery *query; + }; #define MODEST_FOLDER_VIEW_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -282,11 +293,11 @@ modest_folder_view_init (ModestFolderView *obj) priv = MODEST_FOLDER_VIEW_GET_PRIVATE(obj); - priv->view_is_empty = TRUE; - priv->account_store = NULL; - priv->cur_folder = NULL; - - priv->lock = g_mutex_new (); + priv->view_is_empty = TRUE; + priv->account_store = NULL; + priv->cur_folder = NULL; + priv->query = NULL; + priv->lock = g_mutex_new (); column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, @@ -313,9 +324,33 @@ modest_folder_view_init (ModestFolderView *obj) gtk_tree_view_column_set_fixed_width (column, TRUE); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(obj), TRUE); gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(obj), FALSE); + gtk_tree_view_set_enable_search (GTK_TREE_VIEW(obj), FALSE); } +static void +modest_folder_view_disconnect_store_account_handlers (GtkTreeView *self) +{ + TnyIterator *iter; + ModestFolderViewPrivate *priv; + GtkTreeModel *model; + GtkTreeModelSort *sortable; + gint i = 0; + + sortable = GTK_TREE_MODEL_SORT (gtk_tree_view_get_model (self)); + if (!sortable) return; + model = gtk_tree_model_sort_get_model (sortable); + if (!model) return; + + priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self); + iter = tny_list_create_iterator (TNY_LIST (model)); + do { + g_signal_handler_disconnect (G_OBJECT (tny_iterator_get_current (iter)), + priv->store_accounts_handlers [i++]); + tny_iterator_next (iter); + } while (!tny_iterator_is_done (iter)); +} + static void modest_folder_view_finalize (GObject *obj) @@ -338,6 +373,17 @@ modest_folder_view_finalize (GObject *obj) priv->lock = NULL; } + if (priv->store_accounts_handlers) { + modest_folder_view_disconnect_store_account_handlers (GTK_TREE_VIEW (obj)); + g_free (priv->store_accounts_handlers); + priv->store_accounts_handlers = NULL; + } + + if (priv->query) { + g_object_unref (G_OBJECT (priv->query)); + priv->query = NULL; + } + sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(obj)); if (sel) g_signal_handler_disconnect (G_OBJECT(sel), priv->sig2); @@ -347,7 +393,7 @@ modest_folder_view_finalize (GObject *obj) static void -on_account_update (TnyAccountStoreIface *account_store, const gchar *account, +on_account_update (TnyAccountStore *account_store, const gchar *account, gpointer user_data) { update_model_empty (MODEST_FOLDER_VIEW(user_data)); @@ -360,7 +406,8 @@ on_account_update (TnyAccountStoreIface *account_store, const gchar *account, GtkWidget* -modest_folder_view_new (ModestTnyAccountStore *account_store) +modest_folder_view_new (ModestTnyAccountStore *account_store, + TnyFolderStoreQuery *query) { GObject *self; ModestFolderViewPrivate *priv; @@ -371,7 +418,10 @@ modest_folder_view_new (ModestTnyAccountStore *account_store) self = G_OBJECT(g_object_new(MODEST_TYPE_FOLDER_VIEW, NULL)); priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); - if (!update_model (MODEST_FOLDER_VIEW(self), + priv->account_store = g_object_ref (G_OBJECT (account_store)); + if (query) priv->query = g_object_ref (G_OBJECT (query)); + + if (!update_model (MODEST_FOLDER_VIEW(self), MODEST_TNY_ACCOUNT_STORE(account_store))) g_printerr ("modest: failed to update model"); @@ -386,7 +436,20 @@ modest_folder_view_new (ModestTnyAccountStore *account_store) } +const gchar * +modest_folder_view_get_selected_account (ModestFolderView *self) +{ + GtkTreeModel *model; + GtkTreeIter iter; + ModestFolderViewPrivate *priv; + + g_return_val_if_fail (self, NULL); + priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); + + gtk_tree_selection_get_selected (priv->cur_selection, &model, &iter); + return get_account_name_from_folder (model, iter); +} static gboolean update_model_empty (ModestFolderView *self) @@ -398,6 +461,14 @@ update_model_empty (ModestFolderView *self) g_return_val_if_fail (self, FALSE); priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); + /* Disconnect old handlers */ + if (priv->store_accounts_handlers) { + modest_folder_view_disconnect_store_account_handlers (GTK_TREE_VIEW (self)); + g_free (priv->store_accounts_handlers); + priv->store_accounts_handlers = NULL; + } + + /* Create the new model */ store = gtk_tree_store_new (1, G_TYPE_STRING); gtk_tree_store_append (store, &iter, NULL); @@ -412,11 +483,9 @@ update_model_empty (ModestFolderView *self) g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTED_SIGNAL], 0, NULL); - return TRUE; } - static gboolean update_model (ModestFolderView *self, ModestTnyAccountStore *account_store) { @@ -428,7 +497,7 @@ update_model (ModestFolderView *self, ModestTnyAccountStore *account_store) g_return_val_if_fail (account_store, FALSE); priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); - model = GTK_TREE_MODEL(tny_gtk_account_tree_model_new (TRUE)); /* async */ + model = GTK_TREE_MODEL(tny_gtk_account_tree_model_new (TRUE, priv->query)); /* async */ account_list = TNY_LIST(model); update_model_empty (self); /* cleanup */ @@ -439,6 +508,8 @@ update_model (ModestFolderView *self, ModestTnyAccountStore *account_store) TNY_ACCOUNT_STORE_STORE_ACCOUNTS); if (account_list) { + TnyIterator *iter; + gint i = 0, size; sortable = gtk_tree_model_sort_new_with_model (model); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sortable), @@ -446,8 +517,23 @@ update_model (ModestFolderView *self, ModestTnyAccountStore *account_store) GTK_SORT_ASCENDING); gtk_tree_view_set_model (GTK_TREE_VIEW(self), sortable); + + /* Listen to subscription changes */ + size = tny_list_get_length (TNY_LIST (account_list)) * sizeof (gulong); + priv->store_accounts_handlers = g_malloc0 (size); + iter = tny_list_create_iterator (account_list); + do { + priv->store_accounts_handlers [i++] = + g_signal_connect (G_OBJECT (tny_iterator_get_current (iter)), + "subscription_changed", + G_CALLBACK (on_subscription_changed), + self); + tny_iterator_next (iter); + } while (!tny_iterator_is_done (iter)); + priv->view_is_empty = FALSE; + g_object_unref (iter); g_object_unref (model); } @@ -464,11 +550,13 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) ModestFolderView *tree_view; ModestFolderViewPrivate *priv; gint type; + const gchar *account_name; g_return_if_fail (sel); g_return_if_fail (user_data); priv = MODEST_FOLDER_VIEW_GET_PRIVATE(user_data); + priv->cur_selection = sel; /* is_empty means that there is only the 'empty' item */ if (priv->view_is_empty) @@ -483,32 +571,41 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) tree_view = MODEST_FOLDER_VIEW (user_data); gtk_tree_model_get (model, &iter, - TNY_GTK_ACCOUNT_TREE_MODEL_TYPE_COLUMN, - &type, -1); + TNY_GTK_ACCOUNT_TREE_MODEL_TYPE_COLUMN, &type, + TNY_GTK_ACCOUNT_TREE_MODEL_INSTANCE_COLUMN, &folder, + -1); if (type == TNY_FOLDER_TYPE_ROOT) { - g_message ("FOLDER ROOT"); + account_name = tny_account_get_name (TNY_ACCOUNT (folder)); } else { - gtk_tree_model_get (model, &iter, - TNY_GTK_ACCOUNT_TREE_MODEL_INSTANCE_COLUMN, - &folder, -1); + if (priv->cur_folder) + tny_folder_expunge (priv->cur_folder); + priv->cur_folder = folder; - if (TNY_IS_FOLDER (folder)) { - - if (priv->cur_folder) - tny_folder_expunge (priv->cur_folder); - priv->cur_folder = folder; - + account_name = get_account_name_from_folder (model, iter); - g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTED_SIGNAL], 0, - folder); - } + g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTED_SIGNAL], 0, + folder); } } +static void +on_subscription_changed (TnyStoreAccount *store_account, + TnyFolder *folder, + ModestFolderView *self) +{ + /* TODO: probably we won't need a full reload, just the store + account or even the parent of the folder */ + + ModestFolderViewPrivate *priv; + + priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); + update_model (self, MODEST_TNY_ACCOUNT_STORE (priv->account_store)); +} + static gboolean -modest_folder_view_update_model (ModestFolderView *self, TnyAccountStoreIface *account_store) +modest_folder_view_update_model (ModestFolderView *self, TnyAccountStore *account_store) { gboolean retval; @@ -520,3 +617,23 @@ modest_folder_view_update_model (ModestFolderView *self, TnyAccountStoreIface *a return retval; } + +static const gchar * +get_account_name_from_folder (GtkTreeModel *model, GtkTreeIter iter) { + GtkTreePath *path; + GtkTreeIter new_iter; + TnyFolder *account_folder; + gint depth, i; + + path = gtk_tree_model_get_path (model, &iter); + depth = gtk_tree_path_get_depth (path); + + for (i=1; i<= depth - 1; i++) + gtk_tree_path_up (path); + + gtk_tree_model_get_iter (model, &new_iter, path); + gtk_tree_model_get (model, &new_iter, + TNY_GTK_ACCOUNT_TREE_MODEL_INSTANCE_COLUMN, &account_folder, + -1); + return tny_account_get_name (TNY_ACCOUNT (account_folder)); +} diff --git a/src/widgets/modest-folder-view.h b/src/widgets/modest-folder-view.h index ffa99bf..22c443c 100644 --- a/src/widgets/modest-folder-view.h +++ b/src/widgets/modest-folder-view.h @@ -57,12 +57,11 @@ struct _ModestFolderViewClass { /* emitted when a folder is clicked */ void (*folder_selected) (ModestFolderView* self, - TnyFolderIface *folder, + TnyFolder *folder, gpointer user_data); gboolean (*update_model) (ModestFolderView *self, - TnyAccountStoreIface *iface); - + TnyAccountStore *account_store); }; @@ -84,7 +83,8 @@ GType modest_folder_view_get_type (void) G_GNUC_CONST; * * Returns: a new GtkWidget (a GtkTreeView-subclass) */ -GtkWidget* modest_folder_view_new (ModestTnyAccountStore *account_store); +GtkWidget* modest_folder_view_new (ModestTnyAccountStore *account_store, + TnyFolderStoreQuery *query); /** @@ -99,7 +99,8 @@ GtkWidget* modest_folder_view_new (ModestTnyAccountStore *account_store) gboolean modest_folder_view_is_empty (ModestFolderView *self); +const gchar* modest_folder_view_get_selected_account (ModestFolderView *self); + G_END_DECLS #endif /* __MODEST_FOLDER_VIEW_H__ */ - diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index 8badfca..a2ac72b 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -826,6 +826,9 @@ on_refresh_folder (TnyFolder *folder, gboolean cancelled, gpointer user_data) else { /* it's a new one or a refresh */ GSList *col; + if (priv->headers) + g_object_unref (priv->headers); + priv->headers = TNY_LIST(tny_gtk_header_list_model_new ()); tny_folder_get_headers (folder, priv->headers, FALSE); @@ -949,5 +952,8 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) /* mark message as seen; _set_flags crashes, bug in tinymail? */ header_flags = tny_header_get_flags (TNY_HEADER(header)); tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN); + + /* Free */ +/* g_free (folder); */ } diff --git a/src/widgets/modest-msg-view.c b/src/widgets/modest-msg-view.c index 2e37fa1..c1fcdeb 100644 --- a/src/widgets/modest-msg-view.c +++ b/src/widgets/modest-msg-view.c @@ -299,7 +299,7 @@ find_cid_image (TnyMsg *msg, const gchar *cid) parts = TNY_LIST (tny_simple_list_new()); - tny_msg_get_parts (msg, parts); + tny_mime_part_get_parts (TNY_MIME_PART (msg), parts); iter = tny_list_create_iterator (parts); while (!tny_iterator_is_done(iter)) { @@ -379,7 +379,7 @@ attachments_as_html (ModestMsgView *self, TnyMsg *msg) priv = MODEST_MSG_VIEW_GET_PRIVATE (self); parts = TNY_LIST(tny_simple_list_new()); - tny_msg_get_parts (msg, parts); + tny_mime_part_get_parts (TNY_MIME_PART (msg), parts); iter = tny_list_create_iterator (parts); appendix= g_string_new ("");