Bug #514210: Allow multiple rows to be selected and remapped on QIF Import

account mapping pages. Also includes many whitespace adjustments.
BP


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@17156 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Charles Day 2008-05-14 02:49:29 +00:00
parent d0ddccaa01
commit 23b3f81410
2 changed files with 554 additions and 467 deletions

View File

@ -202,15 +202,19 @@ gnc_ui_qif_account_picker_changed_cb (GtkTreeSelection *selection,
g_free(wind->selected_name);
if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
gtk_tree_model_get(model, &iter, ACCOUNT_COL_FULLNAME, &wind->selected_name, -1);
scm_call_2(name_setter, wind->map_entry, scm_makfrom0str(wind->selected_name));
gtk_tree_model_get(model, &iter,
ACCOUNT_COL_FULLNAME, &wind->selected_name,
-1);
scm_call_2(name_setter, wind->map_entry,
scm_makfrom0str(wind->selected_name));
} else {
wind->selected_name = NULL;
}
}
static void
gnc_ui_qif_account_picker_row_activated_cb (GtkTreeView *view, GtkTreePath *path,
gnc_ui_qif_account_picker_row_activated_cb(GtkTreeView *view,
GtkTreePath *path,
GtkTreeViewColumn *column,
gpointer user_data)
{
@ -232,21 +236,22 @@ gnc_ui_qif_account_picker_map_cb(GtkWidget * w, gpointer user_data)
return FALSE;
}
/****************************************************************
* qif_account_picker_dialog
* select an account from the ones that the engine knows about, plus
* the ones that will be created newly by the QIF import. this is
* sort of like fileBox... it returns a string for the account name or
* NULL on cancel. It's modal.
*
* Select an account from the ones that the engine knows about,
* plus those that will be created by the QIF import. Returns
* a new Scheme map entry, or SCM_BOOL_F on cancel. Modal.
****************************************************************/
SCM
qif_account_picker_dialog(QIFImportWindow * qif_wind, SCM map_entry)
{
QIFAccountPickerDialog * wind;
SCM save_entry = scm_c_eval_string("qif-map-entry:clone");
SCM clone_entry = scm_c_eval_string("qif-map-entry:clone");
SCM init_pick = scm_c_eval_string("qif-map-entry:gnc-name");
SCM saved_entry = scm_call_1(save_entry, map_entry);
SCM new_entry = scm_call_1(clone_entry, map_entry);
int response;
const gchar * scmname;
GladeXML *xml;
@ -256,17 +261,18 @@ qif_account_picker_dialog(QIFImportWindow * qif_wind, SCM map_entry)
xml = gnc_glade_xml_new("qif.glade", "QIF Import Account Picker");
glade_xml_signal_connect_data
(xml, "gnc_ui_qif_account_picker_new_cb",
G_CALLBACK (gnc_ui_qif_account_picker_new_cb), wind);
glade_xml_signal_connect_data(xml,
"gnc_ui_qif_account_picker_new_cb",
G_CALLBACK(gnc_ui_qif_account_picker_new_cb),
wind);
wind->dialog = glade_xml_get_widget(xml, "QIF Import Account Picker");
wind->treeview = GTK_TREE_VIEW(glade_xml_get_widget(xml, "account_tree"));
wind->qif_wind = qif_wind;
wind->map_entry = map_entry;
wind->map_entry = new_entry;
scmname = SCM_STRING_CHARS(scm_call_1(init_pick, map_entry));
scmname = SCM_STRING_CHARS(scm_call_1(init_pick, new_entry));
wind->selected_name = g_strdup(scmname);
scm_gc_protect_object(wind->map_entry);
@ -283,16 +289,20 @@ qif_account_picker_dialog(QIFImportWindow * qif_wind, SCM map_entry)
g_object_unref(store);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Account"), renderer,
"text", ACCOUNT_COL_NAME,
column = gtk_tree_view_column_new_with_attributes(_("Account"),
renderer,
"text",
ACCOUNT_COL_NAME,
NULL);
g_object_set(column, "expand", TRUE, NULL);
gtk_tree_view_append_column(wind->treeview, column);
renderer = gtk_cell_renderer_toggle_new();
g_object_set(renderer, "activatable", FALSE, NULL);
column = gtk_tree_view_column_new_with_attributes(_("New?"), renderer,
"active", ACCOUNT_COL_CHECK,
column = gtk_tree_view_column_new_with_attributes(_("New?"),
renderer,
"active",
ACCOUNT_COL_CHECK,
NULL);
gtk_tree_view_append_column(wind->treeview, column);
@ -324,10 +334,8 @@ qif_account_picker_dialog(QIFImportWindow * qif_wind, SCM map_entry)
g_free(wind->selected_name);
g_free(wind);
if (response == GTK_RESPONSE_OK) {
return map_entry;
}
else {
return saved_entry;
}
if (response == GTK_RESPONSE_OK)
return new_entry;
return SCM_BOOL_F;
}

View File

@ -307,8 +307,10 @@ get_next_druid_page(QIFImportWindow * wind, GnomeDruidPage * page)
}
}
if(next) return (GtkWidget *)next->data;
else return NULL;
if (next)
return (GtkWidget *)next->data;
return NULL;
}
@ -396,7 +398,7 @@ get_prev_druid_page(QIFImportWindow * wind, GnomeDruidPage * page)
if(prev)
return (GtkWidget *)prev->data;
else
return NULL;
}
@ -1087,6 +1089,7 @@ update_accounts_page(QIFImportWindow * wind)
/****************************************************************
* update_categories_page
*
* update the QIF category -> GNC Account picker
****************************************************************/
@ -1101,6 +1104,7 @@ update_categories_page(QIFImportWindow * wind)
/****************************************************************
* update_memo_page
*
* update the QIF memo -> GNC Account picker
****************************************************************/
@ -1134,65 +1138,123 @@ create_account_picker_view(GtkWidget *widget,
g_object_unref(store);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(col_name, renderer,
"text", ACCOUNT_COL_QIF_NAME,
column = gtk_tree_view_column_new_with_attributes(col_name,
renderer,
"text",
ACCOUNT_COL_QIF_NAME,
NULL);
g_object_set(column, "expand", TRUE, NULL);
gtk_tree_view_append_column(view, column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("GnuCash account name"), renderer,
"text", ACCOUNT_COL_GNC_NAME,
column = gtk_tree_view_column_new_with_attributes(_("GnuCash account name"),
renderer,
"text",
ACCOUNT_COL_GNC_NAME,
NULL);
g_object_set(column, "expand", TRUE, NULL);
gtk_tree_view_append_column(view, column);
renderer = gtk_cell_renderer_toggle_new();
g_object_set(renderer, "activatable", FALSE, NULL);
column = gtk_tree_view_column_new_with_attributes(_("New?"), renderer,
"active", ACCOUNT_COL_NEW,
column = gtk_tree_view_column_new_with_attributes(_("New?"),
renderer,
"active",
ACCOUNT_COL_NEW,
NULL);
gtk_tree_view_append_column(view, column);
g_object_set_data(G_OBJECT(store), PREV_ROW, GINT_TO_POINTER(-1));
g_signal_connect(view, "row-activated", G_CALLBACK(callback), user_data);
/* Allow multiple rows to be selected. */
gtk_tree_selection_set_mode(gtk_tree_view_get_selection(view),
GTK_SELECTION_MULTIPLE);
}
/********************************************************************
* select_line
* generic function to process the selection when a user tries to edit
* an account mapping in one of the "map QIF * to GNC" pages. This
* calls out to the account picker, and then then updates the
* appropriate data structures. Finally, it will call the update_page
* function.
*
* This is a helper function for tree controls used by some druid
* pages for mapping QIF values to GnuCash accounts. It processes
* the selected rows when a user tries to edit the account mappings.
* The account picker is displayed, and the chosen GnuCash account
* becomes the new mapping for each row. Finally, the update_page
* function is called.
********************************************************************/
static void
select_line(QIFImportWindow *wind, GtkTreeSelection *selection,
SCM display_info, SCM map_info,
void (*update_page)(QIFImportWindow *))
{
SCM get_name = scm_c_eval_string("qif-map-entry:qif-name");
SCM selected_acct;
SCM get_qif_name = scm_c_eval_string("qif-map-entry:qif-name");
SCM get_gnc_name = scm_c_eval_string("qif-map-entry:gnc-name");
SCM set_gnc_name = scm_c_eval_string("qif-map-entry:set-gnc-name!");
SCM map_entry;
SCM gnc_name;
GList *pathlist;
GList *current;
GtkTreeModel *model;
GtkTreeIter iter;
gint row;
if (!gtk_tree_selection_get_selected (selection, &model, &iter))
/* Get a list of selected rows. */
pathlist = gtk_tree_selection_get_selected_rows(selection, &model);
if (!pathlist)
return;
/*
* Update the first selected row.
*/
/* Get the row number of the first selected row. */
if (!gtk_tree_model_get_iter(model, &iter, (GtkTreePath *) pathlist->data))
return;
gtk_tree_model_get(model, &iter, ACCOUNT_COL_INDEX, &row, -1);
/* Save the row number. */
g_object_set_data(G_OBJECT(model), PREV_ROW, GINT_TO_POINTER(row));
if (row == -1)
return;
/* find the <qif-map-entry> corresponding to the selected row */
selected_acct = scm_list_ref(display_info, scm_int2num(row));
/* Find the <qif-map-entry> corresponding to the selected row. */
map_entry = scm_list_ref(display_info, scm_int2num(row));
/* call the account picker to update it */
selected_acct = qif_account_picker_dialog(wind, selected_acct);
/* Call the account picker to update it. */
map_entry = qif_account_picker_dialog(wind, map_entry);
if (map_entry == SCM_BOOL_F)
return;
gnc_name = scm_call_1(get_gnc_name, map_entry);
scm_hash_set_x(map_info, scm_call_1(get_name, selected_acct), selected_acct);
/* Update the mapping hash table. */
scm_hash_set_x(map_info, scm_call_1(get_qif_name, map_entry), map_entry);
/* update display */
/*
* Map all other selected rows to the same GnuCash account.
*/
for (current = pathlist->next; current; current = current->next)
{
/* Get the row number. */
gtk_tree_model_get_iter(model, &iter, (GtkTreePath *) current->data);
gtk_tree_model_get(model, &iter, ACCOUNT_COL_INDEX, &row, -1);
/* Update the <qif-map-entry> for the selected row. */
map_entry = scm_list_ref(display_info, scm_int2num(row));
scm_call_2(set_gnc_name, map_entry, gnc_name);
/* Update the mapping hash table. */
scm_hash_set_x(map_info, scm_call_1(get_qif_name, map_entry), map_entry);
}
/* Free the path list. */
g_list_foreach(pathlist, (GFunc) gtk_tree_path_free, NULL);
g_list_free(pathlist);
/* Update the display. */
update_page(wind);
}
@ -2315,6 +2377,7 @@ gnc_file_qif_import (void)
gnc_ui_qif_import_druid_make();
}
/********************************************************************
* gnc_ui_qif_import_druid_make()
* build the druid.
@ -2517,8 +2580,10 @@ gnc_ui_qif_import_druid_make(void)
g_object_unref(store);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Account"), renderer,
"text", FILENAME_COL_NAME,
column = gtk_tree_view_column_new_with_attributes(_("Account"),
renderer,
"text",
FILENAME_COL_NAME,
NULL);
gtk_tree_view_append_column(view, column);
@ -2545,21 +2610,27 @@ gnc_ui_qif_import_druid_make(void)
g_object_unref(store);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Date"), renderer,
"text", QIF_TRANS_COL_DATE,
column = gtk_tree_view_column_new_with_attributes(_("Date"),
renderer,
"text",
QIF_TRANS_COL_DATE,
NULL);
gtk_tree_view_append_column(view, column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Description"), renderer,
"text", QIF_TRANS_COL_DESCRIPTION,
column = gtk_tree_view_column_new_with_attributes(_("Description"),
renderer,
"text",
QIF_TRANS_COL_DESCRIPTION,
NULL);
gtk_tree_view_append_column(view, column);
gtk_tree_view_column_set_expand(column, TRUE);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Amount"), renderer,
"text", QIF_TRANS_COL_AMOUNT,
column = gtk_tree_view_column_new_with_attributes(_("Amount"),
renderer,
"text",
QIF_TRANS_COL_AMOUNT,
NULL);
gtk_tree_view_append_column(view, column);
@ -2577,27 +2648,35 @@ gnc_ui_qif_import_druid_make(void)
g_object_unref(store);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Date"), renderer,
"text", QIF_TRANS_COL_DATE,
column = gtk_tree_view_column_new_with_attributes(_("Date"),
renderer,
"text",
QIF_TRANS_COL_DATE,
NULL);
gtk_tree_view_append_column(view, column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Description"), renderer,
"text", QIF_TRANS_COL_DESCRIPTION,
column = gtk_tree_view_column_new_with_attributes(_("Description"),
renderer,
"text",
QIF_TRANS_COL_DESCRIPTION,
NULL);
gtk_tree_view_append_column(view, column);
gtk_tree_view_column_set_expand(column, TRUE);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Amount"), renderer,
"text", QIF_TRANS_COL_AMOUNT,
column = gtk_tree_view_column_new_with_attributes(_("Amount"),
renderer,
"text",
QIF_TRANS_COL_AMOUNT,
NULL);
gtk_tree_view_append_column(view, column);
renderer = gtk_cell_renderer_toggle_new();
column = gtk_tree_view_column_new_with_attributes(_("Dup?"), renderer,
"active", QIF_TRANS_COL_CHECKED,
column = gtk_tree_view_column_new_with_attributes(_("Dup?"),
renderer,
"active",
QIF_TRANS_COL_CHECKED,
NULL);
gtk_tree_view_append_column(view, column);