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

@ -52,8 +52,8 @@ struct _accountpickerdialog {
static void static void
acct_tree_add_accts(SCM accts, acct_tree_add_accts(SCM accts,
GtkTreeStore *store, GtkTreeStore *store,
GtkTreeIter *parent, GtkTreeIter *parent,
const char *base_name, const char *base_name,
const char *selected_name, const char *selected_name,
GtkTreeRowReference **reference) GtkTreeRowReference **reference)
@ -79,7 +79,7 @@ acct_tree_add_accts(SCM accts,
else else
compname = ""; compname = "";
if(!SCM_NULLP(SCM_CADDR(current))) { if (!SCM_NULLP(SCM_CADDR(current))) {
leafnode = FALSE; leafnode = FALSE;
} }
else { else {
@ -87,25 +87,25 @@ acct_tree_add_accts(SCM accts,
} }
/* compute full name */ /* compute full name */
if(base_name && *base_name) { if (base_name && *base_name) {
acctname = g_strjoin(gnc_get_account_separator_string(), acctname = g_strjoin(gnc_get_account_separator_string(),
base_name, compname, (char *)NULL); base_name, compname, (char *)NULL);
} }
else { else {
acctname = g_strdup(compname); acctname = g_strdup(compname);
} }
checked = (SCM_CADR (current) == SCM_BOOL_T); checked = (SCM_CADR(current) == SCM_BOOL_T);
gtk_tree_store_append(store, &iter, parent); gtk_tree_store_append(store, &iter, parent);
gtk_tree_store_set(store, &iter, gtk_tree_store_set(store, &iter,
ACCOUNT_COL_NAME, compname, ACCOUNT_COL_NAME, compname,
ACCOUNT_COL_FULLNAME, acctname, ACCOUNT_COL_FULLNAME, acctname,
ACCOUNT_COL_CHECK, checked, ACCOUNT_COL_CHECK, checked,
-1); -1);
if (reference && !*reference && if (reference && !*reference &&
selected_name && (g_utf8_collate(selected_name, acctname) == 0)) { selected_name && (g_utf8_collate(selected_name, acctname) == 0)) {
GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter); GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
*reference = gtk_tree_row_reference_new(GTK_TREE_MODEL(store), path); *reference = gtk_tree_row_reference_new(GTK_TREE_MODEL(store), path);
gtk_tree_path_free(path); gtk_tree_path_free(path);
@ -113,7 +113,7 @@ acct_tree_add_accts(SCM accts,
if(!leafnode) { if(!leafnode) {
acct_tree_add_accts(SCM_CADDR(current), store, &iter, acctname, acct_tree_add_accts(SCM_CADDR(current), store, &iter, acctname,
selected_name, reference); selected_name, reference);
} }
g_free(acctname); g_free(acctname);
@ -127,7 +127,7 @@ build_acct_tree(QIFAccountPickerDialog * picker, QIFImportWindow * import)
{ {
SCM get_accts = scm_c_eval_string("qif-import:get-all-accts"); SCM get_accts = scm_c_eval_string("qif-import:get-all-accts");
SCM acct_tree = scm_call_1(get_accts, SCM acct_tree = scm_call_1(get_accts,
gnc_ui_qif_import_druid_get_mappings(import)); gnc_ui_qif_import_druid_get_mappings(import));
GtkTreeStore *store; GtkTreeStore *store;
GtkTreePath *path; GtkTreePath *path;
GtkTreeSelection* selection; GtkTreeSelection* selection;
@ -137,7 +137,7 @@ build_acct_tree(QIFAccountPickerDialog * picker, QIFImportWindow * import)
gtk_tree_store_clear(store); gtk_tree_store_clear(store);
acct_tree_add_accts(acct_tree, store, NULL, NULL, acct_tree_add_accts(acct_tree, store, NULL, NULL,
picker->selected_name, &reference); picker->selected_name, &reference);
if (reference) { if (reference) {
selection = gtk_tree_view_get_selection(picker->treeview); selection = gtk_tree_view_get_selection(picker->treeview);
@ -160,11 +160,11 @@ gnc_ui_qif_account_picker_new_cb(GtkButton * w, gpointer user_data)
char * fullname; char * fullname;
GtkWidget *dlg, *entry; GtkWidget *dlg, *entry;
dlg = gtk_message_dialog_new (GTK_WINDOW(wind->dialog), dlg = gtk_message_dialog_new(GTK_WINDOW(wind->dialog),
GTK_DIALOG_DESTROY_WITH_PARENT, GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_QUESTION, GTK_MESSAGE_QUESTION,
GTK_BUTTONS_OK_CANCEL, GTK_BUTTONS_OK_CANCEL,
"%s", _("Enter a name for the account")); "%s", _("Enter a name for the account"));
entry = gtk_entry_new(); entry = gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(entry), 250); gtk_entry_set_max_length(GTK_ENTRY(entry), 250);
@ -176,7 +176,7 @@ gnc_ui_qif_account_picker_new_cb(GtkButton * w, gpointer user_data)
name = gtk_entry_get_text(GTK_ENTRY(entry)); name = gtk_entry_get_text(GTK_ENTRY(entry));
if(wind->selected_name && (strlen(wind->selected_name) > 0)) { if(wind->selected_name && (strlen(wind->selected_name) > 0)) {
fullname = g_strjoin(gnc_get_account_separator_string(), fullname = g_strjoin(gnc_get_account_separator_string(),
wind->selected_name, name, (char *)NULL); wind->selected_name, name, (char *)NULL);
} }
else { else {
fullname = g_strdup(name); fullname = g_strdup(name);
@ -192,8 +192,8 @@ gnc_ui_qif_account_picker_new_cb(GtkButton * w, gpointer user_data)
} }
static void static void
gnc_ui_qif_account_picker_changed_cb (GtkTreeSelection *selection, gnc_ui_qif_account_picker_changed_cb(GtkTreeSelection *selection,
gpointer user_data) gpointer user_data)
{ {
QIFAccountPickerDialog * wind = user_data; QIFAccountPickerDialog * wind = user_data;
SCM name_setter = scm_c_eval_string("qif-map-entry:set-gnc-name!"); SCM name_setter = scm_c_eval_string("qif-map-entry:set-gnc-name!");
@ -202,22 +202,26 @@ gnc_ui_qif_account_picker_changed_cb (GtkTreeSelection *selection,
g_free(wind->selected_name); g_free(wind->selected_name);
if (gtk_tree_selection_get_selected(selection, &model, &iter)) { if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
gtk_tree_model_get(model, &iter, ACCOUNT_COL_FULLNAME, &wind->selected_name, -1); gtk_tree_model_get(model, &iter,
scm_call_2(name_setter, wind->map_entry, scm_makfrom0str(wind->selected_name)); ACCOUNT_COL_FULLNAME, &wind->selected_name,
-1);
scm_call_2(name_setter, wind->map_entry,
scm_makfrom0str(wind->selected_name));
} else { } else {
wind->selected_name = NULL; wind->selected_name = NULL;
} }
} }
static void static void
gnc_ui_qif_account_picker_row_activated_cb (GtkTreeView *view, GtkTreePath *path, gnc_ui_qif_account_picker_row_activated_cb(GtkTreeView *view,
GtkTreeViewColumn *column, GtkTreePath *path,
gpointer user_data) GtkTreeViewColumn *column,
gpointer user_data)
{ {
QIFAccountPickerDialog *wind = user_data; QIFAccountPickerDialog *wind = user_data;
g_return_if_fail (wind); g_return_if_fail(wind);
gtk_dialog_response (GTK_DIALOG (wind->dialog), GTK_RESPONSE_OK); gtk_dialog_response(GTK_DIALOG(wind->dialog), GTK_RESPONSE_OK);
} }
static int static int
@ -232,21 +236,22 @@ gnc_ui_qif_account_picker_map_cb(GtkWidget * w, gpointer user_data)
return FALSE; return FALSE;
} }
/**************************************************************** /****************************************************************
* qif_account_picker_dialog * 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 * Select an account from the ones that the engine knows about,
* sort of like fileBox... it returns a string for the account name or * plus those that will be created by the QIF import. Returns
* NULL on cancel. It's modal. * a new Scheme map entry, or SCM_BOOL_F on cancel. Modal.
****************************************************************/ ****************************************************************/
SCM SCM
qif_account_picker_dialog(QIFImportWindow * qif_wind, SCM map_entry) qif_account_picker_dialog(QIFImportWindow * qif_wind, SCM map_entry)
{ {
QIFAccountPickerDialog * wind; 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 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; int response;
const gchar * scmname; const gchar * scmname;
GladeXML *xml; GladeXML *xml;
@ -254,19 +259,20 @@ qif_account_picker_dialog(QIFImportWindow * qif_wind, SCM map_entry)
wind = g_new0(QIFAccountPickerDialog, 1); wind = g_new0(QIFAccountPickerDialog, 1);
xml = gnc_glade_xml_new ("qif.glade", "QIF Import Account Picker"); xml = gnc_glade_xml_new("qif.glade", "QIF Import Account Picker");
glade_xml_signal_connect_data glade_xml_signal_connect_data(xml,
(xml, "gnc_ui_qif_account_picker_new_cb", "gnc_ui_qif_account_picker_new_cb",
G_CALLBACK (gnc_ui_qif_account_picker_new_cb), wind); G_CALLBACK(gnc_ui_qif_account_picker_new_cb),
wind);
wind->dialog = glade_xml_get_widget (xml, "QIF Import Account Picker"); wind->dialog = glade_xml_get_widget(xml, "QIF Import Account Picker");
wind->treeview = GTK_TREE_VIEW(glade_xml_get_widget (xml, "account_tree")); wind->treeview = GTK_TREE_VIEW(glade_xml_get_widget(xml, "account_tree"));
wind->qif_wind = qif_wind; 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); wind->selected_name = g_strdup(scmname);
scm_gc_protect_object(wind->map_entry); scm_gc_protect_object(wind->map_entry);
@ -278,37 +284,41 @@ qif_account_picker_dialog(QIFImportWindow * qif_wind, SCM map_entry)
GtkTreeSelection *selection; GtkTreeSelection *selection;
store = gtk_tree_store_new(NUM_ACCOUNT_COLS, G_TYPE_STRING, G_TYPE_STRING, store = gtk_tree_store_new(NUM_ACCOUNT_COLS, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_BOOLEAN); G_TYPE_BOOLEAN);
gtk_tree_view_set_model(wind->treeview, GTK_TREE_MODEL(store)); gtk_tree_view_set_model(wind->treeview, GTK_TREE_MODEL(store));
g_object_unref(store); g_object_unref(store);
renderer = gtk_cell_renderer_text_new(); renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Account"), renderer, column = gtk_tree_view_column_new_with_attributes(_("Account"),
"text", ACCOUNT_COL_NAME, renderer,
NULL); "text",
ACCOUNT_COL_NAME,
NULL);
g_object_set(column, "expand", TRUE, NULL); g_object_set(column, "expand", TRUE, NULL);
gtk_tree_view_append_column(wind->treeview, column); gtk_tree_view_append_column(wind->treeview, column);
renderer = gtk_cell_renderer_toggle_new(); renderer = gtk_cell_renderer_toggle_new();
g_object_set(renderer, "activatable", FALSE, NULL); g_object_set(renderer, "activatable", FALSE, NULL);
column = gtk_tree_view_column_new_with_attributes(_("New?"), renderer, column = gtk_tree_view_column_new_with_attributes(_("New?"),
"active", ACCOUNT_COL_CHECK, renderer,
NULL); "active",
ACCOUNT_COL_CHECK,
NULL);
gtk_tree_view_append_column(wind->treeview, column); gtk_tree_view_append_column(wind->treeview, column);
selection = gtk_tree_view_get_selection(wind->treeview); selection = gtk_tree_view_get_selection(wind->treeview);
g_signal_connect(selection, "changed", g_signal_connect(selection, "changed",
G_CALLBACK(gnc_ui_qif_account_picker_changed_cb), wind); G_CALLBACK(gnc_ui_qif_account_picker_changed_cb), wind);
g_signal_connect(wind->treeview, "row-activated", g_signal_connect(wind->treeview, "row-activated",
G_CALLBACK(gnc_ui_qif_account_picker_row_activated_cb), G_CALLBACK(gnc_ui_qif_account_picker_row_activated_cb),
wind); wind);
} }
g_signal_connect_after(wind->dialog, "map", g_signal_connect_after(wind->dialog, "map",
G_CALLBACK(gnc_ui_qif_account_picker_map_cb), G_CALLBACK(gnc_ui_qif_account_picker_map_cb),
wind); wind);
button = glade_xml_get_widget (xml, "newbutton"); button = glade_xml_get_widget(xml, "newbutton");
gtk_button_set_use_stock(GTK_BUTTON(button), TRUE); gtk_button_set_use_stock(GTK_BUTTON(button), TRUE);
/* this is to get the checkmarks set up right.. it will get called /* this is to get the checkmarks set up right.. it will get called
@ -324,10 +334,8 @@ qif_account_picker_dialog(QIFImportWindow * qif_wind, SCM map_entry)
g_free(wind->selected_name); g_free(wind->selected_name);
g_free(wind); g_free(wind);
if (response == GTK_RESPONSE_OK) { if (response == GTK_RESPONSE_OK)
return map_entry; return new_entry;
}
else { return SCM_BOOL_F;
return saved_entry;
}
} }

File diff suppressed because it is too large Load Diff