00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00028 #include "config.h"
00029
00030 #include <gtk/gtk.h>
00031 #include <glib/gi18n.h>
00032
00033 #include "import-main-matcher.h"
00034
00035 #include "dialog-utils.h"
00036 #include "gnc-ui.h"
00037 #include "gnc-ui-util.h"
00038 #include "gnc-engine.h"
00039 #include "import-settings.h"
00040 #include "import-match-map.h"
00041 #include "import-match-picker.h"
00042 #include "import-backend.h"
00043 #include "import-account-matcher.h"
00044
00045 #define GCONF_SECTION "dialogs/import/generic_matcher/transaction_list"
00046
00047 struct _main_matcher_info
00048 {
00049 GtkWidget *dialog;
00050 GtkTreeView *view;
00051 GNCImportSettings *user_settings;
00052 GdkColor color_back_red;
00053 GdkColor color_back_green;
00054 GdkColor color_back_yellow;
00055 int selected_row;
00056 GNCTransactionProcessedCB transaction_processed_cb;
00057 gpointer user_data;
00058 };
00059
00060 enum downloaded_cols
00061 {
00062 DOWNLOADED_COL_DATE = 0,
00063 DOWNLOADED_COL_ACCOUNT,
00064 DOWNLOADED_COL_AMOUNT,
00065 DOWNLOADED_COL_DESCRIPTION,
00066 DOWNLOADED_COL_MEMO,
00067 DOWNLOADED_COL_ACTION_ADD,
00068 DOWNLOADED_COL_ACTION_CLEAR,
00069 DOWNLOADED_COL_ACTION_UPDATE,
00070 DOWNLOADED_COL_ACTION_INFO,
00071 DOWNLOADED_COL_ACTION_PIXBUF,
00072 DOWNLOADED_COL_DATA,
00073 DOWNLOADED_COL_COLOR,
00074 NUM_DOWNLOADED_COLS
00075 };
00076
00077 #define COLOR_RED "brown1"
00078 #define COLOR_YELLOW "gold"
00079 #define COLOR_GREEN "DarkSeaGreen1"
00080
00081 static QofLogModule log_module = GNC_MOD_IMPORT;
00082
00083
00084 static void
00085 automatch_store_transactions(GNCImportMainMatcher *info,
00086 GtkTreeModel *model,
00087 GtkTreeIter *iter,
00088 GNCImportTransInfo *trans_info);
00089 static void
00090 refresh_model_row(GNCImportMainMatcher *gui, GtkTreeModel *model,
00091 GtkTreeIter *iter, GNCImportTransInfo *info);
00092
00093 void gnc_gen_trans_list_delete (GNCImportMainMatcher *info)
00094 {
00095 GtkTreeModel *model;
00096 GtkTreeIter iter;
00097 GNCImportTransInfo *trans_info;
00098
00099 if (info == NULL)
00100 return;
00101
00102 model = gtk_tree_view_get_model(info->view);
00103 if (gtk_tree_model_get_iter_first(model, &iter))
00104 {
00105 do
00106 {
00107 gtk_tree_model_get(model, &iter,
00108 DOWNLOADED_COL_DATA, &trans_info,
00109 -1);
00110
00111 if (info->transaction_processed_cb)
00112 {
00113 info->transaction_processed_cb(trans_info,
00114 FALSE,
00115 info->user_data);
00116 }
00117
00118 gnc_import_TransInfo_delete(trans_info);
00119 }
00120 while (gtk_tree_model_iter_next (model, &iter));
00121 }
00122
00123 gnc_save_window_size(GCONF_SECTION, GTK_WINDOW(info->dialog));
00124 gnc_import_Settings_delete (info->user_settings);
00125 gtk_widget_destroy (GTK_WIDGET (info->dialog));
00126 g_free (info);
00127 }
00128
00129 static void
00130 on_matcher_ok_clicked (GtkButton *button,
00131 GNCImportMainMatcher *info)
00132 {
00133 GtkTreeModel *model;
00134 GtkTreePath *path;
00135 GtkTreeRowReference *ref;
00136 GtkTreeIter iter;
00137 GNCImportTransInfo *trans_info;
00138 GSList *refs_list = NULL, *item;
00139
00140 g_assert (info);
00141
00142
00143
00144 model = gtk_tree_view_get_model(info->view);
00145 if (!gtk_tree_model_get_iter_first(model, &iter))
00146 return;
00147
00148 do
00149 {
00150 gtk_tree_model_get(model, &iter,
00151 DOWNLOADED_COL_DATA, &trans_info,
00152 -1);
00153
00154 if (gnc_import_process_trans_item(NULL, trans_info))
00155 {
00156 path = gtk_tree_model_get_path(model, &iter);
00157 ref = gtk_tree_row_reference_new(model, path);
00158 refs_list = g_slist_append(refs_list, ref);
00159 gtk_tree_path_free(path);
00160
00161 if (info->transaction_processed_cb)
00162 {
00163 info->transaction_processed_cb(trans_info,
00164 TRUE,
00165 info->user_data);
00166 }
00167 }
00168 else
00169 {
00170
00171
00172
00173 xaccTransDestroy(gnc_import_TransInfo_get_trans(trans_info));
00174 xaccTransCommitEdit(gnc_import_TransInfo_get_trans(trans_info));
00175 }
00176
00177 }
00178 while (gtk_tree_model_iter_next (model, &iter));
00179
00180
00181
00182
00183
00184 for (item = refs_list; item; item = g_slist_next(item))
00185 {
00186 ref = item->data;
00187 path = gtk_tree_row_reference_get_path(ref);
00188 if (gtk_tree_model_get_iter(model, &iter, path))
00189 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
00190 gtk_tree_path_free(path);
00191 gtk_tree_row_reference_free(ref);
00192 }
00193 g_slist_free(refs_list);
00194
00195 gnc_gen_trans_list_delete (info);
00196
00197 }
00198
00199 static void
00200 on_matcher_cancel_clicked (GtkButton *button,
00201 gpointer user_data)
00202 {
00203 GNCImportMainMatcher *info = user_data;
00204 gnc_gen_trans_list_delete (info);
00205 }
00206
00207 static void
00208 on_matcher_help_close_clicked (GtkButton *button,
00209 gpointer user_data)
00210 {
00211 GtkWidget *help_dialog = user_data;
00212
00213 gtk_widget_destroy(help_dialog);
00214 }
00215
00216 static void
00217 on_matcher_help_clicked (GtkButton *button,
00218 gpointer user_data)
00219 {
00220 GNCImportMainMatcher *info = user_data;
00221 GladeXML *xml;
00222 GtkWidget *help_dialog, *box;
00223
00224 xml = gnc_glade_xml_new ("generic-import.glade", "matcher_help");
00225
00226 box = glade_xml_get_widget (xml, "red");
00227 gtk_widget_modify_bg(box, GTK_STATE_NORMAL, &info->color_back_red);
00228 box = glade_xml_get_widget (xml, "yellow");
00229 gtk_widget_modify_bg(box, GTK_STATE_NORMAL, &info->color_back_yellow);
00230 box = glade_xml_get_widget (xml, "green");
00231 gtk_widget_modify_bg(box, GTK_STATE_NORMAL, &info->color_back_green);
00232
00233 help_dialog = glade_xml_get_widget (xml, "matcher_help");
00234 gtk_window_set_transient_for(GTK_WINDOW(help_dialog),
00235 GTK_WINDOW(info->dialog));
00236
00237 glade_xml_signal_connect_data(xml, "on_matcher_help_close_clicked",
00238 G_CALLBACK(on_matcher_help_close_clicked),
00239 help_dialog);
00240
00241 gtk_widget_show(help_dialog);
00242 }
00243
00244 static void
00245 run_account_picker_dialog (GNCImportMainMatcher *info,
00246 GtkTreeModel *model,
00247 GtkTreeIter *iter,
00248 GNCImportTransInfo *trans_info)
00249 {
00250 Account *old_acc, *new_acc;
00251 gboolean ok_pressed;
00252 g_assert (trans_info);
00253 old_acc = gnc_import_TransInfo_get_destacc (trans_info);
00254 new_acc = gnc_import_select_account(info->dialog,
00255 NULL,
00256 TRUE,
00257 _("Destination account for the auto-balance split."),
00258 xaccTransGetCurrency(gnc_import_TransInfo_get_trans(trans_info)),
00259 ACCT_TYPE_NONE,
00260 old_acc,
00261 &ok_pressed);
00262 if (ok_pressed)
00263 {
00264 gnc_import_TransInfo_set_destacc (trans_info,
00265 new_acc,
00266 TRUE);
00267
00268
00269 automatch_store_transactions(info, model, iter, trans_info);
00270 }
00271 }
00272
00273 static void
00274 run_match_dialog (GNCImportMainMatcher *info,
00275 GNCImportTransInfo *trans_info)
00276 {
00277 gnc_import_match_picker_run_and_close (trans_info);
00278 }
00279
00280 static void
00281 gnc_gen_trans_add_toggled_cb (GtkCellRendererToggle *cell_renderer,
00282 gchar *path,
00283 GNCImportMainMatcher *gui)
00284 {
00285 GtkTreeModel *model;
00286 GtkTreeIter iter;
00287 GNCImportTransInfo *trans_info;
00288
00289 model = gtk_tree_view_get_model(gui->view);
00290 if (!gtk_tree_model_get_iter_from_string(model, &iter, path))
00291 return;
00292 gtk_tree_model_get(model, &iter, DOWNLOADED_COL_DATA, &trans_info, -1);
00293
00294 if ( gnc_import_TransInfo_get_action(trans_info) == GNCImport_ADD
00295 && gnc_import_Settings_get_action_skip_enabled (gui->user_settings) == TRUE)
00296 {
00297 gnc_import_TransInfo_set_action(trans_info, GNCImport_SKIP);
00298 }
00299 else
00300 {
00301 gnc_import_TransInfo_set_action(trans_info, GNCImport_ADD);
00302 }
00303 refresh_model_row(gui, model, &iter, trans_info);
00304 }
00305
00306 static void
00307 gnc_gen_trans_clear_toggled_cb (GtkCellRendererToggle *cell_renderer,
00308 gchar *path,
00309 GNCImportMainMatcher *gui)
00310 {
00311 GtkTreeModel *model;
00312 GtkTreeIter iter;
00313 GNCImportTransInfo *trans_info;
00314
00315 model = gtk_tree_view_get_model(gui->view);
00316 if (!gtk_tree_model_get_iter_from_string(model, &iter, path))
00317 return;
00318 gtk_tree_model_get(model, &iter, DOWNLOADED_COL_DATA, &trans_info, -1);
00319
00320 if ( gnc_import_TransInfo_get_action(trans_info) == GNCImport_CLEAR
00321 && gnc_import_Settings_get_action_skip_enabled (gui->user_settings) == TRUE)
00322 {
00323 gnc_import_TransInfo_set_action(trans_info, GNCImport_SKIP);
00324 }
00325 else
00326 {
00327 gnc_import_TransInfo_set_action(trans_info, GNCImport_CLEAR);
00328 }
00329 refresh_model_row(gui, model, &iter, trans_info);
00330 }
00331
00332 static void
00333 gnc_gen_trans_update_toggled_cb (GtkCellRendererToggle *cell_renderer,
00334 gchar *path,
00335 GNCImportMainMatcher *gui)
00336 {
00337 GtkTreeModel *model;
00338 GtkTreeIter iter;
00339 GNCImportTransInfo *trans_info;
00340
00341 model = gtk_tree_view_get_model(gui->view);
00342 if (!gtk_tree_model_get_iter_from_string(model, &iter, path))
00343 return;
00344 gtk_tree_model_get(model, &iter, DOWNLOADED_COL_DATA, &trans_info, -1);
00345
00346 if ( gnc_import_TransInfo_get_action(trans_info) == GNCImport_UPDATE
00347 && gnc_import_Settings_get_action_skip_enabled (gui->user_settings) == TRUE)
00348 {
00349 gnc_import_TransInfo_set_action(trans_info, GNCImport_SKIP);
00350 }
00351 else
00352 {
00353 gnc_import_TransInfo_set_action(trans_info, GNCImport_UPDATE);
00354 }
00355 refresh_model_row(gui, model, &iter, trans_info);
00356 }
00357
00358 static void
00359 gnc_gen_trans_row_activated_cb (GtkTreeView *view,
00360 GtkTreePath *path,
00361 GtkTreeViewColumn *column,
00362 GNCImportMainMatcher *gui)
00363 {
00364 GtkTreeModel *model;
00365 GtkTreeIter iter;
00366 GNCImportTransInfo *trans_info;
00367
00368 model = gtk_tree_view_get_model(gui->view);
00369 if (!gtk_tree_model_get_iter(model, &iter, path))
00370 return;
00371 gtk_tree_model_get(model, &iter, DOWNLOADED_COL_DATA, &trans_info, -1);
00372
00373 switch (gnc_import_TransInfo_get_action (trans_info))
00374 {
00375 case GNCImport_ADD:
00376 if (gnc_import_TransInfo_is_balanced(trans_info) == FALSE)
00377 {
00378 run_account_picker_dialog (gui, model, &iter, trans_info);
00379 }
00380 break;
00381 case GNCImport_CLEAR:
00382 case GNCImport_UPDATE:
00383 run_match_dialog (gui, trans_info);
00384 break;
00385 case GNCImport_SKIP:
00386
00387 break;
00388 default:
00389 PERR("I don't know what to do! (Yet...)");
00390 }
00391 refresh_model_row(gui, model, &iter, trans_info);
00392 }
00393
00394 static void
00395 gnc_gen_trans_row_changed_cb (GtkTreeSelection *selection,
00396 GNCImportMainMatcher *gui)
00397 {
00398 GtkTreeModel *model;
00399 GtkTreeIter iter;
00400
00401 if (!gtk_tree_selection_get_selected(selection, &model, &iter))
00402 return;
00403 gtk_tree_selection_unselect_iter(selection, &iter);
00404 }
00405
00406 static GtkTreeViewColumn *
00407 add_text_column(GtkTreeView *view, const gchar *title, int col_num)
00408 {
00409 GtkCellRenderer *renderer;
00410 GtkTreeViewColumn *column;
00411
00412 renderer = gtk_cell_renderer_text_new();
00413 g_object_set(G_OBJECT(renderer),
00414 "foreground", "black",
00415 "foreground-set", TRUE,
00416 NULL);
00417 column = gtk_tree_view_column_new_with_attributes
00418 (title, renderer,
00419 "text", col_num,
00420 "background", DOWNLOADED_COL_COLOR,
00421 NULL);
00422 gtk_tree_view_column_set_sort_column_id(column, col_num);
00423 g_object_set(G_OBJECT(column),
00424 "reorderable", TRUE,
00425 "resizable", TRUE,
00426 NULL);
00427 gtk_tree_view_append_column(view, column);
00428 return column;
00429 }
00430
00431 static GtkTreeViewColumn *
00432 add_toggle_column(GtkTreeView *view, const gchar *title, int col_num,
00433 GCallback cb_fn, gpointer cb_arg)
00434 {
00435 GtkCellRenderer *renderer;
00436 GtkTreeViewColumn *column;
00437
00438 renderer = gtk_cell_renderer_toggle_new();
00439 column = gtk_tree_view_column_new_with_attributes
00440 (title, renderer,
00441 "active", col_num,
00442 "cell-background", DOWNLOADED_COL_COLOR,
00443 NULL);
00444 gtk_tree_view_column_set_sort_column_id(column, col_num);
00445 g_object_set(G_OBJECT(column),
00446 "reorderable", TRUE,
00447 NULL);
00448 g_signal_connect(renderer, "toggled", cb_fn, cb_arg);
00449 gtk_tree_view_append_column(view, column);
00450 return column;
00451 }
00452
00453 static void
00454 gnc_gen_trans_init_view (GNCImportMainMatcher *info,
00455 gboolean show_account,
00456 gboolean show_update)
00457 {
00458 GtkTreeView *view;
00459 GtkListStore *store;
00460 GtkCellRenderer *renderer;
00461 GtkTreeViewColumn *column;
00462 GtkTreeSelection *selection;
00463
00464 view = info->view;
00465 store = gtk_list_store_new(NUM_DOWNLOADED_COLS,
00466 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
00467 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN,
00468 G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_STRING,
00469 GDK_TYPE_PIXBUF, G_TYPE_POINTER, G_TYPE_STRING);
00470 gtk_tree_view_set_model(view, GTK_TREE_MODEL(store));
00471 g_object_unref(store);
00472
00473
00474 add_text_column(view, _("Date"), DOWNLOADED_COL_DATE);
00475 column = add_text_column(view, _("Account"), DOWNLOADED_COL_ACCOUNT);
00476 gtk_tree_view_column_set_visible(column, show_account);
00477 add_text_column(view, _("Amount"), DOWNLOADED_COL_AMOUNT);
00478 add_text_column(view, _("Description"), DOWNLOADED_COL_DESCRIPTION);
00479 add_text_column(view, _("Memo"), DOWNLOADED_COL_MEMO);
00480 add_toggle_column(view, _("A"), DOWNLOADED_COL_ACTION_ADD,
00481 G_CALLBACK(gnc_gen_trans_add_toggled_cb), info);
00482 column = add_toggle_column(view, _("U+R"), DOWNLOADED_COL_ACTION_UPDATE,
00483 G_CALLBACK(gnc_gen_trans_update_toggled_cb), info);
00484 gtk_tree_view_column_set_visible(column, show_update);
00485 add_toggle_column(view, _("R"), DOWNLOADED_COL_ACTION_CLEAR,
00486 G_CALLBACK(gnc_gen_trans_clear_toggled_cb), info);
00487
00488
00489 renderer = gtk_cell_renderer_pixbuf_new();
00490 g_object_set(renderer, "xalign", 0.0, NULL);
00491 column = gtk_tree_view_column_new_with_attributes(_("Info"), renderer,
00492 "pixbuf", DOWNLOADED_COL_ACTION_PIXBUF,
00493 "cell-background", DOWNLOADED_COL_COLOR,
00494 NULL);
00495 renderer = gtk_cell_renderer_text_new();
00496 g_object_set(G_OBJECT(renderer),
00497 "foreground", "black",
00498 "foreground-set", TRUE,
00499 NULL);
00500 gtk_tree_view_column_pack_start(column, renderer, TRUE);
00501 gtk_tree_view_column_set_attributes(column, renderer,
00502 "text", DOWNLOADED_COL_ACTION_INFO,
00503 "background", DOWNLOADED_COL_COLOR,
00504 NULL);
00505 gtk_tree_view_column_set_sort_column_id(column, DOWNLOADED_COL_ACTION_INFO);
00506 g_object_set(G_OBJECT(column),
00507 "reorderable", TRUE,
00508 "resizable", TRUE,
00509 NULL);
00510 gtk_tree_view_append_column(info->view, column);
00511
00512
00513 selection = gtk_tree_view_get_selection(info->view);
00514 g_signal_connect(info->view, "row-activated",
00515 G_CALLBACK(gnc_gen_trans_row_activated_cb), info);
00516 g_signal_connect(selection, "changed",
00517 G_CALLBACK(gnc_gen_trans_row_changed_cb), info);
00518 }
00519
00520 GNCImportMainMatcher *gnc_gen_trans_list_new (GtkWidget *parent,
00521 const gchar* heading,
00522 gboolean all_from_same_account,
00523 gint match_date_hardlimit)
00524 {
00525 GNCImportMainMatcher *info;
00526 GladeXML *xml;
00527 GtkWidget *heading_label;
00528 gboolean show_update;
00529
00530 info = g_new0 (GNCImportMainMatcher, 1);
00531
00532
00533 info->user_settings = gnc_import_Settings_new ();
00534 gnc_import_Settings_set_match_date_hardlimit (info->user_settings, match_date_hardlimit);
00535
00536
00537 xml = gnc_glade_xml_new ("generic-import.glade", "transaction_matcher");
00538
00539 info->dialog = glade_xml_get_widget (xml, "transaction_matcher");
00540 g_assert (info->dialog != NULL);
00541 info->view = GTK_TREE_VIEW(glade_xml_get_widget (xml, "downloaded_view"));
00542 g_assert (info->view != NULL);
00543
00544 show_update = gnc_import_Settings_get_action_update_enabled(info->user_settings);
00545 gnc_gen_trans_init_view(info, all_from_same_account, show_update);
00546 heading_label = glade_xml_get_widget (xml, "heading_label");
00547 g_assert (heading_label != NULL);
00548
00549
00550
00551
00552
00553
00554 glade_xml_signal_connect_data(xml, "on_matcher_ok_clicked",
00555 G_CALLBACK(on_matcher_ok_clicked),
00556 info);
00557 glade_xml_signal_connect_data(xml, "on_matcher_cancel_clicked",
00558 G_CALLBACK(on_matcher_cancel_clicked),
00559 info);
00560 glade_xml_signal_connect_data(xml, "on_matcher_help_clicked",
00561 G_CALLBACK(on_matcher_help_clicked),
00562 info);
00563
00564
00565 gdk_color_parse(COLOR_RED, &info->color_back_red);
00566 gdk_color_parse(COLOR_YELLOW, &info->color_back_yellow);
00567 gdk_color_parse(COLOR_GREEN, &info->color_back_green);
00568
00569 if (heading)
00570 gtk_label_set_text (GTK_LABEL (heading_label), heading);
00571
00572 gnc_restore_window_size(GCONF_SECTION, GTK_WINDOW(info->dialog));
00573 gtk_widget_show_all (GTK_WIDGET (info->dialog));
00574
00575 info->transaction_processed_cb = NULL;
00576
00577 return info;
00578 }
00579
00580 void gnc_gen_trans_list_add_tp_cb(GNCImportMainMatcher *info,
00581 GNCTransactionProcessedCB trans_processed_cb,
00582 gpointer user_data)
00583 {
00584 info->user_data = user_data;
00585 info->transaction_processed_cb = trans_processed_cb;
00586 }
00587
00588
00589 gboolean gnc_gen_trans_list_run (GNCImportMainMatcher *info)
00590 {
00591 gboolean result;
00592
00593
00594 result = gtk_dialog_run (GTK_DIALOG (info->dialog));
00595
00596
00597
00598
00599
00600 return result;
00601 }
00602
00603
00604 static void
00605 refresh_model_row (GNCImportMainMatcher *gui,
00606 GtkTreeModel *model,
00607 GtkTreeIter *iter,
00608 GNCImportTransInfo *info)
00609 {
00610 GtkListStore *store;
00611 GtkTreeSelection *selection;
00612 gchar *tmp, *imbalance, *text, *color;
00613 const gchar *ro_text;
00614 Split *split;
00615 g_assert (gui);
00616 g_assert (model);
00617 g_assert (info);
00618
00619
00620 store = GTK_LIST_STORE(model);
00621 gtk_list_store_set(store, iter, DOWNLOADED_COL_DATA, info, -1);
00622
00623
00624 split = gnc_import_TransInfo_get_fsplit (info);
00625 g_assert(split);
00626 ro_text = xaccAccountGetName(xaccSplitGetAccount(split));
00627 gtk_list_store_set(store, iter, DOWNLOADED_COL_ACCOUNT, ro_text, -1);
00628
00629
00630
00631 text =
00632 qof_print_date ( xaccTransGetDate( gnc_import_TransInfo_get_trans(info) ) );
00633 gtk_list_store_set(store, iter, DOWNLOADED_COL_DATE, text, -1);
00634 g_free(text);
00635
00636
00637 ro_text = xaccPrintAmount
00638 (xaccSplitGetAmount (split),
00639 gnc_split_amount_print_info(split, TRUE)
00640 );
00641 gtk_list_store_set(store, iter, DOWNLOADED_COL_AMOUNT, ro_text, -1);
00642
00643
00644 ro_text = xaccTransGetDescription(gnc_import_TransInfo_get_trans(info) );
00645 gtk_list_store_set(store, iter, DOWNLOADED_COL_DESCRIPTION, ro_text, -1);
00646
00647
00648 ro_text = xaccSplitGetMemo(split);
00649 gtk_list_store_set(store, iter, DOWNLOADED_COL_MEMO, ro_text, -1);
00650
00651
00652
00653
00654 ro_text = text = color = NULL;
00655 switch (gnc_import_TransInfo_get_action(info))
00656 {
00657 case GNCImport_ADD:
00658 if (gnc_import_TransInfo_is_balanced(info) == TRUE)
00659 {
00660 ro_text = _("New, already balanced");
00661 color = COLOR_GREEN;
00662 }
00663 else
00664 {
00665
00666
00667 imbalance =
00668 g_strdup
00669 (xaccPrintAmount
00670 (gnc_numeric_neg(xaccTransGetImbalanceValue
00671 (gnc_import_TransInfo_get_trans(info) )),
00672 gnc_commodity_print_info
00673 (xaccTransGetCurrency(gnc_import_TransInfo_get_trans (info)),
00674 TRUE) ));
00675 if (gnc_import_TransInfo_get_destacc (info) != NULL)
00676 {
00677 color = COLOR_GREEN;
00678 tmp = gnc_account_get_full_name
00679 (gnc_import_TransInfo_get_destacc (info));
00680 if (gnc_import_TransInfo_get_destacc_selected_manually(info)
00681 == TRUE)
00682 {
00683 text =
00684
00685
00686 g_strdup_printf(_("New, transfer %s to (manual) \"%s\""),
00687 imbalance, tmp);
00688 }
00689 else
00690 {
00691 text =
00692
00693
00694 g_strdup_printf(_("New, transfer %s to (auto) \"%s\""),
00695 imbalance, tmp);
00696 }
00697 g_free (tmp);
00698
00699 }
00700 else
00701 {
00702 color = COLOR_YELLOW;
00703 text =
00704
00705 g_strdup_printf(_("New, UNBALANCED (need acct to transfer %s)!"),
00706 imbalance);
00707 }
00708 g_free (imbalance);
00709 }
00710 break;
00711 case GNCImport_CLEAR:
00712 if (gnc_import_TransInfo_get_selected_match(info))
00713 {
00714 color = COLOR_GREEN;
00715 if (gnc_import_TransInfo_get_match_selected_manually(info) == TRUE)
00716 {
00717 ro_text = _("Reconcile (manual) match");
00718 }
00719 else
00720 {
00721 ro_text = _("Reconcile (auto) match");
00722 }
00723 }
00724 else
00725 {
00726 color = COLOR_RED;
00727 ro_text = _("Match missing!");
00728 }
00729 break;
00730 case GNCImport_UPDATE:
00731 if (gnc_import_TransInfo_get_selected_match(info))
00732 {
00733 color = COLOR_GREEN;
00734 if (gnc_import_TransInfo_get_match_selected_manually(info) == TRUE)
00735 {
00736 ro_text = _("Update and reconcile (manual) match");
00737 }
00738 else
00739 {
00740 ro_text = _("Update and reconcile (auto) match");
00741 }
00742 }
00743 else
00744 {
00745 color = COLOR_RED;
00746 ro_text = _("Match missing!");
00747 }
00748 break;
00749 case GNCImport_SKIP:
00750 color = COLOR_RED;
00751 ro_text = _("Do not import (no action selected)");
00752 break;
00753 default:
00754 color = "white";
00755 ro_text = "WRITEME, this is an unknown action";
00756 }
00757
00758 gtk_list_store_set(store, iter,
00759 DOWNLOADED_COL_COLOR, color,
00760 DOWNLOADED_COL_ACTION_INFO, ro_text ? ro_text : text,
00761 -1);
00762 if (text)
00763 g_free(text);
00764
00765
00766 gtk_list_store_set(store, iter,
00767 DOWNLOADED_COL_ACTION_ADD,
00768 gnc_import_TransInfo_get_action(info) == GNCImport_ADD,
00769 -1);
00770 if (gnc_import_TransInfo_get_action(info) == GNCImport_SKIP)
00771 {
00772
00773 gtk_list_store_set(store, iter,
00774 DOWNLOADED_COL_ACTION_PIXBUF,
00775 gen_probability_pixbuf( gnc_import_MatchInfo_get_probability
00776 ( gnc_import_TransInfo_get_selected_match (info)),
00777 gui->user_settings,
00778 GTK_WIDGET(gui->view)),
00779 -1);
00780 }
00781
00782 gtk_list_store_set(store, iter,
00783 DOWNLOADED_COL_ACTION_CLEAR,
00784 gnc_import_TransInfo_get_action(info) == GNCImport_CLEAR,
00785 -1);
00786 if (gnc_import_TransInfo_get_action(info) == GNCImport_CLEAR)
00787 {
00788
00789 gtk_list_store_set(store, iter,
00790 DOWNLOADED_COL_ACTION_PIXBUF,
00791 gen_probability_pixbuf( gnc_import_MatchInfo_get_probability
00792 ( gnc_import_TransInfo_get_selected_match (info)),
00793 gui->user_settings,
00794 GTK_WIDGET(gui->view)),
00795 -1);
00796 }
00797
00798 gtk_list_store_set(store, iter,
00799 DOWNLOADED_COL_ACTION_UPDATE,
00800 gnc_import_TransInfo_get_action(info) == GNCImport_UPDATE,
00801 -1);
00802 if (gnc_import_TransInfo_get_action(info) == GNCImport_UPDATE)
00803 {
00804
00805 gtk_list_store_set(store, iter,
00806 DOWNLOADED_COL_ACTION_PIXBUF,
00807 gen_probability_pixbuf( gnc_import_MatchInfo_get_probability
00808 ( gnc_import_TransInfo_get_selected_match (info)),
00809 gui->user_settings,
00810 GTK_WIDGET(gui->view)),
00811 -1);
00812 }
00813
00814 selection = gtk_tree_view_get_selection(gui->view);
00815 gtk_tree_selection_unselect_all(selection);
00816 }
00817
00818
00819 void gnc_gen_trans_list_add_trans(GNCImportMainMatcher *gui, Transaction *trans)
00820 {
00821 gnc_gen_trans_list_add_trans_with_ref_id(gui, trans, 0);
00822 return;
00823 }
00824
00825 void gnc_gen_trans_list_add_trans_with_ref_id(GNCImportMainMatcher *gui, Transaction *trans, guint32 ref_id)
00826 {
00827 GNCImportTransInfo * transaction_info = NULL;
00828 GtkTreeModel *model;
00829 GtkTreeIter iter;
00830 g_assert (gui);
00831 g_assert (trans);
00832
00833
00834 if (gnc_import_exists_online_id (trans))
00835 return;
00836 else
00837 {
00838 transaction_info = gnc_import_TransInfo_new(trans, NULL);
00839 gnc_import_TransInfo_set_ref_id(transaction_info, ref_id);
00840
00841 gnc_import_TransInfo_init_matches(transaction_info,
00842 gui->user_settings);
00843
00844 model = gtk_tree_view_get_model(gui->view);
00845 gtk_list_store_append(GTK_LIST_STORE(model), &iter);
00846 refresh_model_row (gui, model, &iter, transaction_info);
00847 }
00848 return;
00849 }
00850
00851
00852 static void
00853 automatch_store_transactions (GNCImportMainMatcher *info,
00854 GtkTreeModel *model,
00855 GtkTreeIter *iter,
00856 GNCImportTransInfo *trans_info)
00857 {
00858
00859 if (gnc_import_TransInfo_refresh_destacc(trans_info, NULL))
00860 {
00861 refresh_model_row(info, model, iter, trans_info);
00862 }
00863 }
00864
00865 GtkWidget *gnc_gen_trans_list_widget (GNCImportMainMatcher *info)
00866 {
00867 g_assert(info);
00868 return info->dialog;
00869 }
00870