* Keep a list of exiting accounts in ModestAccountMgr.
* Check configuration changes in ModestAccountMgr and create according signals.
* Provide better data in signal handlers.
* Do not re-create account lists in ModestTnyAccountStore.
* Connect handlers with test code to ModestAccountMgr signals in ModestTnyAccountStore.
* Comment out some currently dangerous code.
* Add new marshaller.
pmo-trunk-r271
TnyAccountStoreIface *account_store;
GtkWidget *folder_view;
GtkWidget *header_view;
+ GtkWidget *message_view;
GtkWindow *main_window;
GladeXML *glade_xml;
-
+ TnyMsgFolderIface *current_folder;
};
#define MODEST_UI_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
NULL);
message_view = GTK_WIDGET(modest_tny_msg_view_new (NULL, show_attachments_inline));
+ priv->message_view = message_view;
if (!message_view) {
g_warning ("failed to create message view");
return FALSE;
{
GtkWidget *win;
GtkWidget *button;
- GtkWidget *paned;
ModestTnyHeaderTreeView *tree_view;
ModestTnyMsgView *msg_view;
ModestUIPrivate *priv;
priv = MODEST_UI_GET_PRIVATE(data);
scrollview = glade_xml_get_widget (priv->glade_xml,"mail_list");
- tree_view = MODEST_TNY_HEADER_TREE_VIEW(
- gtk_bin_get_child(GTK_BIN(scrollview)));
+ tree_view = MODEST_TNY_HEADER_TREE_VIEW (priv->header_view);
+
win = glade_xml_get_widget (priv->glade_xml, "main");
gtk_window_set_title (GTK_WINDOW(win),
tny_msg_folder_iface_get_name(folder));
modest_tny_header_tree_view_set_folder (tree_view, folder);
+ priv->current_folder = folder;
button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
if (button) {
gtk_widget_set_sensitive(button, FALSE);
}
- paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
- g_return_if_fail (paned);
-
- msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
+ msg_view = MODEST_TNY_MSG_VIEW (priv->message_view);
g_return_if_fail (msg_view);
modest_tny_msg_view_set_message (msg_view, NULL);
TnyMsgIface *message,
gpointer data)
{
- GtkWidget *paned;
GtkWidget *button;
ModestTnyMsgView *msg_view;
ModestUIPrivate *priv;
g_return_if_fail (data);
- priv = MODEST_UI_GET_PRIVATE(data);
- paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
- msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
+ priv = MODEST_UI_GET_PRIVATE (data);
+ msg_view = MODEST_TNY_MSG_VIEW (priv->message_view);
- modest_tny_msg_view_set_message (msg_view,
- message);
+ modest_tny_msg_view_set_message (msg_view, message);
+
button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
if (button) {
gtk_widget_set_sensitive(button, TRUE);
MODEST_TNY_HEADER_TREE_VIEW_COLUMN_RECEIVED_DATE
};
- for (i = 0 ; i != sizeof(cols)/sizeof(ModestTnyHeaderTreeViewColumn); ++i)
+ for (i = 0 ; i != sizeof(cols) / sizeof(ModestTnyHeaderTreeViewColumn); ++i)
columns = g_slist_append (columns, GINT_TO_POINTER(cols[i]));
header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder, columns,
{
GtkWidget *folder_tree;
- folder_tree = GTK_WIDGET(modest_tny_folder_tree_view_new (account_store));
+ folder_tree = GTK_WIDGET (modest_tny_folder_tree_view_new (account_store));
if (!folder_tree) {
g_warning ("could not create folder list");
return NULL;
on_view_attachments_toggled(GtkWidget *widget, gpointer user_data)
{
ModestUI *modest_ui = (ModestUI *)user_data;
- GtkWidget *view_attachments_item, *paned;
+ GtkWidget *view_attachments_item;
ModestTnyMsgView *msg_view;
ModestUIPrivate *priv;
gboolean view_attachments_inline;
view_attachments_item = glade_xml_get_widget (priv->glade_xml, "menu_view_attachments");
g_return_if_fail(view_attachments_item);
- paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
- msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
+ msg_view = MODEST_TNY_MSG_VIEW(priv->message_view);
view_attachments_inline = gtk_check_menu_item_get_active(
GTK_CHECK_MENU_ITEM(view_attachments_item));
{
ModestUI *modest_ui = (ModestUI *)user_data;
GtkTreeSelection *sel;
- GtkWidget *paned;
GtkTreeModel *model;
GtkTreeIter iter;
- GtkScrolledWindow *scroll;
GtkTreeModel *mymodel;
ModestTnyHeaderTreeView *header_view;
priv = MODEST_UI_GET_PRIVATE(modest_ui);
- paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
- g_return_if_fail (paned);
-
- scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
- g_return_if_fail (scroll);
-
- msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
+ msg_view = MODEST_TNY_MSG_VIEW(priv->message_view);
g_return_if_fail (msg_view);
- header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
+ header_view = MODEST_TNY_HEADER_TREE_VIEW(priv->header_view);
g_return_if_fail (header_view);
sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
{
ModestUI *modest_ui = (ModestUI *)user_data;
ModestUIPrivate *priv;
- // ModestTnyStoreActions *store_actions;
TnyAccountStoreIface *account_store;
const GList *store_accounts;
const GList *iter;
g_return_if_fail (modest_ui);
-
- // store_actions = MODEST_TNY_STORE_ACTIONS (modest_tny_store_actions_new ());
priv = MODEST_UI_GET_PRIVATE(modest_ui);
account_store = priv->account_store;
store_accounts =
tny_account_store_iface_get_store_accounts (account_store);
-
+
for (iter = store_accounts; iter; iter = iter->next) {
modest_tny_store_actions_update_folders (TNY_STORE_ACCOUNT_IFACE (iter->data));
- // modest_tny_store_actions_update_folders (store_actions, TNY_STORE_ACCOUNT_IFACE (iter->data));
+
+ }
+
+ if (priv->header_view && priv->current_folder) {
+
+ modest_tny_header_tree_view_set_folder (priv->header_view, priv->current_folder);
+ gtk_widget_queue_draw (priv->header_view);
}
- // g_object_unref (store_actions);
}
static void
on_forward_attached_activated (GtkWidget *widget, gpointer user_data)
quoted_send_msg (ModestUI *modest_ui, quoted_send_type qstype)
{
GtkTreeSelection *sel;
- GtkWidget *paned;
GtkTreeModel *model;
GtkTreeIter iter;
- GtkScrolledWindow *scroll;
TnyMsgHeaderIface *header;
priv = MODEST_UI_GET_PRIVATE(modest_ui);
- paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
- g_return_if_fail (paned);
-
- scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
- g_return_if_fail (scroll);
-
- msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
+ msg_view = MODEST_TNY_MSG_VIEW(priv->message_view);
g_return_if_fail (msg_view);
- header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
+ header_view = MODEST_TNY_HEADER_TREE_VIEW(priv->header_view);
g_return_if_fail (header_view);
sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
priv->glade_xml = NULL;
priv->folder_view = NULL;
priv->header_view = NULL;
-
+ priv->message_view = NULL;
+ priv->current_folder = NULL;
}
VOID:POINTER,POINTER
+VOID:POINTER,POINTER,POINTER
typedef struct _ModestAccountMgrPrivate ModestAccountMgrPrivate;
struct _ModestAccountMgrPrivate {
ModestConf *modest_conf;
+ GSList *current_accounts;
};
#define MODEST_ACCOUNT_MGR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
static guint signals[LAST_SIGNAL] = {0};
-/* map configuration changes to account changes */
+static GSList *
+delete_account_from_list (GSList *list, const gchar *name)
+{
+ GSList *iter, *result;
+
+ iter = list;
+ result = list;
+ while (iter) {
+ if (!strcmp (name, iter->data)) {
+ result = g_slist_delete_link (list, iter);
+ break;
+ }
+
+ iter = g_slist_next (iter);
+ }
+ return result;
+}
+
+static GSList *
+find_account_in_list (GSList *list, const gchar *name)
+{
+ GSList *iter, *result;
+
+ iter = list;
+ result = list;
+ while (iter) {
+ if (!strcmp (name, iter->data)) {
+ return iter;
+ break;
+ }
+
+ iter = g_slist_next (iter);
+ }
+ return NULL;
+}
+
+/* Map configuration changes to account changes.
+ * Doing this here makes sure all changes are available and external changes
+ * are covered as well. */
+
static void
modest_account_mgr_check_change (ModestConf *conf, const gchar *key,
const gchar *new_value, gpointer user_data)
{
ModestAccountMgr *amgr = user_data;
+ ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (amgr);
-
-
- g_signal_emit (amgr, signals[ACCOUNT_CHANGE_SIGNAL], 0, key, new_value);
+ if ((strlen (key) > strlen (MODEST_SERVER_ACCOUNT_NAMESPACE "/")
+ && g_str_has_prefix (key, MODEST_SERVER_ACCOUNT_NAMESPACE))) {
+ gchar *subkey = key + strlen (MODEST_SERVER_ACCOUNT_NAMESPACE "/");
+ if (! strstr (subkey, "/")) {/* no more '/' means an account was modified */
+ if (new_value) {
+ /* covers only one case of two */
+ priv->current_accounts =
+ g_slist_prepend (priv->current_accounts, g_strdup (subkey));
+ g_signal_emit (amgr, signals[ACCOUNT_ADD_SIGNAL], 0, subkey);
+ } else {
+ priv->current_accounts =
+ delete_account_from_list (priv->current_accounts, subkey);
+
+ g_signal_emit (amgr, signals[ACCOUNT_REMOVE_SIGNAL], 0, subkey);
+ }
+ } else {
+ gchar *param;
+
+ param = strstr (subkey, "/");
+ param [0] = 0;
+ param++;
+
+ /* that's the second case for a new account */
+ if (!find_account_in_list (priv->current_accounts, subkey)) {
+ priv->current_accounts =
+ g_slist_prepend (priv->current_accounts, g_strdup (subkey));
+ g_signal_emit (amgr, signals[ACCOUNT_ADD_SIGNAL], 0, subkey);
+ }
+
+ g_signal_emit (amgr, signals[ACCOUNT_CHANGE_SIGNAL], 0, subkey, param, new_value);
+ }
+ }
g_message ("value changed: %s %s\n", key, new_value);
}
modest_account_mgr_class_init (ModestAccountMgrClass * klass)
{
GObjectClass *gobject_class;
- GType paramtypes[2] = {G_TYPE_POINTER, G_TYPE_POINTER};
+ GType paramtypes[3] = {G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER};
gobject_class = (GObjectClass *) klass;
g_signal_newv ("account-change",
G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
NULL, NULL, NULL,
- modest_marshal_VOID__POINTER_POINTER,
- G_TYPE_NONE, 2, paramtypes);
+ modest_marshal_VOID__POINTER_POINTER_POINTER,
+ G_TYPE_NONE, 3, paramtypes);
}
*/
g_object_ref (G_OBJECT (priv->modest_conf = conf));
+ priv->current_accounts = modest_account_mgr_account_names (MODEST_ACCOUNT_MGR(obj), NULL);
+
g_signal_connect (G_OBJECT (conf), "key-changed",
G_CALLBACK (modest_account_mgr_check_change), obj);
return obj;
}
+
+static void
+manager_new_account (ModestAccountMgr *modest_acc_mgr, gchar *name, gpointer data)
+{
+ g_print ("new account signal %s\n", name);
+}
+void
+manager_remove_account (ModestAccountMgr *modest_acc_mgr,gchar *name, gpointer data)
+{
+ g_print ("remove account signal %s\n", name);
+}
+void
+manager_change_account (ModestAccountMgr *modest_acc_mgr, gchar *accountname,
+ gchar *key, gchar* value, gpointer data)
+{
+ g_print ("account change signal: account: %s key: %s value: %s\n", accountname, key, value);
+}
+
GObject*
modest_tny_account_store_new (ModestAccountMgr *modest_acc_mgr)
{
g_object_unref (obj);
return NULL;
}
+
+#warning todo: disconnect on destruction
+ g_signal_connect (G_OBJECT (modest_acc_mgr), "account-add",
+ G_CALLBACK(manager_new_account), NULL);
+ g_signal_connect (G_OBJECT (modest_acc_mgr), "account-remove",
+ G_CALLBACK(manager_remove_account), NULL);
+ g_signal_connect (G_OBJECT (modest_acc_mgr), "account-change",
+ G_CALLBACK(manager_change_account), NULL);
return obj;
}
ModestTnyAccountStore *self;
ModestTnyAccountStorePrivate *priv;
GSList *accounts;
- GList *tny_accounts;
g_return_val_if_fail (iface, NULL);
self = MODEST_TNY_ACCOUNT_STORE(iface);
priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
- accounts =
- modest_account_mgr_server_account_names (priv->modest_acc_mgr,
- NULL,
- MODEST_PROTO_TYPE_STORE,
- NULL, FALSE);
+ if (!priv->store_accounts) {
+ accounts =
+ modest_account_mgr_server_account_names (priv->modest_acc_mgr,
+ NULL,
+ MODEST_PROTO_TYPE_STORE,
+ NULL, FALSE);
- tny_accounts = tny_accounts_from_server_accounts (self, accounts, TRUE);
- g_slist_free (accounts);
-
- /*
- * FIXME: after gconf notification support is added,
- * we can simply return priv->store_account
- */
- priv->store_accounts = free_gobject_list (priv->store_accounts);
- priv->store_accounts = tny_accounts;
+ priv->store_accounts = tny_accounts_from_server_accounts (self, accounts, TRUE);
+ g_slist_free (accounts);
+ }
- return tny_accounts;
+ return priv->store_accounts;
}
ModestTnyAccountStore *self;
ModestTnyAccountStorePrivate *priv;
GSList *accounts;
- GList *tny_accounts;
g_return_val_if_fail (iface, NULL);
self = MODEST_TNY_ACCOUNT_STORE(iface);
priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
- accounts =
- modest_account_mgr_server_account_names (priv->modest_acc_mgr,
- NULL,
- MODEST_PROTO_TYPE_TRANSPORT,
- NULL, FALSE);
- tny_accounts = tny_accounts_from_server_accounts (self, accounts, FALSE);
- g_warning ("transport accounts: %d", g_list_length (tny_accounts));
-
- g_slist_free (accounts);
+
+ if (!priv->transport_accounts) {
+ accounts =
+ modest_account_mgr_server_account_names (priv->modest_acc_mgr,
+ NULL,
+ MODEST_PROTO_TYPE_TRANSPORT,
+ NULL, FALSE);
+ priv->transport_accounts = tny_accounts_from_server_accounts (self, accounts, FALSE);
+ g_slist_free (accounts);
+ }
- /*
- * FIXME: after gconf notification support is added,
- * we can simply return priv->store_account
- */
- priv->transport_accounts = free_gobject_list (priv->transport_accounts);
- priv->transport_accounts = tny_accounts;
- return tny_accounts; /* FIXME: who will free this? */
+ return priv->transport_accounts;
}
if (folder) {
GSList *col;
-
+
+ #warning Looks like a memory leak.
priv->headers = TNY_LIST_IFACE(tny_msg_header_list_model_new ());
+
tny_msg_folder_iface_get_headers (folder, priv->headers,
FALSE);
tny_msg_header_list_model_set_folder (TNY_MSG_HEADER_LIST_MODEL(priv->headers),
const TnyListIface* folders;
TnyIteratorIface* ifolders;
const TnyMsgFolderIface *cur_folder;
-
- folders = tny_store_account_iface_get_folders (storage_account,
+#warning TODO: This results in failure on folder change.
+/* folders = tny_store_account_iface_get_folders (storage_account,
TNY_STORE_ACCOUNT_FOLDER_TYPE_SUBSCRIBED);
ifolders = tny_list_iface_create_iterator (folders);
}
g_object_unref (ifolders);
-}
+*/}