|
GnuCash 2.4.99
|
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 }
1.7.4