r23582 - gnucash/trunk/src/register/ledger-core - Extract-method on gnc_split_register_auto_calc

John Ralls jralls at code.gnucash.org
Thu Dec 19 19:44:28 EST 2013


Author: jralls
Date: 2013-12-19 19:44:27 -0500 (Thu, 19 Dec 2013)
New Revision: 23582
Trac: http://svn.gnucash.org/trac/changeset/23582

Modified:
   gnucash/trunk/src/register/ledger-core/split-register.c
Log:
Extract-method on gnc_split_register_auto_calc

Producing calculate_value, recalc_message_box, recalculate_shares, recalculate_price, recalculate_value

Modified: gnucash/trunk/src/register/ledger-core/split-register.c
===================================================================
--- gnucash/trunk/src/register/ledger-core/split-register.c	2013-12-20 00:44:18 UTC (rev 23581)
+++ gnucash/trunk/src/register/ledger-core/split-register.c	2013-12-20 00:44:27 UTC (rev 23582)
@@ -1891,6 +1891,157 @@
     return gnc_split_register_get_account_by_name (reg, cell, name);
 }
 
+static gnc_numeric
+calculate_value (SplitRegister *reg)
+{
+    gnc_numeric credit;
+    gnc_numeric debit;
+
+    PriceCell *cell = (PriceCell*)gnc_table_layout_get_cell (reg->table->layout,
+                                                             CRED_CELL);
+    credit = gnc_price_cell_get_value (cell);
+
+    cell = (PriceCell*)gnc_table_layout_get_cell (reg->table->layout,
+                                                  DEBT_CELL);
+    debit = gnc_price_cell_get_value (cell);
+
+    return gnc_numeric_sub_fixed (debit, credit);
+}
+
+
+static int
+recalc_message_box (SplitRegister *reg, gboolean shares_changed,
+                    gboolean price_changed, gboolean value_changed)
+{
+    int choice;
+    int default_value;
+    GList *node;
+    GList *radio_list = NULL;
+    const char *title = _("Recalculate Transaction");
+    const char *message = _("The values entered for this transaction "
+                            "are inconsistent. Which value would you "
+                            "like to have recalculated?");
+
+    if (shares_changed)
+        radio_list = g_list_append (radio_list, g_strdup_printf ("%s (%s)",
+                                                                 _("_Shares"),
+                                                                 _("Changed")));
+    else
+        radio_list = g_list_append (radio_list, g_strdup (_("_Shares")));
+
+    if (price_changed)
+        radio_list = g_list_append (radio_list, g_strdup_printf ("%s (%s)",
+                                                                 _("_Price"),
+                                                                 _("Changed")));
+    else
+        radio_list = g_list_append (radio_list, g_strdup (_("_Price")));
+
+    if (value_changed)
+        radio_list = g_list_append (radio_list, g_strdup_printf ("%s (%s)",
+                                                                 _("_Value"),
+                                                                 _("Changed")));
+    else
+        radio_list = g_list_append (radio_list, g_strdup (_("_Value")));
+
+    if (price_changed) default_value = 2;  /* change the value */
+    else  default_value = 1;  /* change the value */
+
+    choice = gnc_choose_radio_option_dialog
+        (gnc_split_register_get_parent (reg),
+         title,
+         message,
+         _("_Recalculate"),
+         default_value,
+         radio_list);
+
+    for (node = radio_list; node; node = node->next)
+        g_free (node->data);
+
+    g_list_free (radio_list);
+
+    return choice;
+}
+
+static void
+recalculate_shares (Split* split, SplitRegister *reg,
+               gnc_numeric value, gnc_numeric price, gboolean value_changed)
+{
+    gint64 denom = gnc_split_get_amount_denom (split);
+    gnc_numeric amount = gnc_numeric_div (value, price, denom,
+                                          GNC_HOW_RND_ROUND_HALF_UP);
+
+    BasicCell *cell = gnc_table_layout_get_cell (reg->table->layout, SHRS_CELL);
+    gnc_price_cell_set_value ((PriceCell *) cell, amount);
+    gnc_basic_cell_set_changed (cell, TRUE);
+
+    if (value_changed)
+    {
+        cell = gnc_table_layout_get_cell (reg->table->layout, PRIC_CELL);
+        gnc_basic_cell_set_changed (cell, FALSE);
+    }
+}
+
+static void
+recalculate_price (Split *split, SplitRegister *reg,
+              gnc_numeric value, gnc_numeric amount)
+{
+    BasicCell *price_cell;
+    gnc_numeric price = gnc_numeric_div (value, amount,
+                                         GNC_DENOM_AUTO,
+                                         GNC_HOW_DENOM_EXACT);
+
+    if (gnc_numeric_negative_p (price))
+    {
+        BasicCell *debit_cell;
+        BasicCell *credit_cell;
+
+        debit_cell = gnc_table_layout_get_cell (reg->table->layout,
+                                                DEBT_CELL);
+
+        credit_cell = gnc_table_layout_get_cell (reg->table->layout,
+                                                 CRED_CELL);
+
+        price = gnc_numeric_neg (price);
+
+        gnc_price_cell_set_debt_credit_value ((PriceCell *) debit_cell,
+                                              (PriceCell *) credit_cell,
+                                              gnc_numeric_neg (value));
+
+        gnc_basic_cell_set_changed (debit_cell, TRUE);
+        gnc_basic_cell_set_changed (credit_cell, TRUE);
+    }
+
+    price_cell = gnc_table_layout_get_cell (reg->table->layout, PRIC_CELL);
+    gnc_price_cell_set_value ((PriceCell *) price_cell, price);
+    gnc_basic_cell_set_changed (price_cell, TRUE);
+}
+
+static void
+recalculate_value (Split *split, SplitRegister *reg,
+              gnc_numeric price, gnc_numeric amount, gboolean shares_changed)
+{
+    BasicCell *debit_cell = gnc_table_layout_get_cell (reg->table->layout,
+                                                       DEBT_CELL);
+    BasicCell *credit_cell = gnc_table_layout_get_cell (reg->table->layout,
+                                                        CRED_CELL);
+    gint64 denom = gnc_split_get_value_denom (split);
+    gnc_numeric value = gnc_numeric_mul (price, amount, denom,
+                                         GNC_HOW_RND_ROUND_HALF_UP);
+
+    gnc_price_cell_set_debt_credit_value ((PriceCell *) debit_cell,
+                                          (PriceCell *) credit_cell, value);
+
+    gnc_basic_cell_set_changed (debit_cell, TRUE);
+    gnc_basic_cell_set_changed (credit_cell, TRUE);
+
+    if (shares_changed)
+    {
+        BasicCell *cell = gnc_table_layout_get_cell (reg->table->layout,
+                                                     PRIC_CELL);
+        gnc_basic_cell_set_changed (cell, FALSE);
+    }
+}
+
 static gboolean
 gnc_split_register_auto_calc (SplitRegister *reg, Split *split)
 {
@@ -1899,7 +2050,7 @@
     gboolean recalc_price = FALSE;
     gboolean recalc_value = FALSE;
     gboolean price_changed;
-    gboolean amount_changed;  /* please s/amount_changed/value_changed/ */
+    gboolean value_changed;
     gboolean shares_changed;
     gnc_numeric calc_value;
     gnc_numeric value;
@@ -1907,10 +2058,11 @@
     gnc_numeric amount;
     Account *account;
     int denom;
+    int choice;
 
     if (STOCK_REGISTER    != reg->type &&
-            CURRENCY_REGISTER != reg->type &&
-            PORTFOLIO_LEDGER  != reg->type)
+        CURRENCY_REGISTER != reg->type &&
+        PORTFOLIO_LEDGER  != reg->type)
         return TRUE;
 
     account = gnc_split_register_get_account (reg, XFRM_CELL);
@@ -1926,14 +2078,14 @@
 
     price_changed = gnc_table_layout_get_cell_changed (reg->table->layout,
                     PRIC_CELL, TRUE);
-    amount_changed = (gnc_table_layout_get_cell_changed (reg->table->layout,
+    value_changed = (gnc_table_layout_get_cell_changed (reg->table->layout,
                       DEBT_CELL, TRUE) ||
                       gnc_table_layout_get_cell_changed (reg->table->layout,
                               CRED_CELL, TRUE));
     shares_changed = gnc_table_layout_get_cell_changed (reg->table->layout,
                      SHRS_CELL, TRUE);
 
-    if (!price_changed && !amount_changed && !shares_changed)
+    if (!price_changed && !value_changed && !shares_changed)
         return TRUE;
 
     /* If we are using commodity trading accounts then the value may
@@ -1965,21 +2117,8 @@
     else
         price = xaccSplitGetSharePrice (split);
 
-    if (amount_changed)
-    {
-        gnc_numeric credit;
-        gnc_numeric debit;
-
-        cell = (PriceCell *) gnc_table_layout_get_cell (reg->table->layout,
-                CRED_CELL);
-        credit = gnc_price_cell_get_value (cell);
-
-        cell = (PriceCell *) gnc_table_layout_get_cell (reg->table->layout,
-                DEBT_CELL);
-        debit = gnc_price_cell_get_value (cell);
-
-        value = gnc_numeric_sub_fixed (debit, credit);
-    }
+    if (value_changed)
+        value = calculate_value (reg);
     else
         value = xaccSplitGetValue (split);
 
@@ -1990,7 +2129,6 @@
     if (gnc_numeric_zero_p(amount) && gnc_numeric_zero_p(price) &&
             !gnc_numeric_zero_p(value))
     {
-        /* XXX: should we ask the user? */
         return TRUE;
     }
 
@@ -2018,18 +2156,19 @@
             (!recalc_price)  &&
             (!recalc_value))
     {
-        if (price_changed && amount_changed)
+        if (price_changed && value_changed)
         {
             if (!shares_changed)
                 recalc_shares = TRUE;
         }
-        else if (amount_changed && shares_changed)
+        else if (value_changed && shares_changed)
             recalc_price = TRUE;
         else if (price_changed && shares_changed)
             recalc_value = TRUE;
     }
 
-    calc_value = gnc_numeric_mul (price, amount, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD);
+    calc_value = gnc_numeric_mul (price, amount,
+                                  GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD);
 
     denom = gnc_split_get_value_denom (split);
 
@@ -2038,56 +2177,13 @@
      *  help from the user. */
 
     if (!recalc_shares &&
-            !recalc_price &&
-            !recalc_value &&
-            !gnc_numeric_same (value, calc_value, denom, GNC_HOW_RND_ROUND_HALF_UP))
+        !recalc_price &&
+        !recalc_value &&
+        !gnc_numeric_same (value, calc_value, denom, GNC_HOW_RND_ROUND_HALF_UP))
     {
-        int choice;
-        int default_value;
-        GList *node;
-        GList *radio_list = NULL;
-        const char *title = _("Recalculate Transaction");
-        const char *message = _("The values entered for this transaction "
-                                "are inconsistent. Which value would you "
-                                "like to have recalculated?");
-
-        if (shares_changed)
-            radio_list = g_list_append (radio_list,
-                                        g_strdup_printf ("%s (%s)",
-                                                _("_Shares"), _("Changed")));
-        else
-            radio_list = g_list_append (radio_list, g_strdup (_("_Shares")));
-
-        if (price_changed)
-            radio_list = g_list_append (radio_list,
-                                        g_strdup_printf ("%s (%s)",
-                                                _("_Price"), _("Changed")));
-        else
-            radio_list = g_list_append (radio_list, g_strdup (_("_Price")));
-
-        if (amount_changed)
-            radio_list = g_list_append (radio_list,
-                                        g_strdup_printf ("%s (%s)",
-                                                _("_Value"), _("Changed")));
-        else
-            radio_list = g_list_append (radio_list, g_strdup (_("_Value")));
-
-        if (price_changed) default_value = 2;  /* change the value */
-        else  default_value = 1;  /* change the value */
-
-        choice = gnc_choose_radio_option_dialog
-                 (gnc_split_register_get_parent (reg),
-                  title,
-                  message,
-                  _("_Recalculate"),
-                  default_value,
-                  radio_list);
-
-        for (node = radio_list; node; node = node->next)
-            g_free (node->data);
-
-        g_list_free (radio_list);
-
+        choice = recalc_message_box(reg, shares_changed,
+                                    price_changed,
+                                    value_changed);
         switch (choice)
         {
         case 0: /* Modify number of shares */
@@ -2104,88 +2200,18 @@
         }
     }
 
-    if (recalc_shares)
-        if (!gnc_numeric_zero_p (price))
-        {
-            BasicCell *cell;
+    if (recalc_shares && !gnc_numeric_zero_p (price))
+        recalculate_shares (split, reg, value, price, value_changed);
 
-            denom = gnc_split_get_amount_denom (split);
-
-            amount = gnc_numeric_div (value, price, denom, GNC_HOW_RND_ROUND_HALF_UP);
-
-            cell = gnc_table_layout_get_cell (reg->table->layout, SHRS_CELL);
-            gnc_price_cell_set_value ((PriceCell *) cell, amount);
-            gnc_basic_cell_set_changed (cell, TRUE);
-
-            if (amount_changed)
-            {
-                cell = gnc_table_layout_get_cell (reg->table->layout, PRIC_CELL);
-                gnc_basic_cell_set_changed (cell, FALSE);
-            }
-        }
-
-    if (recalc_price)
-        if (!gnc_numeric_zero_p (amount))
-        {
-            BasicCell *price_cell;
-
-            price = gnc_numeric_div (value, amount,
-                                     GNC_DENOM_AUTO,
-                                     GNC_HOW_DENOM_EXACT);
-
-            if (gnc_numeric_negative_p (price))
-            {
-                BasicCell *debit_cell;
-                BasicCell *credit_cell;
-
-                debit_cell = gnc_table_layout_get_cell (reg->table->layout,
-                                                        DEBT_CELL);
-
-                credit_cell = gnc_table_layout_get_cell (reg->table->layout,
-                              CRED_CELL);
-
-                price = gnc_numeric_neg (price);
-
-                gnc_price_cell_set_debt_credit_value ((PriceCell *) debit_cell,
-                                                      (PriceCell *) credit_cell,
-                                                      gnc_numeric_neg (value));
-
-                gnc_basic_cell_set_changed (debit_cell, TRUE);
-                gnc_basic_cell_set_changed (credit_cell, TRUE);
-            }
-
-            price_cell = gnc_table_layout_get_cell (reg->table->layout, PRIC_CELL);
-            gnc_price_cell_set_value ((PriceCell *) price_cell, price);
-            gnc_basic_cell_set_changed (price_cell, TRUE);
-        }
-
+    if (recalc_price && !gnc_numeric_zero_p (amount))
+    {
+        recalculate_price (split, reg, value, amount);
+        price_changed = TRUE;
+    }
     if (recalc_value)
-    {
-        BasicCell *debit_cell;
-        BasicCell *credit_cell;
+        recalculate_value (split, reg, price, amount, shares_changed);
 
-        debit_cell = gnc_table_layout_get_cell (reg->table->layout, DEBT_CELL);
-        credit_cell = gnc_table_layout_get_cell (reg->table->layout, CRED_CELL);
 
-        denom = gnc_split_get_value_denom (split);
-
-        value = gnc_numeric_mul (price, amount, denom, GNC_HOW_RND_ROUND_HALF_UP);
-
-        gnc_price_cell_set_debt_credit_value ((PriceCell *) debit_cell,
-                                              (PriceCell *) credit_cell, value);
-
-        gnc_basic_cell_set_changed (debit_cell, TRUE);
-        gnc_basic_cell_set_changed (credit_cell, TRUE);
-
-        if (shares_changed)
-        {
-            BasicCell *cell;
-
-            cell = gnc_table_layout_get_cell (reg->table->layout, PRIC_CELL);
-            gnc_basic_cell_set_changed (cell, FALSE);
-        }
-    }
-
     return TRUE;
 }
 



More information about the gnucash-changes mailing list