diff --git a/src/EuroUtils.c b/src/EuroUtils.c index 997590bf3d..0cf03f6076 100644 --- a/src/EuroUtils.c +++ b/src/EuroUtils.c @@ -71,7 +71,9 @@ _gnc_euro_rate_compare_(const void * key, { const gnc_commodity * curr = key; const gnc_euro_rate_struct * euro = value; - if(!key || !value) return -1; + + if (!key || !value) + return -1; return strcasecmp(gnc_commodity_get_mnemonic(curr), euro->currency); @@ -109,21 +111,21 @@ gnc_is_euro_currency(const gnc_commodity * currency) { /* ------------------------------------------------------ */ -double -gnc_convert_to_euro(const gnc_commodity * currency, double value) { +gnc_numeric +gnc_convert_to_euro(const gnc_commodity * currency, gnc_numeric value) { gnc_euro_rate_struct *result; const char *namespace; if (currency == NULL) - return 0.0; + return gnc_numeric_zero (); namespace = gnc_commodity_get_namespace (currency); if (namespace == NULL) - return FALSE; + return gnc_numeric_zero (); if (strcmp (namespace, GNC_COMMODITY_NS_ISO) != 0) - return FALSE; + return gnc_numeric_zero (); result = bsearch(currency, _gnc_euro_rate_, @@ -132,29 +134,35 @@ gnc_convert_to_euro(const gnc_commodity * currency, double value) { _gnc_euro_rate_compare_); if (result == NULL) - return 0.0; + return gnc_numeric_zero (); /* round to 2 decimal places */ - return (floor(((value / result->rate) * 100.0) + 0.5) / 100.0); + { + gnc_numeric rate; + + rate = double_to_gnc_numeric (result->rate, 100000, GNC_RND_ROUND); + + return gnc_numeric_div (value, rate, 100, GNC_RND_FLOOR); + } } /* ------------------------------------------------------ */ -double -gnc_convert_from_euro(const gnc_commodity * currency, double value) { +gnc_numeric +gnc_convert_from_euro(const gnc_commodity * currency, gnc_numeric value) { gnc_euro_rate_struct * result; const char *namespace; if (currency == NULL) - return 0.0; + return gnc_numeric_zero (); namespace = gnc_commodity_get_namespace (currency); if (namespace == NULL) - return FALSE; + return gnc_numeric_zero (); if (strcmp (namespace, GNC_COMMODITY_NS_ISO) != 0) - return FALSE; + return gnc_numeric_zero (); result = bsearch(currency, _gnc_euro_rate_, @@ -163,9 +171,16 @@ gnc_convert_from_euro(const gnc_commodity * currency, double value) { _gnc_euro_rate_compare_); if (result == NULL) - return 0.0; + return gnc_numeric_zero (); - return (value * result->rate); + { + gnc_numeric rate; + + rate = double_to_gnc_numeric (result->rate, 100000, GNC_RND_ROUND); + + return gnc_numeric_mul (value, rate, gnc_commodity_get_fraction (currency), + GNC_RND_ROUND); + } } /* ------------------------------------------------------ */ diff --git a/src/EuroUtils.h b/src/EuroUtils.h index 9d9c50bc31..954515922b 100644 --- a/src/EuroUtils.h +++ b/src/EuroUtils.h @@ -25,10 +25,13 @@ #include #include "gnc-commodity.h" +#include "gnc-numeric.h" -gboolean gnc_is_euro_currency(const gnc_commodity * currency); -double gnc_convert_to_euro(const gnc_commodity * currency, double value); -double gnc_convert_from_euro(const gnc_commodity * currency, double value); +gboolean gnc_is_euro_currency (const gnc_commodity * currency); +gnc_numeric gnc_convert_to_euro (const gnc_commodity * currency, + gnc_numeric value); +gnc_numeric gnc_convert_from_euro (const gnc_commodity * currency, + gnc_numeric value); const gnc_commodity * gnc_get_euro (void); diff --git a/src/gnome/account-tree.c b/src/gnome/account-tree.c index 107e2dcd46..77c7d119da 100644 --- a/src/gnome/account-tree.c +++ b/src/gnome/account-tree.c @@ -996,11 +996,11 @@ gnc_account_tree_insert_row(GNCAccountTree *tree, if (gnc_color_deficits()) { GtkStyle *style; - double balance; + gnc_numeric balance; gboolean deficit; - balance = gnc_ui_account_get_balance(acc, FALSE); - deficit = (balance < 0) && !DEQ(balance, 0); + balance = gnc_ui_account_get_balance (acc, FALSE); + deficit = gnc_numeric_negative_p (balance); if (deficit) style = tree->deficit_style; @@ -1012,7 +1012,7 @@ gnc_account_tree_insert_row(GNCAccountTree *tree, tree->balance_column, style); balance = gnc_ui_account_get_balance(acc, TRUE); - deficit = (balance < 0) && !DEQ(balance, 0); + deficit = gnc_numeric_negative_p (balance); if (deficit) style = tree->deficit_style; diff --git a/src/gnome/dialog-utils.c b/src/gnome/dialog-utils.c index ea9c42aaf5..3540a10f15 100644 --- a/src/gnome/dialog-utils.c +++ b/src/gnome/dialog-utils.c @@ -215,27 +215,27 @@ gnc_ui_get_account_field_name(int field) } -double +gnc_numeric gnc_ui_account_get_balance(Account *account, gboolean include_children) { - double balance; + gnc_numeric balance; if (account == NULL) - return 0.0; + return gnc_numeric_zero (); - balance = DxaccAccountGetBalance (account); + balance = xaccAccountGetBalance (account); if (include_children) { AccountGroup *children; children = xaccAccountGetChildren (account); - balance += DxaccGroupGetBalance (children); + balance = gnc_numeric_add_fixed (balance, xaccGroupGetBalance (children)); } /* reverse sign if needed */ if (gnc_reverse_balance (account)) - balance = -balance; + balance = gnc_numeric_neg (balance); return balance; } @@ -274,42 +274,44 @@ gnc_ui_get_account_field_value_string(Account *account, int field) break; case ACCOUNT_BALANCE : { - double balance = gnc_ui_account_get_balance(account, FALSE); + gnc_numeric balance = gnc_ui_account_get_balance(account, FALSE); - return DxaccPrintAmount(balance, - gnc_account_value_print_info (account, TRUE)); + return xaccPrintAmount(balance, + gnc_account_value_print_info (account, TRUE)); } break; case ACCOUNT_BALANCE_EURO : { const gnc_commodity * account_currency = xaccAccountGetCurrency(account); - double balance = gnc_ui_account_get_balance(account, FALSE); - double euro_balance = gnc_convert_to_euro(account_currency, balance); + gnc_numeric balance = gnc_ui_account_get_balance(account, FALSE); + gnc_numeric euro_balance = gnc_convert_to_euro(account_currency, + balance); - return DxaccPrintAmount(euro_balance, - gnc_commodity_print_info (gnc_get_euro (), - TRUE)); + return xaccPrintAmount(euro_balance, + gnc_commodity_print_info (gnc_get_euro (), + TRUE)); } break; case ACCOUNT_TOTAL : { - double balance = gnc_ui_account_get_balance(account, TRUE); + gnc_numeric balance = gnc_ui_account_get_balance(account, TRUE); - return DxaccPrintAmount(balance, - gnc_account_value_print_info (account, TRUE)); + return xaccPrintAmount(balance, + gnc_account_value_print_info (account, TRUE)); } break; case ACCOUNT_TOTAL_EURO : { - const gnc_commodity * account_currency = + const gnc_commodity * account_currency = xaccAccountGetCurrency(account); - double balance = gnc_ui_account_get_balance(account, TRUE); - double euro_balance = gnc_convert_to_euro(account_currency, balance); + gnc_numeric balance = gnc_ui_account_get_balance(account, TRUE); + gnc_numeric euro_balance = gnc_convert_to_euro(account_currency, + balance); - return DxaccPrintAmount(euro_balance, - gnc_commodity_print_info (gnc_get_euro (), - TRUE)); + return xaccPrintAmount(euro_balance, + gnc_commodity_print_info (gnc_get_euro (), + TRUE)); } break; } @@ -465,7 +467,7 @@ gnc_get_deficit_color(GdkColor *color) * Returns: none * \*******************************************************************/ void -gnc_set_label_color(GtkWidget *label, double value) +gnc_set_label_color(GtkWidget *label, gnc_numeric value) { gboolean deficit; GdkColormap *cm; @@ -479,7 +481,7 @@ gnc_set_label_color(GtkWidget *label, double value) style = gtk_style_copy(style); - deficit = (value < 0) && !DEQ(value, 0); + deficit = gnc_numeric_negative_p (value); if (deficit) { diff --git a/src/gnome/dialog-utils.h b/src/gnome/dialog-utils.h index a461787107..2d65df989f 100644 --- a/src/gnome/dialog-utils.h +++ b/src/gnome/dialog-utils.h @@ -82,7 +82,8 @@ const char * gnc_ui_get_account_field_name(int field); const char * gnc_ui_get_account_field_value_string(Account *account, int field); -double gnc_ui_account_get_balance(Account *account, gboolean include_children); +gnc_numeric gnc_ui_account_get_balance(Account *account, + gboolean include_children); GtkWidget * gnc_ui_source_menu_create(Account *account); @@ -98,7 +99,7 @@ GtkToolbarStyle gnc_get_toolbar_style(void); gboolean gnc_color_deficits (void); void gnc_get_deficit_color(GdkColor *color); -void gnc_set_label_color(GtkWidget *label, double value); +void gnc_set_label_color(GtkWidget *label, gnc_numeric value); char gnc_get_account_separator(void); diff --git a/src/gnome/window-main.c b/src/gnome/window-main.c index 26631ea0a8..c59ec1f7a5 100644 --- a/src/gnome/window-main.c +++ b/src/gnome/window-main.c @@ -29,34 +29,33 @@ #include #include "AccWindow.h" -#include "global-options.h" -#include "dialog-options.h" -#include "FileDialog.h" -#include "gnucash.h" -#include "MainWindow.h" #include "Destroy.h" -#include "gnc-ui.h" -#include "messages.h" -#include "RegWindow.h" +#include "EuroUtils.h" +#include "FileDialog.h" +#include "MainWindow.h" #include "Refresh.h" -#include "window-main.h" -#include "window-reconcile.h" -#include "window-register.h" -#include "window-help.h" +#include "RegWindow.h" +#include "Scrub.h" #include "account-tree.h" -#include "dialog-transfer.h" #include "dialog-account.h" #include "dialog-fincalc.h" #include "dialog-find-transactions.h" +#include "dialog-options.h" #include "dialog-totd.h" +#include "dialog-transfer.h" #include "file-history.h" -#include "gtkselect.h" -#include "EuroUtils.h" -#include "Scrub.h" -#include "gnc-engine-util.h" +#include "global-options.h" #include "gnc-commodity.h" +#include "gnc-engine-util.h" #include "gnc-engine.h" +#include "gnc-ui.h" +#include "gnucash.h" #include "gtkselect.h" +#include "messages.h" +#include "window-help.h" +#include "window-main.h" +#include "window-reconcile.h" +#include "window-register.h" /* FIXME get rid of these */ #include @@ -102,8 +101,8 @@ static GNCMainInfo * gnc_get_main_info(void); * be better ways to do this, but none occurred. */ struct _GNCCurrencyAcc { const gnc_commodity * currency; - double assets; - double profits; + gnc_numeric assets; + gnc_numeric profits; }; typedef struct _GNCCurrencyAcc GNCCurrencyAcc; @@ -117,7 +116,7 @@ struct _GNCCurrencyItem { GtkWidget *listitem; GtkWidget *assets_label; GtkWidget *profits_label; - gint touched:1; + gint touched : 1; }; typedef struct _GNCCurrencyItem GNCCurrencyItem; @@ -208,11 +207,11 @@ gnc_ui_get_currency_accumulator(GList **list, const gnc_commodity * currency) } } - found = g_new0(GNCCurrencyAcc, 1); + found = g_new0 (GNCCurrencyAcc, 1); found->currency = currency; - found->assets = 0.0; - found->profits = 0.0; - *list = g_list_append(*list, found); + found->assets = gnc_numeric_zero (); + found->profits = gnc_numeric_zero (); + *list = g_list_append (*list, found); return found; } @@ -253,7 +252,7 @@ static void gnc_ui_accounts_recurse (AccountGroup *group, GList **currency_list, gboolean euro) { - double amount; + gnc_numeric amount; AccountGroup *children; Account *account; int num_accounts; @@ -276,6 +275,8 @@ gnc_ui_accounts_recurse (AccountGroup *group, GList **currency_list, euro_accum = gnc_ui_get_currency_accumulator(currency_list, euro_commodity); } + else + euro_commodity = NULL; num_accounts = xaccGroupGetNumAccounts(group); for (i = 0; i < num_accounts; i++) @@ -297,20 +298,35 @@ gnc_ui_accounts_recurse (AccountGroup *group, GList **currency_list, case MUTUAL: case CREDIT: case LIABILITY: - amount = DxaccAccountGetBalance(account); - currency_accum->assets += amount; - if(euro) - euro_accum->assets += gnc_convert_to_euro(account_currency, amount); + amount = xaccAccountGetBalance(account); + currency_accum->assets = + gnc_numeric_add (currency_accum->assets, amount, + gnc_commodity_get_fraction (account_currency), + GNC_RND_ROUND); + + if (euro) + euro_accum->assets = + gnc_numeric_add (euro_accum->assets, + gnc_convert_to_euro(account_currency, amount), + gnc_commodity_get_fraction (euro_commodity), + GNC_RND_ROUND); if (children != NULL) gnc_ui_accounts_recurse(children, currency_list, euro); break; case INCOME: case EXPENSE: - amount = DxaccAccountGetBalance(account); - currency_accum->profits -= amount; - if(euro) - euro_accum->profits -= gnc_convert_to_euro(account_currency, amount); + amount = xaccAccountGetBalance(account); + currency_accum->profits = + gnc_numeric_sub (currency_accum->profits, amount, + gnc_commodity_get_fraction (account_currency), + GNC_RND_ROUND); + + if (euro) + gnc_numeric_sub (euro_accum->profits, + gnc_convert_to_euro(account_currency, amount), + gnc_commodity_get_fraction (euro_commodity), + GNC_RND_ROUND); if (children != NULL) gnc_ui_accounts_recurse(children, currency_list, euro); @@ -392,15 +408,13 @@ gnc_ui_refresh_statusbar (void) main_info->totals_combo); currency_item->touched = 1; - DxaccSPrintAmount(asset_string, currency_accum->assets, - gnc_commodity_print_info (currency_accum->currency, - TRUE)); + xaccSPrintAmount(asset_string, currency_accum->assets, + gnc_commodity_print_info(currency_accum->currency, TRUE)); gtk_label_set_text(GTK_LABEL(currency_item->assets_label), asset_string); gnc_set_label_color(currency_item->assets_label, currency_accum->assets); - DxaccSPrintAmount(profit_string, currency_accum->profits, - gnc_commodity_print_info (currency_accum->currency, - TRUE)); + xaccSPrintAmount(profit_string, currency_accum->profits, + gnc_commodity_print_info(currency_accum->currency, TRUE)); gtk_label_set_text(GTK_LABEL(currency_item->profits_label), profit_string); gnc_set_label_color(currency_item->profits_label, currency_accum->profits); @@ -479,16 +493,16 @@ gnc_refresh_main_window() } static void -gnc_ui_find_transactions_cb ( GtkWidget *widget, gpointer data ) +gnc_ui_find_transactions_cb (GtkWidget *widget, gpointer data) { gnc_ui_find_transactions_dialog_create(NULL); } static void -gnc_ui_exit_cb ( GtkWidget *widget, gpointer data ) +gnc_ui_exit_cb (GtkWidget *widget, gpointer data) { - gnc_shutdown(0); + gnc_shutdown (0); } static void @@ -517,19 +531,19 @@ gnc_ui_totd_cb (GtkWidget *widget, gpointer data) } static void -gnc_ui_help_cb ( GtkWidget *widget, gpointer data ) +gnc_ui_help_cb (GtkWidget *widget, gpointer data) { helpWindow(NULL, NULL, HH_MAIN); } static void -gnc_ui_add_account ( GtkWidget *widget, gpointer data ) +gnc_ui_add_account (GtkWidget *widget, gpointer data) { gnc_ui_new_account_window (NULL); } static void -gnc_ui_delete_account ( Account *account ) +gnc_ui_delete_account (Account *account) { /* Step 1: Delete associated windows */ xaccAccountWindowDestroy(account); @@ -547,7 +561,7 @@ gnc_ui_delete_account ( Account *account ) } static void -gnc_ui_delete_account_cb ( GtkWidget *widget, gpointer data ) +gnc_ui_delete_account_cb (GtkWidget *widget, gpointer data) { Account *account = gnc_get_current_account(); @@ -575,7 +589,7 @@ gnc_ui_delete_account_cb ( GtkWidget *widget, gpointer data ) } static void -gnc_ui_mainWindow_toolbar_open ( GtkWidget *widget, gpointer data ) +gnc_ui_mainWindow_toolbar_open (GtkWidget *widget, gpointer data) { RegWindow *regData; Account *account = gnc_get_current_account(); @@ -615,7 +629,7 @@ gnc_ui_mainWindow_toolbar_open_subs(GtkWidget *widget, gpointer data) } static void -gnc_ui_mainWindow_toolbar_edit ( GtkWidget *widget, gpointer data ) +gnc_ui_mainWindow_toolbar_edit (GtkWidget *widget, gpointer data) { Account *account = gnc_get_current_account(); AccountWindow *edit_window_data; diff --git a/src/gnome/window-reconcile.c b/src/gnome/window-reconcile.c index 1c151ba0bb..f4d7defd56 100644 --- a/src/gnome/window-reconcile.c +++ b/src/gnome/window-reconcile.c @@ -199,8 +199,7 @@ recnRecalculateBalance(RecnWindow *recnData) starting = gnc_numeric_neg (starting); amount = xaccPrintAmount(starting, print_info); - gnc_set_label_color(recnData->starting, - gnc_numeric_to_double (starting)); + gnc_set_label_color(recnData->starting, starting); gtk_label_set_text(GTK_LABEL(recnData->starting), amount); if (reverse_balance) starting = gnc_numeric_neg (starting); @@ -210,8 +209,7 @@ recnRecalculateBalance(RecnWindow *recnData) if (reverse_balance) ending = gnc_numeric_neg (ending); amount = xaccPrintAmount(ending, print_info); - gnc_set_label_color(recnData->ending, - gnc_numeric_to_double (ending)); + gnc_set_label_color(recnData->ending, ending); gtk_label_set_text(GTK_LABEL(recnData->ending), amount); if (reverse_balance) ending = gnc_numeric_neg (ending); @@ -236,8 +234,7 @@ recnRecalculateBalance(RecnWindow *recnData) if (reverse_balance) reconciled = gnc_numeric_neg (reconciled); amount = xaccPrintAmount(reconciled, print_info); - gnc_set_label_color(recnData->reconciled, - gnc_numeric_to_double (reconciled)); + gnc_set_label_color(recnData->reconciled, reconciled); gtk_label_set_text(GTK_LABEL(recnData->reconciled), amount); if (reverse_balance) reconciled = gnc_numeric_neg (reconciled); @@ -247,8 +244,7 @@ recnRecalculateBalance(RecnWindow *recnData) if (reverse_balance) diff = gnc_numeric_neg (diff); amount = xaccPrintAmount(diff, print_info); - gnc_set_label_color(recnData->difference, - gnc_numeric_to_double (diff)); + gnc_set_label_color(recnData->difference, diff); gtk_label_set_text(GTK_LABEL(recnData->difference), amount); if (reverse_balance) diff = gnc_numeric_neg (diff); diff --git a/src/gnome/window-register.c b/src/gnome/window-register.c index 1572f86703..0464ab46bc 100644 --- a/src/gnome/window-register.c +++ b/src/gnome/window-register.c @@ -1844,14 +1844,12 @@ regRefresh(xaccLedgerDisplay *ledger) if (euro) { strcat(string, " / "); - DxaccSPrintAmount(string + strlen(string), - gnc_convert_to_euro(currency, - gnc_numeric_to_double (amount)), - gnc_commodity_print_info (gnc_get_euro (), TRUE)); + xaccSPrintAmount(string + strlen(string), + gnc_convert_to_euro(currency, amount), + gnc_commodity_print_info (gnc_get_euro (), TRUE)); } - gnc_set_label_color(regData->balance_label, - gnc_numeric_to_double (amount)); + gnc_set_label_color(regData->balance_label, amount); gtk_label_set_text(GTK_LABEL(regData->balance_label), string); } @@ -1865,14 +1863,12 @@ regRefresh(xaccLedgerDisplay *ledger) if (euro) { strcat(string, " / "); - DxaccSPrintAmount(string + strlen(string), - gnc_convert_to_euro(currency, - gnc_numeric_to_double (amount)), - gnc_commodity_print_info (gnc_get_euro (), TRUE)); + xaccSPrintAmount(string + strlen(string), + gnc_convert_to_euro(currency, amount), + gnc_commodity_print_info (gnc_get_euro (), TRUE)); } - gnc_set_label_color(regData->cleared_label, - gnc_numeric_to_double (amount)); + gnc_set_label_color(regData->cleared_label, amount); gtk_label_set_text(GTK_LABEL(regData->cleared_label), string); }