AUDIT: r17336 - gnucash/trunk/src/import-export/qif-import - QIF Import: Allow column resizing on account mappings pages. Reorganize a massive and messy function into reasonably-sized chunks.

Charles Day cedayiv at cvs.gnucash.org
Tue Jul 15 15:34:06 EDT 2008


Author: cedayiv
Date: 2008-07-15 15:34:05 -0400 (Tue, 15 Jul 2008)
New Revision: 17336
Trac: http://svn.gnucash.org/trac/changeset/17336

Modified:
   gnucash/trunk/src/import-export/qif-import/druid-qif-import.c
Log:
QIF Import: Allow column resizing on account mappings pages. Reorganize a massive and messy function into reasonably-sized chunks.
BP


Modified: gnucash/trunk/src/import-export/qif-import/druid-qif-import.c
===================================================================
--- gnucash/trunk/src/import-export/qif-import/druid-qif-import.c	2008-07-15 17:35:10 UTC (rev 17335)
+++ gnucash/trunk/src/import-export/qif-import/druid-qif-import.c	2008-07-15 19:34:05 UTC (rev 17336)
@@ -398,9 +398,9 @@
   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) {
-      if((current = g_list_find(wind->post_comm_pages, page)) == NULL) {
+  if ((current = g_list_find(wind->pre_comm_pages, page)) == NULL) {
+    if ((current = g_list_find(wind->commodity_pages, page)) == NULL) {
+      if ((current = g_list_find(wind->post_comm_pages, page)) == NULL) {
         /* Where are we? */
         g_critical("QIF import: BUG DETECTED in get_next_druid_page! I'm lost!");
         return FALSE;
@@ -422,7 +422,7 @@
          (!wind->show_doc_pages && g_list_find(wind->doc_pages, next->data)) ||
          (wind->new_securities == SCM_BOOL_F &&
           GNOME_DRUID_PAGE(next->data) == get_named_page(wind, "commodity_doc_page"))) {
-    if(next && next->next) {
+    if (next && next->next) {
       next = next->next;
     }
     else {
@@ -467,9 +467,9 @@
   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) {
-      if((current = g_list_find(wind->post_comm_pages, page)) == NULL) {
+  if ((current = g_list_find(wind->pre_comm_pages, page)) == NULL) {
+    if ((current = g_list_find(wind->commodity_pages, page)) == NULL) {
+      if ((current = g_list_find(wind->post_comm_pages, page)) == NULL) {
         /* Where are we? */
         g_critical("QIF import: BUG DETECTED in get_prev_druid_page! I'm lost!");
         return NULL;
@@ -503,7 +503,7 @@
     /* We're either out of pages for this stage, or we've reached
      * an optional doc page that shouldn't be shown. */
 
-    if(prev && prev->prev) {
+    if (prev && prev->prev) {
       /* Go back another page within the same stage. */
       prev = prev->prev;
     }
@@ -515,7 +515,7 @@
         prev = g_list_last(wind->pre_comm_pages);
         break;
       case 2:
-        if(wind->new_securities != SCM_BOOL_F) {
+        if (wind->new_securities != SCM_BOOL_F) {
           prev = g_list_last(wind->commodity_pages);
         }
         else {
@@ -533,7 +533,7 @@
     }
   }
 
-  if(prev)
+  if (prev)
     return (GtkWidget *)prev->data;
 
   return NULL;
@@ -553,7 +553,7 @@
   QIFImportWindow * wind = user_data;
   GtkWidget * next_page = get_next_druid_page(wind, page);
 
-  if(next_page)
+  if (next_page)
   {
     gnome_druid_set_page(GNOME_DRUID(wind->druid),
                          GNOME_DRUID_PAGE(next_page));
@@ -577,7 +577,7 @@
   QIFImportWindow * wind = user_data;
   GtkWidget * back_page = get_prev_druid_page(wind, page);
 
-  if(back_page)
+  if (back_page)
   {
     gnome_druid_set_page(GNOME_DRUID(wind->druid),
                          GNOME_DRUID_PAGE(back_page));
@@ -1213,7 +1213,7 @@
                        FILENAME_COL_INDEX, row++,
                        FILENAME_COL_NAME, row_text,
                        -1);
-    if(scm_qiffile == wind->selected_file) {
+    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);
       gtk_tree_path_free(path);
@@ -1252,7 +1252,7 @@
   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,
@@ -1326,7 +1326,7 @@
   SCM unload_qif_file = scm_c_eval_string("qif-dialog:unload-qif-file");
   SCM imported_files;
 
-  if(wind->selected_file != SCM_BOOL_F) {
+  if (wind->selected_file != SCM_BOOL_F) {
     imported_files =
       scm_call_2(unload_qif_file, wind->selected_file, wind->imported_files);
 
@@ -1384,7 +1384,7 @@
   SCM    scm_name;
 
   g_return_val_if_fail(wind->selected_file != SCM_BOOL_F, FALSE);
-  if(!acct_name || acct_name[0] == 0) {
+  if (!acct_name || acct_name[0] == 0) {
     gnc_warning_dialog(wind->window, _("You must enter an account name."));
     return TRUE;
   }
@@ -1456,7 +1456,7 @@
                                                     "text",
                                                     ACCOUNT_COL_QIF_NAME,
                                                     NULL);
-  g_object_set(column, "expand", TRUE, NULL);
+  gtk_tree_view_column_set_resizable(column, TRUE);
   gtk_tree_view_append_column(view, column);
 
   renderer = gtk_cell_renderer_text_new();
@@ -1466,6 +1466,7 @@
                                                     ACCOUNT_COL_GNC_NAME,
                                                     NULL);
   g_object_set(column, "expand", TRUE, NULL);
+  gtk_tree_view_column_set_resizable(column, TRUE);
   gtk_tree_view_append_column(view, column);
 
   renderer = gtk_cell_renderer_toggle_new();
@@ -2057,20 +2058,20 @@
   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)) {
+  if (!namespace || (namespace[0] == 0)) {
     gnc_warning_dialog(wind->window,
                        _("You must enter a Type for the commodity."));
     if (namespace)
       g_free(namespace);
     return TRUE;
   }
-  else if(!name || (name[0] == 0)) {
+  else if (!name || (name[0] == 0)) {
     gnc_warning_dialog(wind->window,
                        _("You must enter a name for the commodity."));
     g_free(namespace);
     return TRUE;
   }
-  else if(!mnemonic || (mnemonic[0] == 0)) {
+  else if (!mnemonic || (mnemonic[0] == 0)) {
     gnc_warning_dialog
       (wind->window, _("You must enter an abbreviation for the commodity."));
     g_free(namespace);
@@ -2847,7 +2848,7 @@
   store = GTK_LIST_STORE(gtk_tree_view_get_model(view));
   gtk_list_store_clear(store);
 
-  if(wind->match_transactions != SCM_BOOL_F) {
+  if (wind->match_transactions != SCM_BOOL_F) {
     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"),
@@ -2861,7 +2862,7 @@
       #undef FUNC_NAME
       selected    = SCM_CDR(current_xtn);
 
-      if(xaccTransCountSplits(gnc_xtn) > 2) {
+      if (xaccTransCountSplits(gnc_xtn) > 2) {
         amount_str = _("(split)");
       }
       else {
@@ -3114,55 +3115,121 @@
 }
 
 
-/* ======================================================== */
 
-static gboolean
-show_handler(const char *class, gint component_id,
-             gpointer user_data, gpointer iter_data)
-{
-  QIFImportWindow *qif_win = user_data;
+/* ================================================================== */
+/*                                                                    */
+/*                         IMPORTER CREATION                          */
+/*                                                                    */
+/* ================================================================== */
 
-  if (!qif_win)
-    return(FALSE);
-  gtk_window_present(GTK_WINDOW(qif_win->window));
-  return(TRUE);
-}
 
-void
-gnc_file_qif_import(void)
+/********************************************************************
+ * get_preferences
+ *
+ * Get all user preferences related to QIF import.
+ ********************************************************************/
+
+static void
+get_preferences(QIFImportWindow *wind)
 {
-  if (gnc_forall_gui_components(DRUID_QIF_IMPORT_CM_CLASS,
-                                show_handler, NULL))
-    return;
+  GError * err = NULL;
 
-  /* pop up the QIF File Import dialog box */
-  gnc_ui_qif_import_druid_make();
+  g_return_if_fail(wind);
+
+  /* Get the user's preference for showing documentation pages. */
+  wind->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", err->message);
+    g_error_free(err);
+
+    /* Show documentation pages by default. */
+    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.");
+    wind->show_doc_pages = TRUE;
+  }
 }
 
 
 /********************************************************************
- * gnc_ui_qif_import_druid_make()
- * build the druid.
+ * initialize_scheme
+ *
+ * Initialize all Scheme-controlled objects.
  ********************************************************************/
 
-QIFImportWindow *
-gnc_ui_qif_import_druid_make(void)
+static void
+initialize_scheme(QIFImportWindow *wind)
 {
-
-  QIFImportWindow * retval;
-  GladeXML        * xml;
-  GError * err = NULL;
   SCM  load_map_prefs;
   SCM  mapping_info;
   SCM  create_ticker_map;
+
+  g_return_if_fail(wind);
+
+  /* Initialize Scheme variables. */
+  wind->imported_files        = SCM_EOL;
+  wind->selected_file         = SCM_BOOL_F;
+  wind->gnc_acct_info         = SCM_BOOL_F;
+  wind->cat_display_info      = SCM_BOOL_F;
+  wind->cat_map_info          = SCM_BOOL_F;
+  wind->acct_display_info     = SCM_BOOL_F;
+  wind->acct_map_info         = SCM_BOOL_F;
+  wind->memo_display_info     = SCM_BOOL_F;
+  wind->memo_map_info         = SCM_BOOL_F;
+  wind->security_hash         = SCM_BOOL_F;
+  wind->security_prefs        = SCM_BOOL_F;
+  wind->new_securities        = SCM_BOOL_F;
+  wind->ticker_map            = SCM_BOOL_F;
+  wind->imported_account_tree = SCM_BOOL_F;
+  wind->match_transactions    = SCM_BOOL_F;
+
+  /* Get the saved state of mappings from Quicken accounts and
+   * categories to GnuCash accounts. */
+  load_map_prefs = scm_c_eval_string("qif-import:load-map-prefs");
+  mapping_info = scm_call_0(load_map_prefs);
+  wind->gnc_acct_info         = scm_list_ref(mapping_info, scm_int2num(0));
+  wind->acct_map_info         = scm_list_ref(mapping_info, scm_int2num(1));
+  wind->cat_map_info          = scm_list_ref(mapping_info, scm_int2num(2));
+  wind->memo_map_info         = scm_list_ref(mapping_info, scm_int2num(3));
+  wind->security_hash         = scm_list_ref(mapping_info, scm_int2num(4));
+  wind->security_prefs        = scm_list_ref(mapping_info, scm_int2num(5));
+
+  /* Get the initial ticker map. */
+  create_ticker_map = scm_c_eval_string("make-ticker-map");
+  wind->ticker_map            = scm_call_0(create_ticker_map);
+
+  /* Protect our data from garbage collection. */
+  scm_gc_protect_object(wind->imported_files);
+  scm_gc_protect_object(wind->selected_file);
+  scm_gc_protect_object(wind->gnc_acct_info);
+  scm_gc_protect_object(wind->cat_display_info);
+  scm_gc_protect_object(wind->cat_map_info);
+  scm_gc_protect_object(wind->memo_display_info);
+  scm_gc_protect_object(wind->memo_map_info);
+  scm_gc_protect_object(wind->acct_display_info);
+  scm_gc_protect_object(wind->acct_map_info);
+  scm_gc_protect_object(wind->security_hash);
+  scm_gc_protect_object(wind->security_prefs);
+  scm_gc_protect_object(wind->new_securities);
+  scm_gc_protect_object(wind->ticker_map);
+  scm_gc_protect_object(wind->imported_account_tree);
+  scm_gc_protect_object(wind->match_transactions);
+}
+
+
+/********************************************************************
+ * build_page_lists
+ *
+ * Build the lists of druid pages.
+ ********************************************************************/
+
+static void
+build_page_lists(QIFImportWindow *wind, GladeXML *xml)
+{
   int  i;
-  GtkTreeView *view;
-  GtkListStore *store;
-  GtkCellRenderer *renderer;
-  GtkTreeViewColumn *column;
-  GtkTreeSelection *selection;
 
-
+  /* Pages that may appear prior to security-related pages. */
   char * pre_page_names[NUM_PRE_PAGES] = {
     "start_page", "load_file_page", "load_progress_page",
     "date_format_page", "account_name_page",
@@ -3171,251 +3238,271 @@
     "memo_match_page", "currency_page", "commodity_doc_page"
   };
 
+  /* Pages that may appear after security-related pages. */
   char * post_page_names[NUM_POST_PAGES] = {
     "convert_progress_page", "match_doc_page", "match_duplicates_page",
     "end_page"
   };
 
+  /* Optional pages that only show documention. */
   char * doc_page_names[NUM_DOC_PAGES] = {
     "start_page", "account_doc_page", "category_doc_page",
     "commodity_doc_page", "memo_doc_page", "match_doc_page"
   };
 
-  retval = g_new0(QIFImportWindow, 1);
+  g_return_if_fail(wind);
 
-  xml = gnc_glade_xml_new("qif.glade", "QIF Import Druid");
+  wind->pre_comm_pages   = NULL;
+  wind->post_comm_pages  = NULL;
+  wind->doc_pages        = NULL;
+  wind->commodity_pages = NULL;
 
+  g_return_if_fail(xml);
+
+  /* Build the page lists. */
+  for(i = 0; i < NUM_PRE_PAGES; i++) {
+    wind->pre_comm_pages =
+      g_list_append(wind->pre_comm_pages,
+                    glade_xml_get_widget(xml, pre_page_names[i]));
+  }
+  for(i = 0; i < NUM_POST_PAGES; i++) {
+    wind->post_comm_pages =
+      g_list_append(wind->post_comm_pages,
+                    glade_xml_get_widget(xml, post_page_names[i]));
+  }
+  for(i = 0; i < NUM_DOC_PAGES; i++) {
+    wind->doc_pages =
+      g_list_append(wind->doc_pages,
+                    glade_xml_get_widget(xml, doc_page_names[i]));
+  }
+}
+
+
+/********************************************************************
+ * get_glade_widgets
+ *
+ * Get all glade-defined widgets that need to be actively managed.
+ ********************************************************************/
+
+static void
+get_glade_widgets(QIFImportWindow *wind, GladeXML *xml)
+{
+  g_return_if_fail(wind);
+  g_return_if_fail(xml);
+
+  wind->window            = glade_xml_get_widget(xml, "QIF Import Druid");
+  wind->druid             = glade_xml_get_widget(xml, "qif_import_druid");
+  wind->filename_entry    = glade_xml_get_widget(xml, "qif_filename_entry");
+  wind->load_pause        = glade_xml_get_widget(xml, "load_progress_pause");
+  wind->load_log          = glade_xml_get_widget(xml, "load_progress_log");
+  wind->load_progress     = gnc_progress_dialog_custom(
+    GTK_LABEL(glade_xml_get_widget(xml, "load_progress_primary")),
+    GTK_LABEL(glade_xml_get_widget(xml, "load_progress_secondary")),
+    GTK_PROGRESS_BAR(glade_xml_get_widget(xml, "load_progress_bar")),
+    GTK_LABEL(glade_xml_get_widget(xml, "load_progress_sub")),
+    GTK_TEXT_VIEW(wind->load_log));
+  wind->acct_entry        = glade_xml_get_widget(xml, "qif_account_entry");
+  wind->date_format_combo = glade_xml_get_widget(xml, "date_format_combobox");
+  wind->selected_file_view = glade_xml_get_widget(xml, "selected_file_view");
+  wind->currency_picker   = glade_xml_get_widget(xml, "currency_comboboxentry");
+  wind->acct_view         = glade_xml_get_widget(xml, "account_page_view");
+  wind->acct_view_count   = glade_xml_get_widget(xml, "account_page_count");
+  wind->acct_view_btn     = glade_xml_get_widget(xml, "account_page_change");
+  wind->cat_view          = glade_xml_get_widget(xml, "category_page_view");
+  wind->cat_view_count    = glade_xml_get_widget(xml, "category_page_count");
+  wind->cat_view_btn      = glade_xml_get_widget(xml, "category_page_change");
+  wind->memo_view         = glade_xml_get_widget(xml, "memo_page_view");
+  wind->memo_view_count   = glade_xml_get_widget(xml, "memo_page_count");
+  wind->memo_view_btn     = glade_xml_get_widget(xml, "memo_page_change");
+  wind->convert_pause     = glade_xml_get_widget(xml, "convert_progress_pause");
+  wind->convert_log       = glade_xml_get_widget(xml, "convert_progress_log");
+  wind->convert_progress  = gnc_progress_dialog_custom(
+    GTK_LABEL(glade_xml_get_widget(xml, "convert_progress_primary")),
+    GTK_LABEL(glade_xml_get_widget(xml, "convert_progress_secondary")),
+    GTK_PROGRESS_BAR(glade_xml_get_widget(xml, "convert_progress_bar")),
+    GTK_LABEL(glade_xml_get_widget(xml, "convert_progress_sub")),
+    GTK_TEXT_VIEW(wind->convert_log));
+  wind->new_transaction_view =
+    glade_xml_get_widget(xml, "new_transaction_view");
+  wind->old_transaction_view =
+    glade_xml_get_widget(xml, "old_transaction_view");
+}
+
+
+/********************************************************************
+ * connect_glade_signals
+ *
+ * Connect all glade-defined signals to their handlers.
+ ********************************************************************/
+
+static void
+connect_glade_signals(QIFImportWindow *wind, GladeXML *xml)
+{
+  g_return_if_fail(wind);
+  g_return_if_fail(xml);
+
+  /*
+   * Connect all glade-defined signals to their handlers.
+   */
   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), wind);
 
   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), wind);
 
   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), wind);
 
   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), wind);
 
   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), wind);
 
   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), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_load_progress_prepare_cb",
-     G_CALLBACK(gnc_ui_qif_import_load_progress_prepare_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_load_progress_prepare_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_load_progress_show_cb",
-     G_CALLBACK(gnc_ui_qif_import_load_progress_show_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_load_progress_show_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_load_progress_pause_cb",
-     G_CALLBACK(gnc_ui_qif_import_load_progress_pause_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_load_progress_pause_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_load_progress_next_cb",
-     G_CALLBACK(gnc_ui_qif_import_load_progress_next_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_load_progress_next_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_load_progress_back_cb",
-     G_CALLBACK(gnc_ui_qif_import_load_progress_back_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_load_progress_back_cb), wind);
 
   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), wind);
 
   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), wind);
 
   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), wind);
 
   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), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_loaded_files_next_cb",
-     G_CALLBACK(gnc_ui_qif_import_loaded_files_next_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_loaded_files_next_cb), wind);
 
   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), wind);
 
   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), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_account_rematch_cb",
-     G_CALLBACK(gnc_ui_qif_import_account_rematch_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_account_rematch_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_account_next_cb",
-     G_CALLBACK(gnc_ui_qif_import_account_next_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_account_next_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_category_rematch_cb",
-     G_CALLBACK(gnc_ui_qif_import_category_rematch_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_category_rematch_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_category_next_cb",
-     G_CALLBACK(gnc_ui_qif_import_category_next_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_category_next_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_memo_doc_back_cb",
-     G_CALLBACK(gnc_ui_qif_import_memo_doc_back_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_memo_doc_back_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_memo_rematch_cb",
-     G_CALLBACK(gnc_ui_qif_import_memo_rematch_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_memo_rematch_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_memo_back_cb",
-     G_CALLBACK(gnc_ui_qif_import_memo_back_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_memo_back_cb), wind);
 
   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), wind);
 
   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), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_convert_progress_prepare_cb",
-     G_CALLBACK(gnc_ui_qif_import_convert_progress_prepare_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_convert_progress_prepare_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_convert_progress_show_cb",
-     G_CALLBACK(gnc_ui_qif_import_convert_progress_show_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_convert_progress_show_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_convert_progress_pause_cb",
-     G_CALLBACK(gnc_ui_qif_import_convert_progress_pause_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_convert_progress_pause_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_convert_progress_next_cb",
-     G_CALLBACK(gnc_ui_qif_import_convert_progress_next_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_convert_progress_next_cb), wind);
 
   glade_xml_signal_connect_data
     (xml, "gnc_ui_qif_import_convert_progress_back_cb",
-     G_CALLBACK(gnc_ui_qif_import_convert_progress_back_cb), retval);
+     G_CALLBACK(gnc_ui_qif_import_convert_progress_back_cb), wind);
 
   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), wind);
+}
 
-  retval->window = glade_xml_get_widget(xml, "QIF Import Druid");
 
-  retval->imported_files    =  SCM_EOL;
-  retval->selected_file     =  SCM_BOOL_F;
-  retval->gnc_acct_info     =  SCM_BOOL_F;
-  retval->cat_display_info  =  SCM_BOOL_F;
-  retval->cat_map_info      =  SCM_BOOL_F;
-  retval->acct_display_info =  SCM_BOOL_F;
-  retval->acct_map_info     =  SCM_BOOL_F;
-  retval->memo_display_info =  SCM_BOOL_F;
-  retval->memo_map_info     =  SCM_BOOL_F;
-  retval->security_hash     =  SCM_BOOL_F;
-  retval->new_securities    =  SCM_BOOL_F;
-  retval->new_namespaces    =  NULL;
-  retval->ticker_map        =  SCM_BOOL_F;
-  retval->imported_account_tree = SCM_BOOL_F;
-  retval->match_transactions    = SCM_BOOL_F;
-  retval->selected_transaction  = 0;
-  retval->busy              = FALSE;
+/********************************************************************
+ * build_views
+ *
+ * Build the details of all GtkTreeView widgets.
+ ********************************************************************/
 
-  retval->druid           = glade_xml_get_widget(xml, "qif_import_druid");
-  retval->filename_entry  = glade_xml_get_widget(xml, "qif_filename_entry");
-  retval->load_pause      = glade_xml_get_widget(xml, "load_progress_pause");
-  retval->load_log        = glade_xml_get_widget(xml, "load_progress_log");
-  retval->load_progress = gnc_progress_dialog_custom(
-    GTK_LABEL(glade_xml_get_widget(xml, "load_progress_primary")),
-    GTK_LABEL(glade_xml_get_widget(xml, "load_progress_secondary")),
-    GTK_PROGRESS_BAR(glade_xml_get_widget(xml, "load_progress_bar")),
-    GTK_LABEL(glade_xml_get_widget(xml, "load_progress_sub")),
-    GTK_TEXT_VIEW(retval->load_log));
-  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->acct_view_count = glade_xml_get_widget(xml, "account_page_count");
-  retval->acct_view_btn   = glade_xml_get_widget(xml, "account_page_change");
-  retval->cat_view        = glade_xml_get_widget(xml, "category_page_view");
-  retval->cat_view_count  = glade_xml_get_widget(xml, "category_page_count");
-  retval->cat_view_btn    = glade_xml_get_widget(xml, "category_page_change");
-  retval->memo_view       = glade_xml_get_widget(xml, "memo_page_view");
-  retval->memo_view_count = glade_xml_get_widget(xml, "memo_page_count");
-  retval->memo_view_btn   = glade_xml_get_widget(xml, "memo_page_change");
-  retval->convert_pause   = glade_xml_get_widget(xml, "convert_progress_pause");
-  retval->convert_log     = glade_xml_get_widget(xml, "convert_progress_log");
-  retval->convert_progress = gnc_progress_dialog_custom(
-    GTK_LABEL(glade_xml_get_widget(xml, "convert_progress_primary")),
-    GTK_LABEL(glade_xml_get_widget(xml, "convert_progress_secondary")),
-    GTK_PROGRESS_BAR(glade_xml_get_widget(xml, "convert_progress_bar")),
-    GTK_LABEL(glade_xml_get_widget(xml, "convert_progress_sub")),
-    GTK_TEXT_VIEW(retval->convert_log));
-  retval->new_transaction_view =
-    glade_xml_get_widget(xml, "new_transaction_view");
-  retval->old_transaction_view =
-    glade_xml_get_widget(xml, "old_transaction_view");
+static void
+build_views(QIFImportWindow *wind)
+{
+  GtkTreeView *view;
+  GtkListStore *store;
+  GtkCellRenderer *renderer;
+  GtkTreeViewColumn *column;
+  GtkTreeSelection *selection;
 
-  retval->pre_comm_pages   = NULL;
-  retval->post_comm_pages  = NULL;
-  retval->doc_pages        = NULL;
-  retval->commodity_pages = NULL;
+  g_return_if_fail(wind);
 
-  /* Get the user's preference for showing documentation 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", err->message);
-    g_error_free(err);
-
-    /* Show documentation pages by default. */
-    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.");
-    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]));
-  }
-  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]));
-  }
-  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]));
-  }
-
   /* Set up the selected file view */
-  view = GTK_TREE_VIEW(retval->selected_file_view);
+  view = GTK_TREE_VIEW(wind->selected_file_view);
   store = gtk_list_store_new(NUM_FILENAME_COLS, G_TYPE_INT, G_TYPE_STRING);
   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(_("Account"),
+  column = gtk_tree_view_column_new_with_attributes("unused",
                                                     renderer,
                                                     "text",
                                                     FILENAME_COL_NAME,
@@ -3425,28 +3512,28 @@
   selection = gtk_tree_view_get_selection(view);
   g_signal_connect(selection, "changed",
                    G_CALLBACK(gnc_ui_qif_import_select_loaded_file_cb),
-                   retval);
+                   wind);
 
   /* Set up the QIF account to GnuCash account matcher. */
-  create_account_picker_view(retval->acct_view, _("QIF account name"),
+  create_account_picker_view(wind->acct_view, _("QIF account name"),
                              G_CALLBACK(gnc_ui_qif_import_account_activate_cb),
                              G_CALLBACK(gnc_ui_qif_import_account_select_cb),
-                             retval);
+                             wind);
 
   /* Set up the QIF category to GnuCash account matcher. */
-  create_account_picker_view(retval->cat_view,  _("QIF category name"),
+  create_account_picker_view(wind->cat_view,  _("QIF category name"),
                              G_CALLBACK(gnc_ui_qif_import_category_activate_cb),
                              G_CALLBACK(gnc_ui_qif_import_category_select_cb),
-                             retval);
+                             wind);
 
   /* Set up the QIF payee/memo to GnuCash account matcher. */
-  create_account_picker_view(retval->memo_view, _("QIF payee/memo"),
+  create_account_picker_view(wind->memo_view, _("QIF payee/memo"),
                              G_CALLBACK(gnc_ui_qif_import_memo_activate_cb),
                              G_CALLBACK(gnc_ui_qif_import_memo_select_cb),
-                             retval);
+                             wind);
 
   /* Set up the new transaction view */
-  view = GTK_TREE_VIEW(retval->new_transaction_view);
+  view = GTK_TREE_VIEW(wind->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);
   gtk_tree_view_set_model(view, GTK_TREE_MODEL(store));
@@ -3480,11 +3567,11 @@
   selection = gtk_tree_view_get_selection(view);
   g_signal_connect(selection, "changed",
                    G_CALLBACK(gnc_ui_qif_import_duplicate_new_select_cb),
-                   retval);
+                   wind);
 
 
   /* Set up the old transaction view */
-  view = GTK_TREE_VIEW(retval->old_transaction_view);
+  view = GTK_TREE_VIEW(wind->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);
   gtk_tree_view_set_model(view, GTK_TREE_MODEL(store));
@@ -3526,58 +3613,90 @@
   selection = gtk_tree_view_get_selection(view);
   g_signal_connect(selection, "changed",
                    G_CALLBACK(gnc_ui_qif_import_duplicate_old_select_cb),
-                   retval);
+                   wind);
+}
 
 
-  /* load the saved-state of the mappings from Quicken accounts and
-   * categories to gnucash accounts */
-  load_map_prefs = scm_c_eval_string("qif-import:load-map-prefs");
+/********************************************************************
+ * gnc_ui_qif_import_druid_make
+ *
+ * Build a new QIF import druid.
+ ********************************************************************/
 
-  mapping_info = scm_call_0(load_map_prefs);
-  retval->gnc_acct_info    = scm_list_ref(mapping_info, scm_int2num(0));
-  retval->acct_map_info    = scm_list_ref(mapping_info, scm_int2num(1));
-  retval->cat_map_info     = scm_list_ref(mapping_info, scm_int2num(2));
-  retval->memo_map_info    = scm_list_ref(mapping_info, scm_int2num(3));
-  retval->security_hash    = scm_list_ref(mapping_info, scm_int2num(4));
-  retval->security_prefs   = scm_list_ref(mapping_info, scm_int2num(5));
+QIFImportWindow *
+gnc_ui_qif_import_druid_make(void)
+{
+  QIFImportWindow * wind;
+  GladeXML        * xml;
 
-  create_ticker_map = scm_c_eval_string("make-ticker-map");
-  retval->ticker_map = scm_call_0(create_ticker_map);
+  /* Allocate space for the druid and load its design. */
+  wind = g_new0(QIFImportWindow, 1);
+  xml = gnc_glade_xml_new("qif.glade", "QIF Import Druid");
 
-  scm_gc_protect_object(retval->imported_files);
-  scm_gc_protect_object(retval->selected_file);
-  scm_gc_protect_object(retval->gnc_acct_info);
-  scm_gc_protect_object(retval->cat_display_info);
-  scm_gc_protect_object(retval->cat_map_info);
-  scm_gc_protect_object(retval->memo_display_info);
-  scm_gc_protect_object(retval->memo_map_info);
-  scm_gc_protect_object(retval->acct_display_info);
-  scm_gc_protect_object(retval->acct_map_info);
-  scm_gc_protect_object(retval->security_hash);
-  scm_gc_protect_object(retval->security_prefs);
-  scm_gc_protect_object(retval->new_securities);
-  scm_gc_protect_object(retval->ticker_map);
-  scm_gc_protect_object(retval->imported_account_tree);
-  scm_gc_protect_object(retval->match_transactions);
+  wind->new_namespaces       = NULL;
+  wind->selected_transaction = 0;
+  wind->busy                 = FALSE;
 
-  /* 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,
+  /* Get all user preferences related to QIF importing. */
+  get_preferences(wind);
+
+  /* Set up the Scheme side of things. */
+  initialize_scheme(wind);
+
+  /* Build lists of the druid pages. */
+  build_page_lists(wind, xml);
+
+  /* Get all interesting glade-defined widgets. */
+  get_glade_widgets(wind, xml);
+
+  /* Connect all glade-defined signals to their handlers. */
+  connect_glade_signals(wind, xml);
+
+  /* Build the details of all GtkTreeView widgets. */
+  build_views(wind);
+
+  /* Set a default currency for new accounts */
+  gnc_cbe_require_list_item(GTK_COMBO_BOX_ENTRY(wind->currency_picker));
+  gnc_ui_update_commodity_picker(wind->currency_picker,
                                  GNC_COMMODITY_NS_CURRENCY,
-                                 gnc_commodity_get_printname
-                                 (gnc_default_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"));
-  }
+  /* If desired, skip the initial documentation pages. */
+  if (!wind->show_doc_pages)
+    gnome_druid_set_page(GNOME_DRUID(wind->druid),
+                         get_named_page(wind, "load_file_page"));
 
-  gnc_druid_set_colors(GNOME_DRUID(retval->druid));
+  gnc_druid_set_colors(GNOME_DRUID(wind->druid));
 
-  gnc_register_gui_component(DRUID_QIF_IMPORT_CM_CLASS, NULL, NULL, retval);
+  gnc_register_gui_component(DRUID_QIF_IMPORT_CM_CLASS, NULL, NULL, wind);
 
-  gtk_widget_show_all(retval->window);
-  gtk_window_present(GTK_WINDOW(retval->window));
+  gtk_widget_show_all(wind->window);
+  gtk_window_present(GTK_WINDOW(wind->window));
 
-  return retval;
+  return wind;
 }
+
+
+static gboolean
+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));
+  return(TRUE);
+}
+
+void
+gnc_file_qif_import(void)
+{
+  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();
+}



More information about the gnucash-changes mailing list