r20207 - gnucash/trunk/src - Modify Tax Info on Account Page to display or not display sub-account info based on whether row is expanded.

J. Alex Aycinena alex.aycinena at code.gnucash.org
Sun Jan 30 15:34:56 EST 2011


Author: alex.aycinena
Date: 2011-01-30 15:34:55 -0500 (Sun, 30 Jan 2011)
New Revision: 20207
Trac: http://svn.gnucash.org/trac/changeset/20207

Modified:
   gnucash/trunk/src/app-utils/gnc-ui-util.c
   gnucash/trunk/src/app-utils/gnc-ui-util.h
   gnucash/trunk/src/gnome-utils/gnc-tree-model-account.c
   gnucash/trunk/src/gnome-utils/gnc-tree-model-account.h
   gnucash/trunk/src/gnome-utils/gnc-tree-view-account.c
Log:
Modify Tax Info on Account Page to display or not display sub-account info based on whether row is expanded.

Revert changes made in gnc-ui-util.c in rev 20039 and instead put those changes in new function: gnc_ui_account_get_tax_info_sub_acct_string.

Define a new column, GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT, in gnc-tree-model-account.c filled with gnc_ui_account_get_tax_info_sub_acct_string.

Modify gnc-tree-view-account.c to define a tax_info_data_func that displays only the the data in the GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO model column if the row is expanded; otherwise it combines it with the data in the GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT model column. Modily the view creation function to use the new tax_info_data_func.


Modified: gnucash/trunk/src/app-utils/gnc-ui-util.c
===================================================================
--- gnucash/trunk/src/app-utils/gnc-ui-util.c	2011-01-30 18:33:53 UTC (rev 20206)
+++ gnucash/trunk/src/app-utils/gnc-ui-util.c	2011-01-30 20:34:55 UTC (rev 20207)
@@ -468,24 +468,22 @@
     SCM category;
     SCM code_scm;
     SCM tax_entity_type;
-    const gchar *form, *desc, *copy_txt, *descendant_txt;
+    const gchar *form, *desc, *copy_txt;
     gint64 copy_number;
     SCM scm;
-    GList *descendant, *account_descendants;
 
     if (!account)
         return NULL;
 
-    account_descendants = gnc_account_get_descendants (account);
-    if (account_descendants)
+    tax_related = xaccAccountGetTaxRelated (account);
+    code = xaccAccountGetTaxUSCode (account);
+
+    if (!code)
     {
-        gint sub_acct_tax_number = 0;
-        for (descendant = account_descendants; descendant;
-                descendant = g_list_next(descendant))
-        {
-            if (xaccAccountGetTaxRelated (descendant->data))
-                sub_acct_tax_number++;
-        }
+        if (!tax_related)
+            return NULL;
+        /* tax_related && !code */
+        else
         /* Translators: This and the following strings appear on
          * the account tab if the Tax Info column is displayed,
          * i.e. if the user wants to record the tax form number
@@ -495,35 +493,8 @@
          * account generally corresponds to a specific line number
          * on a paper form and each form has a unique
          * identification (e.g., Form 1040, Schedule A). */
-        descendant_txt = (sub_acct_tax_number == 0) ? "" :
-                         g_strdup_printf (_("(Tax-related subaccounts: %d)"),
-                                          sub_acct_tax_number);
+            return g_strdup (_("Tax-related but has no tax code"));
     }
-    else
-        descendant_txt = "";
-
-    tax_related = xaccAccountGetTaxRelated (account);
-    code = xaccAccountGetTaxUSCode (account);
-
-    if (!code)
-    {
-        if (!tax_related)
-        {
-            if (safe_strcmp (descendant_txt, "") == 0)
-                return NULL;
-            else
-                return g_strdup_printf ("%s", descendant_txt);
-        }
-        /* tax_related && !code */
-        else
-        {
-            if (safe_strcmp (descendant_txt, "") == 0)
-                return g_strdup (_("Tax-related but has no tax code"));
-            else
-                return g_strdup_printf
-                       (_("Tax-related but has no tax code; %s"), descendant_txt);
-        }
-    }
     else  /* with tax code */
     {
         const gchar *num_code = NULL;
@@ -531,13 +502,7 @@
 
         tax_type = gnc_get_current_book_tax_type ();
         if (tax_type == NULL || (safe_strcmp (tax_type, "") == 0))
-        {
-            if (safe_strcmp (descendant_txt, "") == 0)
-                return g_strdup (_("Tax entity type not specified"));
-            else
-                return g_strdup_printf
-                       (_("Tax entity type not specified; %s"), descendant_txt);
-        }
+            return g_strdup (_("Tax entity type not specified"));
         atype = xaccAccountGetType (account);
         /*    tax_entity_type = scm_from_locale_string (tax_type); <- requires guile 1.8*/
         tax_entity_type = scm_makfrom0str (tax_type); /* <-guile 1.6  */
@@ -602,27 +567,13 @@
         if (category == SCM_UNDEFINED)
         {
             if (tax_related)
-            {
-                if (safe_strcmp (descendant_txt, "") == 0)
-                    return g_strdup_printf
-                           (_("Tax type %s: invalid code %s for account type"),
-                            tax_type, num_code);
-                else
-                    return g_strdup_printf
-                           (_("Tax type %s: invalid code %s for account type; %s"),
-                            tax_type, num_code, descendant_txt);
-            }
+                return g_strdup_printf
+                       (_("Tax type %s: invalid code %s for account type"),
+                        tax_type, num_code);
             else
-            {
-                if (safe_strcmp (descendant_txt, "") == 0)
-                    return g_strdup_printf
-                           (_("Not tax-related; tax type %s: invalid code %s for account type"),
-                            tax_type, num_code);
-                else
-                    return g_strdup_printf
-                           (_("Not tax-related; tax type %s: invalid code %s for account type; %s"),
-                            tax_type, num_code, descendant_txt);
-            }
+                return g_strdup_printf
+                       (_("Not tax-related; tax type %s: invalid code %s for account type"),
+                        tax_type, num_code);
         }
 
         code_scm = scm_str2symbol (code);
@@ -630,107 +581,51 @@
         if (!scm_is_string (scm))
         {
             if (tax_related)
-            {
-                if (safe_strcmp (descendant_txt, "") == 0)
-                    return g_strdup_printf
-                           (_("Invalid code %s for tax type %s"),
-                            num_code, tax_type);
-                else
-                    return g_strdup_printf
-                           (_("Invalid code %s for tax type %s; %s"),
-                            num_code, tax_type, descendant_txt);
-            }
+                return g_strdup_printf
+                       (_("Invalid code %s for tax type %s"),
+                        num_code, tax_type);
             else
-            {
-                if (safe_strcmp (descendant_txt, "") == 0)
-                    return g_strdup_printf
-                           (_("Not tax-related; invalid code %s for tax type %s"),
-                            num_code, tax_type);
-                else
-                    return g_strdup_printf
-                           (_("Not tax-related; invalid code %s for tax type %s; %s"),
-                            num_code, tax_type, descendant_txt);
-            }
+                return g_strdup_printf
+                       (_("Not tax-related; invalid code %s for tax type %s"),
+                        num_code, tax_type);
         }
 
         form = scm_to_locale_string (scm);
         if (!form)
         {
             if (tax_related)
-            {
-                if (safe_strcmp (descendant_txt, "") == 0)
-                    return g_strdup_printf
-                           (_("No form: code %s, tax type %s"), num_code, tax_type);
-                else
-                    return g_strdup_printf
-                           (_("No form: code %s, tax type %s; %s"),
-                            num_code, tax_type, descendant_txt);
-            }
+                return g_strdup_printf
+                       (_("No form: code %s, tax type %s"), num_code, tax_type);
             else
-            {
-                if (safe_strcmp (descendant_txt, "") == 0)
-                    return g_strdup_printf
-                           (_("Not tax-related; no form: code %s, tax type %s"),
-                            num_code, tax_type);
-                else
-                    return g_strdup_printf
-                           (_("Not tax-related; no form: code %s, tax type %s; %s"),
-                            num_code, tax_type, descendant_txt);
-            }
+                return g_strdup_printf
+                       (_("Not tax-related; no form: code %s, tax type %s"),
+                        num_code, tax_type);
         }
 
         scm = scm_call_3 (get_desc, category, code_scm, tax_entity_type);
         if (!scm_is_string (scm))
         {
             if (tax_related)
-            {
-                if (safe_strcmp (descendant_txt, "") == 0)
-                    return g_strdup_printf
-                           (_("No description: form %s, code %s, tax type %s"),
-                            form, num_code, tax_type);
-                else
-                    return g_strdup_printf
-                           (_("No description: form %s, code %s, tax type %s; %s"),
-                            form, num_code, tax_type, descendant_txt);
-            }
+                return g_strdup_printf
+                       (_("No description: form %s, code %s, tax type %s"),
+                        form, num_code, tax_type);
             else
-            {
-                if (safe_strcmp (descendant_txt, "") == 0)
-                    return g_strdup_printf
-                           (_("Not tax-related; no description: form %s, code %s, tax type %s"),
-                            form, num_code, tax_type);
-                else
-                    return g_strdup_printf
-                           (_("Not tax-related; no description: form %s, code %s, tax type %s; %s"),
-                            form, num_code, tax_type, descendant_txt);
-            }
+                return g_strdup_printf
+                       (_("Not tax-related; no description: form %s, code %s, tax type %s"),
+                        form, num_code, tax_type);
         }
 
         desc = scm_to_locale_string (scm);
         if (!desc)
         {
             if (tax_related)
-            {
-                if (safe_strcmp (descendant_txt, "") == 0)
-                    return g_strdup_printf
-                           (_("No description: form %s, code %s, tax type %s"),
-                            form, num_code, tax_type);
-                else
-                    return g_strdup_printf
-                           (_("No description: form %s, code %s, tax type %s; %s"),
-                            form, num_code, tax_type, descendant_txt);
-            }
+                return g_strdup_printf
+                       (_("No description: form %s, code %s, tax type %s"),
+                        form, num_code, tax_type);
             else
-            {
-                if (safe_strcmp (descendant_txt, "") == 0)
-                    return g_strdup_printf
-                           (_("Not tax-related; no description: form %s, code %s, tax type %s"),
-                            form, num_code, tax_type);
-                else
-                    return g_strdup_printf
-                           (_("Not tax-related; no description: form %s, code %s, tax type %s; %s"),
-                            form, num_code, tax_type, descendant_txt);
-            }
+                return g_strdup_printf
+                       (_("Not tax-related; no description: form %s, code %s, tax type %s"),
+                        form, num_code, tax_type);
         }
 
         copy_number = xaccAccountGetTaxUSCopyNumber (account);
@@ -740,36 +635,53 @@
         if (tax_related)
         {
             if (safe_strcmp (form, "") == 0)
-            {
-                if (safe_strcmp (descendant_txt, "") == 0)
-                    return g_strdup_printf ("%s", desc);
-                else
-                    return g_strdup_printf ("%s; %s", desc, descendant_txt);
-            }
+                return g_strdup_printf ("%s", desc);
             else
-            {
-                if (safe_strcmp (descendant_txt, "") == 0)
-                    return g_strdup_printf ("%s%s: %s", form, copy_txt, desc);
-                else
-                    return g_strdup_printf ("%s%s: %s; %s",
-                                            form, copy_txt, desc, descendant_txt);
-            }
+                return g_strdup_printf ("%s%s: %s", form, copy_txt, desc);
         }
         else
+            return g_strdup_printf
+                   (_("Not tax-related; %s%s: %s (code %s, tax type %s)"),
+                    form, copy_txt, desc, num_code, tax_type);
+    }
+}
+
+/* Caller is responsible for g_free'ing returned memory */
+char *
+gnc_ui_account_get_tax_info_sub_acct_string (const Account *account)
+{
+    GList *descendant, *account_descendants;
+
+    if (!account)
+        return NULL;
+
+    account_descendants = gnc_account_get_descendants (account);
+    if (account_descendants)
+    {
+        gint sub_acct_tax_number = 0;
+        for (descendant = account_descendants; descendant;
+                descendant = g_list_next(descendant))
         {
-            if (safe_strcmp (descendant_txt, "") == 0)
-                return g_strdup_printf
-                       (_("Not tax-related; %s%s: %s (code %s, tax type %s)"),
-                        form, copy_txt, desc, num_code, tax_type);
-            else
-                return g_strdup_printf
-                       (_("Not tax-related; %s%s: %s (code %s, tax type %s); %s"),
-                        form, copy_txt, desc, num_code, tax_type, descendant_txt);
+            if (xaccAccountGetTaxRelated (descendant->data))
+                sub_acct_tax_number++;
         }
+        /* Translators: This and the following strings appear on
+         * the account tab if the Tax Info column is displayed,
+         * i.e. if the user wants to record the tax form number
+         * and location on that tax form which corresponds to this
+         * gnucash account. For the US Income Tax support in
+         * gnucash, each tax code that can be assigned to an
+         * account generally corresponds to a specific line number
+         * on a paper form and each form has a unique
+         * identification (e.g., Form 1040, Schedule A). */
+        return (sub_acct_tax_number == 0) ? g_strdup ("") :
+                g_strdup_printf (_("(Tax-related subaccounts: %d)"),
+                                 sub_acct_tax_number);
     }
+    else
+        return g_strdup ("");
 }
 
-
 static const char *
 string_after_colon (const char *msgstr)
 {

Modified: gnucash/trunk/src/app-utils/gnc-ui-util.h
===================================================================
--- gnucash/trunk/src/app-utils/gnc-ui-util.h	2011-01-30 18:33:53 UTC (rev 20206)
+++ gnucash/trunk/src/app-utils/gnc-ui-util.h	2011-01-30 20:34:55 UTC (rev 20207)
@@ -177,6 +177,8 @@
 
 char *gnc_ui_account_get_tax_info_string (const Account *account);
 
+char *gnc_ui_account_get_tax_info_sub_acct_string (const Account *account);
+
 gnc_numeric gnc_ui_account_get_balance_as_of_date (Account *account,
         time_t date,
         gboolean include_children);

Modified: gnucash/trunk/src/gnome-utils/gnc-tree-model-account.c
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-tree-model-account.c	2011-01-30 18:33:53 UTC (rev 20206)
+++ gnucash/trunk/src/gnome-utils/gnc-tree-model-account.c	2011-01-30 20:34:55 UTC (rev 20207)
@@ -411,6 +411,7 @@
     case GNC_TREE_MODEL_ACCOUNT_COL_TOTAL_PERIOD:
     case GNC_TREE_MODEL_ACCOUNT_COL_NOTES:
     case GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO:
+    case GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT:
     case GNC_TREE_MODEL_ACCOUNT_COL_LASTNUM:
 
     case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_PRESENT:
@@ -801,6 +802,11 @@
         g_value_take_string (value, gnc_ui_account_get_tax_info_string (account));
         break;
 
+    case GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT:
+        g_value_init (value, G_TYPE_STRING);
+        g_value_take_string (value, gnc_ui_account_get_tax_info_sub_acct_string (account));
+        break;
+
     case GNC_TREE_MODEL_ACCOUNT_COL_LASTNUM:
         g_value_init (value, G_TYPE_STRING);
         g_value_set_string (value, xaccAccountGetLastNum (account));

Modified: gnucash/trunk/src/gnome-utils/gnc-tree-model-account.h
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-tree-model-account.h	2011-01-30 18:33:53 UTC (rev 20206)
+++ gnucash/trunk/src/gnome-utils/gnc-tree-model-account.h	2011-01-30 20:34:55 UTC (rev 20207)
@@ -78,6 +78,7 @@
     GNC_TREE_MODEL_ACCOUNT_COL_TOTAL_PERIOD,
     GNC_TREE_MODEL_ACCOUNT_COL_NOTES,
     GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO,
+    GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT,
     GNC_TREE_MODEL_ACCOUNT_COL_PLACEHOLDER,
 
     GNC_TREE_MODEL_ACCOUNT_COL_LAST_VISIBLE = GNC_TREE_MODEL_ACCOUNT_COL_PLACEHOLDER,

Modified: gnucash/trunk/src/gnome-utils/gnc-tree-view-account.c
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-tree-view-account.c	2011-01-30 18:33:53 UTC (rev 20206)
+++ gnucash/trunk/src/gnome-utils/gnc-tree-view-account.c	2011-01-30 20:34:55 UTC (rev 20207)
@@ -71,6 +71,12 @@
         GtkCellRenderer *renderer,
         GncTreeViewAccountColumnTextEdited col_edited_cb);
 
+static void tax_info_data_func (GtkTreeViewColumn *col,
+        GtkCellRenderer   *renderer,
+        GtkTreeModel      *model,
+        GtkTreeIter       *iter,
+        gpointer           view);
+
 typedef struct GncTreeViewAccountPrivate
 {
     AccountViewInfo avi;
@@ -460,6 +466,66 @@
 }
 
 /************************************************************/
+/*                 Tax_Info data function                   */
+/************************************************************/
+
+/*
+ * The tax-info column in the account tree view is based on the
+ * combination of two columns in the account tree model. The data
+ * function displays only the the data in the
+ * GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO model column if the row is 
+ * expanded; otherwise it combines it with the data
+ * in the GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT model column.
+ */
+static void
+tax_info_data_func (GtkTreeViewColumn *col,
+                    GtkCellRenderer   *renderer,
+                    GtkTreeModel      *model,
+                    GtkTreeIter       *iter,
+                    gpointer           view)
+{
+    const gchar *tax_info, *tax_info_sub_acct;
+    GtkTreePath *path;
+
+    gtk_tree_model_get(model,
+                       iter, 
+                       GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO,
+                       &tax_info,
+                       -1);
+
+    if (tax_info == NULL)
+        tax_info = "";
+    path = gtk_tree_model_get_path(model, iter);
+    if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(view), path))
+        g_object_set(renderer, "text", tax_info, NULL);
+    else
+    {
+        gtk_tree_model_get(model,
+                           iter, 
+                           GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT,
+                           &tax_info_sub_acct,
+                           -1);
+        if (tax_info_sub_acct == NULL)
+            tax_info_sub_acct = "";
+        if (safe_strcmp (tax_info_sub_acct, "") == 0)
+            g_object_set(renderer, "text", tax_info, NULL);
+        else
+        {
+            if (safe_strcmp (tax_info, "") == 0)
+                g_object_set(renderer, "text", tax_info_sub_acct, NULL);
+            else
+            {
+                const gchar *combined_tax_info;
+                combined_tax_info = g_strdup_printf ("%s; %s", tax_info,
+                       tax_info_sub_acct);
+                g_object_set(renderer, "text", combined_tax_info, NULL);
+            }
+        }
+    }
+    gtk_tree_path_free(path);
+}
+
+/************************************************************/
 /*                    New View Creation                     */
 /************************************************************/
 
@@ -477,6 +543,8 @@
     GtkTreePath *virtual_root_path = NULL;
     const gchar *sample_type, *sample_commodity;
     GncTreeViewAccountPrivate *priv;
+    GtkTreeViewColumn *tax_info_column;
+    GtkCellRenderer *renderer;
 
     ENTER(" ");
     /* Create our view */
@@ -644,11 +712,18 @@
                                     GNC_TREE_MODEL_ACCOUNT_COL_NOTES,
                                     GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
                                     sort_by_string);
-    gnc_tree_view_add_text_column(view, _("Tax Info"), "tax-info", NULL,
+    tax_info_column
+    = gnc_tree_view_add_text_column(view, _("Tax Info"), "tax-info", NULL,
                                   "Sample tax info.",
-                                  GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO,
+                                  GNC_TREE_VIEW_COLUMN_DATA_NONE,
                                   GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
                                   sort_by_string);
+    renderer = gnc_tree_view_column_get_renderer(tax_info_column);
+    gtk_tree_view_column_set_cell_data_func(tax_info_column,
+                                            renderer,
+                                            tax_info_data_func,
+                                            GTK_TREE_VIEW(view),
+                                            NULL);
     gnc_tree_view_add_toggle_column(view, _("Placeholder"),
                                     /* Translators: This string has a context prefix; the translation
                                     	must only contain the part after the | character. */



More information about the gnucash-changes mailing list