X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=inline;f=src%2Fimport.c;fp=src%2Fimport.c;h=0000000000000000000000000000000000000000;hb=59c5e08a64798d4303ae7eb3a2713bc93d98fa7b;hp=5ca1ca256555b3d298c2faf91ff015c8dd5d488e;hpb=8988b3bef0760b4cab8144715cc3d8f55688861c;p=chaz%2Fhomebank
diff --git a/src/import.c b/src/import.c
deleted file mode 100644
index 5ca1ca2..0000000
--- a/src/import.c
+++ /dev/null
@@ -1,2640 +0,0 @@
-/* HomeBank -- Free, easy, personal accounting for everyone.
- * Copyright (C) 1995-2014 Maxime DOYEN
- *
- * This file is part of HomeBank.
- *
- * HomeBank is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * HomeBank is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-#include "homebank.h"
-
-#include "import.h"
-
-#include "list_account.h"
-#include "list_operation.h"
-
-#include "ui-account.h"
-#include "dsp_mainwindow.h"
-#include "imp_qif.h"
-
-#ifndef NOOFX
-#include
-#endif
-
-/****************************************************************************/
-/* Debug macros */
-/****************************************************************************/
-#define MYDEBUG 0
-
-#if MYDEBUG
-#define DB(x) (x);
-#else
-#define DB(x);
-#endif
-
-#define FORCE_SIZE 1
-#define HEAD_IMAGE 1
-#define SIDE_IMAGE 0
-
-#define SCOEF 0.6
-
-/* our global datas */
-extern struct HomeBank *GLOBALS;
-extern struct Preferences *PREFS;
-
-
-static gchar *page_titles[] =
-{
- N_("HomeBank Import Assistant"),
- N_("File to import"),
- N_("File analysis results"),
- N_("Adjust what to import"),
- N_("Update your accounts")
-};
-
-extern gchar *CYA_IMPORT_DATEORDER[];
-
-static GtkWidget *ui_acc_affect_listview_new(void);
-guint32 ui_acc_affect_listview_get_selected_key(GtkTreeView *treeview);
-void ui_acc_affect_listview_add(GtkTreeView *treeview, Account *item);
-
-
-/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
-
-
-
-
-Account *import_create_account(gchar *name, gchar *number)
-{
-Account *accitem, *existitem;
-
- //first check we do not have already this imported account
- existitem = da_acc_get_by_imp_name(name);
- if(existitem != NULL)
- return existitem;
-
- accitem = da_acc_malloc();
- accitem->key = da_acc_get_max_key() + 1;
- accitem->pos = da_acc_length() + 1;
-
- // then we check a same named account
- existitem = da_acc_get_by_name(name);
- if(existitem == NULL)
- {
- accitem->name = g_strdup(name);
- }
- else
- {
- accitem->name = g_strdup_printf(_("(account %d)"), accitem->key);
- }
-
- accitem->imp_name = g_strdup(name);
-
- if(number)
- accitem->number = g_strdup(number);
-
- accitem->imported = TRUE;
- da_acc_insert(accitem);
-
- return accitem;
-}
-
-
-static GList *homebank_csv_import(gchar *filename, ImportContext *ictx)
-{
-GIOChannel *io;
-GList *list = NULL;
-static gint csvtype[7] = {
- CSV_DATE,
- CSV_INT,
- CSV_STRING,
- CSV_STRING,
- CSV_STRING,
- CSV_DOUBLE,
- CSV_STRING,
- };
-
- DB( g_print("\n[import] homebank csv\n") );
-
- io = g_io_channel_new_file(filename, "r", NULL);
- if(io != NULL)
- {
- gchar *tmpstr;
- gint io_stat;
- gboolean valid;
- gint count = 0;
- gint error = 0;
- Account *tmp_acc;
- Payee *payitem;
- Category *catitem;
- GError *err = NULL;
-
-
- gchar *accname = g_strdup_printf(_("(account %d)"), da_acc_get_max_key() + 1);
- tmp_acc = import_create_account(accname, NULL);
- g_free(accname);
-
-
- if( ictx->encoding != NULL )
- {
- g_io_channel_set_encoding(io, ictx->encoding, NULL);
- }
-
- for(;;)
- {
- io_stat = g_io_channel_read_line(io, &tmpstr, NULL, NULL, &err);
- if( io_stat == G_IO_STATUS_EOF)
- break;
- if( io_stat == G_IO_STATUS_ERROR )
- {
- DB (g_print(" + ERROR %s\n",err->message));
- break;
- }
- if( io_stat == G_IO_STATUS_NORMAL)
- {
- if( *tmpstr != '\0' )
- {
- gchar **str_array;
- Transaction *newope = da_transaction_malloc();
-
- hb_string_strip_crlf(tmpstr);
-
- /* control validity here */
- valid = hb_string_csv_valid(tmpstr, 8, csvtype);
-
- //DB( g_print("valid %d, '%s'\n", valid, tmpstr) );
-
- if( !valid )
- {
- error++;
- }
- else
- {
- count++;
-
- str_array = g_strsplit (tmpstr, ";", 8);
- // 0:date; 1:paymode; 2:info; 3:payee, 4:wording; 5:amount; 6:category; 7:tags
-
- DB( g_print(" ->%s\n", tmpstr ) );
-
- newope->date = hb_date_get_julian(str_array[0], ictx->datefmt);
- if( newope->date == 0 )
- ictx->cnt_err_date++;
-
- newope->paymode = atoi(str_array[1]);
- newope->info = g_strdup(str_array[2]);
-
- /* payee */
- g_strstrip(str_array[3]);
- payitem = da_pay_get_by_name(str_array[3]);
- if(payitem == NULL)
- {
- payitem = da_pay_malloc();
- payitem->name = g_strdup(str_array[3]);
- payitem->imported = TRUE;
- da_pay_append(payitem);
-
- if( payitem->imported == TRUE )
- ictx->cnt_new_pay += 1;
- }
-
- newope->kpay = payitem->key;
- newope->wording = g_strdup(str_array[4]);
- newope->amount = hb_qif_parser_get_amount(str_array[5]);
-
- /* category */
- g_strstrip(str_array[6]);
- catitem = da_cat_append_ifnew_by_fullname(str_array[6], TRUE);
- if( catitem != NULL )
- {
- newope->kcat = catitem->key;
-
- if( catitem->imported == TRUE && catitem->key > 0 )
- ictx->cnt_new_cat += 1;
- }
-
- /* tags */
- transaction_tags_parse(newope, str_array[7]);
-
-
- newope->kacc = tmp_acc->key;
- //newope->kxferacc = accnum;
-
- newope->flags |= OF_ADDED;
-
- if( newope->amount > 0)
- newope->flags |= OF_INCOME;
-
- /*
- DB( g_print(" storing %s : %s : %s :%s : %s : %s : %s : %s\n",
- str_array[0], str_array[1], str_array[2],
- str_array[3], str_array[4], str_array[5],
- str_array[6], str_array[7]
- ) );
- */
-
- list = g_list_append(list, newope);
-
- g_strfreev (str_array);
- }
- }
- g_free(tmpstr);
- }
-
- }
- g_io_channel_unref (io);
-
- /*
- ui_dialog_msg_infoerror(data->window, error > 0 ? GTK_MESSAGE_ERROR : GTK_MESSAGE_INFO,
- _("Transaction CSV import result"),
- _("%d transactions inserted\n%d errors in the file"),
- count, error);
- */
- }
-
-
- return list;
-}
-
-#ifndef NOOFX
-/*
-**** OFX part
-****
-**** this part is quite weird,but works
-** id is ACCTID
-
-*/
-
-static Account * ofx_get_account_by_id(gchar *id)
-{
-GList *lacc, *list;
-
- DB( g_print("\n[import] ofx_get_account_by_id\n") );
- DB( g_print(" -> searching for '%s'\n",id) );
-
- lacc = list = g_hash_table_get_values(GLOBALS->h_acc);
- while (list != NULL)
- {
- Account *accitem = list->data;
-
- if( accitem->imported == FALSE)
- {
- if(accitem->name && accitem->number && strlen(accitem->number) )
- {
- // todo: maybe smartness should be done here
- if(g_strstr_len(id, -1, accitem->number) != NULL)
- {
- return accitem;
- }
- }
- }
- list = g_list_next(list);
- }
- g_list_free(lacc);
- return NULL;
-}
-
-/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
-
-/**
- * ofx_proc_account_cb:
- *
- * The ofx_proc_account_cb event is always generated first, to allow the application to create accounts
- * or ask the user to match an existing account before the ofx_proc_statement and ofx_proc_transaction
- * event are received. An OfxAccountData is passed to this event.
- *
- */
-static LibofxProcStatementCallback
-ofx_proc_account_cb(const struct OfxAccountData data, OfxContext *ctx)
-{
-Account *tmp_acc, *dst_acc;
-
- DB( g_print("** ofx_proc_account_cb()\n") );
-
- if(data.account_id_valid==true)
- {
- DB( g_print(" account_id: %s\n", data.account_id) );
- DB( g_print(" account_name: %s\n", data.account_name) );
- }
-
- //if(data.account_number_valid==true)
- //{
- DB( g_print(" account_number: %s\n", data.account_number) );
- //}
-
-
- if(data.account_type_valid==true)
- {
- DB( g_print(" account_type: %d\n", data.account_type) );
- }
-
- if(data.currency_valid==true)
- {
- DB( g_print(" currency: %s\n", data.currency) );
- }
-
-
- //find target account
- dst_acc = ofx_get_account_by_id( (gchar *)data.account_id );
- DB( g_print(" ** hb account found result is %x\n", (unsigned int)dst_acc) );
-
-
- // in every case we create an account here
- tmp_acc = import_create_account((gchar *)data.account_name, (gchar *)data.account_id);
- DB( g_print(" -> creating tmp account: %d %s - %x\n", tmp_acc->key, data.account_id, (unsigned int)tmp_acc) );
-
- if( dst_acc != NULL )
- {
- tmp_acc->imp_key = dst_acc->key;
- }
-
-
- ctx->curr_acc = tmp_acc;
- ctx->curr_acc_isnew = TRUE;
-
-
-
-
-
-
-
-
- DB( fputs("\n",stdout) );
- return 0;
-}
-
-
-/**
- * ofx_proc_statement_cb:
- *
- * The ofx_proc_statement_cb event is sent after all ofx_proc_transaction events have been sent.
- * An OfxStatementData is passed to this event.
- *
- */
-static LibofxProcStatementCallback
-ofx_proc_statement_cb(const struct OfxStatementData data, OfxContext *ctx)
-{
- DB( g_print("** ofx_proc_statement_cb()\n") );
-
-#ifdef MYDEBUG
- if(data.ledger_balance_date_valid==true)
- {
- struct tm temp_tm;
-
- temp_tm = *localtime(&(data.ledger_balance_date));
- g_print("ledger_balance_date : %d%s%d%s%d%s", temp_tm.tm_mday, "/", temp_tm.tm_mon+1, "/", temp_tm.tm_year+1900, "\n");
- }
-#endif
-
- if(data.ledger_balance_valid==true)
- {
- if( ctx->curr_acc != NULL && ctx->curr_acc_isnew == TRUE )
- {
- ctx->curr_acc->initial = data.ledger_balance;
- }
- DB( printf("ledger_balance: $%.2f%s",data.ledger_balance,"\n") );
- }
-
- return 0;
-}
-
-/**
- * ofx_proc_statement_cb:
- *
- * An ofx_proc_transaction_cb event is generated for every transaction in the ofx response,
- * after ofx_proc_statement (and possibly ofx_proc_security is generated.
- * An OfxTransactionData structure is passed to this event.
- *
- */
-static LibofxProcStatementCallback
-ofx_proc_transaction_cb(const struct OfxTransactionData data, OfxContext *ctx)
-{
-struct tm temp_tm;
-GDate *date;
-Transaction *newope;
-
- DB( g_print("** ofx_proc_transaction_cb()\n") );
-
- newope = da_transaction_malloc();
-
-// date
- if(data.date_posted_valid==true)
- {
- temp_tm = *localtime(&(data.date_posted));
- date = g_date_new();
- g_date_set_dmy(date, temp_tm.tm_mday, temp_tm.tm_mon+1, temp_tm.tm_year+1900);
- newope->date = g_date_get_julian(date);
- g_date_free(date);
- }
-
-// amount
- if(data.amount_valid==true)
- {
- newope->amount = data.amount;
-
- }
-// check number
- if(data.check_number_valid==true)
- {
- newope->info = g_strdup(data.check_number);
- }
- //todo: reference_number ?
-
-// wording
- if(data.name_valid==true)
- {
- newope->wording = g_strdup(data.name);
- }
-
-//memo ( new for v4.2)
-
- DB( g_print(" -> memo is='%d'\n", data.memo_valid) );
-
-
- if(data.memo_valid==true)
- {
- gchar *old = NULL;
-
- switch(PREFS->dtex_ofxmemo)
- {
- case 1: //add to info
- old = newope->info;
- if(old == NULL)
- newope->info = g_strdup(data.memo);
- else
- {
- newope->info = g_strjoin(" ", old, data.memo, NULL);
- g_free(old);
- }
- break;
-
- case 2: //add to description
- old = newope->wording;
- if(old == NULL)
- newope->wording = g_strdup(data.memo);
- else
- {
- newope->wording = g_strjoin(" ", old, data.memo, NULL);
- g_free(old);
- }
-
- DB( g_print(" -> should concatenate ='%s'\n", data.memo) );
- DB( g_print(" -> old='%s', new ='%s'\n", old, newope->wording) );
-
- break;
- }
- }
-
-// payment
- if(data.transactiontype_valid==true)
- {
- switch(data.transactiontype)
- {
- //#740373
- case OFX_CREDIT:
- if(newope->amount < 0)
- newope->amount *= -1;
- break;
- case OFX_DEBIT:
- if(newope->amount > 0)
- newope->amount *= -1;
- break;
- case OFX_INT:
- newope->paymode = PAYMODE_XFER;
- break;
- case OFX_DIV:
- newope->paymode = PAYMODE_XFER;
- break;
- case OFX_FEE:
- newope->paymode = PAYMODE_FEE;
- break;
- case OFX_SRVCHG:
- newope->paymode = PAYMODE_XFER;
- break;
- case OFX_DEP:
- newope->paymode = PAYMODE_DEPOSIT;
- break;
- case OFX_ATM:
- newope->paymode = PAYMODE_CASH;
- break;
- case OFX_POS:
- if(ctx->curr_acc && ctx->curr_acc->type == ACC_TYPE_CREDITCARD)
- newope->paymode = PAYMODE_CCARD;
- else
- newope->paymode = PAYMODE_DCARD;
- break;
- case OFX_XFER:
- newope->paymode = PAYMODE_XFER;
- break;
- case OFX_CHECK:
- newope->paymode = PAYMODE_CHECK;
- break;
- case OFX_PAYMENT:
- newope->paymode = PAYMODE_EPAYMENT;
- break;
- case OFX_CASH:
- newope->paymode = PAYMODE_CASH;
- break;
- case OFX_DIRECTDEP:
- newope->paymode = PAYMODE_DEPOSIT;
- break;
- case OFX_DIRECTDEBIT:
- newope->paymode = PAYMODE_XFER;
- break;
- case OFX_REPEATPMT:
- newope->paymode = PAYMODE_REPEATPMT;
- break;
- case OFX_OTHER:
-
- break;
- default :
-
- break;
- }
- }
-
- if( ctx->curr_acc )
- {
-
- newope->kacc = ctx->curr_acc->key;
- newope->flags |= OF_ADDED;
-
- if( newope->amount > 0)
- newope->flags |= OF_INCOME;
-
- /* ensure utf-8 here, has under windows, libofx not always return utf-8 as it should */
- #ifndef G_OS_UNIX
- DB( printf(" ensure UTF-8\n") );
-
- newope->info = homebank_utf8_ensure(newope->info);
- newope->wording = homebank_utf8_ensure(newope->wording);
- #endif
-
- ctx->trans_list = g_list_append(ctx->trans_list, newope);
-
- DB( printf(" insert newope: acc=%d\n", newope->kacc) );
-
- if( ctx->curr_acc_isnew == TRUE )
- {
- ctx->curr_acc->initial -= data.amount;
- }
- }
- else
- {
- da_transaction_free(newope);
- }
-
- return 0;
-}
-
-
-
-static LibofxProcStatusCallback
-ofx_proc_status_cb(const struct OfxStatusData data, OfxContext *ctx)
-{
- DB( g_print("** ofx_proc_status_cb()\n") );
-
- if(data.ofx_element_name_valid==true){
- DB( g_print(" Ofx entity this status is relevent to: '%s'\n", data.ofx_element_name) );
- }
- if(data.severity_valid==true){
- DB( g_print(" Severity: ") );
- switch(data.severity){
- case INFO : DB( g_print("INFO\n") );
- break;
- case WARN : DB( g_print("WARN\n") );
- break;
- case ERROR : DB( g_print("ERROR\n") );
- break;
- default: DB( g_print("WRITEME: Unknown status severity!\n") );
- }
- }
- if(data.code_valid==true){
- DB( g_print(" Code: %d, name: %s\n Description: %s\n", data.code, data.name, data.description) );
- }
- if(data.server_message_valid==true){
- DB( g_print(" Server Message: %s\n", data.server_message) );
- }
- DB( g_print("\n") );
-
- return 0;
-}
-
-
-static GList *homebank_ofx_import(gchar *filename, ImportContext *ictx)
-{
-OfxContext ctx = { 0 };
-
-/*extern int ofx_PARSER_msg;
-extern int ofx_DEBUG_msg;
-extern int ofx_WARNING_msg;
-extern int ofx_ERROR_msg;
-extern int ofx_INFO_msg;
-extern int ofx_STATUS_msg;*/
-
- DB( g_print("\n[import] ofx import (libofx=%s) \n", LIBOFX_VERSION_RELEASE_STRING) );
-
- /*ofx_PARSER_msg = false;
- ofx_DEBUG_msg = false;
- ofx_WARNING_msg = false;
- ofx_ERROR_msg = false;
- ofx_INFO_msg = false;
- ofx_STATUS_msg = false;*/
-
- LibofxContextPtr libofx_context = libofx_get_new_context();
-
- ofx_set_status_cb (libofx_context, (LibofxProcStatusCallback) ofx_proc_status_cb , &ctx);
- ofx_set_statement_cb (libofx_context, (LibofxProcStatementCallback) ofx_proc_statement_cb , &ctx);
- ofx_set_account_cb (libofx_context, (LibofxProcAccountCallback) ofx_proc_account_cb , &ctx);
- ofx_set_transaction_cb(libofx_context, (LibofxProcTransactionCallback)ofx_proc_transaction_cb, &ctx);
-
-#ifdef G_OS_WIN32
- //#932959: windows don't like utf8 path, so convert
- gchar *file = g_win32_locale_filename_from_utf8(filename);
- libofx_proc_file(libofx_context, file, AUTODETECT);
- g_free(file);
-#else
- libofx_proc_file(libofx_context, filename, AUTODETECT);
-#endif
-
- libofx_free_context(libofx_context);
-
- return ctx.trans_list;
-}
-
-#endif
-
-
-static GList *homebank_qif_import(gchar *filename, ImportContext *ictx)
-{
-GList *list = NULL;
-
- DB( g_print("\n[import] homebank QIF\n") );
-
- //todo: context ?
- list = account_import_qif(filename, ictx);
-
- return list;
-}
-
-
-static void import_clearall(struct import_data *data)
-{
-GList *lxxx, *list;
-GtkTreeModel *model;
-
- DB( g_print("\n[import] clear all\n") );
-
- // clear transactions
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->imported_ope));
- gtk_list_store_clear (GTK_LIST_STORE(model));
-
- // 1: remove imported accounts
- lxxx = list = g_hash_table_get_values(GLOBALS->h_acc);
- while (list != NULL)
- {
- Account *item = list->data;
-
- if( item->imported == TRUE )
- {
- //DB( g_print(" -> remove acc %x '%s'\n", item, item->name) );
- da_acc_remove(item->key);
- }
- list = g_list_next(list);
- }
- g_list_free(lxxx);
-
- // 2: remove imported payees
- lxxx = list = g_hash_table_get_values(GLOBALS->h_pay);
- while (list != NULL)
- {
- Payee *item = list->data;
-
- if( item->imported == TRUE )
- {
- //DB( g_print(" -> remove pay '%s'\n", item->name) );
- da_pay_remove(item->key);
- }
- list = g_list_next(list);
- }
- g_list_free(lxxx);
-
- // 3: remove imported category
- lxxx = list = g_hash_table_get_values(GLOBALS->h_cat);
- while (list != NULL)
- {
- Category *item = list->data;
-
- if( item->imported == TRUE )
- {
- //DB( g_print(" -> remove cat '%s'\n", item->name) );
- da_cat_remove(item->key);
- }
- list = g_list_next(list);
- }
- g_list_free(lxxx);
-
- da_transaction_destroy(data->ictx.trans_list);
- data->ictx.trans_list = NULL;
- data->ictx.cnt_err_date = 0;
- data->ictx.cnt_new_pay = 0;
- data->ictx.cnt_new_cat = 0;
-
- data->ictx.datefmt = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_dateorder));
-
- data->ictx.cnt_initial_acc = da_acc_length();
-
-}
-
-
-/*
- * find duplicate transactions
- *
- * for
- *
- */
-static void import_find_duplicate_transactions(struct import_data *data)
-{
-GList *tmplist, *implist;
-Transaction *item;
-guint32 mindate;
-guint maxgap;
-
- DB( g_print("\n[import] find duplicate\n") );
-
- data->ictx.nb_duplicate = 0;
- if( data->ictx.trans_list )
- {
- /* 1: get import min bound date */
- tmplist = g_list_first(data->ictx.trans_list);
- item = tmplist->data;
- mindate = item->date;
- maxgap = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_maxgap));
-
- /* clear any previous same txn */
- implist = g_list_first(data->ictx.trans_list);
- while (implist != NULL)
- {
- Transaction *impope = implist->data;
-
- if(impope->same != NULL)
- {
- g_list_free(impope->same);
- impope->same = NULL;
- }
- implist = g_list_next(implist);
- }
-
- tmplist = g_list_first(GLOBALS->ope_list);
- while (tmplist != NULL)
- {
- Transaction *ope = tmplist->data;
-
- //if( ope->account == accnum && ope->date >= mindate )
- if( ope->date >= mindate )
- {
- //DB( g_print("should check here %d: %s\n", ope->date, ope->wording) );
-
- implist = g_list_first(data->ictx.trans_list);
- while (implist != NULL)
- {
- Transaction *impope = implist->data;
- Account *acc;
- guint acckey;
-
- //here we should test acc->imp_key and not impope->account
- acckey = impope->kacc;
- acc = da_acc_get(acckey);
- if( acc )
- {
- if( acc->imp_key > 0 )
- acckey = acc->imp_key;
- }
-
- if(
- (acckey == ope->kacc) &&
- (impope->amount == ope->amount) &&
- (ope->date <= (impope->date + maxgap)) && (ope->date >= (impope->date - maxgap))
- )
- {
- //DB( g_print(" found %d: %s\n", impope->date, impope->wording) );
-
- impope->same = g_list_append(impope->same, ope);
- data->ictx.nb_duplicate++;
- }
-
- implist = g_list_next(implist);
- }
- }
-
- tmplist = g_list_next(tmplist);
- }
- }
-
- DB( g_print(" nb_duplicate = %d\n", data->ictx.nb_duplicate) );
-
-
-}
-
-
-static void ui_import_populate_account(struct import_data *data)
-{
-GList *lacc, *list;
-
- DB( g_print("\n[import] populate account\n") );
-
- // clear accounts
- gtk_list_store_clear (GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_acc))));
-
-
- lacc = list = g_hash_table_get_values(GLOBALS->h_acc);
- while (list != NULL)
- {
- Account *item = list->data;
-
- if( item->imported == TRUE )
- {
- ui_acc_affect_listview_add(GTK_TREE_VIEW(data->LV_acc), item);
- }
- list = g_list_next(list);
- }
- g_list_free(lacc);
-
-}
-
-
-
-
-/* count account to be imported */
-static void import_analysis_count(struct import_data *data)
-{
-GList *lacc, *list;
-
- DB( g_print("\n[import] count_new_account\n") );
-
- data->ictx.cnt_new_acc = 0;
- data->ictx.cnt_new_ope = 0;
-
- /* count account */
- lacc = list = g_hash_table_get_values(GLOBALS->h_acc);
- while (list != NULL)
- {
- Account *item = list->data;
-
- if( item->imported == TRUE )
- {
- data->ictx.cnt_new_acc++;
- }
- list = g_list_next(list);
- }
- g_list_free(lacc);
-
- /* count transaction */
- data->ictx.cnt_new_ope = g_list_length(data->ictx.trans_list);
-
-}
-
-
-
-/* count transaction with checkbox 'import' */
-static void import_count_changes(struct import_data *data)
-{
-GList *lacc, *list;
-GtkTreeModel *model;
-GtkTreeIter iter;
-gboolean valid;
-
- DB( g_print("\n[import] count_final_changes\n") );
-
- data->imp_cnt_acc = 0;
-
- lacc = list = g_hash_table_get_values(GLOBALS->h_acc);
- while (list != NULL)
- {
- Account *item = list->data;
-
- if( item->imported == TRUE && item->imp_key != 0)
- {
- data->imp_cnt_acc++;
- }
- list = g_list_next(list);
- }
- g_list_free(lacc);
-
-
- // then import transactions
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->imported_ope));
-
- data->imp_cnt_trn = 0;
-
- valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
- while (valid)
- {
- gboolean toimport;
-
- gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
- LST_OPE_IMPTOGGLE, &toimport,
- -1);
-
- if(toimport == TRUE)
- data->imp_cnt_trn++;
-
- /* Make iter point to the next row in the list store */
- valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
- }
-}
-
-
-
-
-
-
-
-static void import_apply(struct import_data *data)
-{
-GtkTreeModel *model;
-GtkTreeIter iter;
-gboolean valid;
-GList *lxxx, *list;
-
- DB( g_print("\n[import] apply\n") );
-
- // 1: persist imported accounts
- lxxx = list = g_hash_table_get_values(GLOBALS->h_acc);
- while (list != NULL)
- {
- Account *item = list->data;
-
- if( item->imported == TRUE )
- {
- //only persist user selected to new account
- if( item->imp_key == 0)
- {
- //DB( g_print(" -> persist acc %x '%s'\n", item, item->name) );
- item->imported = FALSE;
- g_free(item->imp_name);
- item->imp_name = NULL;
- }
- }
- list = g_list_next(list);
- }
- g_list_free(lxxx);
-
- // 2: persist imported payees
- lxxx = list = g_hash_table_get_values(GLOBALS->h_pay);
- while (list != NULL)
- {
- Payee *item = list->data;
-
- if( item->imported == TRUE )
- {
- //DB( g_print(" -> persist pay '%s'\n", item->name) );
- item->imported = FALSE;
- }
- list = g_list_next(list);
- }
- g_list_free(lxxx);
-
- // 3: persist imported categories
- lxxx = list = g_hash_table_get_values(GLOBALS->h_cat);
- while (list != NULL)
- {
- Category *item = list->data;
-
- if( item->imported == TRUE )
- {
- //DB( g_print(" -> persist cat '%s'\n", item->name) );
- item->imported = FALSE;
- }
- list = g_list_next(list);
- }
- g_list_free(lxxx);
-
- // 4: insert every transactions
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->imported_ope));
- valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
- while (valid)
- {
- Transaction *item;
- gboolean toimport;
-
- gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
- LST_DSPOPE_DATAS, &item,
- LST_OPE_IMPTOGGLE, &toimport,
- -1);
-
- if(toimport == TRUE)
- {
- Account *acc;
- //DB(g_print("import %d to acc: %d\n", data->total, item->account) );
-
- //todo: here also test imp_key on account and change the key into the transaction
-
- acc = da_acc_get(item->kacc);
- if( acc != NULL)
- {
- if( acc->imp_key > 0)
- {
- item->kacc = acc->imp_key;
- }
- }
-
- transaction_add(item, NULL, 0);
- }
-
- /* Make iter point to the next row in the list store */
- valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
- }
-
-
-}
-
-/*
-**
-*/
-static gboolean
-import_dispose(GtkWidget *widget, gpointer user_data)
-{
-struct import_data *data = user_data;
-
- DB( g_print("\n[import] dispose\n") );
-
-#if MYDEBUG == 1
- gpointer data2 = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
- g_print(" user_data=%08x to be free, data2=%x\n", (gint)user_data, (gint)data2);
-#endif
-
- g_free( data->filename );
-
- import_clearall(data);
-
-
-
-
- // todo: optimize this
- if(data->imp_cnt_trn > 0)
- {
- GLOBALS->changes_count += data->imp_cnt_trn;
-
- //our global list has changed, so update the treeview
- ui_mainwindow_update(GLOBALS->mainwindow, GINT_TO_POINTER(UF_TITLE+UF_SENSITIVE+UF_BALANCE+UF_REFRESHALL));
- }
-
-
- g_free(user_data);
-
-
- //delete-event TRUE abort/FALSE destroy
- return FALSE;
-}
-
-
-static void import_fill_imp_transactions(struct import_data *data)
-{
-GtkWidget *view;
-GtkTreeModel *model;
-GtkTreeIter iter;
-GList *tmplist;
-
- DB( g_print("\n[import] fill imp operatoin\n") );
-
- view = data->imported_ope;
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
-
- gtk_list_store_clear (GTK_LIST_STORE(model));
-
- g_object_ref(model); /* Make sure the model stays with us after the tree view unrefs it */
- gtk_tree_view_set_model(GTK_TREE_VIEW(view), NULL); /* Detach model from view */
-
- tmplist = g_list_first(data->ictx.trans_list);
- while (tmplist != NULL)
- {
- Transaction *item = tmplist->data;
-
- /* append to our treeview */
- gtk_list_store_append (GTK_LIST_STORE(model), &iter);
-
- //DB( g_print(" populate: %s\n", ope->ope_Word) );
-
- gtk_list_store_set (GTK_LIST_STORE(model), &iter,
- LST_DSPOPE_DATAS, item,
- LST_OPE_IMPTOGGLE, item->same == NULL ? TRUE : FALSE,
- -1);
-
- //DB( g_print(" - fill: %d, %s %.2f %x\n", item->account, item->wording, item->amount, item->same) );
-
- tmplist = g_list_next(tmplist);
- }
-
- gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); /* Re-attach model to view */
-
- g_object_unref(model);
-
-
-
-}
-
-static void import_fillsame(GtkWidget *widget, gpointer user_data)
-{
-struct import_data *data;
-GtkTreeSelection *selection;
-GtkTreeModel *model, *newmodel;
-GtkTreeIter iter, newiter;
-GList *tmplist;
-GtkWidget *view;
-
-
- DB( g_print("\n[import] fillsame\n") );
-
- data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
-
- view = data->duplicat_ope;
- newmodel = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
-
- gtk_list_store_clear (GTK_LIST_STORE(newmodel));
-
-
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->imported_ope));
- //if true there is a selected node
- if (gtk_tree_selection_get_selected(selection, &model, &iter))
- {
- Transaction *item;
-
- gtk_tree_model_get(model, &iter, LST_DSPOPE_DATAS, &item, -1);
-
- if( item->same != NULL )
- {
- tmplist = g_list_first(item->same);
- while (tmplist != NULL)
- {
- Transaction *tmp = tmplist->data;
-
- /* append to our treeview */
- gtk_list_store_append (GTK_LIST_STORE(newmodel), &newiter);
-
- gtk_list_store_set (GTK_LIST_STORE(newmodel), &newiter,
- LST_DSPOPE_DATAS, tmp,
- -1);
-
- DB( g_print(" - fill: %s %.2f %x\n", item->wording, item->amount, (unsigned int)item->same) );
-
- tmplist = g_list_next(tmplist);
- }
- }
-
- }
-
-
-}
-
-
-/*
-** modify target account
-*/
-
-
-static void on_account_type_toggled(GtkRadioButton *radiobutton, gpointer user_data)
-{
-struct import_target_data *data;
-gboolean new_account;
-
-
- data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(radiobutton), GTK_TYPE_WINDOW)), "inst_data");
-
- DB( g_print("\n[import] account type toggle\n") );
-
- new_account = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->radio[0]));
-
- gtk_widget_set_sensitive(data->getwidget1, new_account);
- gtk_widget_set_sensitive(data->getwidget2, new_account^1);
-
-}
-
-
-static void import_edit_target_account(GtkWidget *widget, gpointer user_data)
-{
-struct import_data *data;
-struct import_target_data ddata;
-GtkWidget *dialog, *content, *mainvbox, *table, *label ;
-guint32 key;
-gint row;
-
- data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
- DB( g_print("\n[import] edit target account\n") );
-
- key = ui_acc_affect_listview_get_selected_key(GTK_TREE_VIEW(data->LV_acc));
- if( key > 0 )
- {
- Account *item;
-
- item = da_acc_get( key );
-
- dialog = gtk_dialog_new_with_buttons (_("Change HomeBank account target"),
- GTK_WINDOW (data->assistant),
- 0,
- GTK_STOCK_CANCEL,
- GTK_RESPONSE_REJECT,
- GTK_STOCK_OK,
- GTK_RESPONSE_ACCEPT,
- NULL);
-
- //store our window private data
- g_object_set_data(G_OBJECT(dialog), "inst_data", (gpointer)&ddata);
-
- content = gtk_dialog_get_content_area(GTK_DIALOG (dialog));
-
- mainvbox = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (content), mainvbox, TRUE, TRUE, 0);
- gtk_container_set_border_width (GTK_CONTAINER(mainvbox), HB_MAINBOX_SPACING);
-
- table = gtk_table_new (3, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), HB_TABROW_SPACING);
- gtk_table_set_col_spacings (GTK_TABLE (table), HB_TABCOL_SPACING);
- gtk_box_pack_start (GTK_BOX (mainvbox), table, TRUE, TRUE, HB_BOX_SPACING);
-
- /* area 1 : file summary */
-
- row = 0;
- ddata.radio[0] = gtk_radio_button_new_with_label (NULL, _("new account"));
- gtk_table_attach (GTK_TABLE (table), ddata.radio[0], 0, 1, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
-
- label = make_label(_("_Name:"), 0, 0.5);
- gtk_table_attach (GTK_TABLE (table), label, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
-
- ddata.getwidget1 = gtk_entry_new();
- gtk_table_attach (GTK_TABLE (table), ddata.getwidget1, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
-
- row++;
- ddata.radio[1] = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON (ddata.radio[0]), _("existing account"));
- gtk_table_attach (GTK_TABLE (table), ddata.radio[1], 0, 1, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
-
- label = make_label(_("A_ccount:"), 0, 0.5);
- gtk_table_attach (GTK_TABLE (table), label, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
-
- ddata.getwidget2 = ui_acc_comboboxentry_new(NULL);
- gtk_table_attach (GTK_TABLE (table), ddata.getwidget2, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
-
- //initialize
- if( data->ictx.cnt_initial_acc > 0 ) //if there were already some accounts
- {
- gtk_widget_set_sensitive(ddata.radio[1], TRUE);
- if( item->imp_key > 0 )
- {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ddata.radio[1]), TRUE);
- }
- }
- else
- {
- gtk_widget_set_sensitive(ddata.radio[1], FALSE);
-
- }
-
- gtk_entry_set_text(GTK_ENTRY(ddata.getwidget1), item->name);
- ui_acc_comboboxentry_populate(GTK_COMBO_BOX(ddata.getwidget2), GLOBALS->h_acc, ACC_LST_INSERT_NORMAL);
- ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(ddata.getwidget2), item->imp_key);
-
- on_account_type_toggled(GTK_RADIO_BUTTON (ddata.radio[0]), NULL);
-
- gtk_widget_show_all(mainvbox);
-
- g_signal_connect (ddata.radio[0], "toggled", G_CALLBACK (on_account_type_toggled), NULL);
-
-
- //wait for the user
- gint result = gtk_dialog_run (GTK_DIALOG (dialog));
-
- if(result == GTK_RESPONSE_ACCEPT)
- {
- gchar *name;
- gboolean bnew;
- guint key;
-
- key = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(ddata.getwidget2));
-
- bnew = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ddata.radio[0]));
- if( bnew )
- {
-
- name = (gchar *)gtk_entry_get_text(GTK_ENTRY(ddata.getwidget1));
-
- if(strcasecmp(name, item->name))
- {
-
- DB( g_print("name '%s', existing acc %d\n", name, key) );
-
- if (name && *name)
- {
- if( account_rename(item, name) == FALSE )
- {
- ui_dialog_msg_infoerror(GTK_WINDOW(dialog), GTK_MESSAGE_ERROR,
- _("Error"),
- _("Cannot rename this Account,\n"
- "from '%s' to '%s',\n"
- "this name already exists."),
- item->name,
- name
- );
- }
- }
- }
- else
- {
- item->imp_key = 0;
- }
- }
- else
- {
- item->imp_key = key;
- }
-
- //we should refresh duplicate
- import_find_duplicate_transactions(data);
- import_fill_imp_transactions(data);
-
- }
-
- // cleanup and destroy
- gtk_widget_destroy (dialog);
- }
-
-}
-
-
-static void ui_import_selchange(GtkWidget *widget, gpointer user_data)
-{
-struct import_data *data = user_data;
-gint page_number;
-GtkWidget *current_page;
-gchar *filename;
-
- page_number = gtk_assistant_get_current_page (GTK_ASSISTANT(data->assistant));
-
- DB( g_print("\n[import] selchange (page %d)\n", page_number+1) );
-
- data->valid = FALSE;
-
- filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data->filechooser));
- if( filename == NULL )
- {
- gtk_label_set_text(GTK_LABEL(data->user_info), _("Please select a file..."));
- //current_page = gtk_assistant_get_nth_page (GTK_ASSISTANT(data->assistant), page_number);
- //gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), current_page, FALSE);
- }
- else
- {
- if( page_number == PAGE_FILE )
- {
- if(data->filename)
- g_free( data->filename );
- data->filename = filename;
- //DB( g_print(" filename -> %s\n", data->filename) );
-
- data->filetype = homebank_alienfile_recognize(data->filename);
- switch(data->filetype)
- {
- case FILETYPE_QIF:
- gtk_label_set_text(GTK_LABEL(data->user_info), _("QIF file recognised !"));
- data->valid = TRUE;
- break;
-
- case FILETYPE_OFX:
- #ifndef NOOFX
- gtk_label_set_text(GTK_LABEL(data->user_info), _("OFX file recognised !"));
- data->valid = TRUE;
- #else
- gtk_label_set_text(GTK_LABEL(data->user_info), _("** OFX support is disabled **"));
- #endif
- break;
-
- case FILETYPE_CSV_HB:
- gtk_label_set_text(GTK_LABEL(data->user_info), _("CSV transaction file recognised !"));
- data->valid = TRUE;
- break;
-
- default:
- data->filetype = FILETYPE_UNKNOW;
- gtk_label_set_text(GTK_LABEL(data->user_info), _("Unknown/Invalid file..."));
- break;
- }
-
- current_page = gtk_assistant_get_nth_page (GTK_ASSISTANT(data->assistant), page_number);
- gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), current_page, data->valid);
-
- }
-
- }
-
- if(data->valid == TRUE)
- {
- gtk_widget_show(data->ok_image);
- gtk_widget_hide(data->ko_image);
- }
- else
- {
- gtk_widget_show(data->ko_image);
- gtk_widget_hide(data->ok_image);
- }
-
-}
-
-
-
-static void ui_import_selection(GtkTreeSelection *treeselection, gpointer user_data)
-{
- import_fillsame(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection)), NULL);
-}
-
-
-static void ui_import_update_filecontent(struct import_data *data)
-{
-gchar *tmpstr;
-
- /* file name & path */
- tmpstr = g_path_get_basename(data->filename);
- gtk_label_set_text(GTK_LABEL(data->TX_filename), tmpstr);
- g_free(tmpstr);
-
- tmpstr = g_path_get_dirname(data->filename);
- gtk_label_set_text(GTK_LABEL(data->TX_filepath), tmpstr);
- g_free(tmpstr);
-
- gtk_label_set_text(GTK_LABEL(data->TX_encoding), data->ictx.encoding);
-
- /* file content detail */
- //TODO: difficult translation here
- tmpstr = g_strdup_printf(_("account: %d - transaction: %d - payee: %d - categorie: %d"),
- data->ictx.cnt_new_acc,
- data->ictx.cnt_new_ope,
- data->ictx.cnt_new_pay,
- data->ictx.cnt_new_cat
- );
- gtk_label_set_text(GTK_LABEL(data->TX_filedetails), tmpstr);
- g_free(tmpstr);
-}
-
-static void ui_import_integer_to_label(guint value, GtkWidget *label)
-{
-gchar *tmpstr;
-
- tmpstr = g_strdup_printf("%d", value);
- gtk_label_set_text(GTK_LABEL(label), tmpstr);
- g_free(tmpstr);
-
-}
-
-
-static void ui_import_update_summary(struct import_data *data)
-{
-
- /* account summary */
- ui_import_integer_to_label(data->imp_cnt_acc , data->TX_acc_upd);
- ui_import_integer_to_label(data->ictx.cnt_new_acc - data->imp_cnt_acc, data->TX_acc_new);
-
- /* transaction summary */
- ui_import_integer_to_label(data->imp_cnt_trn , data->TX_trn_imp);
- ui_import_integer_to_label(data->ictx.cnt_new_ope - data->imp_cnt_trn, data->TX_trn_nop);
- ui_import_integer_to_label(data->imp_cnt_asg , data->TX_trn_asg);
-
-}
-
-static void
-ui_import_apply (GtkWidget *widget, gpointer user_data)
-{
-struct import_data *data;
-
- DB( g_print("\n[import] apply\n") );
-
- data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
-
-
- import_apply(data);
-
-}
-
-static void
-ui_import_close_cancel (GtkWidget *widget, gpointer user_data)
-{
-struct import_data *data;
- GtkWidget *assistant = (GtkWidget *) user_data;
-
- DB( g_print("\n[import] close\n") );
-
- data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
-
- import_dispose(widget, data);
-
-
- //g_free(data);
-
-
- gtk_widget_destroy (assistant);
- //assistant = NULL;
-}
-
-static void import_file_import(struct import_data *data)
-{
-
- import_clearall(data);
-
- DB( g_print(" -> get encoding of '%s'\n", data->filename) );
-
- data->ictx.encoding = homebank_file_getencoding(data->filename);
- DB( g_print(" -> encoding is '%s'\n", data->ictx.encoding) );
-
-
- DB( g_print(" -> load file '%s'\n", data->filename) );
-
- switch(data->filetype)
- {
-#ifndef NOOFX
- /* ofx_acc_list & ofx_ope_list are filled here */
- case FILETYPE_OFX:
- data->ictx.trans_list = homebank_ofx_import(data->filename, &data->ictx);
- break;
-#endif
- case FILETYPE_QIF:
- data->ictx.trans_list = homebank_qif_import(data->filename, &data->ictx);
- break;
-
- case FILETYPE_CSV_HB:
- data->ictx.trans_list = homebank_csv_import(data->filename, &data->ictx);
- break;
- }
-
- // sort by date
- data->ictx.trans_list = da_transaction_sort(data->ictx.trans_list);
-
-
-
-}
-
-
-static void
-ui_import_prepare (GtkWidget *widget, GtkWidget *page, gpointer user_data)
-{
-struct import_data *data;
-gint current_page, n_pages;
-gchar *title;
-
- data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
-
- current_page = gtk_assistant_get_current_page (GTK_ASSISTANT(data->assistant));
- n_pages = gtk_assistant_get_n_pages (GTK_ASSISTANT(data->assistant));
-
- DB( g_print("\n[import] prepare %d of %d\n", current_page, n_pages) );
-
- switch( current_page )
- {
- case PAGE_INTRO:
- DB( g_print(" -> 1 intro\n") );
- gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), page, TRUE);
- break;
-
- case PAGE_FILE:
- DB( g_print(" -> 2 file choose\n") );
-
- gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), data->pages[PAGE_RESULT], FALSE);
- gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), data->pages[PAGE_OPTIONS], FALSE);
- gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), data->pages[PAGE_CONFIRM], FALSE);
-
-
- // the page complete is contextual in ui_import_selchange
- break;
-
- case PAGE_RESULT:
- DB( g_print(" -> 3 real import\n") );
- //gtk_assistant_set_current_page(GTK_ASSISTANT (widget), PAGE_IMPORT);
-
- /* remind folder to preference */
- gchar *folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(data->filechooser));
- g_free(PREFS->path_import);
- PREFS->path_import = folder;
-
- import_file_import(data);
- import_analysis_count(data);
- ui_import_update_filecontent(data);
-
- DB( g_print(" -> determine completion: nbtrans=%d, errors=%d\n", data->ictx.cnt_new_ope, data->ictx.cnt_err_date) );
-
- gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), data->pages[PAGE_OPTIONS], FALSE);
- gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), page, FALSE);
-
- //TODO: Check this is sufficient
- if( data->ictx.cnt_err_date > 0 )
- {
- gtk_widget_show(data->GR_options);
- gtk_widget_show(data->GR_error);
- }
- else
- {
- gtk_widget_hide(data->GR_options);
- gtk_widget_hide(data->GR_error);
- }
-
- if( data->ictx.cnt_new_ope > 0 && data->ictx.cnt_err_date <= 0 )
- {
- gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), page, TRUE);
- }
- break;
-
- case PAGE_OPTIONS:
- DB( g_print(" -> post load actions\n") );
-
- //todo: should be optional
- data->imp_cnt_asg = transaction_auto_assign(data->ictx.trans_list, 0);
-
- import_find_duplicate_transactions(data);
-
- ui_import_populate_account(data);
- import_fill_imp_transactions(data);
-
- if( data->ictx.nb_duplicate > 0 )
- {
- gtk_widget_show(data->GR_duplicate);
- }
- else
- {
- gtk_widget_hide(data->GR_duplicate);
- }
-
- gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), page, TRUE);
- break;
-
- case PAGE_CONFIRM:
- {
- DB( g_print(" -> 6 apply\n") );
-
- //todo:rework this
- import_count_changes(data);
-
- ui_import_update_summary(data);
-
-
-
- gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), page, TRUE);
- break;
- }
- }
-
- title = g_strdup_printf ( _("HomeBank Import Assistant - (%d of %d)"), current_page + 1 , n_pages );
- gtk_window_set_title (GTK_WINDOW (data->assistant), title);
- g_free (title);
-}
-
-
-/**
- * ui_import_forward_page_func:
- *
- * define the page to be called when the user forward
- *
- * Return value: the page number
- *
- */
-static gint
-ui_import_forward_page_func(gint current_page, gpointer func_data)
-{
-//struct import_data *data = func_data;
-gint next_page;
-
- DB( g_print("\n[import] forward page\n") );
-
- // normal forward
- next_page = current_page + 1;
-
- DB( g_print(" -> curr page: %d ==> next page: %d\n", current_page, next_page) );
- DB( g_print(" -> page is %s\n", page_titles[current_page]) );
-
- return next_page;
-}
-
-
-
-
-
-static void
-import_refresh_transaction (GtkWidget *widget, gpointer data)
-{
-
- DB( g_print("\n[import] refresh transaction\n") );
-
- import_find_duplicate_transactions(data);
- import_fill_imp_transactions(data);
-
-}
-
-static void
-import_file_refresh_cb(GtkWidget *widget, gpointer user_data)
-{
-struct import_data *data;
-
- data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
-
- DB( g_print("\n[import] refresh file\n") );
- ui_import_prepare(data->assistant, data->pages[PAGE_RESULT], NULL);
-}
-
-
-
-
-static void import_acc_affect_onRowActivated (GtkTreeView *treeview,
- GtkTreePath *path,
- GtkTreeViewColumn *col,
- gpointer userdata)
-{
-//GtkTreeModel *model;
-
- //model = gtk_tree_view_get_model(treeview);
- //gtk_tree_model_get_iter_first(model, &iter);
- //if(gtk_tree_selection_iter_is_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), &iter) == FALSE)
- //{
- import_edit_target_account(GTK_WIDGET(treeview), NULL);
- //}
-}
-
-
-/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
-
-/**
- * create_page1:
- *
- * page 1: intro
- *
- * Return value: a vbox widget
- *
- */
-static GtkWidget *
-ui_import_page1(GtkWidget *assistant, struct import_data *data)
-{
-GtkWidget *vbox, *label, *align;
-
- align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
- gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 0, 0);
-
- vbox = gtk_vbox_new (FALSE, HB_BOX_SPACING);
- gtk_container_set_border_width (GTK_CONTAINER(vbox), HB_MAINBOX_SPACING);
- gtk_container_add(GTK_CONTAINER(align), vbox);
-
- label = make_label(
- _("Welcome to the HomeBank Import Assistant.\n\n" \
- "With this assistant you will be guided throught the process\n" \
- "of importing an external file into HomeBank.\n\n" \
- "No changes will be made until you click \"Apply\" at the end\n" \
- "of this assistant.")
- , 0., 0.0);
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, HB_BOX_SPACING);
-
- /* supported format */
-
-
- label = make_label(
- _("HomeBank can import files in the following formats:\n" \
- "- QIF\n" \
- "- OFX/QFX (optional at compilation time)\n" \
- "- CSV (format is specific to HomeBank, see the documentation)\n" \
- ), 0.0, 0.0);
-
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, HB_BOX_SPACING);
-
-
- gtk_widget_show_all (align);
-
- gtk_assistant_append_page (GTK_ASSISTANT (assistant), align);
- gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), align, GTK_ASSISTANT_PAGE_INTRO);
- gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), align, _(page_titles[PAGE_INTRO]));
- //gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), align, TRUE);
-
-#if HEAD_IMAGE == 1
- gtk_assistant_set_page_header_image (GTK_ASSISTANT (assistant), align, data->head_pixbuf);
-#endif
-
-#if SIDE_IMAGE == 1
- gtk_assistant_set_page_side_image (GTK_ASSISTANT (assistant), align, data->side_pixbuf);
-#endif
-
-
- return align;
-}
-
-
-/**
- * create_page2:
- *
- * page 2: file selection
- *
- * Return value: a vbox widget
- *
- */
-static GtkWidget *
-ui_import_page2 (GtkWidget *assistant, struct import_data *data)
-{
-GtkWidget *vbox, *hbox, *align, *widget, *label;
-GtkFileFilter *filter;
-
- vbox = gtk_vbox_new (FALSE, HB_BOX_SPACING);
- gtk_container_set_border_width (GTK_CONTAINER(vbox), HB_MAINBOX_SPACING);
-
-
-// widget = gtk_file_chooser_button_new ("Pick a File", GTK_FILE_CHOOSER_ACTION_OPEN);
-
- widget = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_OPEN);
-
- data->filechooser = widget;
- gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 0);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("Known files"));
- gtk_file_filter_add_pattern (filter, "*.[Qq][Ii][Ff]");
- #ifndef NOOFX
- gtk_file_filter_add_pattern (filter, "*.[OoQq][Ff][Xx]");
- #endif
- gtk_file_filter_add_pattern (filter, "*.[Cc][Ss][Vv]");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget), filter);
-
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("QIF files"));
- gtk_file_filter_add_pattern (filter, "*.[Qq][Ii][Ff]");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget), filter);
-
- #ifndef NOOFX
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("OFX/QFX files"));
- gtk_file_filter_add_pattern (filter, "*.[OoQq][Ff][Xx]");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget), filter);
- #endif
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("CSV files"));
- gtk_file_filter_add_pattern (filter, "*.[Cc][Ss][Vv]");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget), filter);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("All files"));
- gtk_file_filter_add_pattern (filter, "*");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget), filter);
-
-
-/* our addon message */
- align = gtk_alignment_new(0.65, 0, 0, 0);
- gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
-
- hbox = gtk_hbox_new (FALSE, 0);
- gtk_container_add(GTK_CONTAINER(align), hbox);
-
- label = gtk_label_new("");
- data->user_info = label;
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, HB_BOX_SPACING);
-
- gimp_label_set_attributes (GTK_LABEL (label),
- PANGO_ATTR_SCALE, PANGO_SCALE_LARGE,
- PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD,
- -1);
-
-
-
- widget = gtk_image_new_from_stock(GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON);
- data->ok_image = widget;
- gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
-
- widget = gtk_image_new_from_stock(GTK_STOCK_NO, GTK_ICON_SIZE_BUTTON);
- data->ko_image = widget;
- gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
-
-
- gtk_widget_show_all (vbox);
- gtk_widget_hide(data->ok_image);
- gtk_widget_hide(data->ko_image);
-
-
- gtk_assistant_append_page (GTK_ASSISTANT (assistant), vbox);
- //gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), vbox, GTK_ASSISTANT_PAGE_CONTENT);
- gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), vbox, _(page_titles[PAGE_FILE]));
-
-
-#if HEAD_IMAGE == 1
- gtk_assistant_set_page_header_image (GTK_ASSISTANT (assistant), vbox, data->head_pixbuf);
-#endif
-
-#if SIDE_IMAGE == 1
- gtk_assistant_set_page_side_image (GTK_ASSISTANT (assistant), vbox, data->side_pixbuf);
-#endif
-
-
- return vbox;
-}
-
-
-
-
-static GtkWidget *
-ui_import_page3 (GtkWidget *assistant, struct import_data *data)
-{
-GtkWidget *container, *vbox, *hbox, *table, *label, *widget;
-gint row;
-
- container = gtk_vbox_new (FALSE, HB_BOX_SPACING);
- gtk_container_set_border_width (GTK_CONTAINER(container), HB_BOX_SPACING);
-
-
- /* file informations */
- label = make_label(_("File to import"), 0.0, 0.5);
- gimp_label_set_attributes(GTK_LABEL(label), PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1);
- gtk_box_pack_start (GTK_BOX (container), label, FALSE, FALSE, 0);
-
-
- table = gtk_table_new (2, 2, FALSE);
- //gtk_container_set_border_width (GTK_CONTAINER (table), HB_BOX_SPACING);
- gtk_table_set_row_spacings (GTK_TABLE (table), HB_TABROW_SPACING);
- gtk_table_set_col_spacings (GTK_TABLE (table), HB_TABCOL_SPACING);
-
- gtk_box_pack_start (GTK_BOX (container), table, FALSE, FALSE, 0);
-
- /* area 1 : file summary */
- row = 0;
- label = make_label(_("Path:"), 0.0, 0.5);
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
- widget = make_label(NULL, 0.0, 0.5);
- data->TX_filepath = widget;
- gtk_table_attach (GTK_TABLE (table), widget, 1, 2, row, row+1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (0), 0, 0);
-
- row++;
- label = make_label(_("Name:"), 0.0, 0.5);
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
- widget = make_label(NULL, 0.0, 0.5);
- data->TX_filename = widget;
- gtk_table_attach (GTK_TABLE (table), widget, 1, 2, row, row+1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (0), 0, 0);
-
- row++;
- label = make_label(_("Encoding:"), 0.0, 0.5);
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
- widget = make_label(NULL, 0.0, 0.5);
- data->TX_encoding = widget;
- gtk_table_attach (GTK_TABLE (table), widget, 1, 2, row, row+1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (0), 0, 0);
-
- row++;
- label = make_label(_("Content:"), 0.0, 0.5);
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
- widget = make_label(NULL, 0.0, 0.5);
- data->TX_filedetails = widget;
- gtk_table_attach (GTK_TABLE (table), widget, 1, 2, row, row+1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (0), 0, 0);
-
-
- /* load options */
- vbox = gtk_hbox_new (FALSE, 0);
- data->GR_options = vbox;
- gtk_box_pack_start (GTK_BOX (container), vbox, FALSE, FALSE, 0);
-
- label = make_label(_("Import options"), 0.0, 0.5);
- gimp_label_set_attributes(GTK_LABEL(label), PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1);
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
-
- hbox = gtk_hbox_new (FALSE, HB_BOX_SPACING);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
-
- label = make_label(_("Date order:"), 0.0, 0.5);
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-
- widget = make_cycle(label, CYA_IMPORT_DATEORDER);
- data->CY_dateorder = widget;
- gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
-
-
- widget = gtk_button_new_with_label (_("Load the file again"));
- data->BT_refresh = widget;
- gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
-
- g_signal_connect (widget, "clicked",
- G_CALLBACK (import_file_refresh_cb), data);
-
- /*
- expander = gtk_expander_new (_("File content"));
- gtk_box_pack_start (GTK_BOX (container), expander, TRUE, TRUE, 0);
- scrollwin = gtk_scrolled_window_new(NULL,NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN);
- widget = gtk_text_view_new ();
- gtk_container_add(GTK_CONTAINER(scrollwin), widget);
- gtk_container_add(GTK_CONTAINER(expander), scrollwin);
- */
-
-
- /* status */
- hbox = gtk_hbox_new (FALSE, HB_BOX_SPACING);
- data->GR_error = hbox;
- gtk_box_pack_start (GTK_BOX (container), hbox, FALSE, FALSE, 0);
-
- widget = gtk_image_new_from_stock(GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG );
- gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
- gtk_misc_set_padding(GTK_MISC(widget), HB_BOX_SPACING, 0);
-
- label = gtk_label_new(_(
- "Some date conversion errors were encountered during the load of the file.\n" \
- "Please try to change the date order format and load the file again.")
- );
- /*gimp_label_set_attributes (GTK_LABEL (label),
- PANGO_ATTR_SCALE, PANGO_SCALE_SMALL,
- -1);*/
- gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
- gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
-
-
- gtk_widget_show_all (container);
-
- gtk_assistant_append_page (GTK_ASSISTANT (assistant), container);
- //gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), container, GTK_ASSISTANT_PAGE_CONFIRM);
- //gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), label, TRUE);
- gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), container, _(page_titles[PAGE_RESULT]));
-
-#if HEAD_IMAGE == 1
- gtk_assistant_set_page_header_image (GTK_ASSISTANT (assistant), container, data->head_pixbuf);
-#endif
-
-#if SIDE_IMAGE == 1
- gtk_assistant_set_page_side_image (GTK_ASSISTANT (assistant), container, data->side_pixbuf);
-#endif
-
- return container;
-}
-
-
-static GtkWidget *
-ui_import_page4_account (GtkWidget *assistant, struct import_data *data)
-{
-GtkWidget *vbox, *hbox, *widget, *scrollwin;
-
- vbox = gtk_vbox_new(FALSE, HB_BOX_SPACING);
- gtk_container_set_border_width (GTK_CONTAINER (vbox), HB_BOX_SPACING);
-
- scrollwin = gtk_scrolled_window_new(NULL,NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN);
- widget = ui_acc_affect_listview_new();
- gtk_widget_set_size_request(widget, -1, 100);
- data->LV_acc = widget;
- gtk_container_add(GTK_CONTAINER(scrollwin), widget);
- gtk_box_pack_start (GTK_BOX (vbox), scrollwin, TRUE, TRUE, 0);
-
- hbox = gtk_hbox_new(FALSE, HB_BOX_SPACING);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
-
- widget = gtk_button_new_with_label (_("Edit account to import"));
- data->BT_edit = widget;
- gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
-
- /* signal and other stuff */
- g_signal_connect (G_OBJECT (data->BT_edit), "clicked", G_CALLBACK (import_edit_target_account), data);
- g_signal_connect (GTK_TREE_VIEW(data->LV_acc), "row-activated", G_CALLBACK (import_acc_affect_onRowActivated), NULL);
-
- return vbox;
-}
-
-
-static GtkWidget *
-ui_import_page4_transaction (GtkWidget *assistant, struct import_data *data)
-{
-GtkWidget *mainbox, *vbox, *align, *hbox, *label, *sw, *widget, *expander;
-
- mainbox = gtk_vbox_new (FALSE, HB_BOX_SPACING);
- gtk_container_set_border_width (GTK_CONTAINER(mainbox), HB_BOX_SPACING);
-
- /* transaction list */
- sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-
- widget = create_list_import_transaction();
- data->imported_ope = widget;
- gtk_container_add (GTK_CONTAINER (sw), widget);
-
- gtk_box_pack_start (GTK_BOX (mainbox), sw, TRUE, TRUE, 0);
-
- /* duplicate section */
- expander = gtk_expander_new (_("Detail of duplicate transactions"));
- data->GR_duplicate = expander;
- gtk_box_pack_start (GTK_BOX (mainbox), expander, FALSE, FALSE, 0);
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_container_add (GTK_CONTAINER (expander), vbox);
-
- sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- widget = create_list_transaction(TRN_LIST_TYPE_DETAIL, PREFS->lst_ope_columns);
- data->duplicat_ope = widget;
- gtk_container_add (GTK_CONTAINER (sw), widget);
- gtk_widget_set_size_request(sw, -1, 80);
- gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
-
-
-
- /* duplicate control */
- //expander = gtk_expander_new (_("Change match options"));
- //gtk_box_pack_start (GTK_BOX (vbox), expander, FALSE, FALSE, 0);
-
- align = gtk_alignment_new(0.5, 0.0, 1.0, 0.0);
- /* -- gtk_alignment_set_padding t , b, l, r -- */
- gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 12, 0);
- //gtk_container_add(GTK_CONTAINER(expander), align);
- gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
-
- hbox = gtk_hbox_new (FALSE, HB_BOX_SPACING);
- gtk_container_add(GTK_CONTAINER(align), hbox);
-
-
- label = make_label(_("Date _tolerance:"), 0, 0.5);
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
- widget = make_numeric(label, 0.0, 14.0);
- data->NB_maxgap = widget;
- gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
-
- //TRANSLATORS: there is a spinner on the left of this label, and so you have 0....x days of date tolerance
- label = make_label(_("days"), 0, 0.5);
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-
-
- widget = gtk_button_new_from_stock(GTK_STOCK_REFRESH);
- gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
-
- g_signal_connect (widget, "clicked",
- G_CALLBACK (import_refresh_transaction), data);
-
-
- widget = gtk_image_new_from_stock(GTK_STOCK_INFO, GTK_ICON_SIZE_SMALL_TOOLBAR );
- gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
- gtk_misc_set_padding(GTK_MISC(widget), HB_BOX_SPACING, 0);
-
-
- label = gtk_label_new(_(
- "The match is done in order: by account, amount and date.\n" \
- "A date tolerance of 0 day means an exact match")
- );
- gimp_label_set_attributes (GTK_LABEL (label),
- PANGO_ATTR_SCALE, PANGO_SCALE_SMALL,
- -1);
- gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-
- gtk_widget_show_all (mainbox);
-
- return mainbox;
-}
-
-
-/**
- * create_page3:
- *
- * page 3: analysis & options
- *
- * Return value: a table widget
- *
- */
-static GtkWidget *
-ui_import_page4 (GtkWidget *assistant, struct import_data *data)
-{
-GtkWidget *vbox, *table, *label, *notebook;
-
- vbox = gtk_vbox_new (FALSE, HB_BOX_SPACING);
- gtk_container_set_border_width (GTK_CONTAINER(vbox), HB_MAINBOX_SPACING);
-
- //notebook
- notebook = gtk_notebook_new();
- data->GR_page = notebook;
- //gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
- //gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
- gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
-
- /* account selection */
- label = make_label(_("Account to import"), 0.0, 1.0);
- table = ui_import_page4_account(assistant, data);
- gtk_notebook_append_page (GTK_NOTEBOOK (notebook), table, label);
-
- /* transaction selection */
- label = make_label(_("Transaction to import"), 0.0, 1.0);
- table = ui_import_page4_transaction(assistant, data);
- gtk_notebook_append_page (GTK_NOTEBOOK (notebook), table, label);
-
-
- gtk_widget_show_all (vbox);
- gtk_assistant_append_page (GTK_ASSISTANT (assistant), vbox);
-// gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), vbox, GTK_ASSISTANT_PAGE_PROGRESS);
- gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), vbox, _(page_titles[PAGE_OPTIONS]));
-
-#if HEAD_IMAGE == 1
- gtk_assistant_set_page_header_image (GTK_ASSISTANT (assistant), vbox, data->head_pixbuf);
-#endif
-
-#if SIDE_IMAGE == 1
- gtk_assistant_set_page_side_image (GTK_ASSISTANT (assistant), vbox, data->side_pixbuf);
-#endif
-
-
- return vbox;
-}
-
-
-/**
- * create_page6:
- *
- * page 6: confirmation
- *
- * Return value: a vbox widget
- *
- */
-static GtkWidget *
-ui_import_page6(GtkWidget *assistant, struct import_data *data)
-{
-GtkWidget *vbox, *label, *align, *widget, *table;
-gint row;
-
- align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
- gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 0, 0);
-
- vbox = gtk_vbox_new (FALSE, HB_BOX_SPACING);
- gtk_container_set_border_width (GTK_CONTAINER(vbox), HB_MAINBOX_SPACING);
- gtk_container_add(GTK_CONTAINER(align), vbox);
-
- label = make_label(
- _("Click \"Apply\" to update your accounts.\n"), 0.5, 0.5);
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
-
- /* the summary */
- table = gtk_table_new (7, 3, FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (table), HB_BOX_SPACING);
- gtk_table_set_row_spacings (GTK_TABLE (table), HB_TABROW_SPACING/2);
- gtk_table_set_col_spacings (GTK_TABLE (table), HB_TABCOL_SPACING);
- gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
-
- row = 0;
- label = make_label(_("Accounts"), 0.0, 0.5);
- gimp_label_set_attributes(GTK_LABEL(label), PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1);
- gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 3, row, row+1);
-
- /* acc update */
- row++;
- label = make_label(NULL, 0.0, 0.5);
- //gtk_misc_set_padding (GTK_MISC (label), HB_BOX_SPACING, 0);
- gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row+1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
- widget = make_label(NULL, 1.0, 0.5);
- data->TX_acc_upd = widget;
- gtk_table_attach (GTK_TABLE (table), widget, 1, 2, row, row+1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
- label = make_label(_("to update"), 0.0, 0.5);
- gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, row, row+1);
-
- /* acc create */
- row++;
- widget = make_label(NULL, 1.0, 0.5);
- data->TX_acc_new = widget;
- gtk_table_attach (GTK_TABLE (table), widget, 1, 2, row, row+1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
- label = make_label(_("to create"), 0.0, 0.5);
- gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, row, row+1);
-
- row++;
- label = make_label(_("Transactions"), 0.0, 0.5);
- gimp_label_set_attributes(GTK_LABEL(label), PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1);
- gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 3, row, row+1);
-
- /* trn import */
- row++;
- widget = make_label(NULL, 1.0, 0.5);
- data->TX_trn_imp = widget;
- gtk_table_attach (GTK_TABLE (table), widget, 1, 2, row, row+1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
- label = make_label(_("to import"), 0.0, 0.5);
- gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, row, row+1);
-
- /* trn reject */
- row++;
- widget = make_label(NULL, 1.0, 0.5);
- data->TX_trn_nop = widget;
- gtk_table_attach (GTK_TABLE (table), widget, 1, 2, row, row+1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
- label = make_label(_("to reject"), 0.0, 0.5);
- gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, row, row+1);
-
- /* trn auto-assigned */
- row++;
- widget = make_label(NULL, 1.0, 0.5);
- data->TX_trn_asg = widget;
- gtk_table_attach (GTK_TABLE (table), widget, 1, 2, row, row+1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
- label = make_label(_("auto-assigned"), 0.0, 0.5);
- gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, row, row+1);
-
-
- gtk_widget_show_all (align);
-
- gtk_assistant_append_page (GTK_ASSISTANT (assistant), align);
- gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), align, GTK_ASSISTANT_PAGE_CONFIRM);
- //gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), label, TRUE);
- gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), align, _(page_titles[PAGE_CONFIRM]));
-
-#if HEAD_IMAGE == 1
- gtk_assistant_set_page_header_image (GTK_ASSISTANT (assistant), align, data->head_pixbuf);
-#endif
-
-#if SIDE_IMAGE == 1
- gtk_assistant_set_page_side_image (GTK_ASSISTANT (assistant), align, data->side_pixbuf);
-#endif
-
- return align;
-}
-
-
-/* starting point of import */
-GtkWidget *ui_import_window_new (void)
-{
-struct import_data *data;
-GtkWidget *assistant;
-GdkScreen *screen;
-gint width, height;
-gint pos;
-
- data = g_malloc0(sizeof(struct import_data));
- if(!data) return NULL;
-
-
- assistant = gtk_assistant_new ();
- data->assistant = assistant;
-
- //store our window private data
- g_object_set_data(G_OBJECT(assistant), "inst_data", (gpointer)data);
- //DB( g_print("** \n[import] window=%x, inst_data=%x\n", assistant, data) );
-
-
- gtk_window_set_modal(GTK_WINDOW (assistant), TRUE);
- gtk_window_set_transient_for(GTK_WINDOW(assistant), GTK_WINDOW(GLOBALS->mainwindow));
-
- /* set pixbuf */
-#if HEAD_IMAGE == 1
- data->head_pixbuf = gtk_widget_render_icon (assistant, "hb-file-import", GTK_ICON_SIZE_DIALOG, NULL);
- g_object_unref (data->head_pixbuf);
-#endif
-
-#if SIDE_IMAGE == 1
- gchar *pathfilename = g_build_filename(homebank_app_get_pixmaps_dir(), "wizard.svg", NULL);
- data->side_pixbuf = gdk_pixbuf_new_from_file (pathfilename, NULL);
- g_free(pathfilename);
- g_object_unref (data->side_pixbuf);
-#endif
-
-#if FORCE_SIZE == 1
- screen = gtk_window_get_screen(GTK_WINDOW (assistant));
- // fix #379372 : manage multiple monitor case
- if( gdk_screen_get_n_monitors(screen) > 1 )
- {
- GdkRectangle rect;
-
- gdk_screen_get_monitor_geometry(screen, 1, &rect);
- width = rect.width;
- height = rect.height;
- }
- else
- {
- width = gdk_screen_get_width(screen);
- height = gdk_screen_get_height(screen);
- }
-
- gtk_window_resize(GTK_WINDOW(assistant), SCOEF*width, SCOEF*height);
- gtk_window_set_position (GTK_WINDOW (assistant), GTK_WIN_POS_CENTER_ON_PARENT);
- //gtk_window_set_position (GTK_WINDOW (assistant), GTK_WIN_POS_CENTER);
-#endif
-
-
- pos = 0;
- data->pages[pos++] = ui_import_page1 (assistant, data); // intro
- data->pages[pos++] = ui_import_page2 (assistant, data); // file choose
- data->pages[pos++] = ui_import_page3 (assistant, data); // load result
- data->pages[pos++] = ui_import_page4 (assistant, data); // file content
- data->pages[pos++] = ui_import_page6 (assistant, data); // confirm
-
- gtk_assistant_set_forward_page_func(GTK_ASSISTANT(assistant), ui_import_forward_page_func, data, NULL);
-
- //gtk_assistant_set_current_page(GTK_ASSISTANT (assistant), PAGE_FILE);
-
- //setup
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(data->filechooser), PREFS->path_import);
- //ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data->PO_acc), GLOBALS->h_acc);
- data->ictx.cnt_initial_acc = da_acc_length();
-
- gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_dateorder), PREFS->dtex_datefmt);
-
- ui_import_selchange(assistant, data);
-
- //connect all our signals
- g_signal_connect (G_OBJECT (data->filechooser), "selection-changed",
- G_CALLBACK (ui_import_selchange), (gpointer)data);
-
- g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data->imported_ope)), "changed",
- G_CALLBACK (ui_import_selection), NULL);
-
- g_signal_connect (G_OBJECT (assistant), "cancel",
- G_CALLBACK (ui_import_close_cancel), assistant);
-
- g_signal_connect (G_OBJECT (assistant), "close",
- G_CALLBACK (ui_import_close_cancel), assistant);
-
- g_signal_connect (G_OBJECT (assistant), "apply",
- G_CALLBACK (ui_import_apply), NULL);
-
- g_signal_connect (G_OBJECT (assistant), "prepare",
- G_CALLBACK (ui_import_prepare), NULL);
-
-// g_signal_connect (window, "delete-event", G_CALLBACK (hbfile_dispose), (gpointer)data);
-
-
- gtk_widget_show (assistant);
-
- return assistant;
-}
-
-
-
-/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
-/* account affect listview */
-/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
-
-
-guint32
-ui_acc_affect_listview_get_selected_key(GtkTreeView *treeview)
-{
-GtkTreeSelection *selection;
-GtkTreeModel *model;
-GtkTreeIter iter;
-
- selection = gtk_tree_view_get_selection(treeview);
- if (gtk_tree_selection_get_selected(selection, &model, &iter))
- {
- Account *item;
-
- gtk_tree_model_get(model, &iter, 0, &item, -1);
-
- if( item!= NULL )
- return item->key;
- }
- return 0;
-}
-
-
-static void
-ui_acc_affect_listview_srcname_cell_data_function (GtkTreeViewColumn *col,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
-Account *entry;
-gchar *name;
-gchar *string;
-
- gtk_tree_model_get(model, iter, 0, &entry, -1);
-
- name = entry->imp_name;
-
- #if MYDEBUG
- string = g_markup_printf_escaped("[%d] %s", entry->key, name );
- #else
- string = g_markup_printf_escaped("%s", name);
- #endif
- g_object_set(renderer, "markup", string, NULL);
- g_free(string);
-}
-
-static void
-ui_acc_affect_listview_new_cell_data_function (GtkTreeViewColumn *col,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
-Account *entry;
-gchar *name;
-
- gtk_tree_model_get(model, iter, 0, &entry, -1);
- name = NULL;
- if(entry->imp_key == 0)
- name = _("Create new");
- else
- name = _("Import into");
-
- g_object_set(renderer, "markup", name, NULL);
-
-}
-
-static void
-ui_acc_affect_listview_dstname_cell_data_function (GtkTreeViewColumn *col,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
-Account *entry, *dst_entry;
-gchar *name;
-#if MYDEBUG
-gchar *string;
-#endif
-
- gtk_tree_model_get(model, iter, 0, &entry, -1);
- name = NULL;
- if(entry->imp_key == 0)
- name = entry->name;
- else
- {
- dst_entry = da_acc_get(entry->imp_key);
- if( dst_entry != NULL )
- name = dst_entry->name;
- }
-
- #if MYDEBUG
- string = g_strdup_printf ("[%d] %s", entry->imp_key, name );
- g_object_set(renderer, "text", string, NULL);
- g_free(string);
- #else
- g_object_set(renderer, "text", name, NULL);
- #endif
-
-}
-
-void
-ui_acc_affect_listview_add(GtkTreeView *treeview, Account *item)
-{
- if( item->name != NULL )
- {
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- model = gtk_tree_view_get_model(treeview);
-
- gtk_list_store_append (GTK_LIST_STORE(model), &iter);
- gtk_list_store_set (GTK_LIST_STORE(model), &iter,
- 0, item,
- -1);
-
- //gtk_tree_selection_select_iter (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), &iter);
-
- }
-}
-
-
-static GtkWidget *
-ui_acc_affect_listview_new(void)
-{
-GtkListStore *store;
-GtkWidget *treeview;
-GtkCellRenderer *renderer;
-GtkTreeViewColumn *column;
-
- // create list store
- store = gtk_list_store_new(1,
- G_TYPE_POINTER
- );
-
- // treeview
- treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
- g_object_unref(store);
-
- // column: import account
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new();
- gtk_tree_view_column_pack_start(column, renderer, TRUE);
- gtk_tree_view_column_set_title(column, _("Imported name"));
- gtk_tree_view_column_set_cell_data_func(column, renderer, ui_acc_affect_listview_srcname_cell_data_function, NULL, NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column);
-
- // column: target account
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new();
- gtk_tree_view_column_pack_start(column, renderer, TRUE);
- gtk_tree_view_column_set_title(column, _("Action"));
- gtk_tree_view_column_set_cell_data_func(column, renderer, ui_acc_affect_listview_new_cell_data_function, NULL, NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column);
-
- // column: target account
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new();
- gtk_tree_view_column_pack_start(column, renderer, TRUE);
- gtk_tree_view_column_set_title(column, _("HomeBank name"));
- gtk_tree_view_column_set_cell_data_func(column, renderer, ui_acc_affect_listview_dstname_cell_data_function, NULL, NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column);
-
-
-
- // treeviewattribute
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(treeview), TRUE);
-
- //gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store), ui_acc_listview_compare_func, NULL, NULL);
- //gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
-
- return treeview;
-}
-
-
-