r17357 - gnucash/branches/2.2/src/import-export/qif-import - [r17156, r17157] Bug #514210: Allow multiple rows to be selected and remapped on QIF Import

Andreas Köhler andi5 at cvs.gnucash.org
Sun Jul 20 19:52:16 EDT 2008


Author: andi5
Date: 2008-07-20 19:52:15 -0400 (Sun, 20 Jul 2008)
New Revision: 17357
Trac: http://svn.gnucash.org/trac/changeset/17357

Modified:
   gnucash/branches/2.2/src/import-export/qif-import/dialog-account-picker.c
   gnucash/branches/2.2/src/import-export/qif-import/dialog-account-picker.h
   gnucash/branches/2.2/src/import-export/qif-import/druid-qif-import.c
Log:
[r17156,r17157] Bug #514210: Allow multiple rows to be selected and remapped on QIF Import
account mapping pages. Also includes many whitespace adjustments.

Bug #514210: This fixes a QIF import bug introduced in r17156 which
prevented users from creating new accounts while mapping accounts. It
also fixes several GUI annoyances:
 1. The tree now automatically expands to show the currently selected account.
 2. The new account dialog's OK button is now activated by the Enter key.
 3. Focus returns to the account tree when the new account dialog is closed.
 4. Creation of empty account names is prevented.

Finally, a memory leak has been fixed and many new comments have been added.

Committed by cedayiv.


Modified: gnucash/branches/2.2/src/import-export/qif-import/dialog-account-picker.c
===================================================================
--- gnucash/branches/2.2/src/import-export/qif-import/dialog-account-picker.c	2008-07-20 23:52:06 UTC (rev 17356)
+++ gnucash/branches/2.2/src/import-export/qif-import/dialog-account-picker.c	2008-07-20 23:52:15 UTC (rev 17357)
@@ -1,5 +1,5 @@
 /********************************************************************\
- * dialog-account-picker.c -- window for picking a Gnucash account  * 
+ * dialog-account-picker.c -- window for picking a Gnucash account  *
  * from the QIF importer.                                           *
  * Copyright (C) 2000-2001 Bill Gribble <grib at billgribble.com>      *
  * Copyright (c) 2006 David Hampton <hampton at employees.org>         *
@@ -46,16 +46,27 @@
   GtkWidget       * dialog;
   GtkTreeView     * treeview;
   QIFImportWindow * qif_wind;
-  SCM             map_entry;  
+  SCM             map_entry;
   gchar           * selected_name;
 };
 
+
+/****************************************************************
+ * acct_tree_add_accts
+ *
+ * Given a Scheme list of accounts, this function populates a
+ * GtkTreeStore from them. If the search_name and reference
+ * parameters are provided, and an account is found whose full
+ * name matches search_name, then a GtkTreeRowReference* will be
+ * returned in the reference parameter.
+ ****************************************************************/
+
 static void
 acct_tree_add_accts(SCM accts,
-		    GtkTreeStore *store,
-		    GtkTreeIter *parent,
+                    GtkTreeStore *store,
+                    GtkTreeIter *parent,
                     const char *base_name,
-                    const char *selected_name,
+                    const char *search_name,
                     GtkTreeRowReference **reference)
 {
   GtkTreeIter  iter;
@@ -64,7 +75,7 @@
   gboolean     leafnode;
   SCM          current;
   gboolean     checked;
-  
+
   while(!SCM_NULLP(accts)) {
     current = SCM_CAR(accts);
 
@@ -79,33 +90,33 @@
     else
       compname = "";
 
-    if(!SCM_NULLP(SCM_CADDR(current))) {
+    if (!SCM_NULLP(SCM_CADDR(current))) {
       leafnode = FALSE;
     }
     else {
       leafnode = TRUE;
     }
 
-    /* compute full name */ 
-    if(base_name && *base_name) {
-      acctname =  g_strjoin(gnc_get_account_separator_string(),
-			    base_name, compname, (char *)NULL);
+    /* compute full name */
+    if (base_name && *base_name) {
+      acctname = g_strjoin(gnc_get_account_separator_string(),
+                           base_name, compname, (char *)NULL);
     }
     else {
       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_set(store, &iter,
-		       ACCOUNT_COL_NAME, compname,
-		       ACCOUNT_COL_FULLNAME, acctname,
-		       ACCOUNT_COL_CHECK, checked,
-		       -1);
+                       ACCOUNT_COL_NAME, compname,
+                       ACCOUNT_COL_FULLNAME, acctname,
+                       ACCOUNT_COL_CHECK, checked,
+                       -1);
 
     if (reference && !*reference &&
-	selected_name && (g_utf8_collate(selected_name, acctname) == 0)) {
+        search_name && (g_utf8_collate(search_name, acctname) == 0)) {
       GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
       *reference = gtk_tree_row_reference_new(GTK_TREE_MODEL(store), path);
       gtk_tree_path_free(path);
@@ -113,36 +124,54 @@
 
     if(!leafnode) {
       acct_tree_add_accts(SCM_CADDR(current), store, &iter, acctname,
-			  selected_name, reference);
+                          search_name, reference);
     }
 
     g_free(acctname);
 
-    accts = SCM_CDR(accts);      
+    accts = SCM_CDR(accts);
   }
 }
 
+
+/****************************************************************
+ * build_acct_tree
+ *
+ * This function refreshes the contents of the account tree.
+ ****************************************************************/
+
 static void
 build_acct_tree(QIFAccountPickerDialog * picker, QIFImportWindow * import)
 {
   SCM  get_accts = scm_c_eval_string("qif-import:get-all-accts");
-  SCM  acct_tree = scm_call_1(get_accts, 
-			      gnc_ui_qif_import_druid_get_mappings(import));
+  SCM  acct_tree;
   GtkTreeStore *store;
   GtkTreePath *path;
   GtkTreeSelection* selection;
   GtkTreeRowReference *reference = NULL;
+  gchar *name_to_select;
 
+  g_return_if_fail(picker && import);
+
+  /* Get an account tree with all existing and to-be-imported accounts. */
+  acct_tree = scm_call_1(get_accts,
+                         gnc_ui_qif_import_druid_get_mappings(import));
+
+  /* Rebuild the store.
+   * NOTE: It is necessary to save a copy of the name to select, because
+   *       when the store is cleared, everything becomes unselected. */
+  name_to_select = g_strdup(picker->selected_name);
   store = GTK_TREE_STORE(gtk_tree_view_get_model(picker->treeview));
   gtk_tree_store_clear(store);
+  acct_tree_add_accts(acct_tree, store, NULL, NULL, name_to_select, &reference);
+  g_free(name_to_select);
 
-  acct_tree_add_accts(acct_tree, store, NULL, NULL,
-		      picker->selected_name, &reference);
-
+  /* Select and display the indicated account (if it was found). */
   if (reference) {
     selection = gtk_tree_view_get_selection(picker->treeview);
     path = gtk_tree_row_reference_get_path(reference);
     if (path) {
+      gtk_tree_view_expand_to_path(picker->treeview, path);
       gtk_tree_selection_select_path(selection, path);
       gtk_tree_path_free(path);
     }
@@ -150,50 +179,66 @@
   }
 }
 
+
+/****************************************************************
+ * gnc_ui_qif_account_picker_new_cb
+ *
+ * This handler is invoked when the user wishes to create a new
+ * account.
+ ****************************************************************/
+
 static void
 gnc_ui_qif_account_picker_new_cb(GtkButton * w, gpointer user_data)
 {
   QIFAccountPickerDialog * wind = user_data;
   SCM name_setter = scm_c_eval_string("qif-map-entry:set-gnc-name!");
-  const char *name;
-  int  response;
-  char * fullname;
+  const gchar *name;
+  int response;
+  gchar *fullname;
   GtkWidget *dlg, *entry;
 
-  dlg = gtk_message_dialog_new (GTK_WINDOW(wind->dialog),
-				GTK_DIALOG_DESTROY_WITH_PARENT,
-				GTK_MESSAGE_QUESTION,
-				GTK_BUTTONS_OK_CANCEL,
-				"%s", _("Enter a name for the account"));
-
+  /* Create a dialog to get the new account name. */
+  dlg = gtk_message_dialog_new(GTK_WINDOW(wind->dialog),
+                               GTK_DIALOG_DESTROY_WITH_PARENT,
+                               GTK_MESSAGE_QUESTION,
+                               GTK_BUTTONS_OK_CANCEL,
+                               "%s", _("Enter a name for the account"));
+  gtk_dialog_set_default_response(GTK_DIALOG(dlg), GTK_RESPONSE_OK);
   entry = gtk_entry_new();
+  gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
   gtk_entry_set_max_length(GTK_ENTRY(entry), 250);
   gtk_widget_show(entry);
   gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dlg)->vbox), entry);
 
+  /* Run the dialog to get the new account name. */
   response = gtk_dialog_run(GTK_DIALOG(dlg));
-  if (response == GTK_RESPONSE_OK) {
-    name = gtk_entry_get_text(GTK_ENTRY(entry));
-    if(wind->selected_name && (strlen(wind->selected_name) > 0)) {
+  name = gtk_entry_get_text(GTK_ENTRY(entry));
+
+  /* Did the user enter a name and click OK? */
+  if (response == GTK_RESPONSE_OK && name && *name) {
+    /* If an account is selected, this will be a new subaccount. */
+    if(wind->selected_name && *(wind->selected_name))
+      /* We have the short name; determine the full name. */
       fullname = g_strjoin(gnc_get_account_separator_string(),
-			   wind->selected_name, name, (char *)NULL);
-    }
-    else {
+                           wind->selected_name, name, (char *)NULL);
+    else
       fullname = g_strdup(name);
-    }
-    wind->selected_name = g_strdup(fullname);
+
+    /* Save the full name and update the map entry. */
+    g_free(wind->selected_name);
+    wind->selected_name = fullname;
     scm_call_2(name_setter, wind->map_entry, scm_makfrom0str(fullname));
-    g_free(fullname);
   }
   gtk_widget_destroy(dlg);
 
+  /* Refresh the tree display and give it the focus. */
   build_acct_tree(wind, wind->qif_wind);
-
+  gtk_widget_grab_focus(GTK_WIDGET(wind->treeview));
 }
 
 static void
-gnc_ui_qif_account_picker_changed_cb (GtkTreeSelection *selection,
-				      gpointer          user_data)
+gnc_ui_qif_account_picker_changed_cb(GtkTreeSelection *selection,
+                                     gpointer          user_data)
 {
   QIFAccountPickerDialog * wind = user_data;
   SCM name_setter = scm_c_eval_string("qif-map-entry:set-gnc-name!");
@@ -202,22 +247,26 @@
 
   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,
-					    GtkTreeViewColumn *column,
-					    gpointer user_data)
+gnc_ui_qif_account_picker_row_activated_cb(GtkTreeView *view,
+                                           GtkTreePath *path,
+                                           GtkTreeViewColumn *column,
+                                           gpointer 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
@@ -232,45 +281,49 @@
   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.  If the
+ * user clicks OK, map_entry is changed and TRUE is returned.
+ * If the clicks Cancel instead, FALSE is returned. Modal.
  ****************************************************************/
 
-SCM
+gboolean
 qif_account_picker_dialog(QIFImportWindow * qif_wind, SCM map_entry)
-{  
+{
   QIFAccountPickerDialog * wind;
-  SCM save_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 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 orig_acct    = scm_call_1(gnc_name, map_entry);
   int response;
-  const gchar * scmname;
   GladeXML *xml;
   GtkWidget *button;
 
   wind = g_new0(QIFAccountPickerDialog, 1);
 
-  xml = gnc_glade_xml_new ("qif.glade", "QIF Import Account Picker");
+  /* Save the map entry. */
+  wind->map_entry = map_entry;
+  scm_gc_protect_object(wind->map_entry);
 
-  glade_xml_signal_connect_data
-    (xml, "gnc_ui_qif_account_picker_new_cb",
-     G_CALLBACK (gnc_ui_qif_account_picker_new_cb), wind);
+  /* Set the initial account to be selected. */
+  wind->selected_name = g_strdup(SCM_STRING_CHARS(orig_acct));
 
-  wind->dialog     = glade_xml_get_widget (xml, "QIF Import Account Picker");
-  wind->treeview   = GTK_TREE_VIEW(glade_xml_get_widget (xml, "account_tree"));
+
+  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);
+
+  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;
-  
-  scmname = SCM_STRING_CHARS(scm_call_1(init_pick, map_entry));
-  wind->selected_name = g_strdup(scmname);
 
-  scm_gc_protect_object(wind->map_entry);
-
   {
     GtkTreeStore *store;
     GtkCellRenderer *renderer;
@@ -278,40 +331,44 @@
     GtkTreeSelection *selection;
 
     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));
     g_object_unref(store);
 
     renderer = gtk_cell_renderer_text_new();
-    column = gtk_tree_view_column_new_with_attributes(_("Account"), renderer,
-						      "text", ACCOUNT_COL_NAME,
-						      NULL);
+    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,
-						      NULL);
+    column = gtk_tree_view_column_new_with_attributes(_("New?"),
+                                                      renderer,
+                                                      "active",
+                                                      ACCOUNT_COL_CHECK,
+                                                      NULL);
     gtk_tree_view_append_column(wind->treeview, column);
 
     selection = gtk_tree_view_get_selection(wind->treeview);
     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_CALLBACK(gnc_ui_qif_account_picker_row_activated_cb),
-		     wind);
+                     G_CALLBACK(gnc_ui_qif_account_picker_row_activated_cb),
+                     wind);
   }
 
   g_signal_connect_after(wind->dialog, "map",
-			 G_CALLBACK(gnc_ui_qif_account_picker_map_cb),
-			 wind);
-  
-  button = glade_xml_get_widget (xml, "newbutton");
+                         G_CALLBACK(gnc_ui_qif_account_picker_map_cb),
+                         wind);
+
+  button = glade_xml_get_widget(xml, "newbutton");
   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
    * again after the window is mapped. */
   build_acct_tree(wind, wind->qif_wind);
 
@@ -324,10 +381,11 @@
   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 TRUE;
+
+  /* Restore the original mapping. */
+  scm_call_2(set_gnc_name, map_entry, orig_acct);
+
+  return FALSE;
 }

Modified: gnucash/branches/2.2/src/import-export/qif-import/dialog-account-picker.h
===================================================================
--- gnucash/branches/2.2/src/import-export/qif-import/dialog-account-picker.h	2008-07-20 23:52:06 UTC (rev 17356)
+++ gnucash/branches/2.2/src/import-export/qif-import/dialog-account-picker.h	2008-07-20 23:52:15 UTC (rev 17357)
@@ -28,7 +28,7 @@
 
 #include "druid-qif-import.h"
 
-SCM qif_account_picker_dialog(QIFImportWindow * wind, SCM initial_sel);
+gboolean qif_account_picker_dialog(QIFImportWindow * wind, SCM initial_sel);
 
 typedef struct _accountpickerdialog QIFAccountPickerDialog;
 

Modified: gnucash/branches/2.2/src/import-export/qif-import/druid-qif-import.c
===================================================================
--- gnucash/branches/2.2/src/import-export/qif-import/druid-qif-import.c	2008-07-20 23:52:06 UTC (rev 17356)
+++ gnucash/branches/2.2/src/import-export/qif-import/druid-qif-import.c	2008-07-20 23:52:15 UTC (rev 17357)
@@ -97,7 +97,7 @@
   GtkWidget * currency_picker;
   GtkWidget * new_transaction_view;
   GtkWidget * old_transaction_view;
-  
+
   GList     * pre_comm_pages;
   GList     * commodity_pages;
   GList     * post_comm_pages;
@@ -108,7 +108,7 @@
   SCM       imported_files;
   SCM       selected_file;
 
-  SCM       acct_map_info; 
+  SCM       acct_map_info;
   SCM       acct_display_info;
 
   SCM       cat_map_info;
@@ -136,7 +136,7 @@
   GtkWidget     *new_mnemonic_entry;
   gnc_commodity *commodity;
   SCM            hash_key;
-};  
+};
 
 typedef struct _qifdruidpage QIFDruidPage;
 static QIFDruidPage * make_qif_druid_page(SCM security_hash_key,
@@ -148,8 +148,8 @@
 static void update_memo_page(QIFImportWindow * win);
 
 static void update_account_picker_page(QIFImportWindow * wind,
-				       SCM make_display, GtkWidget *view,
-				       SCM map_info, SCM * display_info);
+                                       SCM make_display, GtkWidget *view,
+                                       SCM map_info, SCM * display_info);
 
 static void gnc_ui_qif_import_commodity_prepare_cb(GnomeDruidPage * page,
                                                    gpointer arg1,
@@ -213,7 +213,7 @@
 \********************************************************************/
 
 void
-gnc_ui_qif_import_druid_destroy (QIFImportWindow * window)
+gnc_ui_qif_import_druid_destroy(QIFImportWindow * window)
 {
   if (!window)
     return;
@@ -253,13 +253,13 @@
  * do a better job of notifying someone.)
 \********************************************************************/
 
-static GtkWidget * 
+static GtkWidget *
 get_next_druid_page(QIFImportWindow * wind, GnomeDruidPage * page)
 {
   GList     * current = NULL;
   GList     * next;
   int       where = 0;
-  
+
   /* Figure out which stage of the druid we're in. */
   if((current = g_list_find(wind->pre_comm_pages, page)) == NULL) {
     if((current = g_list_find(wind->commodity_pages, page)) == NULL) {
@@ -279,7 +279,7 @@
   else {
     where = 1;
   }
-  
+
   next = current->next;
   while (!next ||
          (!wind->show_doc_pages && g_list_find(wind->doc_pages, next->data)) ||
@@ -303,12 +303,14 @@
         if (where > 3)
           return NULL;
         break;
-      }              
+      }
     }
   }
 
-  if(next) return (GtkWidget *)next->data;
-  else return NULL;
+  if (next)
+    return (GtkWidget *)next->data;
+
+  return NULL;
 }
 
 
@@ -320,13 +322,13 @@
  * to do a better job of notifying someone.)
  ********************************************************************/
 
-static GtkWidget * 
+static GtkWidget *
 get_prev_druid_page(QIFImportWindow * wind, GnomeDruidPage * page)
 {
   GList     * current = NULL;
   GList     * prev;
   int       where = 0;
-  
+
   /* Figure out which stage of the druid we're in. */
   if((current = g_list_find(wind->pre_comm_pages, page)) == NULL) {
     if((current = g_list_find(wind->commodity_pages, page)) == NULL) {
@@ -346,7 +348,7 @@
   else {
     where = 1;
   }
-  
+
   /* If no duplicates were found, skip all post-conversion pages. */
   if (where == 3 && SCM_NULLP(wind->match_transactions))
     prev = NULL;
@@ -390,14 +392,14 @@
         if (where < 1)
           return NULL;
         break;
-      }              
+      }
     }
   }
 
   if(prev)
     return (GtkWidget *)prev->data;
-  else 
-    return NULL;
+
+  return NULL;
 }
 
 
@@ -408,16 +410,16 @@
  ********************************************************************/
 
 static gboolean
-gnc_ui_qif_import_generic_next_cb(GnomeDruidPage * page, gpointer arg1, 
+gnc_ui_qif_import_generic_next_cb(GnomeDruidPage * page, gpointer arg1,
                                   gpointer user_data)
 {
   QIFImportWindow * wind = user_data;
   GtkWidget * next_page = get_next_druid_page(wind, page);
-  
+
   if(next_page) {
     gnome_druid_set_page(GNOME_DRUID(wind->druid),
                          GNOME_DRUID_PAGE(next_page));
-    
+
     return TRUE;
   }
   else {
@@ -433,12 +435,12 @@
  ********************************************************************/
 
 static gboolean
-gnc_ui_qif_import_generic_back_cb(GnomeDruidPage * page, gpointer arg1, 
+gnc_ui_qif_import_generic_back_cb(GnomeDruidPage * page, gpointer arg1,
                                   gpointer user_data)
 {
   QIFImportWindow * wind = user_data;
   GtkWidget * back_page = get_prev_druid_page(wind, page);
-  
+
   if(back_page) {
     gnome_druid_set_page(GNOME_DRUID(wind->druid),
                          GNOME_DRUID_PAGE(back_page));
@@ -454,7 +456,7 @@
  * gnc_ui_qif_import_select_file_cb
  *
  * invoked when the "select file" button is clicked
- * this is just to pick a file name and reset-to-defaults all the 
+ * this is just to pick a file name and reset-to-defaults all the
  * fields describing how to parse the file.
  ********************************************************************/
 
@@ -470,13 +472,13 @@
   /* Default to whatever's already present */
   default_dir = gnc_get_default_directory(GCONF_SECTION);
 
-  filter = gtk_file_filter_new ();
-  gtk_file_filter_set_name (filter, "*.qif");
-  gtk_file_filter_add_pattern (filter, "*.[Qq][Ii][Ff]");
-  new_file_name = gnc_file_dialog (_("Select QIF File"),
-				   g_list_prepend (NULL, filter),
-				   default_dir,
-				   GNC_FILE_DIALOG_IMPORT);
+  filter = gtk_file_filter_new();
+  gtk_file_filter_set_name(filter, "*.qif");
+  gtk_file_filter_add_pattern(filter, "*.[Qq][Ii][Ff]");
+  new_file_name = gnc_file_dialog(_("Select QIF File"),
+                                  g_list_prepend (NULL, filter),
+                                  default_dir,
+                                  GNC_FILE_DIALOG_IMPORT);
 
   /* Insure valid data, and something that can be freed. */
   if (new_file_name == NULL) {
@@ -501,37 +503,37 @@
 
 /********************************************************************
  * gnc_ui_qif_import_load_file_back_cb
- * 
+ *
  * Invoked when the "back" button is clicked on the load file page.
  ********************************************************************/
 
 static gboolean
-gnc_ui_qif_import_load_file_back_cb(GnomeDruidPage * page, gpointer arg1, 
-				    gpointer user_data)
+gnc_ui_qif_import_load_file_back_cb(GnomeDruidPage * page, gpointer arg1,
+                                    gpointer user_data)
 {
   QIFImportWindow * wind = user_data;
 
   if (SCM_LISTP(wind->imported_files) &&
       (scm_ilength(wind->imported_files) > 0)) {
-    gnome_druid_set_page(GNOME_DRUID(wind->druid), 
-			 get_named_page(wind, "loaded_files_page"));
+    gnome_druid_set_page(GNOME_DRUID(wind->druid),
+                         get_named_page(wind, "loaded_files_page"));
     return TRUE;
   }
 
-  gnome_druid_set_page(GNOME_DRUID(wind->druid), 
-		       get_named_page(wind, "start_page"));
+  gnome_druid_set_page(GNOME_DRUID(wind->druid),
+                       get_named_page(wind, "start_page"));
   return TRUE;
 }
 
 
 /********************************************************************
  * gnc_ui_qif_import_load_file_next_cb
- * 
+ *
  * Invoked when the "next" button is clicked on the load file page.
  ********************************************************************/
 
 static gboolean
-gnc_ui_qif_import_load_file_next_cb(GnomeDruidPage * page, 
+gnc_ui_qif_import_load_file_next_cb(GnomeDruidPage * page,
                                     gpointer arg1,
                                     gpointer user_data)
 {
@@ -556,7 +558,7 @@
   SCM window;
   int ask_date_format = FALSE;
 
-  /* get the file name */ 
+  /* get the file name */
   path_to_load = gtk_entry_get_text(GTK_ENTRY(wind->filename_entry));
   window = SWIG_NewPointerObj(wind->window, SWIG_TypeQuery("_p_GtkWidget"), 0);
 
@@ -568,16 +570,16 @@
   }
   else if (g_access(path_to_load, R_OK) < 0) {
     /* stay here if bad file */
-    gnc_error_dialog(wind->window, 
-		     _("File not found or read permission denied. "
-		       "Please select another file."));
+    gnc_error_dialog(wind->window,
+                     _("File not found or read permission denied. "
+                       "Please select another file."));
     return TRUE;
   }
   else {
     /* convert filename to scm */
     scm_filename   = scm_makfrom0str(path_to_load);
     imported_files = wind->imported_files;
-    
+
     if(scm_call_2(qif_file_loaded, scm_filename, wind->imported_files)
        == SCM_BOOL_T) {
       gnc_error_dialog(wind->window,
@@ -585,53 +587,53 @@
                                   "Please select another file."));
       return TRUE;
     }
-    
+
     /* turn on the busy cursor */
     gnc_set_busy_cursor(NULL, TRUE);
-    
+
     /* create the <qif-file> object */
-    scm_qiffile          = scm_call_0(make_qif_file);    
-    imported_files       = scm_cons(scm_qiffile, imported_files);    
+    scm_qiffile          = scm_call_0(make_qif_file);
+    imported_files       = scm_cons(scm_qiffile, imported_files);
 
-    scm_gc_unprotect_object(wind->selected_file);      
-    wind->selected_file  = scm_qiffile;    
-    scm_gc_protect_object(wind->selected_file);      
-    
+    scm_gc_unprotect_object(wind->selected_file);
+    wind->selected_file  = scm_qiffile;
+    scm_gc_protect_object(wind->selected_file);
+
     /* load the file */
     load_return = scm_call_4(qif_file_load, SCM_CAR(imported_files),
-			     scm_filename, wind->ticker_map, window);
-    
+                             scm_filename, wind->ticker_map, window);
+
     /* turn back the cursor */
     gnc_unset_busy_cursor(NULL);
 
-    /* a list returned is (#f error-message) for an error, 
-     * (#t error-message) for a warning, or just #f for an 
+    /* a list returned is (#f error-message) for an error,
+     * (#t error-message) for a warning, or just #f for an
      * exception. */
     if(SCM_LISTP(load_return) &&
        (SCM_CAR(load_return) == SCM_BOOL_T)) {
       const gchar *warn_str = SCM_STRING_CHARS(SCM_CADR(load_return));
       gnc_warning_dialog(GTK_WIDGET(wind->window),
-			 _("QIF file load warning: %s"),
-			 warn_str ? warn_str : "(null)");
+                         _("QIF file load warning: %s"),
+                         warn_str ? warn_str : "(null)");
     }
 
     /* check success of the file load */
     if(load_return == SCM_BOOL_F) {
-      gnc_error_dialog(wind->window, 
-		       _( "An error occurred while loading the QIF file."));
+      gnc_error_dialog(wind->window,
+                       _( "An error occurred while loading the QIF file."));
       return TRUE;
     }
     else if ((load_return != SCM_BOOL_T) &&
-             (!SCM_LISTP(load_return) || 
+             (!SCM_LISTP(load_return) ||
               (SCM_CAR(load_return) != SCM_BOOL_T))) {
       const gchar *warn_str = SCM_STRING_CHARS(SCM_CADR(load_return));
       gnc_error_dialog(wind->window,
-		       _("QIF file load failed: %s"),
-		       warn_str ? warn_str : "(null)");
+                       _("QIF file load failed: %s"),
+                       warn_str ? warn_str : "(null)");
 
-      imported_files = 
+      imported_files =
         scm_call_2(unload_qif_file, scm_qiffile, imported_files);
-            
+
       scm_gc_unprotect_object(wind->imported_files);
       wind->imported_files = imported_files;
       scm_gc_protect_object(wind->imported_files);
@@ -644,43 +646,43 @@
 
       /* call the field parser */
       parse_return = scm_call_1(qif_file_parse, SCM_CAR(imported_files));
-      
+
       /* parser returns:
-       *   success:	#t
-       *   failure:	(#f . ((type . errror) ...))
-       *   warning:	(#t . ((type . error) ...))
+       *   success: #t
+       *   failure: (#f . ((type . errror) ...))
+       *   warning: (#t . ((type . error) ...))
        *
        * warning means that (potentially) the date format is
        * ambiguous.  So search the results for the "date" type and if
        * it's found, set up the format selector page.
        */
-      if(SCM_LISTP(parse_return) && 
+      if(SCM_LISTP(parse_return) &&
          (SCM_CAR(parse_return) == SCM_BOOL_T)) {
-	gint n_items;
+        gint n_items;
 
-	/* clear the combo box */
-	gtk_combo_box_set_active(GTK_COMBO_BOX(wind->date_format_combo), -1);
-	n_items = gtk_tree_model_iter_n_children(
-	  gtk_combo_box_get_model(GTK_COMBO_BOX(wind->date_format_combo)), NULL);
-	while (n_items-- > 0)
-	  gtk_combo_box_remove_text(GTK_COMBO_BOX(wind->date_format_combo), 0);
+        /* clear the combo box */
+        gtk_combo_box_set_active(GTK_COMBO_BOX(wind->date_format_combo), -1);
+        n_items = gtk_tree_model_iter_n_children(
+          gtk_combo_box_get_model(GTK_COMBO_BOX(wind->date_format_combo)), NULL);
+        while (n_items-- > 0)
+          gtk_combo_box_remove_text(GTK_COMBO_BOX(wind->date_format_combo), 0);
 
-	if ((date_formats = scm_call_2(parse_results,
-				       SCM_CDR(parse_return),
-				       scm_str2symbol("date"))) != SCM_BOOL_F) {
-	  while(SCM_LISTP(date_formats) && !SCM_NULLP(date_formats)) {
-	    gtk_combo_box_append_text(GTK_COMBO_BOX(wind->date_format_combo),
-				      SCM_SYMBOL_CHARS(SCM_CAR(date_formats)));
-	    date_formats = SCM_CDR(date_formats);
-	  }
-	gtk_combo_box_set_active(GTK_COMBO_BOX(wind->date_format_combo), 0);
-        
-	  ask_date_format = TRUE;
+        if ((date_formats = scm_call_2(parse_results,
+                                       SCM_CDR(parse_return),
+                                       scm_str2symbol("date"))) != SCM_BOOL_F) {
+          while(SCM_LISTP(date_formats) && !SCM_NULLP(date_formats)) {
+            gtk_combo_box_append_text(GTK_COMBO_BOX(wind->date_format_combo),
+                                      SCM_SYMBOL_CHARS(SCM_CAR(date_formats)));
+            date_formats = SCM_CDR(date_formats);
+          }
+        gtk_combo_box_set_active(GTK_COMBO_BOX(wind->date_format_combo), 0);
 
-	} else {
-	  /* FIXME: we've got a "warning" but it's not the date! */
-	  ;
-	}
+          ask_date_format = TRUE;
+
+        } else {
+          /* FIXME: we've got a "warning" but it's not the date! */
+          ;
+        }
       }
 
       /* turn back the cursor */
@@ -689,8 +691,8 @@
       /* Can this ever happen??? */
       if(parse_return == SCM_BOOL_F) {
         gnc_error_dialog(wind->window,
-			 _("An error occurred while parsing the QIF file."));
-        imported_files = 
+                         _("An error occurred while parsing the QIF file."));
+        imported_files =
           scm_call_2(unload_qif_file, scm_qiffile, imported_files);
         return TRUE;
       }
@@ -699,20 +701,20 @@
           (SCM_CAR(parse_return) != SCM_BOOL_T))) {
         const gchar *warn_str = SCM_STRING_CHARS(SCM_CDADR(parse_return));
         gnc_error_dialog(wind->window,
-			 _("QIF file parse failed: %s"),
-			 warn_str ? warn_str : "(null)");
+                         _("QIF file parse failed: %s"),
+                         warn_str ? warn_str : "(null)");
 
-        imported_files = 
+        imported_files =
           scm_call_2(unload_qif_file, scm_qiffile, imported_files);
-        
+
         return TRUE;
-      } 
+      }
     }
-    
+
     scm_gc_unprotect_object(wind->imported_files);
     wind->imported_files = imported_files;
     scm_gc_protect_object(wind->imported_files);
-    
+
     if(ask_date_format) {
       /* we need to get a date format, so go to the next page */
       return gnc_ui_qif_import_generic_next_cb(page, arg1, wind);
@@ -720,26 +722,26 @@
     else if(scm_call_1(check_from_acct, SCM_CAR(imported_files)) != SCM_BOOL_T) {
       /* skip to the "ask account name" page */
       default_acctname =
-	SCM_STRING_CHARS(scm_call_1(default_acct, SCM_CAR(imported_files)));
+        SCM_STRING_CHARS(scm_call_1(default_acct, SCM_CAR(imported_files)));
       gtk_entry_set_text(GTK_ENTRY(wind->acct_entry), default_acctname);
-      
+
       gnome_druid_set_page(GNOME_DRUID(wind->druid),
                            get_named_page(wind, "account_name_page"));
       return TRUE;
     }
     else {
       /* skip ahead to the "loaded files" page */
-      gnome_druid_set_page(GNOME_DRUID(wind->druid), 
+      gnome_druid_set_page(GNOME_DRUID(wind->druid),
                            get_named_page(wind, "loaded_files_page"));
-      return TRUE;      
+      return TRUE;
     }
   }
-  
+
   return FALSE;
 }
 
 static gboolean
-gnc_ui_qif_import_date_format_next_cb(GnomeDruidPage * page, 
+gnc_ui_qif_import_date_format_next_cb(GnomeDruidPage * page,
                                       gpointer arg1,
                                       gpointer user_data)
 {
@@ -749,28 +751,28 @@
   SCM  check_from_acct = scm_c_eval_string("qif-file:check-from-acct");
   SCM  format_sym;
   gchar *text;
-  
+
   text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(wind->date_format_combo));
   format_sym = scm_str2symbol(text);
   g_free(text);
   scm_call_2(reparse_dates, wind->selected_file, format_sym);
-  
+
   if(scm_call_1(check_from_acct, wind->selected_file) != SCM_BOOL_T) {
     SCM default_acct    = scm_c_eval_string("qif-file:path-to-accountname");
     const gchar * default_acctname;
 
     default_acctname = SCM_STRING_CHARS(scm_call_1(default_acct,
-						wind->selected_file));
+                                                    wind->selected_file));
     gtk_entry_set_text(GTK_ENTRY(wind->acct_entry), default_acctname);
 
     return FALSE;
   }
   else {
     /* skip ahead to the "loaded files" page */
-    gnome_druid_set_page(GNOME_DRUID(wind->druid), 
+    gnome_druid_set_page(GNOME_DRUID(wind->druid),
                          get_named_page(wind, "loaded_files_page"));
-    
-    return TRUE;      
+
+    return TRUE;
   }
 }
 
@@ -781,8 +783,8 @@
  ****************************************************************/
 
 static void
-gnc_ui_qif_import_select_loaded_file_cb (GtkTreeSelection *selection,
-					 gpointer          user_data)   
+gnc_ui_qif_import_select_loaded_file_cb(GtkTreeSelection *selection,
+                                        gpointer          user_data)
 {
   QIFImportWindow * wind = user_data;
   GtkTreeModel *model;
@@ -793,16 +795,16 @@
   button = gnc_glade_lookup_widget(wind->window, "unload_file_button");
   if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
     gtk_tree_model_get(model, &iter, FILENAME_COL_INDEX, &row, -1);
-    if(SCM_LISTP(wind->imported_files) && 
+    if(SCM_LISTP(wind->imported_files) &&
        (scm_ilength(wind->imported_files) > row)) {
       scm_gc_unprotect_object(wind->selected_file);
       wind->selected_file = scm_list_ref(wind->imported_files,
-					 scm_int2num(row));   
+                                         scm_int2num(row));
       scm_gc_protect_object(wind->selected_file);
       g_object_set(button, "sensitive", TRUE, (gchar*)NULL);
       gnome_druid_set_buttons_sensitive(GNOME_DRUID(wind->druid),
                                         TRUE, TRUE, TRUE, TRUE);
-    } 
+    }
   } else {
     scm_gc_unprotect_object(wind->selected_file);
     wind->selected_file = SCM_BOOL_F;
@@ -816,7 +818,7 @@
 
 /********************************************************************
  * gnc_ui_qif_import_loaded_files_prepare_cb
- * 
+ *
  * Get the loaded files page ready for viewing
  ********************************************************************/
 
@@ -844,11 +846,11 @@
                                   gpointer user_data)
 {
   QIFImportWindow * wind = user_data;
-  
+
   gnome_druid_set_page(GNOME_DRUID(wind->druid),
                        get_named_page(wind, "load_file_page"));
   gnome_druid_set_buttons_sensitive(GNOME_DRUID(wind->druid),
-                                    TRUE, TRUE, TRUE, TRUE); 
+                                    TRUE, TRUE, TRUE, TRUE);
 }
 
 
@@ -866,11 +868,11 @@
 
   SCM unload_qif_file = scm_c_eval_string("qif-dialog:unload-qif-file");
   SCM imported_files;
-  
+
   if(wind->selected_file != SCM_BOOL_F) {
-    imported_files = 
+    imported_files =
       scm_call_2(unload_qif_file, wind->selected_file, wind->imported_files);
-  
+
     scm_gc_unprotect_object(wind->imported_files);
     wind->imported_files = imported_files;
     scm_gc_protect_object(wind->imported_files);
@@ -878,7 +880,7 @@
     scm_gc_unprotect_object(wind->selected_file);
     wind->selected_file = SCM_BOOL_F;
     scm_gc_protect_object(wind->selected_file);
-     
+
     update_file_page(wind);
   }
 }
@@ -886,13 +888,13 @@
 
 /********************************************************************
  * update_file_page
- * update the list of loaded files 
+ * update the list of loaded files
  ********************************************************************/
 
 static void
 update_file_page(QIFImportWindow * wind)
 {
-  
+
   SCM       loaded_file_list = wind->imported_files;
   SCM       scm_qiffile = SCM_BOOL_F;
   SCM       qif_file_path;
@@ -909,16 +911,16 @@
   store = GTK_LIST_STORE(gtk_tree_view_get_model(view));
   gtk_list_store_clear(store);
   qif_file_path = scm_c_eval_string("qif-file:path");
-  
-  while(!SCM_NULLP(loaded_file_list)) {  
+
+  while(!SCM_NULLP(loaded_file_list)) {
     scm_qiffile = SCM_CAR(loaded_file_list);
     row_text    = SCM_STRING_CHARS(scm_call_1(qif_file_path, scm_qiffile));
 
     gtk_list_store_append(store, &iter);
     gtk_list_store_set(store, &iter,
-		       FILENAME_COL_INDEX, row++,
-		       FILENAME_COL_NAME, row_text,
-		       -1);
+                       FILENAME_COL_INDEX, row++,
+                       FILENAME_COL_NAME, row_text,
+                       -1);
     if(scm_qiffile == wind->selected_file) {
       path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
       reference = gtk_tree_row_reference_new(GTK_TREE_MODEL(store), path);
@@ -942,7 +944,7 @@
 
 /********************************************************************
  * gnc_ui_qif_import_default_acct_next_cb
- * 
+ *
  * Invoked when the "next" button is clicked on the default acct page.
  ********************************************************************/
 
@@ -970,9 +972,9 @@
 
 /********************************************************************
  * gnc_ui_qif_import_default_acct_back_cb
- * 
+ *
  * Invoked when the "back" button is clicked on the default acct page.
- * this unloads the current file.  
+ * this unloads the current file.
  ********************************************************************/
 
 static gboolean
@@ -989,21 +991,21 @@
   scm_gc_unprotect_object(wind->imported_files);
   wind->imported_files = files_list;
   scm_gc_protect_object(wind->imported_files);
-  
+
   scm_gc_unprotect_object(wind->selected_file);
   wind->selected_file = SCM_BOOL_F;
   scm_gc_protect_object(wind->selected_file);
-  
+
   gnome_druid_set_page(GNOME_DRUID(wind->druid),
                        get_named_page(wind, "load_file_page"));
   gnome_druid_set_buttons_sensitive(GNOME_DRUID(wind->druid),
-                                    TRUE, TRUE, TRUE, TRUE); 
+                                    TRUE, TRUE, TRUE, TRUE);
   return TRUE;
 }
 
 
 /****************************************************************
- * update_account_picker_page 
+ * update_account_picker_page
  * Generic function to update an account_picker page.  This
  * generalizes the code shared whenever any QIF -> GNC mapper is
  * updating it's LIST STORE.  It asks the Scheme side to guess some account
@@ -1013,7 +1015,7 @@
 
 static void
 update_account_picker_page(QIFImportWindow * wind, SCM make_display,
-			   GtkWidget *view, SCM map_info, SCM * display_info)
+                           GtkWidget *view, SCM map_info, SCM * display_info)
 {
 
   SCM  get_qif_name = scm_c_eval_string("qif-map-entry:qif-name");
@@ -1033,14 +1035,14 @@
 
   /* now get the list of strings to display in the gtk_list_store widget */
   accts_left = scm_call_3(make_display,
-			  wind->imported_files,
-			  map_info, 
-			  wind->gnc_acct_info);
+                          wind->imported_files,
+                          map_info,
+                          wind->gnc_acct_info);
 
   scm_gc_unprotect_object(*display_info);
-  *display_info = accts_left;  
+  *display_info = accts_left;
   scm_gc_protect_object(*display_info);
-  
+
   /* clear the list */
   gtk_list_store_clear(store);
 
@@ -1051,11 +1053,11 @@
 
     gtk_list_store_append(store, &iter);
     gtk_list_store_set(store, &iter,
-		       ACCOUNT_COL_INDEX,    row++,
-		       ACCOUNT_COL_QIF_NAME, qif_name,
-		       ACCOUNT_COL_GNC_NAME, gnc_name,
-		       ACCOUNT_COL_NEW,      checked,
-		       -1);
+                       ACCOUNT_COL_INDEX,    row++,
+                       ACCOUNT_COL_QIF_NAME, qif_name,
+                       ACCOUNT_COL_GNC_NAME, gnc_name,
+                       ACCOUNT_COL_NEW,      checked,
+                       -1);
     accts_left = SCM_CDR(accts_left);
   }
 
@@ -1063,7 +1065,7 @@
   prev_row = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(store), PREV_ROW));
   if (prev_row != -1) {
     selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
-    path = gtk_tree_path_new_from_indices (prev_row, -1);
+    path = gtk_tree_path_new_from_indices(prev_row, -1);
     gtk_tree_selection_select_path(selection, path);
     gtk_tree_path_free(path);
   }
@@ -1071,7 +1073,7 @@
 
 
 /****************************************************************
- * update_accounts_page 
+ * update_accounts_page
  * update the QIF account -> GNC Account picker
  ****************************************************************/
 
@@ -1081,12 +1083,13 @@
 
   SCM  make_account_display = scm_c_eval_string("qif-dialog:make-account-display");
 
-  update_account_picker_page (wind, make_account_display, wind->acct_view,
-			      wind->acct_map_info, &(wind->acct_display_info));
+  update_account_picker_page(wind, make_account_display, wind->acct_view,
+                             wind->acct_map_info, &(wind->acct_display_info));
 }
 
 /****************************************************************
- * update_categories_page 
+ * update_categories_page
+ *
  * update the QIF category -> GNC Account picker
  ****************************************************************/
 
@@ -1095,12 +1098,13 @@
 {
   SCM  make_category_display = scm_c_eval_string("qif-dialog:make-category-display");
 
-  update_account_picker_page (wind, make_category_display, wind->cat_view,
-			      wind->cat_map_info, &(wind->cat_display_info));
+  update_account_picker_page(wind, make_category_display, wind->cat_view,
+                             wind->cat_map_info, &(wind->cat_display_info));
 }
 
 /****************************************************************
- * update_memo_page 
+ * update_memo_page
+ *
  * update the QIF memo -> GNC Account picker
  ****************************************************************/
 
@@ -1109,8 +1113,8 @@
 {
   SCM  make_memo_display = scm_c_eval_string("qif-dialog:make-memo-display");
 
-  update_account_picker_page (wind, make_memo_display, wind->memo_view,
-			      wind->memo_map_info, &(wind->memo_display_info));
+  update_account_picker_page(wind, make_memo_display, wind->memo_view,
+                             wind->memo_map_info, &(wind->memo_display_info));
 }
 
 
@@ -1119,9 +1123,9 @@
 
 static void
 create_account_picker_view(GtkWidget *widget,
-			   const gchar *col_name,
-			   GCallback callback,
-			   gpointer user_data)
+                           const gchar *col_name,
+                           GCallback callback,
+                           gpointer user_data)
 {
   GtkTreeView *view = GTK_TREE_VIEW(widget);
   GtkListStore *store;
@@ -1129,70 +1133,127 @@
   GtkTreeViewColumn *column;
 
   store = gtk_list_store_new(NUM_ACCOUNT_COLS, G_TYPE_INT, G_TYPE_STRING,
-			     G_TYPE_STRING, G_TYPE_BOOLEAN);
+                             G_TYPE_STRING, G_TYPE_BOOLEAN);
   gtk_tree_view_set_model(view, GTK_TREE_MODEL(store));
   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,
-						    NULL);
+  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,
-						    NULL);
+  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,
-						    NULL);
+  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 *))
+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;
+  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));
-  
-  /* call the account picker to update it */
-  selected_acct = qif_account_picker_dialog(wind, selected_acct);
+  /* Find the <qif-map-entry> corresponding to the selected row. */
+  map_entry = scm_list_ref(display_info, scm_int2num(row));
 
-  scm_hash_set_x(map_info, scm_call_1(get_name, selected_acct), selected_acct);
+  /* Call the account picker to update it. */
+  if (!qif_account_picker_dialog(wind, map_entry))
+    return;
+  gnc_name = scm_call_1(get_gnc_name, map_entry);
 
-  /* update display */
+  /* Update the mapping hash table. */
+  scm_hash_set_x(map_info, scm_call_1(get_qif_name, map_entry), map_entry);
+
+
+  /*
+   * 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);
 }
 
@@ -1204,17 +1265,17 @@
 
 static void
 gnc_ui_qif_import_account_line_select_cb(GtkTreeView *view, GtkTreePath *path,
-					 GtkTreeViewColumn *column,
-					 gpointer user_data)
+                                         GtkTreeViewColumn *column,
+                                         gpointer user_data)
 {
   QIFImportWindow *wind = user_data;
   GtkTreeSelection *selection;
 
-  g_return_if_fail (view && wind);
-  selection = gtk_tree_view_get_selection (view);
+  g_return_if_fail(view && wind);
+  selection = gtk_tree_view_get_selection(view);
 
-  select_line (wind, selection, wind->acct_display_info, wind->acct_map_info,
-	       update_accounts_page);
+  select_line(wind, selection, wind->acct_display_info, wind->acct_map_info,
+              update_accounts_page);
 }
 
 /********************************************************************
@@ -1225,17 +1286,17 @@
 
 static void
 gnc_ui_qif_import_category_line_select_cb(GtkTreeView *view, GtkTreePath *path,
-					 GtkTreeViewColumn *column,
-					 gpointer user_data)
+                                         GtkTreeViewColumn *column,
+                                         gpointer user_data)
 {
   QIFImportWindow *wind = user_data;
   GtkTreeSelection *selection;
 
-  g_return_if_fail (view && wind);
-  selection = gtk_tree_view_get_selection (view);
+  g_return_if_fail(view && wind);
+  selection = gtk_tree_view_get_selection(view);
 
-  select_line (wind, selection, wind->cat_display_info, wind->cat_map_info,
-	       update_categories_page);
+  select_line(wind, selection, wind->cat_display_info, wind->cat_map_info,
+              update_categories_page);
 }
 
 /********************************************************************
@@ -1246,17 +1307,17 @@
 
 static void
 gnc_ui_qif_import_memo_line_select_cb(GtkTreeView *view, GtkTreePath *path,
-					 GtkTreeViewColumn *column,
-					 gpointer user_data)
+                                         GtkTreeViewColumn *column,
+                                         gpointer user_data)
 {
   QIFImportWindow *wind = user_data;
   GtkTreeSelection *selection;
 
-  g_return_if_fail (view && wind);
-  selection = gtk_tree_view_get_selection (view);
+  g_return_if_fail(view && wind);
+  selection = gtk_tree_view_get_selection(view);
 
-  select_line (wind, selection, wind->memo_display_info, wind->memo_map_info,
-	       update_memo_page);
+  select_line(wind, selection, wind->memo_display_info, wind->memo_map_info,
+              update_memo_page);
 }
 
 
@@ -1306,19 +1367,19 @@
   QIFImportWindow * wind = user_data;
   SCM  make_memo_display = scm_c_eval_string("qif-dialog:make-memo-display");
   SCM  accts_left;
-  
+
   gnc_set_busy_cursor(NULL, TRUE);
   /*
    * Hack. Call make-memo-display to see if there are any memos to display.
    * This will get called again when we actually do make the memo display.
    */
   accts_left = scm_call_3(make_memo_display,
-			  wind->imported_files,
-			  wind->memo_map_info,
-			  wind->gnc_acct_info);
-  
+                          wind->imported_files,
+                          wind->memo_map_info,
+                          wind->gnc_acct_info);
+
   gnc_unset_busy_cursor(NULL);
-  
+
   if (SCM_NULLP(accts_left)) {
     gnome_druid_set_page(GNOME_DRUID(wind->druid),
                          get_named_page(wind, "currency_page"));
@@ -1455,7 +1516,7 @@
   }
 
   selection = gtk_tree_view_get_selection(view);
-  path = gtk_tree_path_new_from_indices (0, -1);
+  path = gtk_tree_path_new_from_indices(0, -1);
   gtk_tree_selection_select_path(selection, path);
   gtk_tree_path_free(path);
 }
@@ -1511,7 +1572,7 @@
     gtk_combo_box_get_active_text(GTK_COMBO_BOX(wind->currency_picker));
 
   /* Let the user know we're busy. */
-  gnc_suspend_gui_refresh ();
+  gnc_suspend_gui_refresh();
   gnc_set_busy_cursor(NULL, TRUE);
 
   /* Update the commodities. */
@@ -1624,7 +1685,7 @@
 
   /* Get a list of any new QIF securities since the previous call. */
   updates = scm_call_4(update_securities,
-                       wind->security_hash, 
+                       wind->security_hash,
                        wind->ticker_map,
                        wind->acct_map_info,
                        wind->security_prefs);
@@ -1661,12 +1722,12 @@
 {
   QIFImportWindow * wind = user_data;
   SCM any_new = scm_c_eval_string("qif-import:any-new-accts?");
-  
+
   /* if any accounts are new, ask about the currency; else,
      just skip that page */
   if ((scm_call_1(any_new, wind->acct_map_info) == SCM_BOOL_T) ||
       (scm_call_1(any_new, wind->cat_map_info) == SCM_BOOL_T))
-    /* go to currency page */ 
+    /* go to currency page */
     return gnc_ui_qif_import_generic_next_cb(page, arg1, wind);
   else
   {
@@ -1698,11 +1759,11 @@
  * jump to category match page.
  ****************************************************************/
 static gboolean
-gnc_ui_qif_import_currency_back_cb(GnomeDruidPage * page, gpointer arg1, 
+gnc_ui_qif_import_currency_back_cb(GnomeDruidPage * page, gpointer arg1,
                                   gpointer user_data)
 {
   QIFImportWindow * wind = user_data;
-  
+
   if (!wind->memo_display_info ||
       (wind->memo_display_info == SCM_BOOL_F) ||
        SCM_NULLP(wind->memo_display_info))
@@ -1727,7 +1788,7 @@
   QIFImportWindow * wind = user_data;
 
   gnc_set_busy_cursor(NULL, TRUE);
-  
+
   if (gnc_ui_qif_import_new_securities(wind))
   {
     /* There are new commodities, so show a commodity page next. */
@@ -1765,7 +1826,7 @@
   /* Update the namespaces available to select. */
   if (!ns || !ns[0])
     gnc_ui_update_namespace_picker(
-      qpage->new_type_combo, 
+      qpage->new_type_combo,
       gnc_commodity_get_namespace(qpage->commodity),
       DIAG_COMM_ALL);
   else
@@ -1774,7 +1835,7 @@
   g_free(ns);
 }
 
-  
+
 static gboolean
 gnc_ui_qif_import_comm_next_cb(GnomeDruidPage * page,
                                gpointer arg1,
@@ -1786,21 +1847,21 @@
   QofBook                 *book;
   gnc_commodity_table     *table;
   gnc_commodity_namespace *newns;
-  
+
   gchar       *namespace = gnc_ui_namespace_picker_ns(qpage->new_type_combo);
   const gchar *name      = gtk_entry_get_text(GTK_ENTRY(qpage->new_name_entry));
   const gchar *mnemonic  = gtk_entry_get_text(GTK_ENTRY(qpage->new_mnemonic_entry));
 
   if(!namespace || (namespace[0] == 0)) {
     gnc_warning_dialog(wind->window,
-		       _("You must enter a Type for the commodity."));
+                       _("You must enter a Type for the commodity."));
     if (namespace)
       g_free(namespace);
     return TRUE;
   }
   else if(!name || (name[0] == 0)) {
     gnc_warning_dialog(wind->window,
-		       _("You must enter a name for the commodity."));
+                       _("You must enter a name for the commodity."));
     g_free(namespace);
     return TRUE;
   }
@@ -1817,12 +1878,12 @@
 
   book = gnc_get_current_book();
   table = gnc_commodity_table_get_table(book);
-  if (gnc_commodity_namespace_is_iso (namespace) &&
-      !gnc_commodity_table_lookup (table, namespace, mnemonic))
+  if (gnc_commodity_namespace_is_iso(namespace) &&
+      !gnc_commodity_table_lookup(table, namespace, mnemonic))
   {
     gnc_warning_dialog(wind->window,
-		       _("You must enter an existing national "
-			 "currency or enter a different type."));
+                       _("You must enter an existing national "
+                         "currency or enter a different type."));
 
     g_free(namespace);
     return TRUE;
@@ -1839,7 +1900,7 @@
       wind->new_namespaces = g_list_prepend(wind->new_namespaces, namespace);
     else
     {
-      g_warning("QIF import: Couldn't create namespace %s\n", namespace);
+      g_warning("QIF import: Couldn't create namespace %s", namespace);
       g_free(namespace);
     }
   }
@@ -1859,7 +1920,7 @@
 
 /********************************************************************
  * gnc_ui_qif_import_commodity_prepare_cb
- * build a mapping of QIF security name to gnc_commodity 
+ * build a mapping of QIF security name to gnc_commodity
  ********************************************************************/
 
 static void
@@ -1875,9 +1936,9 @@
 
   GList          * current;
   gnc_commodity  * commodity;
-  GnomeDruidPage * back_page = get_named_page(wind, "commodity_doc_page");  
+  GnomeDruidPage * back_page = get_named_page(wind, "commodity_doc_page");
   QIFDruidPage   * new_page;
-  
+
   /* This shouldn't happen, but do the right thing if it does. */
   if (wind->new_securities == SCM_BOOL_F || SCM_NULLP(wind->new_securities))
   {
@@ -1926,11 +1987,11 @@
                          G_CALLBACK(gnc_ui_qif_import_comm_next_cb),
                          wind);
 
-        wind->commodity_pages = g_list_append(wind->commodity_pages, 
+        wind->commodity_pages = g_list_append(wind->commodity_pages,
                                               new_page->page);
 
         gnome_druid_insert_page(GNOME_DRUID(wind->druid),
-                                back_page, 
+                                back_page,
                                 GNOME_DRUID_PAGE(new_page->page));
         back_page = GNOME_DRUID_PAGE(new_page->page);
         gtk_widget_show_all(new_page->page);
@@ -1942,13 +2003,13 @@
     gnc_unset_busy_cursor(NULL);
   }
 
-  gnc_druid_set_colors (GNOME_DRUID (wind->druid));
+  gnc_druid_set_colors(GNOME_DRUID(wind->druid));
 }
 
 static QIFDruidPage *
 make_qif_druid_page(SCM security_hash_key, gnc_commodity *comm)
 {
-  
+
   QIFDruidPage *retval = g_new0(QIFDruidPage, 1);
   GtkWidget    *top_vbox;
   GtkWidget    *info_label;
@@ -1976,10 +2037,10 @@
   g_free(title);
 
   /* Set the page colors. */
-  gnome_druid_page_standard_set_background(page, & std_bg_color);  
+  gnome_druid_page_standard_set_background(page, & std_bg_color);
   gnome_druid_page_standard_set_logo_background(page, & std_logo_bg_color);
-  gnome_druid_page_standard_set_title_foreground (page, & std_title_color);
-  
+  gnome_druid_page_standard_set_title_foreground(page, & std_title_color);
+
   /*
    * Add all the widgets to the page.
    */
@@ -1988,7 +2049,7 @@
 
   info_label = gtk_label_new(_("Pick the commodity's exchange or listing "
                                "(NASDAQ, NYSE, etc)."));
-  gtk_label_set_justify (GTK_LABEL(info_label), GTK_JUSTIFY_LEFT);
+  gtk_label_set_justify(GTK_LABEL(info_label), GTK_JUSTIFY_LEFT);
   gtk_box_pack_start(GTK_BOX(top_vbox), info_label, TRUE, TRUE, 0);
 
   temp = gtk_hbox_new(FALSE, 0);
@@ -2007,7 +2068,7 @@
   info_label = gtk_label_new(_("Enter the full name of the commodity, "
                                "such as \"Red Hat Stock\""));
 
-  gtk_label_set_justify (GTK_LABEL(info_label), GTK_JUSTIFY_LEFT);
+  gtk_label_set_justify(GTK_LABEL(info_label), GTK_JUSTIFY_LEFT);
   gtk_box_pack_start(GTK_BOX(top_vbox), info_label, TRUE, TRUE, 0);
 
   temp = gtk_hbox_new(FALSE, 0);
@@ -2028,9 +2089,9 @@
   info_label = gtk_label_new(_("Enter the ticker symbol (such as \"RHAT\") or "
                                "other unique abbreviation for the name."));
 
-  gtk_label_set_justify (GTK_LABEL(info_label), GTK_JUSTIFY_LEFT);
+  gtk_label_set_justify(GTK_LABEL(info_label), GTK_JUSTIFY_LEFT);
   gtk_box_pack_start(GTK_BOX(top_vbox), info_label, TRUE, TRUE, 0);
- 
+
   temp = gtk_hbox_new(FALSE, 0);
   gtk_box_pack_start(GTK_BOX(top_vbox), temp, FALSE, FALSE, 0);
 
@@ -2048,7 +2109,7 @@
 
   next_label = gtk_label_new(_("Click \"Forward\" to accept the information "
                                "and move on."));
-  gtk_label_set_justify (GTK_LABEL(next_label), GTK_JUSTIFY_LEFT);
+  gtk_label_set_justify(GTK_LABEL(next_label), GTK_JUSTIFY_LEFT);
   gtk_box_pack_end(GTK_BOX(top_vbox), next_label, TRUE, TRUE, 0);
 
 
@@ -2078,7 +2139,7 @@
     possible_matches = SCM_CDR(scm_list_ref(wind->match_transactions,
                                   scm_int2num(wind->selected_transaction)));
     scm_call_2(scm_c_eval_string("qif-import:refresh-match-selection"),
-	       possible_matches, scm_int2num(selection));
+               possible_matches, scm_int2num(selection));
 
     while(!SCM_NULLP(possible_matches)) {
       current_xtn = SCM_CAR(possible_matches);
@@ -2087,13 +2148,13 @@
                                     SWIG_TypeQuery("_p_Transaction"), 1, 0);
       #undef FUNC_NAME
       selected    = SCM_CDR(current_xtn);
-      
+
       if(xaccTransCountSplits(gnc_xtn) > 2) {
-        amount_str = _("(split)"); 
+        amount_str = _("(split)");
       }
       else {
-	gnc_split = xaccTransGetSplit(gnc_xtn, 0);  
-        amount_str = 
+        gnc_split = xaccTransGetSplit(gnc_xtn, 0);
+        amount_str =
           xaccPrintAmount(gnc_numeric_abs(xaccSplitGetValue(gnc_split)),
                           gnc_account_print_info
                           (xaccSplitGetAccount(gnc_split), TRUE));
@@ -2101,13 +2162,13 @@
 
       gtk_list_store_append(store, &iter);
       gtk_list_store_set
-	(store, &iter,
-	 QIF_TRANS_COL_INDEX, rownum++,
-	 QIF_TRANS_COL_DATE, gnc_print_date(xaccTransRetDatePostedTS(gnc_xtn)),
-	 QIF_TRANS_COL_DESCRIPTION, xaccTransGetDescription(gnc_xtn),
-	 QIF_TRANS_COL_AMOUNT, amount_str,
-	 QIF_TRANS_COL_CHECKED, selected != SCM_BOOL_F,
-	 -1);
+        (store, &iter,
+         QIF_TRANS_COL_INDEX, rownum++,
+         QIF_TRANS_COL_DATE, gnc_print_date(xaccTransRetDatePostedTS(gnc_xtn)),
+         QIF_TRANS_COL_DESCRIPTION, xaccTransGetDescription(gnc_xtn),
+         QIF_TRANS_COL_AMOUNT, amount_str,
+         QIF_TRANS_COL_CHECKED, selected != SCM_BOOL_F,
+         -1);
 
       possible_matches = SCM_CDR(possible_matches);
     }
@@ -2115,16 +2176,16 @@
 }
 
 static void
-gnc_ui_qif_import_duplicate_new_select_cb (GtkTreeSelection *selection,
-					   QIFImportWindow  *wind)
+gnc_ui_qif_import_duplicate_new_select_cb(GtkTreeSelection *selection,
+                                          QIFImportWindow  *wind)
 {
   GtkTreeModel *model;
   GtkTreeIter iter;
 
   if (gtk_tree_selection_get_selected(selection, &model, &iter))
     gtk_tree_model_get(model, &iter,
-		       QIF_TRANS_COL_INDEX, &wind->selected_transaction,
-		       -1);
+                       QIF_TRANS_COL_INDEX, &wind->selected_transaction,
+                       -1);
   refresh_old_transactions(wind, -1);
 }
 
@@ -2136,8 +2197,8 @@
 }
 
 static void
-gnc_ui_qif_import_duplicate_old_select_cb (GtkTreeSelection *selection,
-					   QIFImportWindow  *wind)
+gnc_ui_qif_import_duplicate_old_select_cb(GtkTreeSelection *selection,
+                                          QIFImportWindow  *wind)
 {
   GtkTreeModel *model;
   GtkTreeIter iter;
@@ -2161,15 +2222,15 @@
   /* Get the row the user clicked on and update the scheme
    * code/rebuild the list store.  */
   gtk_tree_model_get(model, &iter,
-		     QIF_TRANS_COL_INDEX, &row,
-		     -1);
+                     QIF_TRANS_COL_INDEX, &row,
+                     -1);
   refresh_old_transactions(wind, row);
 }
 
 
 /********************************************************************
  * gnc_ui_qif_import_check_acct_tree
- * 
+ *
  * Designed for use with gnc_main_window_foreach_page(), this
  * function determines whether an account tab is open in the main
  * window. The parameter user_data must point to a gboolean.
@@ -2187,19 +2248,19 @@
 
 /********************************************************************
  * gnc_ui_qif_import_finish_cb
- * 
+ *
  * Invoked when the "Apply" button is clicked on the final page.
  ********************************************************************/
 
 static void
-gnc_ui_qif_import_finish_cb(GnomeDruidPage * gpage, 
-                            gpointer arg1, 
+gnc_ui_qif_import_finish_cb(GnomeDruidPage * gpage,
+                            gpointer arg1,
                             gpointer user_data)
 {
   SCM   save_map_prefs = scm_c_eval_string("qif-import:save-map-prefs");
   SCM   cat_and_merge = scm_c_eval_string("gnc:account-tree-catenate-and-merge");
   SCM   prune_xtns = scm_c_eval_string("gnc:prune-matching-transactions");
-  
+
   QIFImportWindow * wind = user_data;
   GncPluginPage *page;
   gboolean acct_tree_found = FALSE;
@@ -2213,17 +2274,17 @@
   /* Merge the imported account tree with the existing one. */
   if (wind->imported_account_tree != SCM_BOOL_F)
     scm_call_2(cat_and_merge,
-	       scm_c_eval_string("(gnc-get-current-root-account)"),
-	       wind->imported_account_tree);
+               scm_c_eval_string("(gnc-get-current-root-account)"),
+               wind->imported_account_tree);
 
   gnc_resume_gui_refresh();
 
   /* Save the user's mapping preferences. */
   scm_apply(save_map_prefs,
-	    SCM_LIST5(wind->acct_map_info, wind->cat_map_info,
-		      wind->memo_map_info, wind->security_hash,
+            SCM_LIST5(wind->acct_map_info, wind->cat_map_info,
+                      wind->memo_map_info, wind->security_hash,
                       wind->security_prefs),
-	    SCM_EOL);
+            SCM_EOL);
 
   /* Open an account tab in the main window if one doesn't exist already. */
   gnc_main_window_foreach_page(gnc_ui_qif_import_check_acct_tree,
@@ -2234,7 +2295,7 @@
     gnc_main_window_open_page(NULL, page);
   }
 
-  gnc_ui_qif_import_druid_destroy(wind);  
+  gnc_ui_qif_import_druid_destroy(wind);
 }
 
 
@@ -2284,7 +2345,7 @@
 SCM
 gnc_ui_qif_import_druid_get_mappings(QIFImportWindow * w)
 {
-  return SCM_LIST3(w->acct_map_info, 
+  return SCM_LIST3(w->acct_map_info,
                    w->cat_map_info,
                    w->memo_map_info);
 }
@@ -2293,37 +2354,38 @@
 /* ======================================================== */
 
 static gboolean
-show_handler (const char *class, gint component_id,
-	      gpointer user_data, gpointer iter_data)
+show_handler(const char *class, gint component_id,
+             gpointer user_data, gpointer iter_data)
 {
   QIFImportWindow *qif_win = user_data;
 
   if (!qif_win)
     return(FALSE);
-  gtk_window_present (GTK_WINDOW(qif_win->window));
+  gtk_window_present(GTK_WINDOW(qif_win->window));
   return(TRUE);
 }
 
 void
-gnc_file_qif_import (void) 
+gnc_file_qif_import(void)
 {
-  if (gnc_forall_gui_components (DRUID_QIF_IMPORT_CM_CLASS,
-				 show_handler, NULL))
-      return;
+  if (gnc_forall_gui_components(DRUID_QIF_IMPORT_CM_CLASS,
+                                show_handler, NULL))
+    return;
 
   /* pop up the QIF File Import dialog box */
   gnc_ui_qif_import_druid_make();
 }
 
+
 /********************************************************************
- * gnc_ui_qif_import_druid_make() 
+ * gnc_ui_qif_import_druid_make()
  * build the druid.
  ********************************************************************/
 
 QIFImportWindow *
 gnc_ui_qif_import_druid_make(void)
 {
-  
+
   QIFImportWindow * retval;
   GladeXML        * xml;
   GError * err = NULL;
@@ -2340,7 +2402,7 @@
 
   char * pre_page_names[NUM_PRE_PAGES] = {
     "start_page", "load_file_page", "date_format_page", "account_name_page",
-    "loaded_files_page", "account_doc_page", "account_match_page", 
+    "loaded_files_page", "account_doc_page", "account_match_page",
     "category_doc_page", "category_match_page", "memo_doc_page",
     "memo_match_page", "currency_page", "commodity_doc_page"
   };
@@ -2350,99 +2412,99 @@
   };
 
   char * doc_page_names[NUM_DOC_PAGES] = {
-    "start_page", "account_doc_page", "category_doc_page", 
-    "commodity_doc_page", "memo_doc_page", "match_doc_page"    
+    "start_page", "account_doc_page", "category_doc_page",
+    "commodity_doc_page", "memo_doc_page", "match_doc_page"
   };
 
   retval = g_new0(QIFImportWindow, 1);
 
-  xml = gnc_glade_xml_new ("qif.glade", "QIF Import Druid");
+  xml = gnc_glade_xml_new("qif.glade", "QIF Import Druid");
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_cancel_cb",
-     G_CALLBACK (gnc_ui_qif_import_cancel_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_cancel_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_generic_next_cb",
-     G_CALLBACK (gnc_ui_qif_import_generic_next_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_generic_next_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_generic_back_cb",
-     G_CALLBACK (gnc_ui_qif_import_generic_back_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_generic_back_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_select_file_cb",
-     G_CALLBACK (gnc_ui_qif_import_select_file_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_select_file_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_load_file_back_cb",
-     G_CALLBACK (gnc_ui_qif_import_load_file_back_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_load_file_back_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_load_file_next_cb",
-     G_CALLBACK (gnc_ui_qif_import_load_file_next_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_load_file_next_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_date_format_next_cb",
-     G_CALLBACK (gnc_ui_qif_import_date_format_next_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_date_format_next_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_loaded_files_prepare_cb",
-     G_CALLBACK (gnc_ui_qif_import_loaded_files_prepare_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_loaded_files_prepare_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_load_another_cb",
-     G_CALLBACK (gnc_ui_qif_import_load_another_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_load_another_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_unload_file_cb",
-     G_CALLBACK (gnc_ui_qif_import_unload_file_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_unload_file_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_default_acct_next_cb",
-     G_CALLBACK (gnc_ui_qif_import_default_acct_next_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_default_acct_next_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_default_acct_back_cb",
-     G_CALLBACK (gnc_ui_qif_import_default_acct_back_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_default_acct_back_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_accounts_prepare_cb",
-     G_CALLBACK (gnc_ui_qif_import_accounts_prepare_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_accounts_prepare_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_categories_prepare_cb",
-     G_CALLBACK (gnc_ui_qif_import_categories_prepare_cb), retval);
-  
+     G_CALLBACK(gnc_ui_qif_import_categories_prepare_cb), retval);
+
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_categories_next_cb",
-     G_CALLBACK (gnc_ui_qif_import_categories_next_cb), retval);
-  
+     G_CALLBACK(gnc_ui_qif_import_categories_next_cb), retval);
+
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_memo_prepare_cb",
-     G_CALLBACK (gnc_ui_qif_import_memo_prepare_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_memo_prepare_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_memo_next_cb",
-     G_CALLBACK (gnc_ui_qif_import_memo_next_cb), retval);
-  
+     G_CALLBACK(gnc_ui_qif_import_memo_next_cb), retval);
+
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_currency_back_cb",
-     G_CALLBACK (gnc_ui_qif_import_currency_back_cb), retval);
-  
+     G_CALLBACK(gnc_ui_qif_import_currency_back_cb), retval);
+
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_currency_next_cb",
-     G_CALLBACK (gnc_ui_qif_import_currency_next_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_currency_next_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_commodity_prepare_cb",
-     G_CALLBACK (gnc_ui_qif_import_commodity_prepare_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_commodity_prepare_cb), retval);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_finish_cb",
-     G_CALLBACK (gnc_ui_qif_import_finish_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_finish_cb), retval);
 
-  retval->window = glade_xml_get_widget (xml, "QIF Import Druid");
+  retval->window = glade_xml_get_widget(xml, "QIF Import Druid");
 
   retval->imported_files    =  SCM_EOL;
   retval->selected_file     =  SCM_BOOL_F;
@@ -2460,56 +2522,56 @@
   retval->imported_account_tree   = SCM_BOOL_F;
   retval->match_transactions = SCM_BOOL_F;
   retval->selected_transaction = 0;
-  
-  retval->druid          = glade_xml_get_widget (xml, "qif_import_druid");
-  retval->filename_entry = glade_xml_get_widget (xml, "qif_filename_entry");
-  retval->acct_entry     = glade_xml_get_widget (xml, "qif_account_entry");
-  retval->date_format_combo = glade_xml_get_widget (xml, "date_format_combobox");
+
+  retval->druid          = glade_xml_get_widget(xml, "qif_import_druid");
+  retval->filename_entry = glade_xml_get_widget(xml, "qif_filename_entry");
+  retval->acct_entry     = glade_xml_get_widget(xml, "qif_account_entry");
+  retval->date_format_combo = glade_xml_get_widget(xml, "date_format_combobox");
   retval->selected_file_view = glade_xml_get_widget(xml, "selected_file_view");
-  retval->currency_picker = glade_xml_get_widget (xml, "currency_comboboxentry");
-  retval->acct_view      = glade_xml_get_widget (xml, "account_page_view");
-  retval->cat_view       = glade_xml_get_widget (xml, "category_page_view");
-  retval->memo_view      = glade_xml_get_widget (xml, "memo_page_view");
-  retval->new_transaction_view = 
-    glade_xml_get_widget (xml, "new_transaction_view");
-  retval->old_transaction_view = 
-    glade_xml_get_widget (xml, "old_transaction_view");
-  
+  retval->currency_picker = glade_xml_get_widget(xml, "currency_comboboxentry");
+  retval->acct_view      = glade_xml_get_widget(xml, "account_page_view");
+  retval->cat_view       = glade_xml_get_widget(xml, "category_page_view");
+  retval->memo_view      = glade_xml_get_widget(xml, "memo_page_view");
+  retval->new_transaction_view =
+    glade_xml_get_widget(xml, "new_transaction_view");
+  retval->old_transaction_view =
+    glade_xml_get_widget(xml, "old_transaction_view");
+
   retval->pre_comm_pages   = NULL;
   retval->post_comm_pages  = NULL;
   retval->doc_pages        = NULL;
   retval->commodity_pages = NULL;
 
   /* Get the user's preference for showing documentation pages. */
-  retval->show_doc_pages = 
+  retval->show_doc_pages =
     gnc_gconf_get_bool(GCONF_SECTION, GCONF_NAME_SHOW_DOC, &err);
   if (err != NULL) {
-    g_warning("QIF import: gnc_gconf_get_bool error: %s\n", err->message);
+    g_warning("QIF import: gnc_gconf_get_bool error: %s", err->message);
     g_error_free(err);
 
     /* Show documentation pages by default. */
-    g_warning("QIF import: Couldn't get %s setting from gconf.\n",
+    g_warning("QIF import: Couldn't get %s setting from gconf.",
               GCONF_NAME_SHOW_DOC);
-    g_warning("QIF import: Documentation pages will be shown by default.\n");
+    g_warning("QIF import: Documentation pages will be shown by default.");
     retval->show_doc_pages = TRUE;
   }
 
   for(i=0; i < NUM_PRE_PAGES; i++) {
-    retval->pre_comm_pages = 
-      g_list_append(retval->pre_comm_pages, 
-                    glade_xml_get_widget (xml, pre_page_names[i]));
+    retval->pre_comm_pages =
+      g_list_append(retval->pre_comm_pages,
+                    glade_xml_get_widget(xml, pre_page_names[i]));
   }
   for(i=0; i < NUM_POST_PAGES; i++) {
-    retval->post_comm_pages = 
-      g_list_append(retval->post_comm_pages, 
-                    glade_xml_get_widget (xml, post_page_names[i]));
+    retval->post_comm_pages =
+      g_list_append(retval->post_comm_pages,
+                    glade_xml_get_widget(xml, post_page_names[i]));
   }
   for(i=0; i < NUM_DOC_PAGES; i++) {
-    retval->doc_pages = 
-      g_list_append(retval->doc_pages, 
-                    glade_xml_get_widget (xml, doc_page_names[i]));
+    retval->doc_pages =
+      g_list_append(retval->doc_pages,
+                    glade_xml_get_widget(xml, doc_page_names[i]));
   }
-  
+
   /* Set up the selected file view */
   view = GTK_TREE_VIEW(retval->selected_file_view);
   store = gtk_list_store_new(NUM_FILENAME_COLS, G_TYPE_INT, G_TYPE_STRING);
@@ -2517,94 +2579,110 @@
   g_object_unref(store);
 
   renderer = gtk_cell_renderer_text_new();
-  column = gtk_tree_view_column_new_with_attributes(_("Account"), renderer,
-						    "text", FILENAME_COL_NAME,
-						    NULL);
+  column = gtk_tree_view_column_new_with_attributes(_("Account"),
+                                                    renderer,
+                                                    "text",
+                                                    FILENAME_COL_NAME,
+                                                    NULL);
   gtk_tree_view_append_column(view, column);
 
   selection = gtk_tree_view_get_selection(view);
   g_signal_connect(selection, "changed",
-		   G_CALLBACK(gnc_ui_qif_import_select_loaded_file_cb),
-		   retval);
-  
+                   G_CALLBACK(gnc_ui_qif_import_select_loaded_file_cb),
+                   retval);
+
   create_account_picker_view(retval->acct_view, _("QIF account name"),
-			     G_CALLBACK(gnc_ui_qif_import_account_line_select_cb),
-			     retval);
+                             G_CALLBACK(gnc_ui_qif_import_account_line_select_cb),
+                             retval);
   create_account_picker_view(retval->cat_view,  _("QIF category name"),
-			     G_CALLBACK(gnc_ui_qif_import_category_line_select_cb),
-			     retval);
+                             G_CALLBACK(gnc_ui_qif_import_category_line_select_cb),
+                             retval);
   create_account_picker_view(retval->memo_view, _("QIF payee/memo"),
-			     G_CALLBACK(gnc_ui_qif_import_memo_line_select_cb),
-			     retval);
+                             G_CALLBACK(gnc_ui_qif_import_memo_line_select_cb),
+                             retval);
 
   /* Set up the new transaction view */
   view = GTK_TREE_VIEW(retval->new_transaction_view);
   store = gtk_list_store_new(NUM_QIF_TRANS_COLS, G_TYPE_INT, G_TYPE_STRING,
-			     G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
+                             G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
   gtk_tree_view_set_model(view, GTK_TREE_MODEL(store));
   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,
-						    NULL);
+  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,
-						    NULL);
+  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,
-						    NULL);
+  column = gtk_tree_view_column_new_with_attributes(_("Amount"),
+                                                    renderer,
+                                                    "text",
+                                                    QIF_TRANS_COL_AMOUNT,
+                                                    NULL);
   gtk_tree_view_append_column(view, column);
 
   selection = gtk_tree_view_get_selection(view);
   g_signal_connect(selection, "changed",
-		   G_CALLBACK(gnc_ui_qif_import_duplicate_new_select_cb),
-		   retval);
+                   G_CALLBACK(gnc_ui_qif_import_duplicate_new_select_cb),
+                   retval);
 
 
   /* Set up the old transaction view */
   view = GTK_TREE_VIEW(retval->old_transaction_view);
   store = gtk_list_store_new(NUM_QIF_TRANS_COLS, G_TYPE_INT, G_TYPE_STRING,
-			     G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
+                             G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
   gtk_tree_view_set_model(view, GTK_TREE_MODEL(store));
   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,
-						    NULL);
+  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,
-						    NULL);
+  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,
-						    NULL);
+  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,
-						    NULL);
+  column = gtk_tree_view_column_new_with_attributes(_("Dup?"),
+                                                    renderer,
+                                                    "active",
+                                                    QIF_TRANS_COL_CHECKED,
+                                                    NULL);
   gtk_tree_view_append_column(view, column);
 
   selection = gtk_tree_view_get_selection(view);
   g_signal_connect(selection, "changed",
-		   G_CALLBACK(gnc_ui_qif_import_duplicate_old_select_cb),
-		   retval);
+                   G_CALLBACK(gnc_ui_qif_import_duplicate_old_select_cb),
+                   retval);
 
 
   /* load the saved-state of the mappings from Quicken accounts and
@@ -2621,7 +2699,7 @@
 
   create_ticker_map = scm_c_eval_string("make-ticker-map");
   retval->ticker_map = scm_call_0(create_ticker_map);
-  
+
   scm_gc_protect_object(retval->imported_files);
   scm_gc_protect_object(retval->selected_file);
   scm_gc_protect_object(retval->gnc_acct_info);
@@ -2637,25 +2715,25 @@
   scm_gc_protect_object(retval->ticker_map);
   scm_gc_protect_object(retval->imported_account_tree);
   scm_gc_protect_object(retval->match_transactions);
-  
+
   /* set a default currency for new accounts */
   gnc_cbe_require_list_item(GTK_COMBO_BOX_ENTRY(retval->currency_picker));
   gnc_ui_update_commodity_picker(retval->currency_picker,
-                                 GNC_COMMODITY_NS_CURRENCY, 
+                                 GNC_COMMODITY_NS_CURRENCY,
                                  gnc_commodity_get_printname
                                  (gnc_default_currency()));
-  
+
   if(!retval->show_doc_pages) {
     gnome_druid_set_page(GNOME_DRUID(retval->druid),
                          get_named_page(retval, "load_file_page"));
   }
 
-  gnc_druid_set_colors (GNOME_DRUID (retval->druid));
+  gnc_druid_set_colors(GNOME_DRUID(retval->druid));
 
   gnc_register_gui_component(DRUID_QIF_IMPORT_CM_CLASS, NULL, NULL, retval);
 
   gtk_widget_show_all(retval->window);
-  gtk_window_present (GTK_WINDOW(retval->window));
+  gtk_window_present(GTK_WINDOW(retval->window));
 
   return retval;
 }



More information about the gnucash-changes mailing list