* Update several UI bits to use internal pointers instead of searching widgets.
authorFlorian Boor <florian@kernelconcepts.de>
Thu, 15 Jun 2006 15:17:03 +0000 (15:17 +0000)
committerFlorian Boor <florian@kernelconcepts.de>
Thu, 15 Jun 2006 15:17:03 +0000 (15:17 +0000)
* 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

src/gtk-glade/modest-ui-glade.h
src/gtk-glade/modest-ui-main-view.c
src/gtk-glade/modest-ui-message-editor.c
src/gtk-glade/modest-ui.c
src/marshall.list
src/modest-account-mgr.c
src/modest-tny-account-store.c
src/modest-tny-header-tree-view.c
src/modest-tny-store-actions.c

index ccb5afd..7c66c73 100644 (file)
@@ -24,11 +24,12 @@ struct _ModestUIPrivate {
        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), \
index 80d883c..550c6c0 100644 (file)
@@ -143,6 +143,7 @@ modest_ui_show_main_window (ModestUI *modest_ui)
                                             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;
@@ -297,7 +298,6 @@ on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
 {
        GtkWidget *win;
        GtkWidget *button;
-       GtkWidget *paned;
        ModestTnyHeaderTreeView *tree_view;
        ModestTnyMsgView *msg_view;
        ModestUIPrivate *priv;
@@ -309,13 +309,14 @@ on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
        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) {
@@ -332,10 +333,7 @@ on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
                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);
@@ -347,19 +345,17 @@ on_message_clicked (ModestTnyFolderTreeView *folder_tree,
                                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);
@@ -389,7 +385,7 @@ modest_main_window_header_tree (TnyMsgFolderIface *folder)
                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,
@@ -411,7 +407,7 @@ modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr,
 {
        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;
@@ -443,7 +439,7 @@ static void
 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;
@@ -452,8 +448,7 @@ on_view_attachments_toggled(GtkWidget *widget, gpointer user_data)
        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));
@@ -472,10 +467,8 @@ on_delete_clicked (GtkWidget *widget, gpointer user_data)
 {
        ModestUI *modest_ui = (ModestUI *)user_data;
        GtkTreeSelection *sel;
-       GtkWidget *paned;
        GtkTreeModel *model;
        GtkTreeIter iter;
-       GtkScrolledWindow *scroll;
        GtkTreeModel *mymodel;
 
        ModestTnyHeaderTreeView *header_view;
@@ -486,16 +479,10 @@ on_delete_clicked (GtkWidget *widget, gpointer user_data)
 
        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));
@@ -535,25 +522,27 @@ on_sendreceive_button_clicked (GtkWidget *widget, gpointer user_data)
 {
        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)
index ce4734d..4171aa0 100644 (file)
@@ -337,10 +337,8 @@ void
 quoted_send_msg (ModestUI *modest_ui, quoted_send_type qstype)
 {
        GtkTreeSelection *sel;
-       GtkWidget *paned;
        GtkTreeModel *model;
        GtkTreeIter iter;
-       GtkScrolledWindow *scroll;
 
        TnyMsgHeaderIface *header;
 
@@ -362,16 +360,10 @@ quoted_send_msg (ModestUI *modest_ui, quoted_send_type qstype)
 
        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));
index 8d93d07..a34aac5 100644 (file)
@@ -113,7 +113,8 @@ modest_ui_init (ModestUI *obj)
        priv->glade_xml         = NULL;
        priv->folder_view       = NULL;
        priv->header_view       = NULL;
-
+       priv->message_view      = NULL;
+       priv->current_folder    = NULL;
 }
 
 
index cd48853..b0935aa 100644 (file)
@@ -1 +1,2 @@
 VOID:POINTER,POINTER
+VOID:POINTER,POINTER,POINTER
index 4a079cc..4b09744 100644 (file)
@@ -27,6 +27,7 @@ enum {
 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), \
@@ -38,16 +39,85 @@ static GObjectClass *parent_class = NULL;
 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);
 }
@@ -82,7 +152,7 @@ static void
 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;
 
@@ -110,8 +180,8 @@ modest_account_mgr_class_init (ModestAccountMgrClass * 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);
 }
 
 
@@ -152,6 +222,8 @@ modest_account_mgr_new (ModestConf * conf)
         */
        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;
index 7d7b97a..169cf4a 100644 (file)
@@ -181,6 +181,24 @@ modest_tny_account_store_finalize (GObject *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)
 {
@@ -209,6 +227,14 @@ 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;
 }
@@ -407,30 +433,24 @@ modest_tny_account_store_get_store_accounts  (TnyAccountStoreIface *iface)
        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;
 }
 
 
@@ -440,31 +460,25 @@ modest_tny_account_store_get_transport_accounts (TnyAccountStoreIface *iface)
        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;
 }
 
 
index c2aaa82..19561d4 100644 (file)
@@ -661,8 +661,10 @@ modest_tny_header_tree_view_set_folder (ModestTnyHeaderTreeView *self,
        
        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),
index 1b39abc..4edfdf9 100644 (file)
@@ -28,8 +28,8 @@ modest_tny_store_actions_update_folders (TnyStoreAccountIface *storage_account)
        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);
@@ -43,5 +43,5 @@ modest_tny_store_actions_update_folders (TnyStoreAccountIface *storage_account)
        }
        
        g_object_unref (ifolders);
-}
+*/}