diff --git a/gnucash/gnome/dialog-imap-editor.c b/gnucash/gnome/dialog-imap-editor.c index 5bc4962c5b..d88b31886b 100644 --- a/gnucash/gnome/dialog-imap-editor.c +++ b/gnucash/gnome/dialog-imap-editor.c @@ -60,6 +60,7 @@ typedef struct GtkWidget *dialog; QofSession *session; GtkWidget *view; + GtkTreeModel *model; GncListType type; GtkWidget *radio_bayes; @@ -138,7 +139,7 @@ delete_info_nbayes (Account *source_account, gchar *head, } static void -delete_selected_row (GtkTreeModel *model, GtkTreeIter *iter, ImapDialog *imap_dialog) +delete_selected_row (ImapDialog *imap_dialog, GtkTreeIter *iter) { Account *source_account = NULL; gchar *full_source_account; @@ -146,8 +147,11 @@ delete_selected_row (GtkTreeModel *model, GtkTreeIter *iter, ImapDialog *imap_di gchar *category; gchar *match_string; - gtk_tree_model_get (model, iter, SOURCE_ACCOUNT, &source_account, SOURCE_FULL_ACC, &full_source_account, - HEAD, &head, CATEGORY, &category, MATCH_STRING, &match_string, -1); + gtk_tree_model_get (imap_dialog->model, iter, SOURCE_ACCOUNT, &source_account, + SOURCE_FULL_ACC, &full_source_account, + HEAD, &head, + CATEGORY, &category, + MATCH_STRING, &match_string, -1); PINFO("Account is '%s', Head is '%s', Category is '%s', Match String is '%s'", full_source_account, head, category, match_string); @@ -158,7 +162,7 @@ delete_selected_row (GtkTreeModel *model, GtkTreeIter *iter, ImapDialog *imap_di gint depth; // Get the level we are at in the tree-model - tree_path = gtk_tree_model_get_path (model, iter); + tree_path = gtk_tree_model_get_path (imap_dialog->model, iter); depth = gtk_tree_path_get_depth (tree_path); gtk_tree_path_free (tree_path); @@ -185,14 +189,15 @@ static void gnc_imap_dialog_delete (ImapDialog *imap_dialog) { GList *list, *row; - GtkTreeModel *model; + GtkTreeModel *fmodel; + GtkTreeIter fiter; GtkTreeIter iter; GtkTreeSelection *selection; - model = gtk_tree_view_get_model (GTK_TREE_VIEW(imap_dialog->view)); + fmodel = gtk_tree_view_get_model (GTK_TREE_VIEW(imap_dialog->view)); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(imap_dialog->view)); - list = gtk_tree_selection_get_selected_rows (selection, &model); + list = gtk_tree_selection_get_selected_rows (selection, &fmodel); // Make sure we have some rows selected if (g_list_length (list) == 0) @@ -207,8 +212,11 @@ gnc_imap_dialog_delete (ImapDialog *imap_dialog) // Walk the list for (row = g_list_first (list); row; row = g_list_next (row)) { - if (gtk_tree_model_get_iter (model, &iter, row->data)) - delete_selected_row (model, &iter, imap_dialog); + if (gtk_tree_model_get_iter (fmodel, &fiter, row->data)) + { + gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(fmodel), &iter, &fiter); + delete_selected_row (imap_dialog, &iter); + } } g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL); g_list_free (list); @@ -238,8 +246,8 @@ gnc_imap_dialog_response_cb (GtkDialog *dialog, gint response_id, gpointer user_ } static gboolean -filter_test_and_move_next (GtkTreeModel *model, GtkTreeIter *iter, - const gchar *filter_text, ImapDialog *imap_dialog) +filter_test_and_move_next (ImapDialog *imap_dialog, GtkTreeIter *iter, + const gchar *filter_text) { GtkTreePath *tree_path; gint depth; @@ -248,14 +256,14 @@ filter_test_and_move_next (GtkTreeModel *model, GtkTreeIter *iter, const gchar *map_full_acc; // Read the row - gtk_tree_model_get (model, iter, MATCH_STRING, &match_string, MAP_FULL_ACC, &map_full_acc, -1); + gtk_tree_model_get (imap_dialog->model, iter, MATCH_STRING, &match_string, MAP_FULL_ACC, &map_full_acc, -1); // Get the level we are at in the tree-model - tree_path = gtk_tree_model_get_path (model, iter); + tree_path = gtk_tree_model_get_path (imap_dialog->model, iter); depth = gtk_tree_path_get_depth (tree_path); // Reset filter to TRUE - gtk_tree_store_set (GTK_TREE_STORE(model), iter, FILTER, TRUE, -1); + gtk_tree_store_set (GTK_TREE_STORE(imap_dialog->model), iter, FILTER, TRUE, -1); // Check for a filter_text entry if (filter_text && *filter_text != '\0') @@ -264,7 +272,7 @@ filter_test_and_move_next (GtkTreeModel *model, GtkTreeIter *iter, { if ((g_strrstr (match_string, filter_text) == NULL) && (g_strrstr (map_full_acc, filter_text) == NULL )) - gtk_tree_store_set (GTK_TREE_STORE(model), iter, FILTER, FALSE, -1); + gtk_tree_store_set (GTK_TREE_STORE(imap_dialog->model), iter, FILTER, FALSE, -1); else gtk_tree_view_expand_to_path (GTK_TREE_VIEW(imap_dialog->view), tree_path); } @@ -275,14 +283,14 @@ filter_test_and_move_next (GtkTreeModel *model, GtkTreeIter *iter, else { gtk_tree_path_next (tree_path); - if (!gtk_tree_model_get_iter (model, iter, tree_path)) + if (!gtk_tree_model_get_iter (imap_dialog->model, iter, tree_path)) { gtk_tree_path_prev (tree_path); gtk_tree_path_up (tree_path); gtk_tree_path_next (tree_path); } } - valid = gtk_tree_model_get_iter (model, iter, tree_path); + valid = gtk_tree_model_get_iter (imap_dialog->model, iter, tree_path); gtk_tree_path_free (tree_path); @@ -292,14 +300,10 @@ filter_test_and_move_next (GtkTreeModel *model, GtkTreeIter *iter, static void filter_button_cb (GtkButton *button, ImapDialog *imap_dialog) { - GtkTreeModel *model, *filter; GtkTreeIter iter; gboolean valid; const gchar *filter_text; - filter = gtk_tree_view_get_model (GTK_TREE_VIEW(imap_dialog->view)); - model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER(filter)); - filter_text = gtk_entry_get_text (GTK_ENTRY(imap_dialog->filter_text_entry)); // Collapse all nodes @@ -314,11 +318,11 @@ filter_button_cb (GtkButton *button, ImapDialog *imap_dialog) if (filter_text && *filter_text != '\0') imap_dialog->apply_selection_filter = TRUE; - valid = gtk_tree_model_get_iter_first (model, &iter); + valid = gtk_tree_model_get_iter_first (imap_dialog->model, &iter); while (valid) { - valid = filter_test_and_move_next (model, &iter, filter_text, imap_dialog); + valid = filter_test_and_move_next (imap_dialog, &iter, filter_text); } gtk_widget_grab_focus (GTK_WIDGET(imap_dialog->view)); } @@ -382,7 +386,7 @@ show_count_column (ImapDialog *imap_dialog, gboolean show) } static void -add_to_store (GtkTreeModel *model, GtkTreeIter *iter, const gchar *text, GncImapInfo *imapInfo) +add_to_store (ImapDialog *imap_dialog, GtkTreeIter *iter, const gchar *text, GncImapInfo *imapInfo) { gchar *fullname = NULL; gchar *map_fullname = NULL; @@ -398,7 +402,7 @@ add_to_store (GtkTreeModel *model, GtkTreeIter *iter, const gchar *text, GncImap PINFO("Add to Store: Source Acc '%s', Head is '%s', Category is '%s', Match '%s', Map Acc '%s', Count is %s", fullname, imapInfo->head, imapInfo->category, imapInfo->match_string, map_fullname, imapInfo->count); - gtk_tree_store_set (GTK_TREE_STORE(model), iter, + gtk_tree_store_set (GTK_TREE_STORE(imap_dialog->model), iter, SOURCE_FULL_ACC, fullname, SOURCE_ACCOUNT, imapInfo->source_account, BASED_ON, text, MATCH_STRING, imapInfo->match_string, @@ -411,7 +415,7 @@ add_to_store (GtkTreeModel *model, GtkTreeIter *iter, const gchar *text, GncImap } static void -get_imap_info (Account *acc, const gchar *category, GtkTreeModel *model, const gchar *text) +get_imap_info (ImapDialog *imap_dialog, Account *acc, const gchar *category, const gchar *text) { GtkTreeIter toplevel, child; GList *imap_list, *node; @@ -436,8 +440,8 @@ get_imap_info (Account *acc, const gchar *category, GtkTreeModel *model, const g PINFO("List length is %d", g_list_length (imap_list)); // Add top level entry of Source full Account and Based on. - gtk_tree_store_append (GTK_TREE_STORE(model), &toplevel, NULL); - gtk_tree_store_set (GTK_TREE_STORE(model), &toplevel, + gtk_tree_store_append (GTK_TREE_STORE(imap_dialog->model), &toplevel, NULL); + gtk_tree_store_set (GTK_TREE_STORE(imap_dialog->model), &toplevel, SOURCE_ACCOUNT, acc, SOURCE_FULL_ACC, acc_name, HEAD, head, CATEGORY, category, BASED_ON, text, FILTER, TRUE, -1); @@ -446,8 +450,8 @@ get_imap_info (Account *acc, const gchar *category, GtkTreeModel *model, const g GncImapInfo *imapInfo = node->data; // First add a child entry and pass iter to add_to_store - gtk_tree_store_append (GTK_TREE_STORE(model), &child, &toplevel); - add_to_store (model, &child, text, imapInfo); + gtk_tree_store_append (GTK_TREE_STORE(imap_dialog->model), &child, &toplevel); + add_to_store (imap_dialog, &child, text, imapInfo); // Free the members and structure g_free (imapInfo->head); @@ -464,14 +468,10 @@ get_imap_info (Account *acc, const gchar *category, GtkTreeModel *model, const g static void show_first_row (ImapDialog *imap_dialog) { - GtkTreeModel *model, *filter; GtkTreeIter iter; - filter = gtk_tree_view_get_model (GTK_TREE_VIEW(imap_dialog->view)); - model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER(filter)); - // See if there are any entries - if (gtk_tree_model_get_iter_first (model, &iter)) + if (gtk_tree_model_get_iter_first (imap_dialog->model, &iter)) { GtkTreePath *path; path = gtk_tree_path_new_first (); // Set Path to first entry @@ -481,7 +481,7 @@ show_first_row (ImapDialog *imap_dialog) } static void -get_account_info_bayes (GList *accts, GtkTreeModel *model) +get_account_info_bayes (ImapDialog *imap_dialog, GList *accts) { GList *ptr; @@ -490,12 +490,12 @@ get_account_info_bayes (GList *accts, GtkTreeModel *model) { Account *acc = ptr->data; - get_imap_info (acc, NULL, model, _("Bayesian")); + get_imap_info (imap_dialog, acc, NULL, _("Bayesian")); } } static void -get_account_info_nbayes (GList *accts, GtkTreeModel *model) +get_account_info_nbayes (ImapDialog *imap_dialog, GList *accts) { GList *ptr; @@ -505,18 +505,18 @@ get_account_info_nbayes (GList *accts, GtkTreeModel *model) Account *acc = ptr->data; // Description - get_imap_info (acc, IMAP_FRAME_DESC, model, _("Description Field")); + get_imap_info (imap_dialog, acc, IMAP_FRAME_DESC, _("Description Field")); // Memo - get_imap_info (acc, IMAP_FRAME_MEMO, model, _("Memo Field")); + get_imap_info (imap_dialog, acc, IMAP_FRAME_MEMO, _("Memo Field")); // CSV Account Map - get_imap_info (acc, IMAP_FRAME_CSV, model, _("CSV Account Map")); + get_imap_info (imap_dialog, acc, IMAP_FRAME_CSV, _("CSV Account Map")); } } static void -get_account_info_online (GList *accts, GtkTreeModel *model) +get_account_info_online (ImapDialog *imap_dialog, GList *accts) { GList *ptr; GtkTreeIter toplevel; @@ -547,8 +547,8 @@ get_account_info_online (GList *accts, GtkTreeModel *model) imapInfo.count = " "; // Add top level entry and pass iter to add_to_store - gtk_tree_store_append (GTK_TREE_STORE(model), &toplevel, NULL); - add_to_store (model, &toplevel, _("Online Id"), &imapInfo); + gtk_tree_store_append (GTK_TREE_STORE(imap_dialog->model), &toplevel, NULL); + add_to_store (imap_dialog, &toplevel, _("Online Id"), &imapInfo); } g_free (text); } @@ -580,22 +580,22 @@ get_account_info (ImapDialog *imap_dialog) { Account *root; GList *accts; - GtkTreeModel *model, *filter; + GtkTreeModel *fmodel; /* Get list of Accounts */ root = gnc_book_get_root_account (gnc_get_current_book()); accts = gnc_account_get_descendants_sorted (root); - filter = gtk_tree_view_get_model (GTK_TREE_VIEW(imap_dialog->view)); + fmodel = gtk_tree_view_get_model (GTK_TREE_VIEW(imap_dialog->view)); - model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER(filter)); + imap_dialog->model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER(fmodel)); // Disconnect the filter model from the treeview - g_object_ref (G_OBJECT(model)); + g_object_ref (G_OBJECT(imap_dialog->model)); gtk_tree_view_set_model (GTK_TREE_VIEW(imap_dialog->view), NULL); // Clear the tree store - gtk_tree_store_clear (GTK_TREE_STORE(model)); + gtk_tree_store_clear (GTK_TREE_STORE(imap_dialog->model)); // Clear the filter gtk_entry_set_text (GTK_ENTRY(imap_dialog->filter_text_entry), ""); @@ -609,26 +609,26 @@ get_account_info (ImapDialog *imap_dialog) if (imap_dialog->type == BAYES) { - get_account_info_bayes (accts, model); + get_account_info_bayes (imap_dialog, accts); // Show Count Column show_count_column (imap_dialog, TRUE); } else if (imap_dialog->type == NBAYES) - get_account_info_nbayes (accts, model); + get_account_info_nbayes (imap_dialog, accts); else if (imap_dialog->type == ONLINE) { // Hide Filter Option show_filter_option (imap_dialog, FALSE); - get_account_info_online (accts, model); + get_account_info_online (imap_dialog, accts); } // create a new filter model and reconnect to treeview - filter = gtk_tree_model_filter_new (GTK_TREE_MODEL(model), NULL); - gtk_tree_model_filter_set_visible_column (GTK_TREE_MODEL_FILTER(filter), FILTER); - g_object_unref (G_OBJECT(model)); + fmodel = gtk_tree_model_filter_new (GTK_TREE_MODEL(imap_dialog->model), NULL); + gtk_tree_model_filter_set_visible_column (GTK_TREE_MODEL_FILTER(fmodel), FILTER); + g_object_unref (G_OBJECT(imap_dialog->model)); - gtk_tree_view_set_model (GTK_TREE_VIEW(imap_dialog->view), filter); - g_object_unref (G_OBJECT(filter)); + gtk_tree_view_set_model (GTK_TREE_VIEW(imap_dialog->view), fmodel); + g_object_unref (G_OBJECT(fmodel)); // if there are any entries, show first row show_first_row (imap_dialog);