1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 Maxime DOYEN
4 * This file is part of HomeBank.
6 * HomeBank is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * HomeBank is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "hb-preferences.h"
24 #include "hb-filter.h"
25 #include "gtk-chart-colors.h"
31 /****************************************************************************/
33 /****************************************************************************/
42 /* our global datas */
43 extern struct HomeBank
*GLOBALS
;
44 extern struct Preferences
*PREFS
;
46 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
48 static void homebank_pref_init_monetary(void)
51 DB( g_print("\n[system] get currency code\n") );
54 struct lconv
*lc
= localeconv();
56 g_stpcpy (PREFS
->IntCurrSymbol
, lc
->int_curr_symbol
);
57 g_strstrip(PREFS
->IntCurrSymbol
);
59 DB( g_print("- stored '%s' from linux system\n", PREFS
->IntCurrSymbol
) );
63 #define BUFFER_SIZE 512
64 char buffer
[BUFFER_SIZE
];
65 //LPWSTR wcBuffer = buffer;
66 LPSTR wcBuffer
= buffer
;
69 //https://msdn.microsoft.com/en-us/library/windows/desktop/dd464799%28v=vs.85%29.aspx
72 iResult
= GetLocaleInfoA(LOCALE_USER_DEFAULT
, LOCALE_SINTLSYMBOL
, wcBuffer
, BUFFER_SIZE
);
75 DB( g_print("LOCALE_SINTLSYMBOL='%s'\n", buffer
) );
76 g_stpcpy (PREFS
->IntCurrSymbol
, buffer
);
77 g_strstrip(PREFS
->IntCurrSymbol
);
79 DB( g_print("- stored '%s' from windows system\n", PREFS
->IntCurrSymbol
) );
83 g_stpcpy (PREFS
->IntCurrSymbol
, "USD");
85 DB( g_print("- stored '%s' as default\n", PREFS
->IntCurrSymbol
) );
96 static void homebank_pref_init_monetary(void)
98 DB( g_print("\n[preferences] monetary\n") );
103 struct lconv *lc = localeconv();
105 DB( g_print("\n[preferences] monetary unix\n") );
107 DB( g_print("int_curr_symbol '%s'\n", lc->int_curr_symbol) );
109 DB( g_print("mon_decimal_point is utf8: %d\n", g_utf8_validate(lc->mon_decimal_point, -1, NULL)) );
110 DB( g_print("mon_decimal_point '%s'\n", lc->mon_decimal_point) );
111 DB( g_print("mon_decimal_point %x %x %x %x\n", lc->mon_decimal_point[0], lc->mon_decimal_point[1], lc->mon_decimal_point[2], lc->mon_decimal_point[3]) );
113 DB( g_print("mon_thousands_sep is utf8: %d\n", g_utf8_validate(lc->mon_thousands_sep, -1, NULL)) );
114 DB( g_print("mon_thousands_sep '%s'\n", lc->mon_thousands_sep) );
115 DB( g_print("mon_thousands_sep %x %x %x %x\n", lc->mon_thousands_sep[0], lc->mon_thousands_sep[1], lc->mon_thousands_sep[2], lc->mon_thousands_sep[3]) );
118 DB( g_print("frac_digits '%d'\n", (gint)lc->frac_digits) );
120 DB( g_print("currency_symbol '%s'\n", lc->currency_symbol) );
122 DB( g_print("p_cs_precedes '%d'\n", lc->p_cs_precedes) );
124 DB( g_print("n_cs_precedes '%d'\n", lc->n_cs_precedes) );
126 //PREFS->base_cur.iso_code = g_strdup(g_strstrip(lc->int_curr_symbol));
128 if( lc->p_cs_precedes || lc->n_cs_precedes )
130 PREFS->base_cur.symbol = g_strdup(lc->currency_symbol);
131 PREFS->base_cur.sym_prefix = TRUE;
132 DB( g_print("locale mon cs is a prefix\n") );
136 PREFS->base_cur.symbol = g_strdup(lc->currency_symbol);
137 PREFS->base_cur.sym_prefix = FALSE;
140 PREFS->base_cur.decimal_char = g_strdup(lc->mon_decimal_point);
142 PREFS->base_cur.grouping_char = g_strdup(lc->mon_thousands_sep);
145 //PREFS->base_cur.grouping_char = g_locale_to_utf8(lc->mon_thousands_sep, -1, NULL, NULL, NULL);
146 //PREFS->base_cur.grouping_char = g_convert (lc->mon_thousands_sep, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL);
148 DB( g_print(" -> grouping_char: '%s'\n", PREFS->base_cur.grouping_char) );
150 PREFS->base_cur.frac_digits = lc->frac_digits;
153 if( PREFS->base_cur.frac_digits > MAX_FRAC_DIGIT )
155 PREFS->base_cur.frac_digits = 2;
156 g_free(PREFS->base_cur.decimal_char);
157 PREFS->base_cur.decimal_char = g_strdup(".");
163 #define BUFFER_SIZE 512
164 char buffer[BUFFER_SIZE];
165 //LPWSTR wcBuffer = buffer;
166 LPSTR wcBuffer = buffer;
170 //https://msdn.microsoft.com/en-us/library/windows/desktop/dd464799%28v=vs.85%29.aspx
175 //see g_locale_to_utf8 here
176 iResult = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SCURRENCY, wcBuffer, BUFFER_SIZE);
179 DB( g_print("LOCALE_SCURRENCY='%s'\n", buffer) );
180 PREFS->base_cur.symbol = g_locale_to_utf8(buffer, -1, NULL, &toto, NULL);
184 //PREFS->base_cur.sym_prefix =
186 iResult = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, wcBuffer, BUFFER_SIZE);
189 DB( g_print("LOCALE_SDECIMAL='%s'\n", buffer) );
190 PREFS->base_cur.decimal_char = g_locale_to_utf8(buffer, -1, NULL, &toto, NULL);
193 iResult = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, wcBuffer, BUFFER_SIZE);
196 DB( g_print("LOCALE_STHOUSAND='%s'\n", buffer) );
197 PREFS->base_cur.grouping_char = g_locale_to_utf8(buffer, -1, NULL, &toto, NULL);
200 // LOCALE_ICURRDIGITS
201 PREFS->base_cur.frac_digits = 2;
205 PREFS->base_cur.iso_code = g_strdup("USD");
206 PREFS->base_cur.symbol = NULL; //g_strdup("");
207 PREFS->base_cur.sym_prefix = FALSE;
208 PREFS->base_cur.decimal_char = g_strdup(".");
209 PREFS->base_cur.grouping_char = NULL; //g_strdup("");
210 PREFS->base_cur.frac_digits = 2;
220 static void homebank_pref_init_wingeometry(struct WinGeometry
*wg
, gint l
, gint t
, gint w
, gint h
)
231 //vehicle_unit_distbyvol
232 //=> used for column title
234 static void _homebank_pref_init_measurement_units(void)
237 if(!PREFS
->vehicle_unit_ismile
)
239 PREFS
->vehicle_unit_dist
= "%d km";
240 PREFS
->vehicle_unit_100
= "100 km";
245 PREFS
->vehicle_unit_dist
= "%d mi.";
246 PREFS
->vehicle_unit_100
= "100 mi.";
250 if(!PREFS
->vehicle_unit_isgal
)
252 //TRANSLATORS: format a liter number with l/L as abbreviation
253 PREFS
->vehicle_unit_vol
= _("%.2f l");
254 if(!PREFS
->vehicle_unit_ismile
)
255 //TRANSLATORS: kilometer per liter
256 PREFS
->vehicle_unit_distbyvol
= _("km/l");
258 //TRANSLATORS: miles per liter
259 PREFS
->vehicle_unit_distbyvol
= _("mi./l");
264 PREFS
->vehicle_unit_vol
= "%.2f gal.";
265 if(!PREFS
->vehicle_unit_ismile
)
266 PREFS
->vehicle_unit_distbyvol
= "km/gal.";
268 PREFS
->vehicle_unit_distbyvol
= "mi./gal.";
274 void homebank_pref_free(void)
276 DB( g_print("\n[preferences] free\n") );
279 g_free(PREFS
->date_format
);
281 g_free(PREFS
->color_exp
);
282 g_free(PREFS
->color_inc
);
283 g_free(PREFS
->color_warn
);
285 g_free(PREFS
->path_hbfile
);
286 g_free(PREFS
->path_import
);
287 g_free(PREFS
->path_export
);
288 //g_free(PREFS->path_navigator);
290 g_free(PREFS
->language
);
292 g_free(PREFS
->pnl_list_tab
);
294 g_free(PREFS
->minor_cur
.symbol
);
295 g_free(PREFS
->minor_cur
.decimal_char
);
296 g_free(PREFS
->minor_cur
.grouping_char
);
298 memset(PREFS
, 0, sizeof(struct Preferences
));
302 void homebank_pref_setdefault(void)
306 DB( g_print("\n[preferences] pref init\n") );
308 homebank_pref_free();
310 PREFS
->language
= NULL
;
312 PREFS
->date_format
= g_strdup(DEFAULT_FORMAT_DATE
);
314 PREFS
->path_hbfile
= g_strdup_printf("%s", g_get_home_dir ());
315 PREFS
->path_import
= g_strdup_printf("%s", g_get_home_dir ());
316 PREFS
->path_export
= g_strdup_printf("%s", g_get_home_dir ());
317 //PREFS->path_navigator = g_strdup(DEFAULT_PATH_NAVIGATOR);
319 PREFS
->showsplash
= TRUE
;
320 PREFS
->loadlast
= TRUE
;
321 PREFS
->appendscheduled
= FALSE
;
322 PREFS
->do_update_currency
= FALSE
;
324 PREFS
->bak_is_automatic
= TRUE
;
325 PREFS
->bak_max_num_copies
= 5;
327 PREFS
->heritdate
= FALSE
;
328 PREFS
->hidereconciled
= FALSE
;
329 PREFS
->showremind
= TRUE
;
331 PREFS
->txn_memoacp
= TRUE
;
332 PREFS
->txn_memoacp_days
= 365;
334 PREFS
->toolbar_style
= 4; //text beside icons
335 PREFS
->custom_colors
= TRUE
;
336 PREFS
->color_exp
= g_strdup(DEFAULT_EXP_COLOR
);
337 PREFS
->color_inc
= g_strdup(DEFAULT_INC_COLOR
);
338 PREFS
->color_warn
= g_strdup(DEFAULT_WARN_COLOR
);
339 PREFS
->grid_lines
= GTK_TREE_VIEW_GRID_LINES_NONE
;
342 PREFS
->fisc_year_day
= 1;
343 PREFS
->fisc_year_month
= 1;
345 /* windows position/size */
346 homebank_pref_init_wingeometry(&PREFS
->wal_wg
, 0, 0, 1024, 600);
347 homebank_pref_init_wingeometry(&PREFS
->acc_wg
, 0, 0, 1024, 600);
348 homebank_pref_init_wingeometry(&PREFS
->sta_wg
, 0, 0, 800, 494);
349 homebank_pref_init_wingeometry(&PREFS
->tme_wg
, 0, 0, 800, 494);
350 homebank_pref_init_wingeometry(&PREFS
->ove_wg
, 0, 0, 800, 494);
351 homebank_pref_init_wingeometry(&PREFS
->bud_wg
, 0, 0, 800, 494);
352 homebank_pref_init_wingeometry(&PREFS
->cst_wg
, 0, 0, 800, 494);
354 homebank_pref_init_wingeometry(&PREFS
->txn_wg
, 0, 0, -1, -1);
356 homebank_pref_init_monetary();
358 PREFS
->wal_toolbar
= TRUE
;
359 PREFS
->wal_spending
= TRUE
;
360 PREFS
->wal_upcoming
= TRUE
;
361 PREFS
->wal_vpaned
= 600/2;
362 PREFS
->wal_hpaned
= 1024/2;
364 PREFS
->pnl_acc_col_acc_width
= -1;
365 PREFS
->pnl_acc_show_by
= 0;
366 PREFS
->pnl_upc_col_pay_width
= -1;
367 PREFS
->pnl_upc_col_mem_width
= -1;
370 PREFS
->lst_impope_columns
[i
++] = LST_DSPOPE_DATE
; //always displayed
371 PREFS
->lst_impope_columns
[i
++] = LST_DSPOPE_MEMO
;
372 PREFS
->lst_impope_columns
[i
++] = LST_DSPOPE_AMOUNT
;
373 PREFS
->lst_impope_columns
[i
++] = LST_DSPOPE_INFO
;
374 PREFS
->lst_impope_columns
[i
++] = LST_DSPOPE_PAYEE
;
375 PREFS
->lst_impope_columns
[i
++] = LST_DSPOPE_CATEGORY
;
376 PREFS
->lst_impope_columns
[i
++] = -LST_DSPOPE_TAGS
;
377 PREFS
->lst_impope_columns
[i
++] = -LST_DSPOPE_CLR
;
378 PREFS
->lst_impope_columns
[i
++] = -LST_DSPOPE_STATUS
; //always displayed
379 PREFS
->lst_impope_columns
[i
++] = -LST_DSPOPE_EXPENSE
;
380 PREFS
->lst_impope_columns
[i
++] = -LST_DSPOPE_INCOME
;
381 PREFS
->lst_impope_columns
[i
++] = -LST_DSPOPE_BALANCE
;
382 PREFS
->lst_impope_columns
[i
++] = -LST_DSPOPE_ACCOUNT
;
385 PREFS
->lst_ope_columns
[i
++] = LST_DSPOPE_STATUS
; //always displayed
386 PREFS
->lst_ope_columns
[i
++] = LST_DSPOPE_DATE
; //always displayed
387 PREFS
->lst_ope_columns
[i
++] = LST_DSPOPE_INFO
;
388 PREFS
->lst_ope_columns
[i
++] = LST_DSPOPE_PAYEE
;
389 PREFS
->lst_ope_columns
[i
++] = LST_DSPOPE_CATEGORY
;
390 PREFS
->lst_ope_columns
[i
++] = LST_DSPOPE_TAGS
;
391 PREFS
->lst_ope_columns
[i
++] = LST_DSPOPE_CLR
;
392 PREFS
->lst_ope_columns
[i
++] = -LST_DSPOPE_AMOUNT
;
393 PREFS
->lst_ope_columns
[i
++] = LST_DSPOPE_EXPENSE
;
394 PREFS
->lst_ope_columns
[i
++] = LST_DSPOPE_INCOME
;
395 PREFS
->lst_ope_columns
[i
++] = LST_DSPOPE_BALANCE
;
396 PREFS
->lst_ope_columns
[i
++] = LST_DSPOPE_MEMO
;
397 PREFS
->lst_ope_columns
[i
++] = -LST_DSPOPE_ACCOUNT
;
399 PREFS
->lst_ope_sort_id
= LST_DSPOPE_DATE
;
400 PREFS
->lst_ope_sort_order
= GTK_SORT_ASCENDING
;
402 for( i
=0;i
<NUM_LST_DSPOPE
;i
++)
403 PREFS
->lst_ope_col_width
[i
] = -1;
405 //PREFS->base_cur.nbdecimal = 2;
406 //PREFS->base_cur.separator = TRUE;
408 //PREFS->date_range_wal = FLT_RANGE_LASTMONTH;
409 //PREFS->date_range_txn = FLT_RANGE_LAST12MONTHS;
410 //PREFS->date_range_rep = FLT_RANGE_THISYEAR;
412 //v5.2 change to let the example file show things
413 PREFS
->date_range_wal
= FLT_RANGE_ALLDATE
;
414 PREFS
->date_range_txn
= FLT_RANGE_ALLDATE
;
415 PREFS
->date_range_rep
= FLT_RANGE_ALLDATE
;
416 PREFS
->date_future_nbdays
= 0;
419 PREFS
->dtex_nointro
= TRUE
;
420 PREFS
->dtex_ucfirst
= FALSE
;
421 //PREFS->dtex_datefmt
422 PREFS
->dtex_ofxname
= 1;
423 PREFS
->dtex_ofxmemo
= 2;
424 PREFS
->dtex_qifmemo
= TRUE
;
425 PREFS
->dtex_qifswap
= FALSE
;
427 //todo: add intelligence here
428 PREFS
->euro_active
= FALSE
;
430 PREFS
->euro_country
= 0;
431 PREFS
->euro_value
= 1.0;
433 da_cur_initformat(&PREFS
->minor_cur
);
435 //PREFS->euro_nbdec = 2;
436 //PREFS->euro_thsep = TRUE;
437 //PREFS->euro_symbol = g_strdup("??");
439 PREFS
->stat_byamount
= FALSE
;
440 PREFS
->stat_showdetail
= FALSE
;
441 PREFS
->stat_showrate
= FALSE
;
442 PREFS
->budg_showdetail
= FALSE
;
443 PREFS
->report_color_scheme
= CHART_COLMAP_HOMEBANK
;
445 //PREFS->chart_legend = FALSE;
447 PREFS
->vehicle_unit_ismile
= FALSE
;
448 PREFS
->vehicle_unit_isgal
= FALSE
;
450 _homebank_pref_init_measurement_units();
456 ** load preference from homedir/.homebank (HB_DATA_PATH)
458 static void homebank_pref_get_wingeometry(
460 const gchar
*group_name
,
462 struct WinGeometry
*storage
)
464 if( g_key_file_has_key(key_file
, group_name
, key
, NULL
) )
469 wg
= g_key_file_get_integer_list(key_file
, group_name
, key
, &length
, NULL
);
470 memcpy(storage
, wg
, 5*sizeof(gint
));
472 // #606613 ensure left/top to be > 0
484 static void homebank_pref_get_boolean(
486 const gchar
*group_name
,
490 DB( g_print(" search %s in %s\n", key
, group_name
) );
492 if( g_key_file_has_key(key_file
, group_name
, key
, NULL
) )
494 *storage
= g_key_file_get_boolean(key_file
, group_name
, key
, NULL
);
495 DB( g_print(" stored boolean %d for %s at %x\n", *storage
, key
, *storage
) );
499 static void homebank_pref_get_integer(
501 const gchar
*group_name
,
505 DB( g_print(" search %s in %s\n", key
, group_name
) );
507 if( g_key_file_has_key(key_file
, group_name
, key
, NULL
) )
509 *storage
= g_key_file_get_integer(key_file
, group_name
, key
, NULL
);
510 DB( g_print(" stored integer %d for %s at %x\n", *storage
, key
, *storage
) );
514 static void homebank_pref_get_guint32(
516 const gchar
*group_name
,
520 DB( g_print(" search %s in %s\n", key
, group_name
) );
522 if( g_key_file_has_key(key_file
, group_name
, key
, NULL
) )
524 *storage
= g_key_file_get_integer(key_file
, group_name
, key
, NULL
);
525 DB( g_print(" stored guint32 %d for %s at %x\n", *storage
, key
, *storage
) );
529 static void homebank_pref_get_short(
531 const gchar
*group_name
,
535 DB( g_print(" search %s in %s\n", key
, group_name
) );
537 if( g_key_file_has_key(key_file
, group_name
, key
, NULL
) )
539 *storage
= (gshort
)g_key_file_get_integer(key_file
, group_name
, key
, NULL
);
540 DB( g_print(" stored short %d for %s at %x\n", *storage
, key
, *storage
) );
544 static void homebank_pref_get_string(
546 const gchar
*group_name
,
552 if( g_key_file_has_key(key_file
, group_name
, key
, NULL
) )
554 /* free any previous string */
555 if( *storage
!= NULL
)
557 //DB( g_print(" storage was not null, freeing\n") );
564 string
= g_key_file_get_string(key_file
, group_name
, key
, NULL
);
567 //*storage = g_strdup(string);
569 *storage
= string
; //already a new allocated string
571 //DB( g_print(" store '%s' for %s at %x\n", string, key, *storage) );
578 g_warning ("error: %s\n", error->message);
588 static void homebank_pref_currfmt_convert(Currency
*cur
, gchar
*prefix
, gchar
*suffix
)
591 if( (prefix
!= NULL
) && (strlen(prefix
) > 0) )
593 cur
->symbol
= g_strdup(prefix
);
594 cur
->sym_prefix
= TRUE
;
596 else if( (suffix
!= NULL
) )
598 cur
->symbol
= g_strdup(suffix
);
599 cur
->sym_prefix
= FALSE
;
604 gboolean
homebank_pref_load(void)
607 gboolean retval
= FALSE
;
608 gchar
*group
, *filename
;
611 GError
*error
= NULL
;
613 DB( g_print("\n[preferences] pref load\n") );
615 keyfile
= g_key_file_new();
618 filename
= g_build_filename(homebank_app_get_config_dir(), "preferences", NULL
);
620 DB( g_print(" - filename: %s\n", filename
) );
623 loaded
= g_key_file_load_from_file (keyfile
, filename
, G_KEY_FILE_NONE
, &error
);
626 g_warning("unable to load file %s: %s", filename
, error
->message
);
627 g_error_free (error
);
635 DB( g_print(" -> ** General\n") );
637 //since 4.51 version is integer
638 homebank_pref_get_guint32 (keyfile
, group
, "Version", &version
);
639 if(version
== 0) // old double number
641 gdouble v
= g_key_file_get_double (keyfile
, group
, "Version", NULL
);
642 version
= (guint32
)(v
* 10);
645 DB( g_print(" - version: %d\n", version
) );
647 homebank_pref_get_string(keyfile
, group
, "Language", &PREFS
->language
);
649 homebank_pref_get_short(keyfile
, group
, "BarStyle" , &PREFS
->toolbar_style
);
651 if(version
<= 6 && PREFS
->toolbar_style
== 0) // force system to text beside
653 PREFS
->toolbar_style
= 4;
656 if(version
<= 2) // retrieve old settings
660 homebank_pref_get_guint32(keyfile
, group
, "ColorExp" , &color
);
661 g_free(PREFS
->color_exp
);
662 PREFS
->color_exp
= g_strdup_printf("#%06x", color
);
664 homebank_pref_get_guint32(keyfile
, group
, "ColorInc" , &color
);
665 g_free(PREFS
->color_inc
);
666 PREFS
->color_inc
= g_strdup_printf("#%06x", color
);
668 homebank_pref_get_guint32(keyfile
, group
, "ColorWarn", &color
);
669 g_free(PREFS
->color_warn
);
670 PREFS
->color_warn
= g_strdup_printf("#%06x", color
);
674 homebank_pref_get_boolean(keyfile
, group
, "CustomColors", &PREFS
->custom_colors
);
676 homebank_pref_get_string(keyfile
, group
, "ColorExp" , &PREFS
->color_exp
);
677 homebank_pref_get_string(keyfile
, group
, "ColorInc" , &PREFS
->color_inc
);
678 homebank_pref_get_string(keyfile
, group
, "ColorWarn", &PREFS
->color_warn
);
683 homebank_pref_get_boolean(keyfile
, group
, "RulesHint", &rules_hint
);
684 if( rules_hint
== TRUE
)
685 PREFS
->grid_lines
= GTK_TREE_VIEW_GRID_LINES_HORIZONTAL
;
689 homebank_pref_get_short(keyfile
, group
, "GridLines", &PREFS
->grid_lines
);
692 DB( g_print(" - color exp: %s\n", PREFS
->color_exp
) );
693 DB( g_print(" - color inc: %s\n", PREFS
->color_inc
) );
694 DB( g_print(" - color wrn: %s\n", PREFS
->color_warn
) );
697 homebank_pref_get_string(keyfile
, group
, "WalletPath", &PREFS
->path_hbfile
);
698 homebank_pref_get_string(keyfile
, group
, "ImportPath", &PREFS
->path_import
);
699 homebank_pref_get_string(keyfile
, group
, "ExportPath", &PREFS
->path_export
);
701 homebank_pref_get_boolean(keyfile
, group
, "ShowSplash", &PREFS
->showsplash
);
702 homebank_pref_get_boolean(keyfile
, group
, "LoadLast", &PREFS
->loadlast
);
703 homebank_pref_get_boolean(keyfile
, group
, "AppendScheduled", &PREFS
->appendscheduled
);
704 homebank_pref_get_boolean(keyfile
, group
, "UpdateCurrency", &PREFS
->do_update_currency
);
706 homebank_pref_get_boolean(keyfile
, group
, "BakIsAutomatic", &PREFS
->bak_is_automatic
);
707 homebank_pref_get_short(keyfile
, group
, "BakMaxNumCopies", &PREFS
->bak_max_num_copies
);
709 homebank_pref_get_boolean(keyfile
, group
, "HeritDate", &PREFS
->heritdate
);
710 homebank_pref_get_boolean(keyfile
, group
, "HideReconciled", &PREFS
->hidereconciled
);
711 homebank_pref_get_boolean(keyfile
, group
, "ShowRemind", &PREFS
->showremind
);
712 homebank_pref_get_boolean(keyfile
, group
, "TxnMemoAcp", &PREFS
->txn_memoacp
);
713 homebank_pref_get_short(keyfile
, group
, "TxnMemoAcpDays", &PREFS
->txn_memoacp_days
);
716 if( g_key_file_has_key(keyfile
, group
, "ColumnsOpe", NULL
) )
722 if(version
<= 2) //retrieve old 0.1 or 0.2 visibility boolean
724 bsrc
= g_key_file_get_boolean_list(keyfile
, group
, "ColumnsOpe", &length
, NULL
);
725 if( length
== NUM_LST_DSPOPE
-1 )
728 for(i
=0; i
<NUM_LST_DSPOPE
-1 ; i
++)
730 PREFS
->lst_ope_columns
[i
] = (bsrc
[i
] == TRUE
) ? i
+1 : -(i
+1);
737 src
= g_key_file_get_integer_list(keyfile
, group
, "ColumnsOpe", &length
, NULL
);
739 DB( g_print(" - length %d (max=%d)\n", length
, NUM_LST_DSPOPE
) );
741 if( length
== NUM_LST_DSPOPE
)
743 DB( g_print(" - copying column order from pref file\n") );
744 memcpy(PREFS
->lst_ope_columns
, src
, length
*sizeof(gint
));
750 if( length
== NUM_LST_DSPOPE
-2 ) //1 less column before v4.5.1
752 DB( g_print(" - upgrade from v7\n") );
753 DB( g_print(" - copying column order from pref file\n") );
754 memcpy(PREFS
->lst_ope_columns
, src
, length
*sizeof(gint
));
755 //append balance column
756 PREFS
->lst_ope_columns
[10] = LST_DSPOPE_BALANCE
;
762 if( length
== NUM_LST_DSPOPE
-2 ) //1 less column before v4.5.1
764 DB( g_print(" - upgrade prior v5.0\n") );
765 DB( g_print(" - copying column order from pref file\n") );
766 gboolean added
= FALSE
;
767 for(i
=0,j
=0; i
<NUM_LST_DSPOPE
-1 ; i
++)
769 if( added
== FALSE
&&
770 (ABS(src
[i
]) == LST_DSPOPE_AMOUNT
||
771 ABS(src
[i
]) == LST_DSPOPE_EXPENSE
||
772 ABS(src
[i
]) == LST_DSPOPE_INCOME
) )
774 PREFS
->lst_ope_columns
[j
++] = LST_DSPOPE_CLR
;
777 PREFS
->lst_ope_columns
[j
++] = src
[i
];
789 if( g_key_file_has_key(keyfile
, group
, "ColumnsOpeWidth", NULL
) )
794 src
= g_key_file_get_integer_list(keyfile
, group
, "ColumnsOpeWidth", &length
, NULL
);
796 DB( g_print(" - length %d (max=%d)\n", length
, NUM_LST_DSPOPE
) );
798 if( length
== NUM_LST_DSPOPE
)
800 DB( g_print(" - copying column width from pref file\n") );
801 memcpy(PREFS
->lst_ope_col_width
, src
, length
*sizeof(gint
));
809 homebank_pref_get_integer(keyfile
, group
, "OpeSortId", &PREFS
->lst_ope_sort_id
);
810 homebank_pref_get_integer(keyfile
, group
, "OpeSortOrder", &PREFS
->lst_ope_sort_order
);
812 DB( g_print(" - set sort to %d %d\n", PREFS
->lst_ope_sort_id
, PREFS
->lst_ope_sort_order
) );
814 homebank_pref_get_short(keyfile
, group
, "FiscYearDay", &PREFS
->fisc_year_day
);
815 homebank_pref_get_short(keyfile
, group
, "FiscYearMonth", &PREFS
->fisc_year_month
);
820 DB( g_print(" -> ** Windows\n") );
822 homebank_pref_get_wingeometry(keyfile
, group
, "Wal", &PREFS
->wal_wg
);
823 homebank_pref_get_wingeometry(keyfile
, group
, "Acc", &PREFS
->acc_wg
);
824 homebank_pref_get_wingeometry(keyfile
, group
, "Sta", &PREFS
->sta_wg
);
825 homebank_pref_get_wingeometry(keyfile
, group
, "Tme", &PREFS
->tme_wg
);
826 homebank_pref_get_wingeometry(keyfile
, group
, "Ove", &PREFS
->ove_wg
);
827 homebank_pref_get_wingeometry(keyfile
, group
, "Bud", &PREFS
->bud_wg
);
828 homebank_pref_get_wingeometry(keyfile
, group
, "Car", &PREFS
->cst_wg
);
830 homebank_pref_get_wingeometry(keyfile
, group
, "Txn", &PREFS
->txn_wg
);
832 if(version
<= 7) //set maximize to 0
843 homebank_pref_get_integer(keyfile
, group
, "WalVPaned", &PREFS
->wal_vpaned
);
844 homebank_pref_get_integer(keyfile
, group
, "WalHPaned", &PREFS
->wal_hpaned
);
845 homebank_pref_get_boolean(keyfile
, group
, "WalToolbar", &PREFS
->wal_toolbar
);
846 homebank_pref_get_boolean(keyfile
, group
, "WalSpending", &PREFS
->wal_spending
);
847 homebank_pref_get_boolean(keyfile
, group
, "WalUpcoming", &PREFS
->wal_upcoming
);
852 DB( g_print(" -> ** Panels\n") );
854 homebank_pref_get_short(keyfile
, group
, "AccColAccW", &PREFS
->pnl_acc_col_acc_width
);
855 homebank_pref_get_short(keyfile
, group
, "AccShowBy" , &PREFS
->pnl_acc_show_by
);
857 homebank_pref_get_short(keyfile
, group
, "UpcColPayW", &PREFS
->pnl_upc_col_pay_width
);
858 homebank_pref_get_short(keyfile
, group
, "UpcColMemW", &PREFS
->pnl_upc_col_mem_width
);
860 homebank_pref_get_string(keyfile
, group
, "PnlLstTab", &PREFS
->pnl_list_tab
);
864 DB( g_print(" -> ** Format\n") );
866 homebank_pref_get_string(keyfile
, group
, "DateFmt", &PREFS
->date_format
);
870 gboolean useimperial
;
872 homebank_pref_get_boolean(keyfile
, group
, "UKUnits", &useimperial
);
875 PREFS
->vehicle_unit_ismile
= TRUE
;
876 PREFS
->vehicle_unit_isgal
= TRUE
;
880 homebank_pref_get_boolean(keyfile
, group
, "UnitIsMile", &PREFS
->vehicle_unit_ismile
);
881 homebank_pref_get_boolean(keyfile
, group
, "UnitIsGal", &PREFS
->vehicle_unit_isgal
);
886 DB( g_print(" -> ** Filter\n") );
888 homebank_pref_get_integer(keyfile
, group
, "DateRangeWal", &PREFS
->date_range_wal
);
889 homebank_pref_get_integer(keyfile
, group
, "DateRangeTxn", &PREFS
->date_range_txn
);
890 homebank_pref_get_integer(keyfile
, group
, "DateFutureNbDays", &PREFS
->date_future_nbdays
);
891 homebank_pref_get_integer(keyfile
, group
, "DateRangeRep", &PREFS
->date_range_rep
);
895 // shift date range >= 5, since we inserted a new one at position 5
896 if(PREFS
->date_range_wal
>= FLT_RANGE_LASTYEAR
)
897 PREFS
->date_range_wal
++;
898 if(PREFS
->date_range_txn
>= FLT_RANGE_LASTYEAR
)
899 PREFS
->date_range_txn
++;
900 if(PREFS
->date_range_rep
>= FLT_RANGE_LASTYEAR
)
901 PREFS
->date_range_rep
++;
907 DB( g_print(" -> ** Euro\n") );
909 //homebank_pref_get_string(keyfile, group, "DefCurrency" , &PREFS->curr_default);
911 homebank_pref_get_boolean(keyfile
, group
, "Active", &PREFS
->euro_active
);
912 homebank_pref_get_integer(keyfile
, group
, "Country", &PREFS
->euro_country
);
914 gchar
*ratestr
= g_key_file_get_string (keyfile
, group
, "ChangeRate", NULL
);
915 if(ratestr
!= NULL
) PREFS
->euro_value
= g_ascii_strtod(ratestr
, NULL
);
919 homebank_pref_get_string(keyfile
, group
, "Symbol", &PREFS
->minor_cur
.symbol
);
920 PREFS
->minor_cur
.frac_digits
= g_key_file_get_integer (keyfile
, group
, "NBDec", NULL
);
922 //PREFS->euro_nbdec = g_key_file_get_integer (keyfile, group, "NBDec", NULL);
923 //PREFS->euro_thsep = g_key_file_get_boolean (keyfile, group, "Sep", NULL);
924 //gchar *tmpstr = g_key_file_get_string (keyfile, group, "Symbol", &error);
930 gchar
*prefix
= NULL
;
931 gchar
*suffix
= NULL
;
933 homebank_pref_get_string(keyfile
, group
, "PreSymbol", &prefix
);
934 homebank_pref_get_string(keyfile
, group
, "SufSymbol", &suffix
);
935 homebank_pref_currfmt_convert(&PREFS
->minor_cur
, prefix
, suffix
);
941 homebank_pref_get_string(keyfile
, group
, "Symbol", &PREFS
->minor_cur
.symbol
);
942 homebank_pref_get_boolean(keyfile
, group
, "IsPrefix", &PREFS
->minor_cur
.sym_prefix
);
944 homebank_pref_get_string(keyfile
, group
, "DecChar" , &PREFS
->minor_cur
.decimal_char
);
945 homebank_pref_get_string(keyfile
, group
, "GroupChar", &PREFS
->minor_cur
.grouping_char
);
946 homebank_pref_get_short(keyfile
, group
, "FracDigits", &PREFS
->minor_cur
.frac_digits
);
949 if( PREFS
->minor_cur
.frac_digits
> MAX_FRAC_DIGIT
)
950 PREFS
->minor_cur
.frac_digits
= MAX_FRAC_DIGIT
;
952 da_cur_initformat(&PREFS
->minor_cur
);
955 //PREFS->euro_symbol = g_locale_to_utf8(tmpstr, -1, NULL, NULL, NULL);
959 DB( g_print(" -> ** Report\n") );
961 homebank_pref_get_boolean(keyfile
, group
, "StatByAmount", &PREFS
->stat_byamount
);
962 homebank_pref_get_boolean(keyfile
, group
, "StatDetail", &PREFS
->stat_showdetail
);
963 homebank_pref_get_boolean(keyfile
, group
, "StatRate", &PREFS
->stat_showrate
);
964 homebank_pref_get_boolean(keyfile
, group
, "BudgDetail", &PREFS
->budg_showdetail
);
965 homebank_pref_get_integer(keyfile
, group
, "ColorScheme", &PREFS
->report_color_scheme
);
969 DB( g_print(" -> ** Exchange\n") );
971 homebank_pref_get_boolean(keyfile
, group
, "DoIntro", &PREFS
->dtex_nointro
);
972 homebank_pref_get_boolean(keyfile
, group
, "UcFirst", &PREFS
->dtex_ucfirst
);
973 homebank_pref_get_integer(keyfile
, group
, "DateFmt", &PREFS
->dtex_datefmt
);
974 homebank_pref_get_integer(keyfile
, group
, "OfxName", &PREFS
->dtex_ofxname
);
975 homebank_pref_get_integer(keyfile
, group
, "OfxMemo", &PREFS
->dtex_ofxmemo
);
976 homebank_pref_get_boolean(keyfile
, group
, "QifMemo", &PREFS
->dtex_qifmemo
);
977 homebank_pref_get_boolean(keyfile
, group
, "QifSwap", &PREFS
->dtex_qifswap
);
981 //PREFS->chart_legend = g_key_file_get_boolean (keyfile, group, "Legend", NULL);
987 gchar *contents = g_key_file_to_data (keyfile, &length, NULL);
988 //g_print(" keyfile:\n%s\n len=%d\n", contents, length);
995 g_key_file_free (keyfile
);
997 _homebank_pref_init_measurement_units();
1004 static void homebank_pref_set_string(
1006 const gchar
*group_name
,
1011 DB( g_print(" - homebank_pref_set_string :: group='%s' key='%s' value='%s'\n", group_name
, key
, string
) );
1013 if( string
!= NULL
&& *string
!= '\0')
1014 g_key_file_set_string (key_file
, group_name
, key
, string
);
1016 g_key_file_set_string (key_file
, group_name
, key
, "");
1022 ** save preference to homedir/.homebank (HB_DATA_PATH)
1024 gboolean
homebank_pref_save(void)
1027 gboolean retval
= FALSE
;
1028 gchar
*group
, *filename
;
1030 GError
*error
= NULL
;
1032 DB( g_print("\n[preferences] pref save\n") );
1034 keyfile
= g_key_file_new();
1038 DB( g_print(" -> ** general\n") );
1042 g_key_file_set_integer (keyfile
, group
, "Version", PREF_VERSION
);
1044 homebank_pref_set_string (keyfile
, group
, "Language", PREFS
->language
);
1046 g_key_file_set_integer (keyfile
, group
, "BarStyle", PREFS
->toolbar_style
);
1047 //g_key_file_set_integer (keyfile, group, "BarImageSize", PREFS->image_size);
1051 g_key_file_set_boolean (keyfile
, group
, "CustomColors", PREFS
->custom_colors
);
1052 g_key_file_set_string (keyfile
, group
, "ColorExp" , PREFS
->color_exp
);
1053 g_key_file_set_string (keyfile
, group
, "ColorInc" , PREFS
->color_inc
);
1054 g_key_file_set_string (keyfile
, group
, "ColorWarn", PREFS
->color_warn
);
1056 g_key_file_set_integer (keyfile
, group
, "GridLines", PREFS
->grid_lines
);
1058 homebank_pref_set_string (keyfile
, group
, "WalletPath" , PREFS
->path_hbfile
);
1059 homebank_pref_set_string (keyfile
, group
, "ImportPath" , PREFS
->path_import
);
1060 homebank_pref_set_string (keyfile
, group
, "ExportPath" , PREFS
->path_export
);
1061 //g_key_file_set_string (keyfile, group, "NavigatorPath", PREFS->path_navigator);
1063 g_key_file_set_boolean (keyfile
, group
, "BakIsAutomatic", PREFS
->bak_is_automatic
);
1064 g_key_file_set_integer (keyfile
, group
, "BakMaxNumCopies", PREFS
->bak_max_num_copies
);
1066 g_key_file_set_boolean (keyfile
, group
, "ShowSplash", PREFS
->showsplash
);
1067 g_key_file_set_boolean (keyfile
, group
, "LoadLast", PREFS
->loadlast
);
1068 g_key_file_set_boolean (keyfile
, group
, "AppendScheduled", PREFS
->appendscheduled
);
1069 g_key_file_set_boolean (keyfile
, group
, "UpdateCurrency", PREFS
->do_update_currency
);
1071 g_key_file_set_boolean (keyfile
, group
, "HeritDate", PREFS
->heritdate
);
1072 g_key_file_set_boolean (keyfile
, group
, "HideReconciled", PREFS
->hidereconciled
);
1073 g_key_file_set_boolean (keyfile
, group
, "ShowRemind", PREFS
->showremind
);
1074 g_key_file_set_boolean (keyfile
, group
, "TxnMemoAcp", PREFS
->txn_memoacp
);
1075 g_key_file_set_integer (keyfile
, group
, "TxnMemoAcpDays" , PREFS
->txn_memoacp_days
);
1077 g_key_file_set_integer_list(keyfile
, group
, "ColumnsOpe", PREFS
->lst_ope_columns
, NUM_LST_DSPOPE
);
1078 g_key_file_set_integer_list(keyfile
, group
, "ColumnsOpeWidth", PREFS
->lst_ope_col_width
, NUM_LST_DSPOPE
);
1079 g_key_file_set_integer (keyfile
, group
, "OpeSortId" , PREFS
->lst_ope_sort_id
);
1080 g_key_file_set_integer (keyfile
, group
, "OpeSortOrder" , PREFS
->lst_ope_sort_order
);
1082 g_key_file_set_integer (keyfile
, group
, "FiscYearDay" , PREFS
->fisc_year_day
);
1083 g_key_file_set_integer (keyfile
, group
, "FiscYearMonth" , PREFS
->fisc_year_month
);
1086 DB( g_print(" -> ** windows\n") );
1089 g_key_file_set_integer_list(keyfile
, group
, "Wal", (gint
*)&PREFS
->wal_wg
, 5);
1090 g_key_file_set_integer_list(keyfile
, group
, "Acc", (gint
*)&PREFS
->acc_wg
, 5);
1091 g_key_file_set_integer_list(keyfile
, group
, "Sta", (gint
*)&PREFS
->sta_wg
, 5);
1092 g_key_file_set_integer_list(keyfile
, group
, "Tme", (gint
*)&PREFS
->tme_wg
, 5);
1093 g_key_file_set_integer_list(keyfile
, group
, "Ove", (gint
*)&PREFS
->ove_wg
, 5);
1094 g_key_file_set_integer_list(keyfile
, group
, "Bud", (gint
*)&PREFS
->bud_wg
, 5);
1095 g_key_file_set_integer_list(keyfile
, group
, "Car", (gint
*)&PREFS
->cst_wg
, 5);
1097 g_key_file_set_integer_list(keyfile
, group
, "Txn", (gint
*)&PREFS
->txn_wg
, 5);
1099 g_key_file_set_integer (keyfile
, group
, "WalVPaned" , PREFS
->wal_vpaned
);
1100 g_key_file_set_integer (keyfile
, group
, "WalHPaned" , PREFS
->wal_hpaned
);
1101 g_key_file_set_boolean (keyfile
, group
, "WalToolbar", PREFS
->wal_toolbar
);
1102 g_key_file_set_boolean (keyfile
, group
, "WalSpending", PREFS
->wal_spending
);
1103 g_key_file_set_boolean (keyfile
, group
, "WalUpcoming", PREFS
->wal_upcoming
);
1106 DB( g_print(" -> ** Panels\n") );
1109 g_key_file_set_integer(keyfile
, group
, "AccColAccW", PREFS
->pnl_acc_col_acc_width
);
1110 g_key_file_set_integer(keyfile
, group
, "AccShowBy" , PREFS
->pnl_acc_show_by
);
1112 g_key_file_set_integer(keyfile
, group
, "UpcColPayW", PREFS
->pnl_upc_col_pay_width
);
1113 g_key_file_set_integer(keyfile
, group
, "UpcColMemW", PREFS
->pnl_upc_col_mem_width
);
1115 homebank_pref_set_string (keyfile
, group
, "PnlLstTab", PREFS
->pnl_list_tab
);
1117 DB( g_print(" -> ** format\n") );
1120 homebank_pref_set_string (keyfile
, group
, "DateFmt" , PREFS
->date_format
);
1122 //g_key_file_set_boolean (keyfile, group, "UKUnits" , PREFS->imperial_unit);
1123 g_key_file_set_boolean (keyfile
, group
, "UnitIsMile" , PREFS
->vehicle_unit_ismile
);
1124 g_key_file_set_boolean (keyfile
, group
, "UnitIsGal" , PREFS
->vehicle_unit_isgal
);
1127 DB( g_print(" -> ** filter\n") );
1130 g_key_file_set_integer (keyfile
, group
, "DateRangeWal", PREFS
->date_range_wal
);
1131 g_key_file_set_integer (keyfile
, group
, "DateRangeTxn", PREFS
->date_range_txn
);
1132 g_key_file_set_integer (keyfile
, group
, "DateFutureNbDays", PREFS
->date_future_nbdays
);
1133 g_key_file_set_integer (keyfile
, group
, "DateRangeRep", PREFS
->date_range_rep
);
1135 DB( g_print(" -> ** euro\n") );
1140 //homebank_pref_set_string(keyfile, group, "DefCurrency" , PREFS->curr_default);
1142 g_key_file_set_boolean (keyfile
, group
, "Active" , PREFS
->euro_active
);
1143 if( PREFS
->euro_active
)
1145 g_key_file_set_integer (keyfile
, group
, "Country", PREFS
->euro_country
);
1147 g_ascii_dtostr(ratestr
, 63, PREFS
->euro_value
);
1148 homebank_pref_set_string (keyfile
, group
, "ChangeRate", ratestr
);
1149 homebank_pref_set_string (keyfile
, group
, "Symbol" , PREFS
->minor_cur
.symbol
);
1150 g_key_file_set_boolean (keyfile
, group
, "IsPrefix" , PREFS
->minor_cur
.sym_prefix
);
1151 homebank_pref_set_string (keyfile
, group
, "DecChar" , PREFS
->minor_cur
.decimal_char
);
1152 homebank_pref_set_string (keyfile
, group
, "GroupChar" , PREFS
->minor_cur
.grouping_char
);
1153 g_key_file_set_integer (keyfile
, group
, "FracDigits", PREFS
->minor_cur
.frac_digits
);
1157 DB( g_print(" -> ** report\n") );
1160 g_key_file_set_boolean (keyfile
, group
, "StatByAmount", PREFS
->stat_byamount
);
1161 g_key_file_set_boolean (keyfile
, group
, "StatDetail" , PREFS
->stat_showdetail
);
1162 g_key_file_set_boolean (keyfile
, group
, "StatRate" , PREFS
->stat_showrate
);
1163 g_key_file_set_boolean (keyfile
, group
, "BudgDetail" , PREFS
->budg_showdetail
);
1164 g_key_file_set_integer (keyfile
, group
, "ColorScheme" , PREFS
->report_color_scheme
);
1168 g_key_file_set_boolean (keyfile
, group
, "DoIntro", PREFS
->dtex_nointro
);
1169 g_key_file_set_boolean (keyfile
, group
, "UcFirst", PREFS
->dtex_ucfirst
);
1170 g_key_file_set_integer (keyfile
, group
, "DateFmt", PREFS
->dtex_datefmt
);
1171 g_key_file_set_integer (keyfile
, group
, "OfxName", PREFS
->dtex_ofxname
);
1172 g_key_file_set_integer (keyfile
, group
, "OfxMemo", PREFS
->dtex_ofxmemo
);
1173 g_key_file_set_boolean (keyfile
, group
, "QifMemo", PREFS
->dtex_qifmemo
);
1174 g_key_file_set_boolean (keyfile
, group
, "QifSwap", PREFS
->dtex_qifswap
);
1178 //g_key_file_set_boolean (keyfile, group, "Legend", PREFS->chart_legend);
1180 //g_key_file_set_string (keyfile, group, "", PREFS->);
1181 //g_key_file_set_boolean (keyfile, group, "", PREFS->);
1182 //g_key_file_set_integer (keyfile, group, "", PREFS->);
1184 DB( g_print(" -> ** g_key_file_to_data\n") );
1186 gchar
*contents
= g_key_file_to_data (keyfile
, &length
, NULL
);
1188 //DB( g_print(" keyfile:\n%s\nlen=%d\n", contents, length) );
1190 filename
= g_build_filename(homebank_app_get_config_dir(), "preferences", NULL
);
1192 DB( g_print(" -> filename: %s\n", filename
) );
1194 g_file_set_contents(filename
, contents
, length
, &error
);
1197 g_warning("unable to save file %s: %s", filename
, error
->message
);
1198 g_error_free (error
);
1202 DB( g_print(" -> contents: %s\n", contents
) );
1204 DB( g_print(" -> freeing filename\n") );
1207 DB( g_print(" -> freeing buffer\n") );
1211 DB( g_print(" -> freeing keyfile\n") );
1213 g_key_file_free (keyfile
);
1216 _homebank_pref_init_measurement_units();