GnuCash 2.4.99
dialog-tax-info.c
00001 /********************************************************************\
00002  * dialog-tax-info.c -- tax information dialog                      *
00003  * Copyright (C) 2001 Gnumatic, Inc.                                *
00004  * Author: Dave Peticolas <dave@krondo.com>                         *
00005  *                                                                  *
00006  *                                                                  *
00007  * updated by  J. Alex Aycinena, July 2009                          *
00008  *                                                                  *
00009  * This program is free software; you can redistribute it and/or    *
00010  * modify it under the terms of the GNU General Public License as   *
00011  * published by the Free Software Foundation; either version 2 of   *
00012  * the License, or (at your option) any later version.              *
00013  *                                                                  *
00014  * This program is distributed in the hope that it will be useful,  *
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
00017  * GNU General Public License for more details.                     *
00018  *                                                                  *
00019  * You should have received a copy of the GNU General Public License*
00020  * along with this program; if not, contact:                        *
00021  *                                                                  *
00022  * Free Software Foundation           Voice:  +1-617-542-5942       *
00023  * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
00024  * Boston, MA  02110-1301,  USA       gnu@gnu.org                   *
00025 \********************************************************************/
00026 
00027 #include "config.h"
00028 
00029 #include <gtk/gtk.h>
00030 #include <glib/gi18n.h>
00031 #include <libguile.h>
00032 #include "guile-mappings.h"
00033 
00034 #include "Account.h"
00035 #include "gnc-ui-util.h"
00036 #include "dialog-utils.h"
00037 #include "gnc-gconf-utils.h"
00038 #include "gnc-tree-view-account.h"
00039 #include "gnc-component-manager.h"
00040 #include "gnc-session.h"
00041 #include "qof.h"
00042 #include "gnc-ui.h"
00043 
00044 #define DIALOG_TAX_INFO_CM_CLASS "dialog-tax-info"
00045 #define GCONF_SECTION "dialogs/tax_info"
00046 #define PANED_POSITION "paned_position"
00047 
00048 enum
00049 {
00050     INCOME,
00051     EXPENSE,
00052     ASSET,
00053     LIAB_EQ,
00054     N_CATEGORIES
00055 };
00056 
00057 static struct
00058 {
00059     SCM payer_name_source;
00060     SCM form;
00061     SCM description;
00062     SCM help;
00063     SCM line_data;
00064     SCM last_year;
00065     SCM copy;
00066 
00067     SCM codes;
00068 
00069     SCM tax_entity_type;
00070     SCM tax_entity_desc;
00071 
00072     SCM tax_entity_types;
00073 } getters;
00074 
00075 typedef struct
00076 {
00077     char *type_code;
00078     char *type;
00079     char *description;
00080     char *combo_box_entry;
00081 } TaxTypeInfo;
00082 
00083 typedef struct
00084 {
00085     char *code;
00086     char *payer_name_source;
00087     char *form;
00088     char *description;
00089     char *help;
00090     gboolean copy;
00091 } TXFInfo;
00092 
00093 typedef struct
00094 {
00095     GtkWidget * dialog;
00096     GtkWidget * paned;
00097 
00098     GtkWidget * entity_name_display;
00099     GtkWidget * entity_name_entry;
00100     GtkWidget * entity_type_display;
00101     GtkWidget * entity_type_combo;
00102     GtkWidget * tax_identity_edit_button;
00103 
00104     GtkWidget * acct_info;
00105     GtkWidget * expense_radio;
00106     GtkWidget * asset_radio;
00107     GtkWidget * liab_eq_radio;
00108     GtkWidget * account_treeview;
00109     GtkWidget * select_button;
00110     GtkWidget * num_acct_label;
00111 
00112     GtkWidget * txf_info;
00113     GtkWidget * tax_related_button;
00114     GtkWidget * txf_vbox;
00115     GtkWidget * txf_category_view;
00116     GtkWidget * txf_help_text;
00117     GtkWidget * help_scroll;
00118     GtkWidget * payer_vbox;
00119     GtkWidget * pns_vbox;
00120     GtkWidget * current_account_button;
00121     GtkWidget * parent_account_button;
00122     GtkWidget * copy_vbox;
00123     GtkWidget * copy_spin_button;
00124 
00125     GList * entity_type_infos;
00126     GList * income_txf_infos;
00127     GList * expense_txf_infos;
00128     GList * asset_txf_infos;
00129     GList * liab_eq_txf_infos;
00130 
00131     const gchar * tax_name;
00132     const gchar * tax_type;
00133     const gchar * tax_type_combo_text;
00134     const gchar * default_tax_type;
00135 
00136     QofBook *this_book;
00137 
00138     gboolean changed;
00139     gboolean tax_type_changed;
00140 
00141     GNCAccountType account_type;
00142 } TaxInfoDialog;
00143 
00144 static void
00145 initialize_getters (void)
00146 {
00147     getters.payer_name_source = scm_c_eval_string ("gnc:txf-get-payer-name-source");
00148     getters.form              = scm_c_eval_string ("gnc:txf-get-form");
00149     getters.description       = scm_c_eval_string ("gnc:txf-get-description");
00150     getters.help              = scm_c_eval_string ("gnc:txf-get-help");
00151     getters.line_data         = scm_c_eval_string ("gnc:txf-get-line-data");
00152     getters.last_year         = scm_c_eval_string ("gnc:txf-get-last-year");
00153     getters.copy              = scm_c_eval_string ("gnc:txf-get-multiple");
00154 
00155     getters.codes             = scm_c_eval_string ("gnc:txf-get-codes");
00156 
00157     getters.tax_entity_type   = scm_c_eval_string ("gnc:txf-get-tax-entity-type");
00158     getters.tax_entity_desc   = scm_c_eval_string
00159                                 ("gnc:txf-get-tax-entity-type-description");
00160 
00161     getters.tax_entity_types = scm_c_eval_string
00162                                ("gnc:txf-get-tax-entity-type-codes");
00163 }
00164 
00165 static void
00166 destroy_tax_type_info (gpointer data, gpointer user_data)
00167 {
00168     TaxTypeInfo *tax_type = data;
00169 
00170     g_free (tax_type->type_code);
00171     tax_type->type_code = NULL;
00172 
00173     g_free (tax_type->type);
00174     tax_type->type = NULL;
00175 
00176     g_free (tax_type->description);
00177     tax_type->description = NULL;
00178 
00179     g_free (tax_type->combo_box_entry);
00180     tax_type->combo_box_entry = NULL;
00181 
00182     g_free (tax_type);
00183 }
00184 
00185 static void
00186 destroy_tax_type_infos (GList *types)
00187 {
00188     g_list_foreach (types, destroy_tax_type_info, NULL);
00189     g_list_free (types);
00190 }
00191 
00192 static void
00193 destroy_txf_info (gpointer data, gpointer user_data)
00194 {
00195     TXFInfo *txf_info = data;
00196 
00197     g_free (txf_info->code);
00198     txf_info->code = NULL;
00199 
00200     g_free (txf_info->payer_name_source);
00201     txf_info->payer_name_source = NULL;
00202 
00203     g_free (txf_info->form);
00204     txf_info->form = NULL;
00205 
00206     g_free (txf_info->description);
00207     txf_info->description = NULL;
00208 
00209     g_free (txf_info->help);
00210     txf_info->help = NULL;
00211 
00212     g_free (txf_info);
00213 }
00214 
00215 static void
00216 destroy_txf_infos (GList *infos)
00217 {
00218     g_list_foreach (infos, destroy_txf_info, NULL);
00219     g_list_free (infos);
00220 }
00221 
00222 static void
00223 gnc_tax_info_set_changed (TaxInfoDialog *ti_dialog, gboolean changed)
00224 {
00225     ti_dialog->changed = changed;
00226 }
00227 
00228 static GList *
00229 load_txf_info (gint acct_category, TaxInfoDialog *ti_dialog)
00230 {
00231     GList *infos = NULL;
00232     SCM tax_entity_type;
00233     SCM category;
00234     SCM codes;
00235 
00236     if (ti_dialog->tax_type == NULL ||
00237             (safe_strcmp (ti_dialog->tax_type, "") == 0))
00238     {
00239         destroy_txf_infos (infos);
00240         return NULL;
00241     }
00242     else
00243     {
00244         tax_entity_type = scm_from_locale_string (ti_dialog->tax_type);
00245     }
00246 
00247     switch (acct_category)
00248     {
00249     case INCOME:
00250         category = scm_c_eval_string ("txf-income-categories");
00251         break;
00252     case EXPENSE:
00253         category = scm_c_eval_string ("txf-expense-categories");
00254         break;
00255     case ASSET:
00256         category = scm_c_eval_string ("txf-asset-categories");
00257         break;
00258     case LIAB_EQ:
00259         category = scm_c_eval_string ("txf-liab-eq-categories");
00260         break;
00261     default:
00262         destroy_txf_infos (infos);
00263         return NULL;
00264     }
00265 
00266     if (category == SCM_UNDEFINED)
00267     {
00268         destroy_txf_infos (infos);
00269         return NULL;
00270     }
00271 
00272     codes = scm_call_2 (getters.codes, category, tax_entity_type);
00273     if (!scm_is_list (codes))
00274     {
00275         destroy_txf_infos (infos);
00276         return NULL;
00277     }
00278 
00279     while (!scm_is_null (codes))
00280     {
00281         TXFInfo *txf_info;
00282         SCM code_scm;
00283         const gchar *last_yr = _("Last Valid Year: ");
00284         const gchar *form_line = _("Form Line Data: ");
00285         const gchar *code_line_word = _("Code");
00286         const gchar *code_line_colon = ": ";
00287         const gchar *prefix = "N";
00288         gchar *str = NULL;
00289         gchar *num_code = NULL;
00290         gchar *form_line_data = NULL;
00291         gchar *help_text = NULL;
00292         SCM scm;
00293         gint year;
00294         gboolean cpy;
00295 
00296         code_scm  = SCM_CAR (codes);
00297         codes     = SCM_CDR (codes);
00298 
00299         scm = scm_call_3 (getters.payer_name_source, category, code_scm,
00300                           tax_entity_type);
00301         if (scm_is_symbol(scm))
00302             str = g_strdup (SCM_SYMBOL_CHARS (scm));
00303         else
00304             str = g_strdup ("");
00305         if (safe_strcmp (str, "not-impl") == 0)
00306         {
00307             g_free (str);
00308             continue;
00309         }
00310 
00311         txf_info = g_new0 (TXFInfo, 1);
00312 
00313         if (safe_strcmp (str, "none") == 0)
00314             txf_info->payer_name_source = NULL;
00315         else
00316             txf_info->payer_name_source = g_strdup (str);
00317         g_free (str);
00318 
00319         if (scm_is_symbol(code_scm))
00320             str = g_strdup (SCM_SYMBOL_CHARS (code_scm));
00321         else
00322             str = g_strdup ("");
00323         txf_info->code = g_strdup (str);
00324         if (g_str_has_prefix (str, prefix))
00325         {
00326             const gchar *num_code_tmp;
00327             num_code_tmp = g_strdup (str);
00328             num_code_tmp++; /* to lose the leading N */
00329             num_code = g_strdup (num_code_tmp);
00330             num_code_tmp--;
00331             g_free ((gpointer *) num_code_tmp);
00332         }
00333         else
00334             num_code = g_strdup (str);
00335         g_free (str);
00336 
00337         scm = scm_call_3 (getters.form, category, code_scm, tax_entity_type);
00338         if (scm_is_string(scm))
00339         {
00340             scm_dynwind_begin (0);
00341             str = scm_to_locale_string(scm);
00342             txf_info->form = g_strdup (str);
00343             scm_dynwind_free (str);
00344             scm_dynwind_end ();
00345         }
00346         else
00347             txf_info->form = g_strdup ("");
00348 
00349         scm = scm_call_3 (getters.description, category, code_scm, tax_entity_type);
00350         if (scm_is_string(scm))
00351         {
00352             scm_dynwind_begin (0);
00353             str = scm_to_locale_string(scm);
00354             txf_info->description = g_strdup (str);
00355             scm_dynwind_free (str);
00356             scm_dynwind_end ();
00357         }
00358         else
00359             txf_info->description = g_strdup ("");
00360 
00361         scm = scm_call_2 (getters.help, category, code_scm);
00362         if (scm_is_string(scm))
00363         {
00364             scm_dynwind_begin (0);
00365             str = scm_to_locale_string(scm);
00366             help_text = g_strdup (str);
00367             scm_dynwind_free (str);
00368             scm_dynwind_end ();
00369         }
00370         else
00371             help_text = g_strdup ("");
00372 
00373         scm = scm_call_3 (getters.last_year, category, code_scm, tax_entity_type);
00374         year = scm_is_bool (scm) ? 0 : scm_to_int(scm);
00375         scm = scm_call_3 (getters.line_data, category, code_scm, tax_entity_type);
00376         if (scm_is_list (scm))
00377         {
00378             const gchar *now = _("now");
00379             gchar *until;
00380 
00381             until = (gchar *) now;
00382             form_line_data = g_strconcat ("\n", "\n", form_line, NULL);
00383             while (!scm_is_null (scm))
00384             {
00385                 SCM year_scm;
00386                 gint line_year;
00387                 gchar *line = NULL;
00388                 gchar *temp = NULL;
00389                 gchar *temp2 = NULL;
00390 
00391                 year_scm  = SCM_CAR (scm);
00392                 scm       = SCM_CDR (scm);
00393 
00394                 line_year = scm_is_bool (SCM_CAR (year_scm)) ? 0 :
00395                             scm_to_int (SCM_CAR (year_scm));
00396                 if (scm_is_string((SCM_CAR (SCM_CDR (year_scm)))))
00397                 {
00398                     gchar *temp_line;
00399                     scm_dynwind_begin (0);
00400                     temp_line = scm_to_locale_string((SCM_CAR (SCM_CDR
00401                                                       (year_scm))));
00402                     line = g_strdup (temp_line);
00403                     scm_dynwind_free (temp_line);
00404                     scm_dynwind_end ();
00405                 }
00406                 else
00407                     line = g_strdup ("");
00408                 temp2 = g_strdup_printf ("%d", line_year);
00409                 temp = g_strconcat (form_line_data, "\n", temp2, " - ",
00410                                     until, "   ", line, NULL);
00411                 if (until != now)
00412                     g_free (until);
00413                 until = g_strdup_printf ("%d", (line_year - 1));
00414                 g_free (form_line_data);
00415                 form_line_data = g_strdup (temp);
00416                 g_free (line);
00417                 g_free (temp);
00418                 g_free (temp2);
00419             }
00420             if (safe_strcmp (until, now) != 0)
00421                 g_free (until);
00422         }
00423         if (year != 0)
00424         {
00425             gchar *temp = g_strdup_printf("%d", year);
00426             if (form_line_data != NULL)
00427                 txf_info->help = g_strconcat (last_yr, temp, "\n", "\n",
00428                                               help_text, "\n", "\n",
00429                                               code_line_word,
00430                                               code_line_colon, num_code,
00431                                               form_line_data, NULL);
00432             else
00433                 txf_info->help = g_strconcat (last_yr, temp, "\n", "\n",
00434                                               help_text, "\n", "\n",
00435                                               code_line_word,
00436                                               code_line_colon, num_code, NULL);
00437             g_free (temp);
00438         }
00439         else
00440         {
00441             if (form_line_data != NULL)
00442                 txf_info->help = g_strconcat (help_text, "\n", "\n",
00443                                               code_line_word,
00444                                               code_line_colon, num_code,
00445                                               form_line_data, NULL);
00446             else
00447                 txf_info->help = g_strconcat (help_text, "\n", "\n",
00448                                               code_line_word,
00449                                               code_line_colon, num_code, NULL);
00450         }
00451 
00452         g_free (num_code);
00453         g_free (help_text);
00454         g_free (form_line_data);
00455 
00456         scm = scm_call_3 (getters.copy, category, code_scm, tax_entity_type);
00457         cpy = scm_is_bool (scm) ? (scm_is_false (scm) ? FALSE : TRUE) : FALSE;
00458         txf_info->copy = cpy;
00459 
00460         infos = g_list_prepend (infos, txf_info);
00461     }
00462     return g_list_reverse (infos);
00463 }
00464 
00465 static GList *
00466 tax_infos (TaxInfoDialog *ti_dialog)
00467 {
00468     return
00469         (ti_dialog->account_type == ACCT_TYPE_INCOME)
00470         ? ti_dialog->income_txf_infos :
00471         ((ti_dialog->account_type == ACCT_TYPE_EXPENSE)
00472          ? ti_dialog->expense_txf_infos :
00473          (((ti_dialog->account_type == ACCT_TYPE_ASSET)
00474            ? ti_dialog->asset_txf_infos :
00475            ti_dialog->liab_eq_txf_infos)));
00476 }
00477 
00478 static void
00479 load_tax_entity_type_list (TaxInfoDialog *ti_dialog)
00480 {
00481     GList *types = NULL;
00482     SCM tax_types;
00483 
00484     ti_dialog->tax_type_combo_text = NULL;
00485     tax_types = scm_call_0 (getters.tax_entity_types);
00486     if (!scm_is_list (tax_types))
00487     {
00488         destroy_tax_type_infos (types);
00489         return;
00490     }
00491 
00492     while (!scm_is_null (tax_types))
00493     {
00494         TaxTypeInfo *tax_type_info;
00495         SCM type_scm;
00496         gchar *str = NULL;
00497         SCM scm;
00498 
00499         type_scm  = SCM_CAR (tax_types);
00500         tax_types = SCM_CDR (tax_types);
00501 
00502         ti_dialog->default_tax_type = NULL;
00503 
00504         tax_type_info = g_new0 (TaxTypeInfo, 1);
00505 
00506         if (scm_is_symbol(type_scm))
00507             str = g_strdup (SCM_SYMBOL_CHARS (type_scm));
00508         else
00509             str = g_strdup ("");
00510         tax_type_info->type_code = g_strdup (str);
00511         g_free (str);
00512 
00513         scm = scm_call_1 (getters.tax_entity_type, type_scm);
00514         if (scm_is_string(scm))
00515         {
00516             scm_dynwind_begin (0);
00517             str = scm_to_locale_string(scm);
00518             tax_type_info->type = g_strdup (str);
00519             scm_dynwind_free (str);
00520             scm_dynwind_end ();
00521         }
00522         else
00523             tax_type_info->type = g_strdup ("");
00524 
00525         scm = scm_call_1 (getters.tax_entity_desc, type_scm);
00526         if (scm_is_string(scm))
00527         {
00528             scm_dynwind_begin (0);
00529             str = scm_to_locale_string(scm);
00530             tax_type_info->description = g_strdup (str);
00531             scm_dynwind_free (str);
00532             scm_dynwind_end ();
00533         }
00534         else
00535             tax_type_info->description = g_strdup ("");
00536 
00537         tax_type_info->combo_box_entry = g_strconcat(tax_type_info->type,
00538                                          " - ",
00539                                          tax_type_info->description, NULL);
00540         /* save combo text for current tax type code */
00541         if (safe_strcmp (ti_dialog->tax_type, tax_type_info->type_code) == 0)
00542             ti_dialog->tax_type_combo_text = tax_type_info->combo_box_entry;
00543         /* the last will be default */
00544         ti_dialog->default_tax_type = tax_type_info->combo_box_entry;
00545 
00546         types = g_list_prepend (types, tax_type_info);
00547     }
00548     ti_dialog->entity_type_infos = g_list_reverse (types);
00549 }
00550 
00551 static void
00552 load_category_list (TaxInfoDialog *ti_dialog)
00553 {
00554     GtkTreeView *view;
00555     GtkListStore *store;
00556     GtkTreeIter iter;
00557     GList *codes;
00558 
00559     view = GTK_TREE_VIEW(ti_dialog->txf_category_view);
00560     store = GTK_LIST_STORE(gtk_tree_view_get_model(view));
00561     g_object_ref(store);
00562     gtk_tree_view_set_model(view, NULL);
00563 
00564     gtk_list_store_clear(store);
00565 
00566     codes = tax_infos (ti_dialog);
00567     for ( ; codes; codes = codes->next)
00568     {
00569         TXFInfo *txf_info = codes->data;
00570 
00571         gtk_list_store_append(store, &iter);
00572         gtk_list_store_set(store, &iter,
00573                            0, txf_info->form,
00574                            1, txf_info->description,
00575                            -1);
00576     }
00577 
00578     gtk_tree_view_set_model(view, GTK_TREE_MODEL(store));
00579     g_object_unref(store);
00580 }
00581 
00582 static void
00583 clear_gui (TaxInfoDialog *ti_dialog)
00584 {
00585     GtkTreeView *view;
00586     GtkTreeSelection *selection;
00587 
00588     gtk_toggle_button_set_active
00589     (GTK_TOGGLE_BUTTON (ti_dialog->tax_related_button), FALSE);
00590 
00591     view = GTK_TREE_VIEW(ti_dialog->txf_category_view);
00592     selection = gtk_tree_view_get_selection(view);
00593     gtk_tree_selection_unselect_all(selection);
00594 
00595     gtk_toggle_button_set_active
00596     (GTK_TOGGLE_BUTTON (ti_dialog->current_account_button), TRUE);
00597 
00598     gtk_spin_button_set_value
00599     (GTK_SPIN_BUTTON (ti_dialog->copy_spin_button), 1);
00600 }
00601 
00602 static gboolean
00603 gnc_tax_info_dialog_account_filter_func (Account *account,
00604         gpointer data)
00605 {
00606     TaxInfoDialog *dialog = data;
00607     gboolean included = FALSE;
00608 
00609     if ((dialog->account_type == ACCT_TYPE_INCOME) ||
00610             (dialog->account_type == ACCT_TYPE_EXPENSE))
00611         included = (xaccAccountGetType (account) == dialog->account_type);
00612     else if (dialog->account_type == ACCT_TYPE_ASSET)
00613         included = ((xaccAccountGetType (account) == ACCT_TYPE_BANK) ||
00614                     (xaccAccountGetType (account) == ACCT_TYPE_CASH) ||
00615                     (xaccAccountGetType (account) == ACCT_TYPE_ASSET) ||
00616                     (xaccAccountGetType (account) == ACCT_TYPE_STOCK) ||
00617                     (xaccAccountGetType (account) == ACCT_TYPE_MUTUAL) ||
00618                     (xaccAccountGetType (account) == ACCT_TYPE_RECEIVABLE));
00619     else if (dialog->account_type == ACCT_TYPE_LIABILITY)
00620         included = ((xaccAccountGetType (account) == ACCT_TYPE_CREDIT) ||
00621                     (xaccAccountGetType (account) == ACCT_TYPE_LIABILITY) ||
00622                     (xaccAccountGetType (account) == ACCT_TYPE_EQUITY) ||
00623                     (xaccAccountGetType (account) == ACCT_TYPE_PAYABLE));
00624     else
00625         included = FALSE;
00626     return included;
00627 }
00628 
00629 static TXFInfo *
00630 txf_infos_find_code (GList *infos, const char *code)
00631 {
00632     for (; infos; infos = infos->next)
00633     {
00634         TXFInfo *info = infos->data;
00635 
00636         if (safe_strcmp (code, info->code) == 0)
00637             return info;
00638     }
00639 
00640     return NULL;
00641 }
00642 
00643 static void
00644 account_to_gui (TaxInfoDialog *ti_dialog, Account *account)
00645 {
00646     GtkTreeView *view;
00647     GtkTreeSelection *selection;
00648     GtkTreePath *path;
00649     gboolean tax_related;
00650     const char *str;
00651     TXFInfo *info;
00652     GList *infos;
00653     guint index;
00654 
00655     if (!account)
00656     {
00657         clear_gui (ti_dialog);
00658         return;
00659     }
00660 
00661     tax_related = xaccAccountGetTaxRelated (account);
00662     gtk_toggle_button_set_active
00663     (GTK_TOGGLE_BUTTON (ti_dialog->tax_related_button), tax_related);
00664 
00665     infos = tax_infos (ti_dialog);
00666 
00667     str = xaccAccountGetTaxUSCode (account);
00668     info = txf_infos_find_code (infos, str);
00669     if (info)
00670         index = g_list_index (infos, info);
00671     else
00672         index = 0;
00673     if (index < 0)
00674         index = 0;
00675 
00676     view = GTK_TREE_VIEW(ti_dialog->txf_category_view);
00677     selection = gtk_tree_view_get_selection(view);
00678     path =  gtk_tree_path_new_from_indices(index, -1);
00679     gtk_tree_selection_select_path(selection, path);
00680     gtk_tree_view_scroll_to_cell(view, path, NULL, FALSE, 0, 0);
00681     gtk_tree_path_free(path);
00682 
00683     str = xaccAccountGetTaxUSPayerNameSource (account);
00684     if (safe_strcmp (str, "parent") == 0)
00685         gtk_toggle_button_set_active
00686         (GTK_TOGGLE_BUTTON (ti_dialog->parent_account_button), TRUE);
00687     else
00688         gtk_toggle_button_set_active
00689         (GTK_TOGGLE_BUTTON (ti_dialog->current_account_button), TRUE);
00690 
00691     gtk_spin_button_set_value
00692     (GTK_SPIN_BUTTON (ti_dialog->copy_spin_button),
00693      (gdouble) xaccAccountGetTaxUSCopyNumber (account));
00694 }
00695 
00696 static void
00697 gui_to_accounts (TaxInfoDialog *ti_dialog)
00698 {
00699     GtkTreeView *view;
00700     GtkTreeModel *model;
00701     GtkTreeSelection *selection;
00702     GtkTreePath *path;
00703     GtkTreeIter iter;
00704     gint *indices;
00705     gboolean tax_related;
00706     const char *code;
00707     const char *pns;
00708     GList *accounts;
00709     TXFInfo *info;
00710     GList *infos;
00711     GList *node;
00712     gint64 copy_number;
00713 
00714     tax_related = gtk_toggle_button_get_active
00715                   (GTK_TOGGLE_BUTTON (ti_dialog->tax_related_button));
00716 
00717     infos = tax_infos (ti_dialog);
00718 
00719     view = GTK_TREE_VIEW(ti_dialog->txf_category_view);
00720     selection = gtk_tree_view_get_selection(view);
00721     if (!gtk_tree_selection_get_selected(selection, &model, &iter))
00722         return;
00723     path = gtk_tree_model_get_path(model, &iter);
00724     indices = gtk_tree_path_get_indices(path);
00725     info = g_list_nth_data (infos, indices[0]);
00726     gtk_tree_path_free(path);
00727     g_return_if_fail (info != NULL);
00728 
00729     code = tax_related ? info->code : NULL;
00730 
00731     if (tax_related && info->payer_name_source)
00732     {
00733         gboolean current;
00734 
00735         current = gtk_toggle_button_get_active
00736                   (GTK_TOGGLE_BUTTON (ti_dialog->current_account_button));
00737 
00738         pns = current ? "current" : "parent";
00739     }
00740     else
00741         pns = NULL;
00742 
00743     if (tax_related && info->copy)
00744     {
00745         copy_number = gtk_spin_button_get_value_as_int
00746                       (GTK_SPIN_BUTTON (ti_dialog->copy_spin_button));
00747     }
00748     else
00749         copy_number = 0;/* setting to zero removes slot */
00750 
00751     accounts = gnc_tree_view_account_get_selected_accounts
00752                (GNC_TREE_VIEW_ACCOUNT(ti_dialog->account_treeview));
00753 
00754     for (node = accounts; node; node = node->next)
00755     {
00756         Account *account = node->data;
00757 
00758         xaccAccountBeginEdit (account);
00759 
00760         xaccAccountSetTaxRelated (account, tax_related);
00761         xaccAccountSetTaxUSPayerNameSource (account, pns);
00762         xaccAccountSetTaxUSCopyNumber (account, copy_number);
00763         /* USCode is last because it removes TaxUS KVP if not tax_related */
00764         xaccAccountSetTaxUSCode (account, code);
00765 
00766         xaccAccountCommitEdit (account);
00767     }
00768     g_list_free (accounts);
00769 }
00770 
00771 static void
00772 identity_edit_destroy_cb (GtkObject *object, gpointer data)
00773 {
00774     TaxInfoDialog *ti_dialog = data;
00775 
00776     ti_dialog->entity_name_entry = NULL;
00777     ti_dialog->entity_type_combo = NULL;
00778 
00779     gtk_object_destroy (object);
00780 }
00781 
00782 static void
00783 window_destroy_cb (GtkObject *object, gpointer data)
00784 {
00785     TaxInfoDialog *ti_dialog = data;
00786 
00787     gnc_unregister_gui_component_by_data (DIALOG_TAX_INFO_CM_CLASS, ti_dialog);
00788 
00789     destroy_tax_type_infos (ti_dialog->entity_type_infos);
00790     ti_dialog->entity_type_infos = NULL;
00791 
00792     destroy_txf_infos (ti_dialog->income_txf_infos);
00793     ti_dialog->income_txf_infos = NULL;
00794 
00795     destroy_txf_infos (ti_dialog->expense_txf_infos);
00796     ti_dialog->expense_txf_infos = NULL;
00797 
00798     destroy_txf_infos (ti_dialog->asset_txf_infos);
00799     ti_dialog->asset_txf_infos = NULL;
00800 
00801     destroy_txf_infos (ti_dialog->liab_eq_txf_infos);
00802     ti_dialog->liab_eq_txf_infos = NULL;
00803 
00804     g_free (ti_dialog);
00805 }
00806 
00807 static void
00808 cursor_changed_cb (GtkWidget *widget, gpointer data)
00809 {
00810     TaxInfoDialog *ti_dialog = data;
00811     GncTreeViewAccount *account_tree;
00812     Account *account;
00813     gint num_children;
00814 
00815     account_tree = GNC_TREE_VIEW_ACCOUNT (ti_dialog->account_treeview);
00816     account = gnc_tree_view_account_get_cursor_account (account_tree);
00817     if (!account)
00818     {
00819         gtk_widget_set_sensitive(ti_dialog->select_button, FALSE);
00820         return;
00821     }
00822 
00823     num_children = gnc_tree_view_account_count_children(account_tree, account);
00824     gtk_widget_set_sensitive(ti_dialog->select_button, num_children > 0);
00825 }
00826 
00827 static void
00828 select_subaccounts_clicked (GtkWidget *widget, gpointer data)
00829 {
00830     TaxInfoDialog *ti_dialog = data;
00831     GncTreeViewAccount *account_tree;
00832     Account *account;
00833 
00834     account_tree = GNC_TREE_VIEW_ACCOUNT (ti_dialog->account_treeview);
00835     account = gnc_tree_view_account_get_cursor_account (account_tree);
00836     if (!account)
00837         return;
00838 
00839     gnc_tree_view_account_select_subaccounts (account_tree, account);
00840 
00841     gtk_widget_grab_focus (ti_dialog->account_treeview);
00842 }
00843 
00844 static void
00845 gnc_tax_info_dialog_response (GtkDialog *dialog, gint response, gpointer data)
00846 {
00847     TaxInfoDialog *ti_dialog = data;
00848 
00849     if (response == GTK_RESPONSE_OK && ti_dialog->changed)
00850         gui_to_accounts (ti_dialog);
00851 
00852     gnc_close_gui_component_by_data (DIALOG_TAX_INFO_CM_CLASS, ti_dialog);
00853 }
00854 
00855 static void
00856 tax_info_show_acct_type_accounts (TaxInfoDialog *ti_dialog)
00857 {
00858     GncTreeViewAccount *tree;
00859     AccountViewInfo info;
00860     GNCAccountType type;
00861 
00862     tree = GNC_TREE_VIEW_ACCOUNT (ti_dialog->account_treeview);
00863 
00864     gnc_tree_view_account_get_view_info (tree, &info);
00865 
00866     for (type = 0; type < NUM_ACCOUNT_TYPES; type++) /* from Account.h */
00867     {
00868         if (ti_dialog->account_type == ACCT_TYPE_EXPENSE)
00869             info.include_type[type] = (type == ACCT_TYPE_EXPENSE);
00870         else if (ti_dialog->account_type == ACCT_TYPE_INCOME)
00871             info.include_type[type] = (type == ACCT_TYPE_INCOME);
00872         else if (ti_dialog->account_type == ACCT_TYPE_ASSET)
00873             info.include_type[type] = ((type == ACCT_TYPE_BANK)      ||
00874                                        (type == ACCT_TYPE_CASH)      ||
00875                                        (type == ACCT_TYPE_ASSET)     ||
00876                                        (type == ACCT_TYPE_STOCK)     ||
00877                                        (type == ACCT_TYPE_MUTUAL)    ||
00878                                        (type == ACCT_TYPE_RECEIVABLE));
00879         else if (ti_dialog->account_type == ACCT_TYPE_LIABILITY)
00880             info.include_type[type] = ((type == ACCT_TYPE_CREDIT)    ||
00881                                        (type == ACCT_TYPE_LIABILITY) ||
00882                                        (type == ACCT_TYPE_EQUITY)    ||
00883                                        (type == ACCT_TYPE_PAYABLE));
00884         else
00885             info.include_type[type] = FALSE;
00886     }
00887 
00888     gnc_tree_view_account_set_view_info (tree, &info);
00889 
00890     load_category_list (ti_dialog);
00891     cursor_changed_cb(GTK_WIDGET(tree), ti_dialog);
00892 }
00893 
00894 static int
00895 gnc_tax_info_update_accounts (TaxInfoDialog *ti_dialog)
00896 {
00897     GncTreeViewAccount *tree;
00898     GtkTreeSelection* selection;
00899     GtkWidget *label;
00900     int num_accounts;
00901     char *string;
00902 
00903     tree = GNC_TREE_VIEW_ACCOUNT(ti_dialog->account_treeview);
00904     selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(tree));
00905     num_accounts = gtk_tree_selection_count_selected_rows (selection);
00906 
00907     label = ti_dialog->num_acct_label;
00908 
00909     string = g_strdup_printf ("%d", num_accounts);
00910     gtk_label_set_text (GTK_LABEL (label), string);
00911     g_free (string);
00912 
00913     gtk_widget_set_sensitive (ti_dialog->txf_info, num_accounts > 0);
00914 
00915     return num_accounts;
00916 }
00917 
00918 static void
00919 gnc_tax_info_acct_type_cb (GtkWidget *w, gpointer data)
00920 {
00921     TaxInfoDialog *ti_dialog = data;
00922     const gchar *button_name;
00923 
00924     if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)))
00925     {
00926         button_name = gtk_buildable_get_name(GTK_BUILDABLE(w));
00927         if (safe_strcmp (button_name, "income_radio") == 0)
00928             ti_dialog->account_type = ACCT_TYPE_INCOME;
00929         else if (safe_strcmp (button_name, "expense_radio") == 0)
00930             ti_dialog->account_type = ACCT_TYPE_EXPENSE;
00931         else if (safe_strcmp (button_name, "asset_radio") == 0)
00932             ti_dialog->account_type = ACCT_TYPE_ASSET;
00933         else if (safe_strcmp (button_name, "liab_eq_radio") == 0)
00934             ti_dialog->account_type = ACCT_TYPE_LIABILITY;
00935         else
00936             return;
00937         tax_info_show_acct_type_accounts (ti_dialog);
00938         gnc_tree_view_account_refilter
00939         (GNC_TREE_VIEW_ACCOUNT (ti_dialog->account_treeview));
00940         gnc_tax_info_update_accounts (ti_dialog);
00941         clear_gui (ti_dialog);
00942     }
00943     else
00944         return;
00945 }
00946 
00947 static void
00948 gnc_tax_info_account_changed_cb (GtkTreeSelection *selection,
00949                                  gpointer data)
00950 {
00951     TaxInfoDialog *ti_dialog = data;
00952     GncTreeViewAccount *view;
00953     GList *accounts;
00954     int num_accounts;
00955 
00956     g_return_if_fail(GTK_IS_TREE_SELECTION(selection));
00957 
00958     num_accounts = gnc_tax_info_update_accounts (ti_dialog);
00959     switch (num_accounts)
00960     {
00961     case 0:
00962         clear_gui (ti_dialog);
00963         gnc_tax_info_set_changed (ti_dialog, FALSE);
00964         return;
00965 
00966     case 1:
00967         /* Get the account. This view is set for multiple selection, so we
00968            can only get a list of accounts. */
00969         view = GNC_TREE_VIEW_ACCOUNT(ti_dialog->account_treeview);
00970         accounts = gnc_tree_view_account_get_selected_accounts (view);
00971         account_to_gui (ti_dialog, accounts->data);
00972         g_list_free(accounts);
00973 
00974         gnc_tax_info_set_changed (ti_dialog, FALSE);
00975         break;
00976 
00977     default:
00978         gnc_tax_info_set_changed (ti_dialog, TRUE);
00979         return;
00980     }
00981 }
00982 
00983 static void
00984 txf_code_select_row_cb (GtkTreeSelection *selection,
00985                         gpointer user_data)
00986 {
00987     TaxInfoDialog *ti_dialog = user_data;
00988     GtkTreeModel *model;
00989     GtkTreePath *path;
00990     GtkTreeIter iter;
00991     gint *indices;
00992     TXFInfo *txf_info;
00993     GtkAdjustment *adj;
00994     GtkWidget *vbox;
00995     GtkTextBuffer *tb;
00996     const char *text;
00997 
00998     if (!gtk_tree_selection_get_selected(selection, &model, &iter))
00999         return;
01000     path = gtk_tree_model_get_path(model, &iter);
01001     indices = gtk_tree_path_get_indices(path);
01002     txf_info = g_list_nth_data (tax_infos (ti_dialog), indices[0]);
01003     gtk_tree_path_free(path);
01004 
01005     tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(ti_dialog->txf_help_text));
01006 
01007     text = (txf_info && txf_info->help) ? txf_info->help : "";
01008     gtk_text_buffer_set_text (tb, text, -1);
01009 
01010     adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (ti_dialog->help_scroll));
01011     gtk_adjustment_set_value (adj, 0.0);
01012 
01013     vbox = ti_dialog->payer_vbox;
01014 
01015     if (txf_info && txf_info->payer_name_source)
01016     {
01017         gboolean current;
01018 
01019         gtk_widget_set_sensitive (vbox, TRUE);
01020 
01021         current = (strcmp ("current", txf_info->payer_name_source) == 0);
01022 
01023         if (current)
01024             gtk_toggle_button_set_active
01025             (GTK_TOGGLE_BUTTON (ti_dialog->current_account_button), TRUE);
01026         else
01027             gtk_toggle_button_set_active
01028             (GTK_TOGGLE_BUTTON (ti_dialog->parent_account_button), TRUE);
01029     }
01030     else
01031     {
01032         gtk_widget_set_sensitive (vbox, FALSE);
01033         gtk_toggle_button_set_active
01034         (GTK_TOGGLE_BUTTON (ti_dialog->current_account_button), TRUE);
01035     }
01036 
01037     vbox = ti_dialog->copy_vbox;
01038 
01039     if (txf_info && txf_info->copy)
01040     {
01041         gtk_widget_set_sensitive (vbox, TRUE);
01042     }
01043     else
01044     {
01045         gtk_widget_set_sensitive (vbox, FALSE);
01046     }
01047 
01048     gnc_tax_info_set_changed (ti_dialog, TRUE);
01049 }
01050 
01051 static void
01052 set_focus_sensitivity (TaxInfoDialog *ti_dialog)
01053 {
01054     if ((ti_dialog->tax_type == NULL) ||
01055             (safe_strcmp (ti_dialog->tax_type, "Other") == 0) ||
01056             (safe_strcmp (ti_dialog->tax_type, "") == 0))
01057     {
01058         gtk_widget_grab_focus (ti_dialog->tax_identity_edit_button);
01059         gtk_widget_set_sensitive (ti_dialog->acct_info, FALSE);
01060         gtk_widget_set_sensitive (ti_dialog->txf_info, FALSE);
01061         gtk_widget_hide (ti_dialog->txf_help_text); /* textview doesn't go insensitive!? */
01062     }
01063     else if (ti_dialog->tax_type_changed)
01064     {
01065         gtk_widget_set_sensitive (ti_dialog->acct_info, TRUE);
01066         gtk_widget_set_sensitive (ti_dialog->txf_info, TRUE);
01067         gtk_widget_grab_focus (ti_dialog->account_treeview);
01068     }
01069     else
01070     {
01071         gtk_widget_set_sensitive (ti_dialog->acct_info, TRUE);
01072         gtk_widget_grab_focus (ti_dialog->account_treeview);
01073     }
01074     if (ti_dialog->asset_txf_infos == NULL)
01075         gtk_widget_hide (ti_dialog->asset_radio);
01076     else
01077         gtk_widget_show (ti_dialog->asset_radio);
01078     if (ti_dialog->liab_eq_txf_infos == NULL)
01079         gtk_widget_hide (ti_dialog->liab_eq_radio);
01080     else
01081         gtk_widget_show (ti_dialog->liab_eq_radio);
01082 }
01083 
01084 static void
01085 identity_edit_response_cb (GtkDialog *dialog, gint response, gpointer data)
01086 {
01087     TaxInfoDialog *ti_dialog = data;
01088     const gchar *entry_name = NULL;
01089     const gchar *entry_type = NULL;
01090     gint active_item = 0;
01091     TaxTypeInfo *selected_type = NULL;
01092 
01093     if (response == GTK_RESPONSE_APPLY)
01094     {
01095         entry_name = gtk_entry_get_text (GTK_ENTRY (ti_dialog->entity_name_entry));
01096         active_item = gtk_combo_box_get_active
01097                       (GTK_COMBO_BOX (ti_dialog->entity_type_combo));
01098         if (active_item != -1)  /* -1 if there's no active item */
01099         {
01100             selected_type = g_list_nth_data (ti_dialog->entity_type_infos,
01101                                              (guint) active_item);
01102             if (selected_type)
01103             {
01104                 entry_type = selected_type->type_code;
01105                 if (!(safe_strcmp (ti_dialog->tax_type, entry_type) == 0))
01106                 {
01107                     ti_dialog->tax_type_changed = TRUE;
01108                     gnc_set_current_book_tax_type (entry_type);
01109                     ti_dialog->tax_type = entry_type;
01110                     if (entry_type != NULL)
01111                     {
01112                         gtk_label_set_text (GTK_LABEL (ti_dialog->entity_type_display),
01113                                             selected_type->combo_box_entry);
01114                     }
01115                     else
01116                     {
01117                         gtk_label_set_text (GTK_LABEL (ti_dialog->entity_type_display),
01118                                             ti_dialog->default_tax_type);
01119                     }
01120                     if (ti_dialog->income_txf_infos != NULL)
01121                         destroy_txf_infos (ti_dialog->income_txf_infos);
01122                     ti_dialog->income_txf_infos = load_txf_info (INCOME, ti_dialog);
01123                     if (ti_dialog->expense_txf_infos != NULL)
01124                         destroy_txf_infos (ti_dialog->expense_txf_infos);
01125                     ti_dialog->expense_txf_infos = load_txf_info (EXPENSE, ti_dialog);
01126                     if (ti_dialog->asset_txf_infos != NULL)
01127                         destroy_txf_infos (ti_dialog->asset_txf_infos);
01128                     ti_dialog->asset_txf_infos = load_txf_info (ASSET, ti_dialog);
01129                     if (ti_dialog->liab_eq_txf_infos != NULL)
01130                         destroy_txf_infos (ti_dialog->liab_eq_txf_infos);
01131                     ti_dialog->liab_eq_txf_infos = load_txf_info (LIAB_EQ, ti_dialog);
01132                     gtk_toggle_button_set_active
01133                     (GTK_TOGGLE_BUTTON(ti_dialog->expense_radio), TRUE);
01134                     tax_info_show_acct_type_accounts (ti_dialog);
01135                     gnc_tree_view_account_refilter
01136                     (GNC_TREE_VIEW_ACCOUNT (ti_dialog->account_treeview));
01137                     gnc_tax_info_update_accounts (ti_dialog);
01138                     clear_gui (ti_dialog);
01139                 }
01140             }
01141         }
01142         if (!(safe_strcmp (ti_dialog->tax_name, entry_name) == 0))
01143         {
01144             gnc_set_current_book_tax_name (entry_name);
01145             ti_dialog->tax_name = g_strdup (entry_name);
01146             gtk_label_set_text (GTK_LABEL (ti_dialog->entity_name_display),
01147                                 entry_name);
01148         }
01149         set_focus_sensitivity (ti_dialog);
01150         ti_dialog->tax_type_changed = FALSE;
01151     }
01152     identity_edit_destroy_cb (GTK_OBJECT (dialog), ti_dialog);
01153 }
01154 
01155 static void
01156 identity_edit_clicked_cb (GtkButton *button,
01157                           gpointer user_data)
01158 {
01159     TaxInfoDialog *ti_dialog = user_data;
01160     GtkWidget *dialog;
01161     GtkWidget *content_area;
01162     GtkWidget *name_entry;
01163     GtkWidget *label;
01164     GtkWidget *alignment;
01165     GtkWidget *table;
01166     GtkListStore *store;
01167     GList *types = NULL;
01168     GtkTreeIter iter;
01169     gint current_item = -1;
01170     gint item = 0;
01171     GtkCellRenderer *renderer;
01172     GtkWidget *type_combo;
01173 
01174     dialog = gtk_dialog_new_with_buttons (_("Income Tax Identity"),
01175                                           (GtkWindow *)ti_dialog->dialog,
01176                                           GTK_DIALOG_MODAL |
01177                                           GTK_DIALOG_DESTROY_WITH_PARENT,
01178                                           GTK_STOCK_CANCEL,
01179                                           GTK_RESPONSE_CANCEL,
01180                                           GTK_STOCK_APPLY,
01181                                           GTK_RESPONSE_APPLY,
01182                                           NULL);
01183 
01184     content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
01185     name_entry = gtk_entry_new();
01186     ti_dialog->entity_name_entry = name_entry;
01187     if (!(safe_strcmp (ti_dialog->tax_name, NULL) == 0))
01188         gtk_entry_set_text (GTK_ENTRY (name_entry), ti_dialog->tax_name);
01189     label = gtk_label_new (_("Name"));
01190     gtk_misc_set_alignment (GTK_MISC (label), 1.00, 0.50);
01191     alignment = gtk_alignment_new(1.00, 0.50, 1.00, 0.00);
01192     gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 12, 0);
01193     gtk_container_add (GTK_CONTAINER (alignment), label);
01194     table = gtk_table_new (3, 2, FALSE);
01195     gtk_table_attach_defaults (GTK_TABLE (table), alignment, 0, 1, 0, 1);
01196     alignment = gtk_alignment_new(0.00, 0.50, 1.00, 0.00);
01197     gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 12, 0);
01198     gtk_container_add (GTK_CONTAINER (alignment), name_entry);
01199     gtk_table_attach_defaults (GTK_TABLE (table), alignment, 1, 2, 0, 1);
01200     store = gtk_list_store_new (1, G_TYPE_STRING);
01201     gtk_list_store_clear(store);
01202     types = ti_dialog->entity_type_infos;
01203     for ( ; types; types = types->next)
01204     {
01205         TaxTypeInfo *tax_type_info = types->data;
01206 
01207         gtk_list_store_append(store, &iter);
01208         gtk_list_store_set(store, &iter, 0, tax_type_info->combo_box_entry, -1);
01209         if (safe_strcmp (ti_dialog->tax_type, tax_type_info->type_code) == 0)
01210             current_item = item;
01211         item++;
01212     }
01213     type_combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL(store));
01214     g_object_unref(G_OBJECT (store));
01215     renderer = gtk_cell_renderer_text_new();
01216     gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(type_combo), renderer, TRUE);
01217     gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(type_combo), renderer,
01218                                    "text", 0, NULL);
01219     ti_dialog->entity_type_combo = type_combo;
01220     if (ti_dialog->tax_type)
01221     {
01222         gtk_combo_box_set_active (GTK_COMBO_BOX (type_combo), current_item);
01223     }
01224     else     /* set to no active item */
01225     {
01226         gtk_combo_box_set_active (GTK_COMBO_BOX (type_combo), -1);
01227     }
01228     label = gtk_label_new (_("Type"));
01229     gtk_misc_set_alignment (GTK_MISC (label), 1.00, 0.50);
01230     alignment = gtk_alignment_new(1.00, 0.50, 1.00, 0.00);
01231     gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 12, 0);
01232     gtk_container_add (GTK_CONTAINER (alignment), label);
01233     gtk_table_attach_defaults (GTK_TABLE (table), alignment, 0, 1, 1, 2);
01234     alignment = gtk_alignment_new(0.00, 0.50, 1.00, 0.00);
01235     gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 12, 0);
01236     gtk_container_add (GTK_CONTAINER (alignment), type_combo);
01237     gtk_table_attach_defaults (GTK_TABLE (table), alignment, 1, 2, 1, 2);
01238     label = gtk_label_new (_("CAUTION: If you set TXF categories, and later change 'Type', you will need to manually reset those categories one at a time"));
01239     gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
01240     gtk_misc_set_alignment (GTK_MISC (label), 0.50, 0.50);
01241     alignment = gtk_alignment_new(0.50, 0.50, 1.00, 0.00);
01242     gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 4, 4);
01243     gtk_container_add (GTK_CONTAINER (alignment), label);
01244     gtk_table_attach_defaults (GTK_TABLE (table), alignment, 0, 2, 2, 3);
01245     gtk_container_add (GTK_CONTAINER (content_area), table);
01246     gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_APPLY);
01247     g_signal_connect (G_OBJECT (dialog), "response",
01248                       G_CALLBACK (identity_edit_response_cb), ti_dialog);
01249     g_signal_connect (G_OBJECT (dialog), "destroy",
01250                       G_CALLBACK (identity_edit_destroy_cb), ti_dialog);
01251     gtk_widget_show_all (dialog);
01252 }
01253 
01254 static void
01255 tax_related_toggled_cb (GtkToggleButton *togglebutton,
01256                         gpointer user_data)
01257 {
01258     TaxInfoDialog *ti_dialog = user_data;
01259     GtkWidget *vbox;
01260     GtkWidget *hbox;
01261     gboolean on;
01262 
01263     on = gtk_toggle_button_get_active (togglebutton);
01264 
01265     vbox = ti_dialog->txf_vbox;
01266     hbox = ti_dialog->pns_vbox;
01267     gtk_widget_set_sensitive (vbox, on);
01268 
01269     gtk_widget_set_sensitive (hbox, on);
01270 
01271     if (on == FALSE)
01272         gtk_widget_hide (ti_dialog->txf_help_text); /* textview doesn't go insensitive!? */
01273     else
01274         gtk_widget_show (ti_dialog->txf_help_text);
01275 
01276     gnc_tax_info_set_changed (ti_dialog, TRUE);
01277 }
01278 
01279 static void
01280 current_account_toggled_cb (GtkToggleButton *togglebutton,
01281                             gpointer user_data)
01282 {
01283     TaxInfoDialog *ti_dialog = user_data;
01284 
01285     gnc_tax_info_set_changed (ti_dialog, TRUE);
01286 }
01287 
01288 static void
01289 copy_number_value_changed_cb (GtkSpinButton *spinbutton,
01290                               gpointer user_data)
01291 {
01292     TaxInfoDialog *ti_dialog = user_data;
01293 
01294     gnc_tax_info_set_changed (ti_dialog, TRUE);
01295 }
01296 
01297 static void
01298 gnc_tax_info_dialog_create (GtkWidget * parent, TaxInfoDialog *ti_dialog)
01299 {
01300     GtkWidget *dialog;
01301     GtkObject *tido;
01302     GtkBuilder  *builder;
01303     GtkTreeView *tree_view;
01304     GtkTreeSelection *selection;
01305     GtkWidget *label;
01306 
01307     builder = gtk_builder_new();
01308     gnc_builder_add_from_file (builder, "dialog-tax-info.glade", "copy_spin_adj");
01309     gnc_builder_add_from_file (builder, "dialog-tax-info.glade", "Tax Information Dialog");
01310 
01311     dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Tax Information Dialog"));
01312     ti_dialog->dialog = dialog;
01313     tido = GTK_OBJECT (dialog);
01314 
01315     initialize_getters ();
01316 
01317     g_signal_connect (G_OBJECT (dialog), "response",
01318                       G_CALLBACK (gnc_tax_info_dialog_response), ti_dialog);
01319 
01320     g_signal_connect (G_OBJECT (dialog), "destroy",
01321                       G_CALLBACK (window_destroy_cb), ti_dialog);
01322 
01323     /* parent */
01324     if (parent != NULL)
01325         gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent));
01326 
01327     /* default to ok */
01328     gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK);
01329 
01330     /* tax identity */
01331     {
01332         GtkWidget *label;
01333         GtkWidget *edit_button;
01334 
01335         ti_dialog->this_book = gnc_get_current_book();
01336         ti_dialog->tax_name = gnc_get_current_book_tax_name();
01337         ti_dialog->tax_type = gnc_get_current_book_tax_type();
01338 
01339         label = GTK_WIDGET(gtk_builder_get_object (builder, "entity_name"));
01340         ti_dialog->entity_name_display = label;
01341         gtk_label_set_text (GTK_LABEL (label), ti_dialog->tax_name);
01342         ti_dialog->entity_name_entry = NULL;
01343 
01344         load_tax_entity_type_list (ti_dialog); /* initialize tax_type_combo_text */
01345 
01346         label = GTK_WIDGET(gtk_builder_get_object (builder, "entity_type"));
01347         ti_dialog->entity_type_display = label;
01348         if (ti_dialog->tax_type != NULL)
01349             gtk_label_set_text (GTK_LABEL (label), ti_dialog->tax_type_combo_text);
01350         ti_dialog->entity_type_combo = NULL;
01351 
01352         edit_button = GTK_WIDGET(gtk_builder_get_object (builder, "identity_edit_button"));
01353         ti_dialog->tax_identity_edit_button = edit_button;
01354         g_signal_connect (G_OBJECT (edit_button), "clicked",
01355                           G_CALLBACK (identity_edit_clicked_cb), ti_dialog);
01356         ti_dialog->tax_type_changed = FALSE;
01357     }
01358 
01359     ti_dialog->income_txf_infos = load_txf_info (INCOME, ti_dialog);
01360     ti_dialog->expense_txf_infos = load_txf_info (EXPENSE, ti_dialog);
01361     ti_dialog->asset_txf_infos = load_txf_info (ASSET, ti_dialog);
01362     ti_dialog->liab_eq_txf_infos = load_txf_info (LIAB_EQ, ti_dialog);
01363 
01364     /* tax information */
01365     {
01366         GtkListStore *store;
01367         GtkTreeViewColumn *column;
01368         GtkCellRenderer *renderer;
01369         GtkWidget *button;
01370         GtkWidget *text;
01371 
01372         ti_dialog->txf_info = GTK_WIDGET(gtk_builder_get_object (builder, "tax_info_vbox"));
01373         button = GTK_WIDGET(gtk_builder_get_object (builder, "tax_related_button"));
01374         ti_dialog->tax_related_button = button;
01375 
01376         g_signal_connect (G_OBJECT (button), "toggled",
01377                           G_CALLBACK  (tax_related_toggled_cb), ti_dialog);
01378 
01379         text = GTK_WIDGET(gtk_builder_get_object (builder, "txf_help_text"));
01380         gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
01381         ti_dialog->txf_help_text = text;
01382 
01383         tree_view = GTK_TREE_VIEW(gtk_builder_get_object (builder, "txf_category_view"));
01384         store =  gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
01385         gtk_tree_view_set_model(tree_view, GTK_TREE_MODEL(store));
01386         g_object_unref(store);
01387         renderer = gtk_cell_renderer_text_new();
01388         column = gtk_tree_view_column_new_with_attributes
01389                  (_("Form"), renderer, "text", 0, NULL);
01390         gtk_tree_view_append_column(tree_view, GTK_TREE_VIEW_COLUMN(column));
01391         renderer = gtk_cell_renderer_text_new();
01392         column = gtk_tree_view_column_new_with_attributes
01393                  (_("Description"), renderer, "text", 1, NULL);
01394         gtk_tree_view_append_column(tree_view, GTK_TREE_VIEW_COLUMN(column));
01395         ti_dialog->txf_category_view = GTK_WIDGET(tree_view);
01396 
01397         selection = gtk_tree_view_get_selection(tree_view);
01398         g_signal_connect (G_OBJECT (selection), "changed",
01399                           G_CALLBACK  (txf_code_select_row_cb), ti_dialog);
01400 
01401         label = GTK_WIDGET(gtk_builder_get_object (builder, "txf_category_label"));
01402         gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(tree_view));
01403 
01404         button = GTK_WIDGET(gtk_builder_get_object (builder, "current_account_button"));
01405         ti_dialog->current_account_button = button;
01406 
01407         button = GTK_WIDGET(gtk_builder_get_object (builder, "parent_account_button"));
01408         ti_dialog->parent_account_button = button;
01409 
01410         ti_dialog->help_scroll = GTK_WIDGET(gtk_builder_get_object (builder, "help_scroll"));
01411         ti_dialog->payer_vbox = GTK_WIDGET(gtk_builder_get_object (builder, "payer_name_source_vbox"));
01412         ti_dialog->copy_vbox = GTK_WIDGET(gtk_builder_get_object (builder, "copy_number_vbox"));
01413         ti_dialog->txf_vbox = GTK_WIDGET(gtk_builder_get_object (builder, "txf_categories_vbox"));
01414         ti_dialog->pns_vbox = GTK_WIDGET(gtk_builder_get_object (builder, "pns_copy_hbox"));
01415 
01416         g_signal_connect (G_OBJECT (button), "toggled",
01417                           G_CALLBACK  (current_account_toggled_cb),
01418                           ti_dialog);
01419 
01420         button = GTK_WIDGET(gtk_builder_get_object (builder, "copy_spin_button"));
01421         ti_dialog->copy_spin_button = button;
01422 
01423         g_signal_connect (G_OBJECT (button), "value-changed",
01424                           G_CALLBACK  (copy_number_value_changed_cb),
01425                           ti_dialog);
01426     }
01427 
01428     /* account tree */
01429     {
01430         GtkWidget *income_radio, *expense_radio, *asset_radio,
01431                   *liab_eq_radio, *box;
01432 
01433         ti_dialog->acct_info = GTK_WIDGET(gtk_builder_get_object (builder, "acct_info_vbox"));
01434         ti_dialog->num_acct_label = GTK_WIDGET(gtk_builder_get_object (builder, "num_accounts_label"));
01435 
01436         tree_view = gnc_tree_view_account_new (FALSE);
01437         gnc_tree_view_account_set_filter (GNC_TREE_VIEW_ACCOUNT(tree_view),
01438                                           gnc_tax_info_dialog_account_filter_func,
01439                                           ti_dialog, NULL);
01440         ti_dialog->account_treeview = GTK_WIDGET(tree_view);
01441 
01442         selection = gtk_tree_view_get_selection (tree_view);
01443         gtk_tree_selection_set_mode (selection, GTK_SELECTION_EXTENDED);
01444         g_signal_connect (G_OBJECT (selection), "changed",
01445                           G_CALLBACK (gnc_tax_info_account_changed_cb),
01446                           ti_dialog);
01447 
01448         gtk_widget_show (ti_dialog->account_treeview);
01449         box = GTK_WIDGET(gtk_builder_get_object (builder, "account_scroll"));
01450         gtk_container_add (GTK_CONTAINER (box), ti_dialog->account_treeview);
01451 
01452         label = GTK_WIDGET(gtk_builder_get_object (builder, "accounts_label"));
01453         gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(tree_view));
01454 
01455         income_radio = GTK_WIDGET(gtk_builder_get_object (builder, "income_radio"));
01456         expense_radio = GTK_WIDGET(gtk_builder_get_object (builder, "expense_radio"));
01457         ti_dialog->expense_radio = expense_radio;
01458         asset_radio = GTK_WIDGET(gtk_builder_get_object (builder, "asset_radio"));
01459         ti_dialog->asset_radio = asset_radio;
01460         liab_eq_radio = GTK_WIDGET(gtk_builder_get_object (builder, "liab_eq_radio"));
01461         ti_dialog->liab_eq_radio = liab_eq_radio;
01462         ti_dialog->account_type = ACCT_TYPE_EXPENSE;
01463         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(expense_radio), TRUE);
01464 
01465         g_signal_connect (G_OBJECT (income_radio), "toggled",
01466                           G_CALLBACK  (gnc_tax_info_acct_type_cb),
01467                           ti_dialog);
01468         g_signal_connect (G_OBJECT (expense_radio), "toggled",
01469                           G_CALLBACK  (gnc_tax_info_acct_type_cb),
01470                           ti_dialog);
01471         g_signal_connect (G_OBJECT (asset_radio), "toggled",
01472                           G_CALLBACK  (gnc_tax_info_acct_type_cb),
01473                           ti_dialog);
01474         g_signal_connect (G_OBJECT (liab_eq_radio), "toggled",
01475                           G_CALLBACK  (gnc_tax_info_acct_type_cb),
01476                           ti_dialog);
01477     }
01478 
01479     /* select subaccounts button */
01480     {
01481         GtkWidget *button;
01482 
01483         button = GTK_WIDGET(gtk_builder_get_object (builder, "select_subaccounts_button"));
01484         ti_dialog->select_button = button;
01485 
01486         g_signal_connect (G_OBJECT (button), "clicked",
01487                           G_CALLBACK  (select_subaccounts_clicked),
01488                           ti_dialog);
01489         g_signal_connect (G_OBJECT (ti_dialog->account_treeview), "cursor_changed",
01490                           G_CALLBACK  (cursor_changed_cb),
01491                           ti_dialog);
01492     }
01493 
01494     tax_info_show_acct_type_accounts (ti_dialog);
01495     gnc_tax_info_update_accounts (ti_dialog);
01496     clear_gui (ti_dialog);
01497     gnc_tax_info_set_changed (ti_dialog, FALSE);
01498 
01499     gnc_restore_window_size(GCONF_SECTION, GTK_WINDOW(ti_dialog->dialog));
01500 
01501     ti_dialog->paned = GTK_WIDGET(gtk_builder_get_object (builder, "paned"));
01502 
01503     if (gnc_gconf_get_bool(GCONF_GENERAL, KEY_SAVE_GEOMETRY, NULL))
01504     {
01505         gint position = gnc_gconf_get_int(GCONF_SECTION, PANED_POSITION, NULL);
01506         gtk_paned_set_position(GTK_PANED(ti_dialog->paned), position);
01507     }
01508     g_object_unref (builder);
01509 }
01510 
01511 static void
01512 close_handler (gpointer user_data)
01513 {
01514     TaxInfoDialog *ti_dialog = user_data;
01515 
01516     if (gnc_gconf_get_bool(GCONF_GENERAL, KEY_SAVE_GEOMETRY, NULL))
01517     {
01518         gnc_gconf_set_int(GCONF_SECTION, PANED_POSITION,
01519                           gtk_paned_get_position(GTK_PANED(ti_dialog->paned)), NULL);
01520     }
01521 
01522     gnc_save_window_size(GCONF_SECTION, GTK_WINDOW(ti_dialog->dialog));
01523     gtk_widget_destroy (ti_dialog->dialog);
01524 }
01525 
01526 static void
01527 refresh_handler (GHashTable *changes, gpointer user_data)
01528 {
01529     TaxInfoDialog *ti_dialog = user_data;
01530 
01531     gnc_tax_info_update_accounts (ti_dialog);
01532 }
01533 
01534 /********************************************************************\
01535  * gnc_tax_info_dialog                                              *
01536  *   opens up a window to set account tax information               *
01537  *                                                                  *
01538  * Args:   parent  - the parent of the window to be created         *
01539  * Return: nothing                                                  *
01540 \********************************************************************/
01541 void
01542 gnc_tax_info_dialog (GtkWidget * parent)
01543 {
01544     TaxInfoDialog *ti_dialog;
01545     gint component_id;
01546 
01547     ti_dialog = g_new0 (TaxInfoDialog, 1);
01548 
01549     gnc_tax_info_dialog_create (parent, ti_dialog);
01550 
01551     component_id = gnc_register_gui_component (DIALOG_TAX_INFO_CM_CLASS,
01552                    refresh_handler, close_handler,
01553                    ti_dialog);
01554     gnc_gui_component_set_session (component_id, gnc_get_current_session ());
01555 
01556     gnc_gui_component_watch_entity_type (component_id,
01557                                          GNC_ID_ACCOUNT,
01558                                          QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
01559 
01560     set_focus_sensitivity (ti_dialog);
01561 
01562     gtk_widget_show (ti_dialog->dialog);
01563 }
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines