]> Dogcows Code - chaz/homebank/blob - src/ui-pref.c
322358e36cc30722e32a84d7445fb4894146159e
[chaz/homebank] / src / ui-pref.c
1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 Maxime DOYEN
3 *
4 * This file is part of HomeBank.
5 *
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.
10 *
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.
15 *
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/>.
18 */
19
20
21 #include "homebank.h"
22
23 #include "ui-pref.h"
24 #include "dsp-mainwindow.h"
25 #include "gtk-chart-colors.h"
26
27 #include "ext.h"
28
29 #include "ui-currency.h"
30
31
32 /****************************************************************************/
33 /* Debug macros */
34 /****************************************************************************/
35 #define MYDEBUG 0
36
37 #if MYDEBUG
38 #define DB(x) (x);
39 #else
40 #define DB(x);
41 #endif
42
43 /* our global datas */
44 extern struct HomeBank *GLOBALS;
45 extern struct Preferences *PREFS;
46
47
48 enum {
49 LST_PREF_ICONNAME,
50 LST_PREF_NAME,
51 LST_PREF_PAGE,
52 LST_PREF_MAX
53 };
54
55
56 enum
57 {
58 EXT_COLUMN_ENABLED = 0,
59 EXT_COLUMN_LABEL,
60 EXT_COLUMN_TOOLTIP,
61 EXT_COLUMN_PLUGIN_NAME,
62 EXT_NUM_COLUMNS
63 };
64
65
66 static gchar *pref_iconname[PREF_MAX] = {
67 "prf-general",
68 "prf-interface",
69 "prf-locale",
70 "prf-columns",
71 //"prf-display",
72 "prf-import",
73 "prf-report",
74 "prf-backup",
75 "prf-folder",
76 "prf-euro", // to be renamed
77 "prf-plugins",
78 //"prf_charts.svg"
79 };
80
81 static gchar *pref_name[PREF_MAX] = {
82 N_("General"),
83 N_("Interface"),
84 N_("Locale"),
85 N_("Transactions"),
86 N_("Import/Export"),
87 N_("Report"),
88 N_("Backup"),
89 N_("Folders"),
90 N_("Euro minor"),
91 N_("Plugins")
92 //
93 };
94
95 static gchar *CYA_TOOLBAR_STYLE[] = {
96 N_("System defaults"),
97 N_("Icons only"),
98 N_("Text only"),
99 N_("Text under icons"),
100 N_("Text beside icons"),
101 NULL
102 };
103
104 static gchar *CYA_GRID_LINES[] = {
105 N_("None"),
106 N_("Horizontal"),
107 N_("Vertical"),
108 N_("Both"),
109 NULL
110 };
111
112
113 gchar *CYA_TANGO_COLORS[] = {
114 "----",
115 N_("Tango light"),
116 N_("Tango medium"),
117 N_("Tango dark"),
118 NULL
119 };
120
121 gchar *CYA_IMPORT_DATEORDER[] = {
122 N_("m-d-y"),
123 N_("d-m-y"),
124 N_("y-m-d"),
125 NULL
126 };
127
128 gchar *CYA_IMPORT_OFXNAME[] = {
129 N_("Ignore"),
130 N_("Memo"),
131 N_("Payee"),
132 N_("Info"),
133 NULL
134 };
135
136 gchar *CYA_IMPORT_OFXMEMO[] = {
137 N_("Ignore"),
138 N_("Append to Info"),
139 N_("Append to Memo"),
140 N_("Append to Payee"),
141 NULL
142 };
143
144 gchar *CYA_IMPORT_CSVSEPARATOR[] = {
145 N_("Tab"),
146 N_("Comma"),
147 N_("Semicolon"),
148 N_("Space"),
149 NULL
150 };
151
152
153
154 extern gchar *CYA_CHART_COLORSCHEME[];
155 extern gchar *CYA_MONTHS[];
156
157
158
159
160 /*
161 source:
162 http://en.wikipedia.org/wiki/Currencies_of_the_European_Union
163 http://www.xe.com/euro.php
164 http://fr.wikipedia.org/wiki/Liste_des_unit%C3%A9s_mon%C3%A9taires_remplac%C3%A9es_par_l%27euro
165 http://www.inter-locale.com/LocalesDemo.jsp
166 */
167 static EuroParams euro_params[] =
168 {
169 // , rate , symb , prfx , dec, grp, frac
170 // ---------------------------------------------------------------------
171 { 0, "" , "--------" , 1.0 , "" , FALSE, ",", ".", 2 },
172 { 1, "ATS", "Austria" , 13.7603 , "S" , TRUE , ",", ".", 2 }, // -S 1.234.567,89
173 { 2, "BEF", "Belgium" , 40.3399 , "BF" , TRUE , ",", ".", 2 }, // BF 1.234.567,89 -
174 { 20, "BGN", "Bulgaria" , 1.95583 , "лв." , TRUE , ",", " ", 2 }, // non-fixé - 2014 target for euro
175 { 24, "HRK", "Croatia" , 1.0000 , "kn" , FALSE, "" , ".", 0 }, // non-fixé - 2015 target for euro earliest
176 { 14, "CYP", "Cyprus" , 0.585274 , "£" , TRUE , ",", "" , 2 }, //
177 { 23, "CZK", "Czech Republic" , 28.36 , "Kč" , FALSE, ",", " ", 2 }, // non-fixé - 2015 earliest
178 // Denmark
179 { 17, "EEK", "Estonia" , 15.6466 , "kr" , FALSE, ",", " ", 2 }, //
180 { 3, "FIM", "Finland" , 5.94573 , "mk" , FALSE, ",", " ", 2 }, // -1 234 567,89 mk
181 { 4, "FRF", "France" , 6.55957 , "F" , FALSE, ",", " ", 2 }, // -1 234 567,89 F
182 { 5, "DEM", "Germany" , 1.95583 , "DM" , FALSE, ",", ".", 2 }, // -1.234.567,89 DM
183 { 6, "GRD", "Greece" , 340.750 , "d" , TRUE , ".", ",", 2 }, // ??
184 { 21, "HUF", "Hungary" , 261.51 , "Ft" , TRUE , ",", " ", 2 }, // non-fixé - No current target for euro
185 { 7, "IEP", "Ireland" , 0.787564 , "£" , TRUE , ".", ",", 2 }, // -£1,234,567.89
186 { 8, "ITL", "Italy" , 1936.27 , "L" , TRUE , "" , ".", 0 }, // L -1.234.567
187 { 18, "LVL", "Latvia" , 0.702804 , "lat.", FALSE, ",", "" , 2 }, // jan. 2014
188 { 19, "LTL", "Lithuania" , 3.45280 , "Lt" , FALSE, ",", "" , 2 }, // jan. 2015
189 { 9, "LUF", "Luxembourg" , 40.3399 , "LU" , TRUE , ",", ".", 2 }, // LU 1.234.567,89 -
190 { 15, "MTL", "Malta" , 0.429300 , "Lm" , TRUE , ",", "" , 2 }, //
191 { 10, "NLG", "Netherlands" , 2.20371 , "F" , TRUE , ",", ".", 2 }, // F 1.234.567,89-
192 { 25, "PLN", "Poland" , 0.25 , "zł" , FALSE, ",", "" , 2 }, // non-fixé - No current target for euro
193 { 11, "PTE", "Portugal" , 200.482 , "Esc.", FALSE, "$", ".", 2 }, // -1.234.567$89 Esc.
194 { 22, "RON", "Romania" , 3.5155 , "Leu" , FALSE, ",", ".", 2 }, // non-fixé - 2015 target for euro earliest
195 { 16, "SKK", "Slovak Republic", 30.12600 , "Sk" , FALSE, ",", " ", 2 }, //
196 { 13, "SIT", "Slovenia" , 239.640 , "tol" , TRUE , ",", ".", 2 }, //
197 { 12, "ESP", "Spain" , 166.386 , "Pts" , TRUE , "" , ".", 0 }, // -Pts 1.234.567
198 //Sweden
199 //United Kingdom
200 // { " ", "" , 1.00000 , "" , "" , FALSE, ",", "", 2 },
201 };
202
203
204 static void list_ext_colpref_get(GtkTreeView *treeview, GList **columns);
205
206
207 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/
208
209
210 static LangName languagenames[] =
211 {
212 // af ar ast be bg ca cs cy da de el en_AU en_CA en_GB es et eu fa fi fr ga gl he hr hu id is it
213 //ja ka ko lt lv ms nb nds nl oc pl pt_BR pt pt_PT ro ru si sk sl sr sv tr uk vi zh_CN zh_TW
214
215 { "aa", "Afar" },
216 { "ab", "Abkhazian" },
217 { "ae", "Avestan" },
218 { "af", "Afrikaans" },
219 { "ak", "Akan" },
220 { "am", "Amharic" },
221 { "an", "Aragonese" },
222 { "ar", "Arabic" },
223 { "as", "Assamese" },
224 { "ast", "Asturian, Bable, Leonese, Asturleonese" },
225 { "av", "Avaric" },
226 { "ay", "Aymara" },
227 { "az", "Azerbaijani" },
228 { "ba", "Bashkir" },
229 { "be", "Belarusian" },
230 { "bg", "Bulgarian" },
231 { "bh", "Bihari" },
232 { "bi", "Bislama" },
233 { "bm", "Bambara" },
234 { "bn", "Bengali" },
235 { "bo", "Tibetan" },
236 { "br", "Breton" },
237 { "bs", "Bosnian" },
238 { "ca", "Catalan" },
239 { "ce", "Chechen" },
240 { "ch", "Chamorro" },
241 { "co", "Corsican" },
242 { "cr", "Cree" },
243 { "cs", "Czech" },
244 { "cu", "Old Church Slavonic" },
245 { "cv", "Chuvash" },
246 { "cy", "Welsh" },
247 { "da", "Danish" },
248 { "de", "German" },
249 { "dv", "Divehi" },
250 { "dz", "Dzongkha" },
251 { "ee", "Ewe" },
252 { "el", "Greek" },
253 { "en", "English" },
254 { "eo", "Esperanto" },
255 { "es", "Spanish" },
256 { "et", "Estonian" },
257 { "eu", "Basque" },
258 { "fa", "Persian" },
259 { "ff", "Fulah" },
260 { "fi", "Finnish" },
261 { "fj", "Fijian" },
262 { "fo", "Faroese" },
263 { "fr", "French" },
264 { "fy", "Western Frisian" },
265 { "ga", "Irish" },
266 { "gd", "Scottish Gaelic" },
267 { "gl", "Galician" },
268 { "gn", "Guarani" },
269 { "gu", "Gujarati" },
270 { "gv", "Manx" },
271 { "ha", "Hausa" },
272 { "he", "Hebrew" },
273 { "hi", "Hindi" },
274 { "ho", "Hiri Motu" },
275 { "hr", "Croatian" },
276 { "ht", "Haitian" },
277 { "hu", "Hungarian" },
278 { "hy", "Armenian" },
279 { "hz", "Herero" },
280 { "ia", "Interlingua" },
281 { "id", "Indonesian" },
282 { "ie", "Interlingue" },
283 { "ig", "Igbo" },
284 { "ii", "Sichuan Yi" },
285 { "ik", "Inupiaq" },
286 { "io", "Ido" },
287 { "is", "Icelandic" },
288 { "it", "Italian" },
289 { "iu", "Inuktitut" },
290 { "ja", "Japanese" },
291 { "jv", "Javanese" },
292 { "ka", "Georgian" },
293 { "kg", "Kongo" },
294 { "ki", "Kikuyu" },
295 { "kj", "Kwanyama" },
296 { "kk", "Kazakh" },
297 { "kl", "Kalaallisut" },
298 { "km", "Khmer" },
299 { "kn", "Kannada" },
300 { "ko", "Korean" },
301 { "kr", "Kanuri" },
302 { "ks", "Kashmiri" },
303 { "ku", "Kurdish" },
304 { "kv", "Komi" },
305 { "kw", "Cornish" },
306 { "ky", "Kirghiz" },
307 { "la", "Latin" },
308 { "lb", "Luxembourgish" },
309 { "lg", "Ganda" },
310 { "li", "Limburgish" },
311 { "ln", "Lingala" },
312 { "lo", "Lao" },
313 { "lt", "Lithuanian" },
314 { "lu", "Luba-Katanga" },
315 { "lv", "Latvian" },
316 { "mg", "Malagasy" },
317 { "mh", "Marshallese" },
318 { "mi", "Māori" },
319 { "mk", "Macedonian" },
320 { "ml", "Malayalam" },
321 { "mn", "Mongolian" },
322 { "mo", "Moldavian" },
323 { "mr", "Marathi" },
324 { "ms", "Malay" },
325 { "mt", "Maltese" },
326 { "my", "Burmese" },
327 { "na", "Nauru" },
328 { "nb", "Norwegian Bokmål" },
329 { "nd", "North Ndebele" },
330 { "nds", "Low German, Low Saxon" },
331 { "ne", "Nepali" },
332 { "ng", "Ndonga" },
333 { "nl", "Dutch" },
334 { "nn", "Norwegian Nynorsk" },
335 { "no", "Norwegian" },
336 { "nr", "South Ndebele" },
337 { "nv", "Navajo" },
338 { "ny", "Chichewa" },
339 { "oc", "Occitan" },
340 { "oj", "Ojibwa" },
341 { "om", "Oromo" },
342 { "or", "Oriya" },
343 { "os", "Ossetian" },
344 { "pa", "Panjabi" },
345 { "pi", "Pāli" },
346 { "pl", "Polish" },
347 { "ps", "Pashto" },
348 { "pt", "Portuguese" },
349 { "qu", "Quechua" },
350 { "rm", "Romansh" },
351 { "rn", "Kirundi" },
352 { "ro", "Romanian" },
353 { "ru", "Russian" },
354 { "rw", "Kinyarwanda" },
355 { "sa", "Sanskrit" },
356 { "sc", "Sardinian" },
357 { "sd", "Sindhi" },
358 { "se", "Northern Sami" },
359 { "sg", "Sango" },
360 { "si", "Sinhalese" },
361 { "sk", "Slovak" },
362 { "sl", "Slovene" },
363 { "sm", "Samoan" },
364 { "sn", "Shona" },
365 { "so", "Somali" },
366 { "sq", "Albanian" },
367 { "sr", "Serbian" },
368 { "ss", "Swati" },
369 { "st", "Sotho" },
370 { "su", "Sundanese" },
371 { "sv", "Swedish" },
372 { "sw", "Swahili" },
373 { "ta", "Tamil" },
374 { "te", "Telugu" },
375 { "tg", "Tajik" },
376 { "th", "Thai" },
377 { "ti", "Tigrinya" },
378 { "tk", "Turkmen" },
379 { "tl", "Tagalog" },
380 { "tn", "Tswana" },
381 { "to", "Tonga" },
382 { "tr", "Turkish" },
383 { "ts", "Tsonga" },
384 { "tt", "Tatar" },
385 { "tw", "Twi" },
386 { "ty", "Tahitian" },
387 { "ug", "Uighur" },
388 { "uk", "Ukrainian" },
389 { "ur", "Urdu" },
390 { "uz", "Uzbek" },
391 { "ve", "Venda" },
392 { "vi", "Viêt Namese" },
393 { "vo", "Volapük" },
394 { "wa", "Walloon" },
395 { "wo", "Wolof" },
396 { "xh", "Xhosa" },
397 { "yi", "Yiddish" },
398 { "yo", "Yoruba" },
399 { "za", "Zhuang" },
400 { "zh", "Chinese" },
401 { "zu", "Zulu" }
402
403 };
404
405
406 static GtkWidget *pref_list_create(void);
407
408
409 static gint
410 ui_language_combobox_compare_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata)
411 {
412 gint retval = 0;
413 gchar *code1, *code2;
414 gchar *name1, *name2;
415
416 gtk_tree_model_get(model, a, 0, &code1, 1, &name1, -1);
417 gtk_tree_model_get(model, b, 0, &code2, 1, &name2, -1);
418
419 //keep system laguage on top
420 if(code1 == NULL) name1 = NULL;
421 if(code2 == NULL) name2 = NULL;
422
423 retval = hb_string_utf8_compare(name1, name2);
424
425 g_free(name2);
426 g_free(name1);
427
428 return retval;
429 }
430
431
432 static gchar *languagename_get(const gchar *locale)
433 {
434 guint i;
435
436 for (i = 0; i < G_N_ELEMENTS (languagenames); i++)
437 {
438 if( g_ascii_strncasecmp(locale, languagenames[i].locale, -1) == 0 )
439 return languagenames[i].name;
440 }
441
442 return NULL;
443 }
444
445
446 static const gchar *
447 ui_language_combobox_get_name(const gchar *locale)
448 {
449 const gchar *lang;
450
451 DB( g_print("[ui_language_combobox_get_name]\n") );
452
453 // A locale directory name is typically of the form language[_territory]
454 lang = languagename_get (locale);
455 if (! lang)
456 {
457 const gchar *delimiter = strchr (locale, '_'); // strip off the territory suffix
458
459 if (delimiter)
460 {
461 gchar *copy = g_strndup (locale, delimiter - locale);
462 lang = languagename_get (copy);
463 g_free (copy);
464 }
465
466 if(! lang)
467 {
468 g_warning(" locale name not found '%s'", locale);
469 lang = locale;
470 }
471
472 }
473
474 return lang;
475 }
476
477
478 static void
479 ui_language_combobox_populate(GtkWidget *combobox)
480 {
481 GtkTreeModel *model;
482 GtkTreeIter iter;
483
484 model = gtk_combo_box_get_model(GTK_COMBO_BOX(combobox));
485 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
486 gtk_list_store_set (GTK_LIST_STORE(model), &iter,
487 0, NULL,
488 1, _("System Language"),
489 -1);
490
491 GDir *dir = g_dir_open (homebank_app_get_locale_dir (), 0, NULL);
492 const gchar *dirname;
493
494 if (! dir)
495 return;
496
497 while ((dirname = g_dir_read_name (dir)) != NULL)
498 {
499 gchar *filename = g_build_filename (homebank_app_get_locale_dir (),
500 dirname,
501 "LC_MESSAGES",
502 GETTEXT_PACKAGE ".mo",
503 NULL);
504 //DB( g_print("- seek for '%s'\n", filename) );
505 if (g_file_test (filename, G_FILE_TEST_EXISTS))
506 {
507 const gchar *lang;
508 gchar *label;
509
510 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
511
512 lang = ui_language_combobox_get_name(dirname);
513 label = g_strdup_printf ("%s [%s]", lang, dirname);
514
515 gtk_list_store_set (GTK_LIST_STORE(model), &iter,
516 0, dirname,
517 1, label,
518 -1);
519 g_free(label);
520
521 }
522 g_free (filename);
523
524 }
525 g_dir_close (dir);
526
527 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
528
529
530 }
531
532
533 static GtkWidget *
534 ui_language_combobox_new(GtkWidget *label)
535 {
536 GtkListStore *store;
537 GtkWidget *combobox;
538 GtkCellRenderer *renderer;
539
540 store = gtk_list_store_new (2,
541 G_TYPE_STRING,
542 G_TYPE_STRING
543 );
544 gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store), ui_language_combobox_compare_func, NULL, NULL);
545
546 combobox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
547 renderer = gtk_cell_renderer_text_new ();
548 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE);
549 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer, "text", 1, NULL);
550
551 gtk_combo_box_set_id_column( GTK_COMBO_BOX(combobox), 0);
552
553 g_object_unref(store);
554
555 if(label)
556 gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
557
558 ui_language_combobox_populate(combobox);
559
560 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
561
562 return combobox;
563 }
564
565
566 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/
567 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/
568 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/
569
570 static gint ui_euro_combobox_id_to_active(gint id)
571 {
572 guint i, retval;
573
574 DB( g_print("\n[ui-pref] ui_euro_combobox_id_to_active\n") );
575
576 retval = 0;
577 for (i = 0; i < G_N_ELEMENTS (euro_params); i++)
578 {
579 if( euro_params[i].id == id )
580 {
581 retval = i;
582 DB( g_print("- id (country)=%d => %d - %s\n", id, i, euro_params[i].name) );
583 break;
584 }
585 }
586
587 return retval;
588 }
589
590
591
592 static gint ui_euro_combobox_active_to_id(gint active)
593 {
594 gint id;
595
596 DB( g_print("\n[ui-pref] ui_euro_combobox_active_to_id\n") );
597
598 DB( g_print("- to %d\n", active) );
599
600 id = 0;
601 if( active < (gint)G_N_ELEMENTS (euro_params) )
602 {
603 id = euro_params[active].id;
604 DB( g_print("- id (country)=%d '%s'\n", id, euro_params[active].name) );
605 }
606 return id;
607 }
608
609
610 static GtkWidget *ui_euro_combobox_new(GtkWidget *label)
611 {
612 GtkWidget *combobox;
613 guint i;
614
615 DB( g_print("\n[ui-pref] make euro preset\n") );
616
617 combobox = gtk_combo_box_text_new();
618 for (i = 0; i < G_N_ELEMENTS (euro_params); i++)
619 {
620 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), euro_params[i].name);
621 }
622 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
623
624 if(label)
625 gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
626
627 return combobox;
628 }
629
630
631 static void defpref_pathselect(GtkWidget *widget, gpointer user_data)
632 {
633 struct defpref_data *data;
634 gint type = GPOINTER_TO_INT(user_data);
635 gchar **path;
636 gchar *title;
637 GtkWidget *entry;
638 gboolean r;
639
640 DB( g_print("\n[ui-pref] path select\n") );
641
642 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
643
644 switch( type )
645 {
646 case PRF_PATH_WALLET:
647 path = &PREFS->path_hbfile;
648 entry = data->ST_path_hbfile;
649 title = _("Choose a default HomeBank files folder");
650 break;
651 case PRF_PATH_IMPORT:
652 path = &PREFS->path_import;
653 entry = data->ST_path_import;
654 title = _("Choose a default import folder");
655 break;
656 case PRF_PATH_EXPORT:
657 path = &PREFS->path_export;
658 entry = data->ST_path_export;
659 title = _("Choose a default export folder");
660 break;
661 default:
662 return;
663 }
664
665 DB( g_print(" - hbfile %p %s at %p\n" , PREFS->path_hbfile, PREFS->path_hbfile, &PREFS->path_hbfile) );
666 DB( g_print(" - import %p %s at %p\n" , PREFS->path_import, PREFS->path_import, &PREFS->path_import) );
667 DB( g_print(" - export %p %s at %p\n" , PREFS->path_export, PREFS->path_export, &PREFS->path_export) );
668
669
670 DB( g_print(" - before: %s %p\n" , *path, path) );
671
672 r = ui_file_chooser_folder(GTK_WINDOW(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), title, path);
673
674
675 DB( g_print(" - after: %s\n", *path) );
676
677 if( r == TRUE )
678 gtk_entry_set_text(GTK_ENTRY(entry), *path);
679
680
681 }
682
683
684 /*
685 ** update the date sample label
686 */
687 static void defpref_date_sample(GtkWidget *widget, gpointer user_data)
688 {
689 struct defpref_data *data;
690 gchar buffer[256];
691 const gchar *fmt;
692 GDate *date;
693
694 DB( g_print("\n[ui-pref] date sample\n") );
695
696 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
697
698 fmt = gtk_entry_get_text(GTK_ENTRY(data->ST_datefmt));
699 date = g_date_new_julian (GLOBALS->today);
700 g_date_strftime (buffer, 256-1, fmt, date);
701 g_date_free(date);
702
703 gtk_label_set_text(GTK_LABEL(data->LB_date), buffer);
704
705 }
706
707
708 /*
709 ** update the number sample label
710 */
711 static void defpref_numbereuro_sample(GtkWidget *widget, gpointer user_data)
712 {
713 struct defpref_data *data;
714 Currency cur;
715 gchar formatd_buf[G_ASCII_DTOSTR_BUF_SIZE];
716 gchar buf[128];
717
718 DB( g_print("\n[ui-pref] number sample\n") );
719
720 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
721
722 cur.symbol = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_euro_symbol));
723 cur.sym_prefix = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_euro_isprefix));
724 cur.decimal_char = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_euro_decimalchar));
725 cur.grouping_char = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_euro_groupingchar));
726 cur.frac_digits = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_euro_fracdigits));
727
728 da_cur_initformat (&cur);
729
730 DB( g_print("fmt: %s\n", cur.format) );
731
732 g_ascii_formatd(formatd_buf, sizeof (formatd_buf), cur.format, HB_NUMBER_SAMPLE);
733 hb_str_formatd(buf, 127, formatd_buf, &cur, TRUE);
734
735 gtk_label_set_text(GTK_LABEL(data->LB_numbereuro), buf);
736
737 }
738
739
740 /*
741 ** enable/disable euro
742 */
743 static void defpref_eurotoggle(GtkWidget *widget, gpointer user_data)
744 {
745 struct defpref_data *data;
746 gboolean sensitive;
747
748 DB( g_print("\n[ui-pref] euro toggle\n") );
749
750 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
751
752 sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_euro_enable));
753
754 gtk_widget_set_sensitive(data->GRP_currency , sensitive);
755 gtk_widget_set_sensitive(data->GRP_rate , sensitive);
756 gtk_widget_set_sensitive(data->GRP_format , sensitive);
757 }
758
759
760 /*
761 ** set euro value widget from a country
762 */
763 static void defpref_eurosetcurrency(GtkWidget *widget, gint country)
764 {
765 struct defpref_data *data;
766 EuroParams *euro;
767 gchar *buf;
768 gint active;
769
770 DB( g_print("\n[ui-pref] eurosetcurrency\n") );
771
772 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
773
774 active = ui_euro_combobox_id_to_active(country);
775 euro = &euro_params[active];
776 buf = g_strdup_printf("%s - %s", euro->iso, euro->name);
777 gtk_label_set_markup(GTK_LABEL(data->ST_euro_country), buf);
778 g_free(buf);
779 }
780
781
782 /*
783 ** set euro value widget from a country
784 */
785 static void defpref_europreset(GtkWidget *widget, gpointer user_data)
786 {
787 struct defpref_data *data;
788 gint active;
789
790 DB( g_print("\n[ui-pref] euro preset\n") );
791
792 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
793
794 active = gtk_combo_box_get_active (GTK_COMBO_BOX(data->CY_euro_preset));
795 data->country = ui_euro_combobox_active_to_id (active);;
796
797 defpref_eurosetcurrency(widget, data->country);
798
799 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NB_euro_value), euro_params[active].value);
800
801 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NB_euro_fracdigits), euro_params[active].frac_digits);
802
803 gtk_entry_set_text(GTK_ENTRY(data->ST_euro_symbol) , euro_params[active].symbol);
804 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_euro_isprefix), euro_params[active].sym_prefix);
805 gtk_entry_set_text(GTK_ENTRY(data->ST_euro_decimalchar) , euro_params[active].decimal_char);
806 gtk_entry_set_text(GTK_ENTRY(data->ST_euro_groupingchar), euro_params[active].grouping_char);
807
808 }
809
810
811 static void defpref_colortoggle(GtkWidget *widget, gpointer user_data)
812 {
813 struct defpref_data *data;
814 gboolean sensitive;
815
816 DB( g_print("\n[ui-pref] color toggle\n") );
817
818 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
819
820 sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_custom_colors));
821
822 gtk_widget_set_sensitive(data->LB_colors , sensitive);
823 gtk_widget_set_sensitive(data->CY_colors , sensitive);
824 gtk_widget_set_sensitive(data->LB_exp_color , sensitive);
825 gtk_widget_set_sensitive(data->GR_colors , sensitive);
826 }
827
828
829 static void defpref_backuptoggle(GtkWidget *widget, gpointer user_data)
830 {
831 struct defpref_data *data;
832 gboolean sensitive;
833
834 DB( g_print("\n[ui-pref] backup toggle\n") );
835
836 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
837
838 sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_bak_is_automatic));
839 gtk_widget_set_sensitive(data->LB_bak_max_num_copies, sensitive);
840 gtk_widget_set_sensitive(data->NB_bak_max_num_copies, sensitive);
841 gtk_widget_set_sensitive(data->GR_bak_freq , sensitive);
842 }
843
844
845 /*
846 ** set preset colors for amount display
847 */
848 static void defpref_colorpreset(GtkWidget *widget, gpointer user_data)
849 {
850 struct defpref_data *data;
851 GdkRGBA rgba;
852 gint preset;
853 gchar *expcol, *inccol, *wrncol;
854
855 DB( g_print("\n[ui-pref] color preset\n") );
856
857 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
858
859 preset = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_colors));
860
861 switch( preset)
862 {
863 case 1: //light
864 expcol = LIGHT_EXP_COLOR;
865 inccol = LIGHT_INC_COLOR;
866 wrncol = LIGHT_WARN_COLOR;
867 break;
868
869 case 2: //medium
870 expcol = MEDIUM_EXP_COLOR;
871 inccol = MEDIUM_INC_COLOR;
872 wrncol = MEDIUM_WARN_COLOR;
873 break;
874
875 case 3: //dark
876 default:
877 expcol = DEFAULT_EXP_COLOR;
878 inccol = DEFAULT_INC_COLOR;
879 wrncol = DEFAULT_WARN_COLOR;
880 break;
881 }
882
883
884 gdk_rgba_parse(&rgba, expcol);
885 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(data->CP_exp_color), &rgba);
886
887 gdk_rgba_parse(&rgba, inccol);
888 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(data->CP_inc_color), &rgba);
889
890 gdk_rgba_parse(&rgba, wrncol);
891 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(data->CP_warn_color), &rgba);
892
893
894 }
895
896
897 static void defpref_color_scheme_changed(GtkWidget *widget, gpointer user_data)
898 {
899 struct defpref_data *data;
900
901 DB( g_print("\n[ui-pref] color scheme chnaged\n") );
902
903 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
904
905 gtk_widget_queue_draw (data->DA_colors);
906
907 }
908
909
910
911
912 /*
913 static void setGdkColor_from_RGB(GdkColor *color, guint32 value)
914 {
915 guint tmp;
916
917 tmp = value >> 16;
918 color->red = tmp | tmp<<8;
919
920 tmp = value >> 8 & 0xFF;
921 color->green = tmp | tmp<<8;
922
923 tmp = value & 0xFF;
924 color->blue = tmp | tmp<<8;
925 }
926 */
927
928
929 /*
930 ** set :: fill in widgets from PREFS structure
931 */
932
933 static void defpref_set(struct defpref_data *data)
934 {
935 GdkRGBA rgba;
936
937 DB( g_print("\n[ui-pref] set\n") );
938
939 // general
940 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_show_splash), PREFS->showsplash);
941 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_load_last), PREFS->loadlast);
942 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_append_scheduled), PREFS->appendscheduled);
943 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_do_update_currency), PREFS->do_update_currency);
944 hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(data->CY_daterange_wal), PREFS->date_range_wal);
945 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NB_fiscyearday), PREFS->fisc_year_day );
946 gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_fiscyearmonth), PREFS->fisc_year_month - 1);
947
948 // files/backup
949 gtk_entry_set_text(GTK_ENTRY(data->ST_path_hbfile), PREFS->path_hbfile);
950 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_bak_is_automatic), PREFS->bak_is_automatic);
951 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NB_bak_max_num_copies), PREFS->bak_max_num_copies);
952
953 // interface
954 if(PREFS->language != NULL)
955 gtk_combo_box_set_active_id(GTK_COMBO_BOX(data->CY_language), PREFS->language);
956 else
957 gtk_combo_box_set_active (GTK_COMBO_BOX(data->CY_language), 0);
958 gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_toolbar), PREFS->toolbar_style);
959 //gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NB_image_size), PREFS->image_size);
960
961 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_custom_colors), PREFS->custom_colors);
962 gdk_rgba_parse(&rgba, PREFS->color_exp);
963 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(data->CP_exp_color), &rgba);
964 gdk_rgba_parse(&rgba, PREFS->color_inc);
965 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(data->CP_inc_color), &rgba);
966 gdk_rgba_parse(&rgba, PREFS->color_warn);
967 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(data->CP_warn_color), &rgba);
968 //gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_ruleshint), PREFS->rules_hint);
969 gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_gridlines), PREFS->grid_lines);
970
971 // transactions
972 hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(data->CY_daterange_txn), PREFS->date_range_txn);
973 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_datefuture_nbdays), PREFS->date_future_nbdays);
974 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_hide_reconciled), PREFS->hidereconciled);
975 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_show_remind), PREFS->showremind);
976 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_herit_date), PREFS->heritdate);
977 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_memoacp), PREFS->txn_memoacp);
978 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_memoacp_days), PREFS->txn_memoacp_days);
979
980 // display format
981 gtk_entry_set_text(GTK_ENTRY(data->ST_datefmt), PREFS->date_format);
982 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_unitismile), PREFS->vehicle_unit_ismile);
983 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_unitisgal), PREFS->vehicle_unit_isgal);
984
985 // import/export
986 gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_dtex_datefmt), PREFS->dtex_datefmt);
987 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_dtex_ucfirst), PREFS->dtex_ucfirst);
988 gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_dtex_ofxname), PREFS->dtex_ofxname);
989 gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_dtex_ofxmemo), PREFS->dtex_ofxmemo);
990 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_dtex_qifmemo), PREFS->dtex_qifmemo);
991 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_dtex_qifswap), PREFS->dtex_qifswap);
992 gtk_entry_set_text(GTK_ENTRY(data->ST_path_import), PREFS->path_import);
993 gtk_entry_set_text(GTK_ENTRY(data->ST_path_export), PREFS->path_export);
994 gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_dtex_csvsep), PREFS->dtex_csvsep);
995
996 // report
997 hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(data->CY_daterange_rep), PREFS->date_range_rep);
998 gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_color_scheme), PREFS->report_color_scheme);
999 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_stat_byamount), PREFS->stat_byamount);
1000 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_stat_showrate), PREFS->stat_showrate);
1001 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_stat_showdetail), PREFS->stat_showdetail);
1002 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_budg_showdetail), PREFS->budg_showdetail);
1003
1004 /* euro */
1005 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_euro_enable), PREFS->euro_active);
1006 //gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_euro_preset), PREFS->euro_country);
1007 data->country = PREFS->euro_country;
1008 defpref_eurosetcurrency(data->window, data->country);
1009 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NB_euro_value), PREFS->euro_value);
1010 ui_gtk_entry_set_text(data->ST_euro_symbol, PREFS->minor_cur.symbol);
1011 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_euro_isprefix), PREFS->minor_cur.sym_prefix);
1012 ui_gtk_entry_set_text(data->ST_euro_decimalchar, PREFS->minor_cur.decimal_char);
1013 ui_gtk_entry_set_text(data->ST_euro_groupingchar, PREFS->minor_cur.grouping_char);
1014 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NB_euro_fracdigits), PREFS->minor_cur.frac_digits);
1015
1016 //gtk_entry_set_text(GTK_ENTRY(data->ST_euro_symbol), PREFS->euro_symbol);
1017 //gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NB_euro_nbdec), PREFS->euro_nbdec);
1018 //gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_euro_thsep), PREFS->euro_thsep);
1019 }
1020
1021
1022 /*
1023 ** get :: fill PREFS structure from widgets
1024 */
1025 #define RGBA_TO_INT(x) (int)(x*255)
1026
1027 static gchar *gdk_rgba_to_hex(GdkRGBA *rgba)
1028 {
1029 return g_strdup_printf("#%02x%02x%02x", RGBA_TO_INT(rgba->red), RGBA_TO_INT(rgba->green), RGBA_TO_INT(rgba->blue));
1030 }
1031
1032
1033 static void defpref_get(struct defpref_data *data)
1034 {
1035 GdkRGBA rgba;
1036 const gchar *lang;
1037
1038 DB( g_print("\n[ui-pref] get\n") );
1039
1040 // general
1041 PREFS->showsplash = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_show_splash));
1042 PREFS->loadlast = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_load_last));
1043 PREFS->appendscheduled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_append_scheduled));
1044 PREFS->do_update_currency = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_do_update_currency));
1045 PREFS->date_range_wal = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_daterange_wal));
1046 PREFS->fisc_year_day = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_fiscyearday));
1047 PREFS->fisc_year_month = 1 + gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_fiscyearmonth));
1048
1049 // files/backup
1050 ui_gtk_entry_replace_text(data->ST_path_hbfile, &PREFS->path_hbfile);
1051
1052 PREFS->bak_is_automatic = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_bak_is_automatic));
1053 PREFS->bak_max_num_copies = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_bak_max_num_copies));
1054
1055 g_free(PREFS->language);
1056 PREFS->language = NULL;
1057 lang = gtk_combo_box_get_active_id(GTK_COMBO_BOX(data->CY_language));
1058 if(lang != NULL)
1059 {
1060 PREFS->language = g_strdup(lang);
1061 }
1062
1063 PREFS->toolbar_style = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_toolbar));
1064 //PREFS->image_size = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_image_size));
1065
1066 PREFS->custom_colors = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_custom_colors));
1067 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(data->CP_exp_color), &rgba);
1068 g_free(PREFS->color_exp);
1069 PREFS->color_exp = gdk_rgba_to_hex(&rgba);
1070 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(data->CP_inc_color), &rgba);
1071 g_free(PREFS->color_inc);
1072 PREFS->color_inc = gdk_rgba_to_hex(&rgba);
1073 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(data->CP_warn_color), &rgba);
1074 g_free(PREFS->color_warn);
1075 PREFS->color_warn = gdk_rgba_to_hex(&rgba);
1076 //PREFS->rules_hint = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_ruleshint));
1077 PREFS->grid_lines = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_gridlines));
1078 //list_txn_colpref_get(GTK_TREE_VIEW(data->LV_opecolumns), PREFS->lst_ope_columns);
1079
1080 // transaction
1081 PREFS->date_range_txn = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_daterange_txn));
1082 PREFS->date_future_nbdays = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_datefuture_nbdays));
1083 PREFS->hidereconciled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_hide_reconciled));
1084 PREFS->showremind = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_show_remind));
1085 PREFS->heritdate = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_herit_date));
1086 PREFS->txn_memoacp = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_memoacp));
1087 PREFS->txn_memoacp_days = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_memoacp_days));
1088
1089 // display format
1090 g_free(PREFS->date_format);
1091 PREFS->date_format = g_strdup(gtk_entry_get_text(GTK_ENTRY(data->ST_datefmt)));
1092 PREFS->vehicle_unit_ismile = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_unitismile));
1093 PREFS->vehicle_unit_isgal = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_unitisgal));
1094
1095 // import/export
1096 PREFS->dtex_datefmt = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_dtex_datefmt));
1097 PREFS->dtex_ucfirst = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_dtex_ucfirst));
1098 PREFS->dtex_ofxname = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_dtex_ofxname));
1099 PREFS->dtex_ofxmemo = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_dtex_ofxmemo));
1100 PREFS->dtex_qifmemo = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_dtex_qifmemo));
1101 PREFS->dtex_qifswap = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_dtex_qifswap));
1102 ui_gtk_entry_replace_text(data->ST_path_import, &PREFS->path_import);
1103 ui_gtk_entry_replace_text(data->ST_path_export, &PREFS->path_export);
1104 PREFS->dtex_csvsep = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_dtex_csvsep));
1105
1106 // report
1107 PREFS->date_range_rep = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_daterange_rep));
1108 PREFS->report_color_scheme = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_color_scheme));
1109 PREFS->stat_byamount = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_stat_byamount));
1110 PREFS->stat_showrate = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_stat_showrate));
1111 PREFS->stat_showdetail = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_stat_showdetail));
1112 PREFS->budg_showdetail = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_budg_showdetail));
1113
1114 // euro minor
1115 PREFS->euro_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_euro_enable));
1116 PREFS->euro_country = data->country;
1117 PREFS->euro_value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_euro_value));
1118 //strcpy(PREFS->euro_symbol, gtk_entry_get_text(GTK_ENTRY(data->ST_euro_symbol)));
1119 //PREFS->euro_nbdec = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_euro_nbdec));
1120 //PREFS->euro_thsep = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_euro_thsep));
1121 ui_gtk_entry_replace_text(data->ST_euro_symbol, &PREFS->minor_cur.symbol);
1122 PREFS->minor_cur.sym_prefix = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_euro_isprefix));
1123 ui_gtk_entry_replace_text(data->ST_euro_decimalchar, &PREFS->minor_cur.decimal_char);
1124 ui_gtk_entry_replace_text(data->ST_euro_groupingchar, &PREFS->minor_cur.grouping_char);
1125 PREFS->minor_cur.frac_digits = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_euro_fracdigits));
1126 //PREFS->chart_legend = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_chartlegend));
1127
1128 list_ext_colpref_get(GTK_TREE_VIEW(data->PI_plugin_columns), &(PREFS->ext_whitelist));
1129 }
1130
1131
1132 static GtkWidget *defpref_page_import (struct defpref_data *data)
1133 {
1134 GtkWidget *content_grid, *group_grid, *label, *widget;
1135 gint crow, row;
1136
1137 content_grid = gtk_grid_new();
1138 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
1139 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
1140
1141 crow = 0;
1142 // group :: Date options
1143 group_grid = gtk_grid_new ();
1144 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1145 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1146 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1147
1148 label = make_label_group(_("General options"));
1149 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1150
1151 row = 1;
1152 label = make_label_widget(_("Date order:"));
1153 //----------------------------------------- l, r, t, b
1154 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1155 widget = make_cycle(label, CYA_IMPORT_DATEORDER);
1156 data->CY_dtex_datefmt = widget;
1157 //gtk_grid_attach (GTK_GRID (group_grid), data->CY_option[FILTER_DATE], 1, 2, row, row+1);
1158 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1159
1160 row++;
1161 widget = gtk_check_button_new_with_mnemonic (_("Sentence _case memo/payee"));
1162 data->CM_dtex_ucfirst = widget;
1163 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1164
1165
1166 // group :: OFX/QFX options
1167 group_grid = gtk_grid_new ();
1168 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1169 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1170 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1171
1172 label = make_label_group(_("OFX/QFX options"));
1173 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1174
1175 row = 1;
1176 label = make_label_widget(_("OFX _Name:"));
1177 //----------------------------------------- l, r, t, b
1178 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1179 widget = make_cycle(label, CYA_IMPORT_OFXNAME);
1180 data->CY_dtex_ofxname = widget;
1181 //gtk_grid_attach (GTK_GRID (group_grid), data->CY_option[FILTER_DATE], 1, 2, row, row+1);
1182 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1183
1184 row++;
1185 label = make_label_widget(_("OFX _Memo:"));
1186 //----------------------------------------- l, r, t, b
1187 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1188 widget = make_cycle(label, CYA_IMPORT_OFXMEMO);
1189 data->CY_dtex_ofxmemo = widget;
1190 //gtk_grid_attach (GTK_GRID (group_grid), data->CY_option[FILTER_DATE], 1, 2, row, row+1);
1191 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1192
1193 // group :: QIF options
1194 group_grid = gtk_grid_new ();
1195 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1196 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1197 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1198
1199 label = make_label_group(_("QIF options"));
1200 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1201
1202 row = 1;
1203 widget = gtk_check_button_new_with_mnemonic (_("_Import memos"));
1204 data->CM_dtex_qifmemo = widget;
1205 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
1206 widget = gtk_check_button_new_with_mnemonic (_("_Swap memos with payees"));
1207 data->CM_dtex_qifswap = widget;
1208 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1209
1210 // group :: other options
1211 group_grid = gtk_grid_new ();
1212 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1213 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1214 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1215
1216 label = make_label_group(_("CSV options"));
1217 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1218
1219 row = 1;
1220 label = make_label(_("(transaction import only)"), 0.0, 0.5);
1221 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 2, 1);
1222
1223 row++;
1224 label = make_label_widget(_("Separator:"));
1225 //----------------------------------------- l, r, t, b
1226 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1227 widget = make_cycle(label, CYA_IMPORT_CSVSEPARATOR);
1228 data->CY_dtex_csvsep = widget;
1229 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1230
1231 return content_grid;
1232 }
1233
1234 #define cube_dim 16
1235
1236 static gboolean
1237 draw_callback (GtkWidget *widget,
1238 cairo_t *cr,
1239 gpointer user_data)
1240 {
1241 struct defpref_data *data = user_data;
1242 gint index;
1243 GtkColorScheme scheme;
1244 gint w, h;
1245 gint i, x, y;
1246
1247 index = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_color_scheme));
1248
1249 colorscheme_init(&scheme, index);
1250
1251 gtk_widget_get_size_request (widget, &w, &h);
1252 x = y = 0;
1253 for(i=0;i<scheme.nb_cols;i++)
1254 {
1255 cairo_user_set_rgbcol (cr, &scheme.colors[i]);
1256 cairo_rectangle(cr, x, y, cube_dim, cube_dim);
1257 cairo_fill(cr);
1258 x += 1 + cube_dim;
1259 if( i == 15 )
1260 { x = 0; y = 1 + cube_dim; }
1261 }
1262
1263 return TRUE;
1264 }
1265
1266
1267
1268 static GtkWidget *defpref_page_reports (struct defpref_data *data)
1269 {
1270 GtkWidget *content_grid, *group_grid, *label, *widget;
1271 gint crow, row;
1272
1273 content_grid = gtk_grid_new();
1274 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
1275 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
1276
1277 crow = 0;
1278 // group :: Initial filter
1279 group_grid = gtk_grid_new ();
1280 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1281 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1282 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1283
1284 label = make_label_group(_("Initial filter"));
1285 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1286
1287 row = 1;
1288 label = make_label_widget(_("_Range:"));
1289 //----------------------------------------- l, r, t, b
1290 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1291 widget = make_daterange(label, DATE_RANGE_CUSTOM_HIDE);
1292 data->CY_daterange_rep = widget;
1293 //gtk_grid_attach (GTK_GRID (group_grid), data->CY_option[FILTER_DATE], 1, 2, row, row+1);
1294 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1295
1296 // group ::Charts options
1297 group_grid = gtk_grid_new ();
1298 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1299 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1300 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1301
1302 label = make_label_group(_("Charts options"));
1303 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1304
1305 row = 1;
1306 label = make_label_widget(_("Color scheme:"));
1307 //----------------------------------------- l, r, t, b
1308 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1309 widget = make_cycle(label, chart_colors);
1310 data->CY_color_scheme = widget;
1311 //gtk_grid_attach (GTK_GRID (group_grid), data->CY_option[FILTER_DATE], 1, 2, row, row+1);
1312 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1313
1314 row++;
1315 widget = gtk_drawing_area_new ();
1316 data->DA_colors = widget;
1317 gtk_widget_set_size_request (widget, (1+cube_dim)*16, (1+cube_dim)*2);
1318 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1319
1320 g_signal_connect (data->DA_colors, "draw", G_CALLBACK (draw_callback), data);
1321
1322 // group :: Statistics options
1323 group_grid = gtk_grid_new ();
1324 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1325 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1326 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1327
1328 label = make_label_group(_("Statistics options"));
1329 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1330
1331 row = 1;
1332 widget = gtk_check_button_new_with_mnemonic (_("Show by _amount"));
1333 data->CM_stat_byamount = widget;
1334 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1335
1336 row++;
1337 widget = gtk_check_button_new_with_mnemonic (_("Show _rate column"));
1338 data->CM_stat_showrate = widget;
1339 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1340
1341 row++;
1342 widget = gtk_check_button_new_with_mnemonic (_("Show _details"));
1343 data->CM_stat_showdetail = widget;
1344 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1345
1346 // group :: Budget options
1347 group_grid = gtk_grid_new ();
1348 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1349 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1350 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1351
1352 label = make_label_group(_("Budget options"));
1353 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1354
1355 row = 1;
1356 widget = gtk_check_button_new_with_mnemonic (_("Show _details"));
1357 data->CM_budg_showdetail = widget;
1358 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1359
1360 return content_grid;
1361 }
1362
1363
1364 static GtkWidget *defpref_page_euro (struct defpref_data *data)
1365 {
1366 GtkWidget *content_grid, *group_grid, *label, *widget, *expander;
1367 gint crow, row;
1368
1369 content_grid = gtk_grid_new();
1370 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
1371 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
1372
1373 crow = 0;
1374 // group :: General
1375 group_grid = gtk_grid_new ();
1376 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1377 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1378 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1379
1380 label = make_label_group(_("General"));
1381 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1382
1383 row=1;
1384 widget = gtk_check_button_new_with_mnemonic (_("_Enable"));
1385 data->CM_euro_enable = widget;
1386 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1387
1388 // group :: Currency
1389 group_grid = gtk_grid_new ();
1390 data->GRP_currency = group_grid;
1391 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1392 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1393 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1394
1395 label = make_label_group(_("Currency"));
1396 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 4, 1);
1397
1398 row=1;
1399 widget = make_label(NULL, 0.0, 0.5);
1400 data->ST_euro_country = widget;
1401 //gtk_grid_attach (GTK_GRID (group_grid), data->CY_option[FILTER_DATE], 1, 2, row, row+1);
1402 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
1403
1404 //row++;
1405 label = make_label_widget(_("_Preset:"));
1406 //----------------------------------------- l, r, t, b
1407 gtk_grid_attach (GTK_GRID (group_grid), label, 2, row, 1, 1);
1408 widget = ui_euro_combobox_new (label);
1409 data->CY_euro_preset = widget;
1410 gtk_widget_set_margin_left (label, 2*SPACING_LARGE);
1411 //gtk_grid_attach (GTK_GRID (group_grid), data->CY_option[FILTER_DATE], 1, 2, row, row+1);
1412 gtk_grid_attach (GTK_GRID (group_grid), widget, 3, row, 1, 1);
1413
1414
1415 // group :: Exchange rate
1416 group_grid = gtk_grid_new ();
1417 data->GRP_rate = group_grid;
1418 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1419 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1420 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1421
1422 label = make_label_group(_("Exchange rate"));
1423 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1424
1425 row=1;
1426 label = make_label_widget("1 EUR _=");
1427 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1428 widget = make_exchange_rate(label);
1429 data->NB_euro_value = widget;
1430 //gtk_grid_attach (GTK_GRID (group_grid), data->CY_option[FILTER_DATE], 1, 2, row, row+1);
1431 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1432
1433 // group :: Numbers format
1434 group_grid = gtk_grid_new ();
1435 data->GRP_format = group_grid;
1436 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1437 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1438 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1439
1440 label = make_label_group(_("Format"));
1441 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1442
1443 row = 1;
1444 widget = make_label(NULL, 0, 0.0);
1445 data->LB_numbereuro = widget;
1446 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
1447
1448 row++;
1449 expander = gtk_expander_new_with_mnemonic(_("_Customize"));
1450 gtk_grid_attach (GTK_GRID (group_grid), expander, 1, row, 1, 1);
1451
1452 group_grid = gtk_grid_new ();
1453 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1454 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1455 gtk_container_add (GTK_CONTAINER (expander), group_grid);
1456
1457 row = 0;
1458 label = make_label_widget(_("_Symbol:"));
1459 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1460 widget = make_string_maxlength(label, 3);
1461 data->ST_euro_symbol = widget;
1462 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1463
1464 row++;
1465 widget = gtk_check_button_new_with_mnemonic (_("Is pre_fix"));
1466 data->CM_euro_isprefix = widget;
1467 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1468
1469 row++;
1470 label = make_label_widget(_("_Decimal char:"));
1471 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1472 widget = make_string_maxlength(label, 1);
1473 data->ST_euro_decimalchar = widget;
1474 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1475
1476 row++;
1477 label = make_label_widget(_("_Frac digits:"));
1478 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1479 widget = make_numeric(label, 0.0, 6.0);
1480 data->NB_euro_fracdigits = widget;
1481 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1482
1483 row++;
1484 label = make_label_widget(_("_Grouping char:"));
1485 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1486 widget = make_string_maxlength(label, 1);
1487 data->ST_euro_groupingchar = widget;
1488 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1489
1490 return content_grid;
1491 }
1492
1493
1494 static GtkWidget *defpref_page_display (struct defpref_data *data)
1495 {
1496 GtkWidget *content_grid, *group_grid, *label, *widget, *expander, *hbox;
1497 gint crow, row;
1498
1499 content_grid = gtk_grid_new();
1500 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
1501 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
1502
1503 crow = 0;
1504 // group :: General
1505 group_grid = gtk_grid_new ();
1506 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1507 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1508 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1509
1510 label = make_label_group(_("User interface"));
1511 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1512
1513 row = 1;
1514 label = make_label(_("_Language:"), 0, 0.5);
1515 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1516 widget = ui_language_combobox_new(label);
1517 data->CY_language = widget;
1518 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1519
1520 row++;
1521 row++;
1522 label = make_label(_("_Date display:"), 0, 0.5);
1523 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1524 widget = make_label(NULL, 0, 0.5);
1525 data->LB_date = widget;
1526 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1527
1528 row++;
1529 expander = gtk_expander_new_with_mnemonic(_("_Customize"));
1530 gtk_grid_attach (GTK_GRID (group_grid), expander, 2, row, 1, 1);
1531
1532 group_grid = gtk_grid_new ();
1533 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1534 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1535 gtk_container_add (GTK_CONTAINER (expander), group_grid);
1536
1537 row++;
1538 label = make_label_widget(_("_Format:"));
1539 //----------------------------------------- l, r, t, b
1540 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1541 widget = make_string(label);
1542 data->ST_datefmt = widget;
1543 //gtk_grid_attach (GTK_GRID (group_grid), data->CY_option[FILTER_DATE], 1, 2, row, row+1);
1544 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1545
1546 widget = gtk_image_new_from_icon_name (ICONNAME_INFO, GTK_ICON_SIZE_BUTTON);
1547 gtk_grid_attach (GTK_GRID (group_grid), widget, 3, row, 1, 1);
1548
1549
1550 gtk_widget_set_tooltip_text(widget,
1551 _("%a locale's abbreviated weekday name.\n"
1552 "%A locale's full weekday name. \n"
1553 "%b locale's abbreviated month name. \n"
1554 "%B locale's full month name. \n"
1555 "%c locale's appropriate date and time representation. \n"
1556 "%C century number (the year divided by 100 and truncated to an integer) as a decimal number [00-99]. \n"
1557 "%d day of the month as a decimal number [01,31]. \n"
1558 "%D same as %m/%d/%y. \n"
1559 "%e day of the month as a decimal number [1,31]; a single digit is preceded by a space. \n"
1560 "%j day of the year as a decimal number [001,366]. \n"
1561 "%m month as a decimal number [01,12]. \n"
1562 "%p locale's appropriate date representation. \n"
1563 "%y year without century as a decimal number [00,99]. \n"
1564 "%Y year with century as a decimal number.")
1565 );
1566
1567 row++;
1568 widget = make_label(NULL, 0.0, 0.5);
1569 gtk_label_set_markup (GTK_LABEL(widget), "<small><a href=\"http://man7.org/linux/man-pages/man3/strftime.3.html\">online reference</a></small>");
1570 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1571
1572
1573
1574
1575 // group :: Fiscal year
1576 group_grid = gtk_grid_new ();
1577 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1578 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1579 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1580
1581 label = make_label_group(_("Fiscal year"));
1582 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1583
1584 row = 1;
1585 //TRANSLATORS: (fiscal year) starts on
1586 label = make_label_widget(_("Starts _on:"));
1587 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1588
1589 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL);
1590 gtk_grid_attach (GTK_GRID (group_grid), hbox, 2, row, 1, 1);
1591 widget = make_numeric (label, 1, 28);
1592 data->NB_fiscyearday = widget;
1593 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1594 widget = make_cycle (NULL, CYA_MONTHS);
1595 data->CY_fiscyearmonth = widget;
1596 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1597
1598
1599
1600 // group :: Measurement units
1601 group_grid = gtk_grid_new ();
1602 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1603 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1604 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1605
1606 label = make_label_group(_("Measurement units"));
1607 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1608
1609 row = 1;
1610 widget = gtk_check_button_new_with_mnemonic (_("Use _miles for meter"));
1611 data->CM_unitismile = widget;
1612 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1613
1614 row++;
1615 widget = gtk_check_button_new_with_mnemonic (_("Use _gallon for fuel"));
1616 data->CM_unitisgal = widget;
1617 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1618
1619 return content_grid;
1620 }
1621
1622
1623 static GtkWidget *defpref_page_transactions (struct defpref_data *data)
1624 {
1625 GtkWidget *content_grid, *group_grid, *label, *widget;
1626 gint crow, row;
1627
1628 content_grid = gtk_grid_new();
1629 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
1630 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
1631
1632 crow = 0;
1633 // group :: Transaction window
1634 group_grid = gtk_grid_new ();
1635 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1636 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1637 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1638
1639 label = make_label_group(_("Transaction window"));
1640 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1641
1642 row = 1;
1643 label = make_label(_("_Range:"), 0, 0.5);
1644 //----------------------------------------- l, r, t, b
1645 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1646 widget = make_daterange(label, DATE_RANGE_CUSTOM_HIDE);
1647 data->CY_daterange_txn = widget;
1648 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1649
1650 row++;
1651 label = make_label(_("_Show future:"), 0, 0.5);
1652 //----------------------------------------- l, r, t, b
1653 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1654 widget = make_numeric(NULL, 0, 366);
1655
1656 data->ST_datefuture_nbdays = widget;
1657 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1658
1659 //TRANSLATORS: there is a spinner on the left of this label, and so you have 0....x days in advance the current date
1660 label = make_label(_("days ahead"), 0, 0.5);
1661 gtk_grid_attach (GTK_GRID (group_grid), label, 3, row, 1, 1);
1662
1663 row++;
1664 widget = gtk_check_button_new_with_mnemonic (_("Hide reconciled transactions"));
1665 data->CM_hide_reconciled = widget;
1666 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 3, 1);
1667
1668 row++;
1669 widget = gtk_check_button_new_with_mnemonic (_("Always show remind transactions"));
1670 data->CM_show_remind = widget;
1671 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 3, 1);
1672
1673 // group :: Multiple add
1674 group_grid = gtk_grid_new ();
1675 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1676 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1677 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1678
1679 label = make_label_group(_("Multiple add"));
1680 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1681
1682 row = 1;
1683 widget = gtk_check_button_new_with_mnemonic (_("Keep the last date"));
1684 data->CM_herit_date = widget;
1685 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1686
1687 // group :: Memo autocomplete
1688 group_grid = gtk_grid_new ();
1689 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1690 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1691 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1692
1693 label = make_label_group(_("Memo autocomplete"));
1694 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1695
1696 row = 1;
1697 widget = gtk_check_button_new_with_mnemonic (_("Active"));
1698 data->CM_memoacp = widget;
1699 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1700
1701 row++;
1702 widget = make_numeric(NULL, 0, 1460);
1703 data->ST_memoacp_days = widget;
1704 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1705 label = make_label(_("rolling days"), 0, 0.5);
1706 gtk_grid_attach (GTK_GRID (group_grid), label, 3, row, 1, 1);
1707
1708 // group :: Column list
1709 /*
1710 group_grid = gtk_grid_new ();
1711 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1712 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1713 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1714
1715 label = make_label_group(_("Column list"));
1716 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1717
1718 row = 1;
1719 sw = gtk_scrolled_window_new (NULL, NULL);
1720 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
1721 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1722 widget = (GtkWidget *)list_txn_colprefcreate();
1723 data->LV_opecolumns = widget;
1724 gtk_widget_set_size_request(data->LV_opecolumns, HB_MINWIDTH_LIST, -1);
1725 gtk_container_add (GTK_CONTAINER (sw), widget);
1726 gtk_widget_set_vexpand (sw, TRUE);
1727 gtk_grid_attach (GTK_GRID (group_grid), sw, 1, row, 2, 1);
1728 gtk_widget_set_tooltip_text(widget, _("Drag & drop to change the order"));
1729 */
1730
1731 return content_grid;
1732 }
1733
1734
1735
1736 static GtkWidget *defpref_page_interface (struct defpref_data *data)
1737 {
1738 GtkWidget *content_grid, *group_grid, *hbox, *label, *widget;
1739 gint crow, row;
1740
1741 content_grid = gtk_grid_new();
1742 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
1743 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
1744
1745 crow = 0;
1746 // group :: General
1747 group_grid = gtk_grid_new ();
1748 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1749 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1750 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1751
1752 label = make_label_group(_("General"));
1753 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1754
1755 row = 1;
1756 label = make_label(_("_Toolbar:"), 0, 0.5);
1757 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1758 widget = make_cycle(label, CYA_TOOLBAR_STYLE);
1759 data->CY_toolbar = widget;
1760 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1761
1762
1763
1764
1765
1766
1767
1768
1769 row++;
1770 //widget = gtk_check_button_new_with_mnemonic (_("Enable rows in alternating colors"));
1771 //data->CM_ruleshint = widget;
1772 label = make_label(_("_Grid line:"), 0, 0.5);
1773 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1774 widget = make_cycle(label, CYA_GRID_LINES);
1775 data->CY_gridlines = widget;
1776 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1777
1778 // group :: Amount colors
1779 group_grid = gtk_grid_new ();
1780 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1781 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1782 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1783
1784 label = make_label_group(_("Amount colors"));
1785 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1786
1787 row = 1;
1788 widget = gtk_check_button_new_with_mnemonic (_("Uses custom colors"));
1789 data->CM_custom_colors = widget;
1790 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1791
1792 row++;
1793 label = make_label(_("_Preset:"), 0, 0.5);
1794 data->LB_colors = label;
1795 //----------------------------------------- l, r, t, b
1796 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1797 widget = make_cycle(label, CYA_TANGO_COLORS);
1798 data->CY_colors = widget;
1799 //gtk_grid_attach (GTK_GRID (group_grid), data->CY_option[FILTER_DATE], 1, 2, row, row+1);
1800 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1801
1802 row++;
1803 label = make_label(_("_Expense:"), 0, 0.5);
1804 data->LB_exp_color = label;
1805 //----------------------------------------- l, r, t, b
1806 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1807 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL);
1808 data->GR_colors = hbox;
1809 gtk_grid_attach (GTK_GRID (group_grid), hbox, 2, row, 1, 1);
1810
1811 widget = gtk_color_button_new ();
1812 data->CP_exp_color = widget;
1813 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1814
1815 label = make_label_widget(_("_Income:"));
1816 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1817
1818 widget = gtk_color_button_new ();
1819 data->CP_inc_color = widget;
1820 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1821
1822 label = make_label_widget(_("_Warning:"));
1823 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1824
1825 widget = gtk_color_button_new ();
1826 data->CP_warn_color = widget;
1827 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1828
1829 return content_grid;
1830 }
1831
1832
1833 static GtkWidget *defpref_page_filebackup (struct defpref_data *data)
1834 {
1835 GtkWidget *content_grid, *group_grid, *hbox, *label, *widget;
1836 gint crow, row;
1837
1838 content_grid = gtk_grid_new();
1839 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
1840 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
1841
1842 crow = 0;
1843 // group :: Backup
1844 group_grid = gtk_grid_new ();
1845 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1846 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1847 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1848
1849 label = make_label_group(_("Backup"));
1850 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1851
1852 row = 1;
1853 widget = gtk_check_button_new_with_mnemonic (_("_Enable automatic backups"));
1854 data->CM_bak_is_automatic = widget;
1855 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1856
1857 row++;
1858 label = make_label_widget(_("_Number of backups to keep:"));
1859 data->LB_bak_max_num_copies = label;
1860 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1861 widget = make_numeric (label, 1, 99);
1862 data->NB_bak_max_num_copies = widget;
1863 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1864
1865 row++;
1866 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL);
1867 data->GR_bak_freq = hbox;
1868 //gtk_widget_set_hexpand (hbox, TRUE);
1869 gtk_grid_attach (GTK_GRID (group_grid), hbox, 1, row, 2, 1);
1870
1871 widget = gtk_image_new_from_icon_name (ICONNAME_INFO, GTK_ICON_SIZE_BUTTON);
1872 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1873 label = make_label_widget(_("Backup frequency is once a day"));
1874 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1875
1876
1877 return content_grid;
1878 }
1879
1880
1881 static GtkWidget *defpref_page_folders (struct defpref_data *data)
1882 {
1883 GtkWidget *content_grid, *group_grid, *hbox, *label, *widget;
1884 gint crow, row;
1885
1886 content_grid = gtk_grid_new();
1887 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
1888 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
1889
1890 crow = 0;
1891 // group :: Files folder
1892 group_grid = gtk_grid_new ();
1893 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1894 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1895 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1896
1897 label = make_label_group(_("HomeBank files"));
1898 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1899
1900 row = 1;
1901 label = make_label_widget(_("_Wallets:"));
1902 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1903
1904 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1905 gtk_widget_set_hexpand (hbox, TRUE);
1906 gtk_grid_attach (GTK_GRID (group_grid), hbox, 2, row, 1, 1);
1907
1908 widget = make_string(label);
1909 data->ST_path_hbfile = widget;
1910 gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET(widget)), GTK_STYLE_CLASS_LINKED);
1911 gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
1912
1913 //widget = gtk_button_new_with_label("...");
1914 widget = gtk_button_new_from_icon_name(ICONNAME_FOLDER, GTK_ICON_SIZE_BUTTON);
1915 data->BT_path_hbfile = widget;
1916 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1917
1918
1919 // group :: Files folder
1920 group_grid = gtk_grid_new ();
1921 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1922 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1923 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1924
1925 label = make_label_group(_("Exchange files"));
1926 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1927
1928 row = 1;
1929 label = make_label_widget(_("_Import:"));
1930 //----------------------------------------- l, r, t, b
1931 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1932
1933 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1934 gtk_widget_set_hexpand (hbox, TRUE);
1935 gtk_grid_attach (GTK_GRID (group_grid), hbox, 2, row, 1, 1);
1936
1937 widget = make_string(label);
1938 data->ST_path_import = widget;
1939 gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET(widget)), GTK_STYLE_CLASS_LINKED);
1940 gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
1941
1942 //widget = gtk_button_new_with_label("...");
1943 widget = gtk_button_new_from_icon_name(ICONNAME_FOLDER, GTK_ICON_SIZE_BUTTON);
1944 data->BT_path_import = widget;
1945 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1946
1947 row++;
1948 label = make_label_widget(_("_Export:"));
1949 //----------------------------------------- l, r, t, b
1950 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1951
1952 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1953 gtk_widget_set_hexpand (hbox, TRUE);
1954 gtk_grid_attach (GTK_GRID (group_grid), hbox, 2, row, 1, 1);
1955
1956 widget = make_string(label);
1957 data->ST_path_export = widget;
1958 gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET(widget)), GTK_STYLE_CLASS_LINKED);
1959 gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
1960
1961 //widget = gtk_button_new_with_label("...");
1962 widget = gtk_button_new_from_icon_name(ICONNAME_FOLDER, GTK_ICON_SIZE_BUTTON);
1963 data->BT_path_export = widget;
1964 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1965
1966
1967
1968 return content_grid;
1969 }
1970
1971
1972 static GtkWidget *defpref_page_general (struct defpref_data *data)
1973 {
1974 GtkWidget *content_grid, *group_grid, *label, *widget;
1975 gint crow, row;
1976
1977 content_grid = gtk_grid_new();
1978 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
1979 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
1980
1981 crow = 0;
1982 // group :: Program start
1983 group_grid = gtk_grid_new ();
1984 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1985 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1986 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1987
1988 label = make_label_group(_("Program start"));
1989 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1990
1991 row = 1;
1992 widget = gtk_check_button_new_with_mnemonic (_("Show splash screen"));
1993 data->CM_show_splash = widget;
1994 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1995
1996 row++;
1997 widget = gtk_check_button_new_with_mnemonic (_("Load last opened file"));
1998 data->CM_load_last = widget;
1999 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
2000
2001 row++;
2002 widget = gtk_check_button_new_with_mnemonic (_("Post pending scheduled transactions"));
2003 data->CM_append_scheduled = widget;
2004 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
2005
2006 row++;
2007 widget = gtk_check_button_new_with_mnemonic (_("Update currencies online"));
2008 data->CM_do_update_currency = widget;
2009 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
2010
2011
2012 // group :: Main window reports
2013 group_grid = gtk_grid_new ();
2014 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
2015 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
2016 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
2017
2018 label = make_label_group(_("Main window reports"));
2019 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
2020
2021 row = 1;
2022 label = make_label(_("_Range:"), 0, 0.5);
2023 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
2024 widget = make_daterange(label, DATE_RANGE_CUSTOM_HIDE);
2025 data->CY_daterange_wal = widget;
2026 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
2027
2028 return content_grid;
2029 }
2030
2031
2032 void plugin_execute_action(GtkTreeView* treeview, GtkTreePath* path, GtkTreeViewColumn* col, gpointer userdata);
2033
2034 static void
2035 toggle_plugin(GtkCellRendererToggle *cell, gchar* path_str, gpointer data)
2036 {
2037 GtkTreeModel *model = (GtkTreeModel*)data;
2038 GtkTreeIter iter;
2039 GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
2040
2041 const gchar* plugin;
2042
2043 gtk_tree_model_get_iter(model, &iter, path);
2044 gtk_tree_model_get(model, &iter, EXT_COLUMN_PLUGIN_NAME, &plugin, -1);
2045
2046 gboolean enabled = ext_is_plugin_loaded(plugin);
2047 if (enabled) {
2048 ext_unload_plugin(plugin);
2049 enabled = FALSE;
2050 } else {
2051 enabled = (ext_load_plugin(plugin) == 0);
2052 if (!enabled) {
2053 ext_run_modal(_("Plugin Error"), _("The plugin failed to load properly."), "error");
2054 }
2055 }
2056
2057 /* set new value */
2058 gtk_list_store_set(GTK_LIST_STORE (model), &iter, EXT_COLUMN_ENABLED, enabled, -1);
2059
2060 /* clean up */
2061 gtk_tree_path_free(path);
2062 }
2063
2064
2065 void plugin_execute_action(GtkTreeView* treeview, GtkTreePath* path, GtkTreeViewColumn* col, gpointer userdata)
2066 {
2067 GtkTreeModel* model = gtk_tree_view_get_model(treeview);
2068 GtkTreeIter iter;
2069
2070 if (gtk_tree_model_get_iter(model, &iter, path)) {
2071 gchar* plugin_filename;
2072 gtk_tree_model_get(model, &iter, EXT_COLUMN_PLUGIN_NAME, &plugin_filename, -1);
2073 ext_execute_action(plugin_filename);
2074 g_free(plugin_filename);
2075 }
2076 }
2077
2078 static GtkWidget *defpref_page_plugins (struct defpref_data *data)
2079 {
2080 GtkWidget *container;
2081 GtkListStore *store;
2082 GtkTreeIter it;
2083 GtkWidget* view;
2084
2085 container = gtk_vbox_new(FALSE, 0);
2086
2087 store = gtk_list_store_new(EXT_NUM_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
2088
2089 gchar** plugins = ext_list_plugins();
2090 gchar** plugins_it;
2091 for (plugins_it = plugins; *plugins_it; ++plugins_it) {
2092
2093 gboolean enabled = ext_is_plugin_loaded(*plugins_it);
2094 GHashTable* metadata = ext_read_plugin_metadata(*plugins_it);
2095 if (!metadata) {
2096 metadata = g_hash_table_new(g_str_hash, g_str_equal);
2097 }
2098
2099 gchar* tmp = NULL;
2100
2101 // NAME
2102 gchar* name = g_hash_table_lookup(metadata, "name");
2103 if (!name || *name == '\0') {
2104 name = *plugins_it;
2105 }
2106 name = g_markup_escape_text(name, -1);
2107 gchar* label = g_strdup_printf("<b>%s</b>", name);
2108 gchar* tooltip = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>", name);
2109 g_free(name);
2110
2111 // VERSION
2112 gchar* version = g_hash_table_lookup(metadata, "version");
2113 if (version) {
2114 version = g_markup_escape_text(version, -1);
2115 tmp = label;
2116 label = g_strdup_printf("%s %s", tmp, version);
2117 g_free(tmp);
2118 tmp = tooltip;
2119 tooltip = g_strdup_printf("%s %s", tmp, version);
2120 g_free(tmp);
2121 g_free(version);
2122 }
2123
2124 // ABSTRACT
2125 gchar* abstract = g_hash_table_lookup(metadata, "abstract");
2126 if (abstract) {
2127 abstract = g_markup_escape_text(abstract, -1);
2128 tmp = label;
2129 label = g_strdup_printf("%s\n%s", tmp, abstract);
2130 g_free(tmp);
2131 g_free(abstract);
2132 }
2133
2134 // AUTHOR
2135 gchar* author = g_hash_table_lookup(metadata, "author");
2136 if (author) {
2137 author = g_markup_escape_text(author, -1);
2138 tmp = tooltip;
2139 tooltip = g_strdup_printf("%s\n%s", tmp, author);
2140 g_free(tmp);
2141 g_free(author);
2142 }
2143
2144 // WEBSITE
2145 gchar* website = g_hash_table_lookup(metadata, "website");
2146 if (website) {
2147 website = g_markup_escape_text(website, -1);
2148 tmp = tooltip;
2149 tooltip = g_strdup_printf("%s\n<b>%s:</b> %s", tmp, _("Website"), website);
2150 g_free(tmp);
2151 g_free(website);
2152 }
2153
2154 // FILEPATH
2155 tmp = ext_find_plugin(*plugins_it);
2156 gchar* full = g_markup_escape_text(tmp, -1);
2157 g_free(tmp);
2158 tmp = tooltip;
2159 tooltip = g_strdup_printf("%s\n<b>%s:</b> %s", tmp, _("File"), full);
2160 g_free(tmp);
2161 g_free(full);
2162
2163 g_hash_table_unref(metadata);
2164
2165 gtk_list_store_append(store, &it);
2166 gtk_list_store_set(store, &it,
2167 EXT_COLUMN_ENABLED, enabled,
2168 EXT_COLUMN_LABEL, label,
2169 EXT_COLUMN_TOOLTIP, tooltip,
2170 EXT_COLUMN_PLUGIN_NAME, *plugins_it,
2171 -1);
2172
2173 g_free(label);
2174 g_free(tooltip);
2175 }
2176 g_strfreev(plugins);
2177
2178 view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
2179 g_object_unref(store);
2180
2181 g_signal_connect(view, "row-activated", (GCallback)plugin_execute_action, NULL);
2182
2183 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view), TRUE);
2184 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), TRUE);
2185 gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(view), EXT_COLUMN_TOOLTIP);
2186
2187
2188 GtkTreeViewColumn *col;
2189 GtkCellRenderer *renderer;
2190
2191
2192 col = gtk_tree_view_column_new();
2193 gtk_tree_view_column_set_title(col, _("Enabled"));
2194 gtk_tree_view_column_set_sort_column_id(col, EXT_COLUMN_ENABLED);
2195 gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
2196
2197 renderer = gtk_cell_renderer_toggle_new();
2198 gtk_tree_view_column_pack_start(col, renderer, TRUE);
2199 gtk_tree_view_column_add_attribute(col, renderer, "active", 0);
2200 g_signal_connect(renderer, "toggled", G_CALLBACK(toggle_plugin), store);
2201
2202 col = gtk_tree_view_column_new();
2203 gtk_tree_view_column_set_title(col, _("Plugin"));
2204 gtk_tree_view_column_set_sort_column_id(col, EXT_COLUMN_LABEL);
2205 gtk_tree_view_column_set_expand(col, TRUE);
2206 /*gtk_tree_view_column_set_sort_order(col, GTK_SORT_ASCENDING);*/
2207 gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
2208
2209 renderer = gtk_cell_renderer_text_new();
2210 g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
2211 gtk_tree_view_column_pack_start(col, renderer, TRUE);
2212 gtk_tree_view_column_add_attribute(col, renderer, "markup", EXT_COLUMN_LABEL);
2213
2214 data->PI_plugin_columns = view;
2215
2216 GtkWidget* sw = gtk_scrolled_window_new(NULL, NULL);
2217 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
2218 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2219 gtk_container_add(GTK_CONTAINER(sw), view);
2220
2221 gtk_box_pack_start(GTK_BOX(container), sw, TRUE, TRUE, 0);
2222
2223 return(container);
2224 }
2225
2226
2227 static void defpref_selection(GtkTreeSelection *treeselection, gpointer user_data)
2228 {
2229 struct defpref_data *data;
2230 GtkWidget *notebook;
2231 GtkTreeView *treeview;
2232 GtkTreeModel *model;
2233 GtkTreeIter iter;
2234
2235 GValue val = { 0, };
2236 gint page;
2237
2238 DB( g_print("\n[ui-pref] selection\n") );
2239
2240 if (gtk_tree_selection_get_selected(treeselection, &model, &iter))
2241 {
2242 notebook = GTK_WIDGET(user_data);
2243 treeview = gtk_tree_selection_get_tree_view(treeselection);
2244 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(treeview), GTK_TYPE_WINDOW)), "inst_data");
2245
2246
2247 gtk_tree_model_get_value(model, &iter, LST_PREF_PAGE, &val);
2248 page = g_value_get_int (&val);
2249 DB( g_print(" - active is %d\n", page) );
2250 g_value_unset (&val);
2251
2252
2253 gtk_tree_model_get_value(model, &iter, LST_PREF_NAME, &val);
2254 gtk_label_set_text (GTK_LABEL (data->label), g_value_get_string (&val));
2255 g_value_unset (&val);
2256
2257 gtk_tree_model_get_value(model, &iter, LST_PREF_ICONNAME, &val);
2258 //gtk_image_set_from_pixbuf (GTK_IMAGE (data->image), g_value_get_object (&val));
2259 gtk_image_set_from_icon_name(GTK_IMAGE (data->image), g_value_get_string (&val), GTK_ICON_SIZE_DIALOG);
2260 g_value_unset (&val);
2261
2262
2263
2264 gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), page);
2265
2266 //defpref_change_page(GTK_WIDGET(gtk_tree_selection_get_tree_view(treeselection)), GINT_TO_POINTER(page));
2267 }
2268
2269 }
2270
2271
2272 /*
2273 ** set the notebook active page from treeview
2274 */
2275 /*void defpref_change_page(GtkWidget *widget, gpointer user_data)
2276 {
2277 struct defpref_data *data;
2278 gint page = GPOINTER_TO_INT(user_data);
2279 GtkTreeModel *model;
2280
2281
2282 DB( g_print("\n[ui-pref] page\n") );
2283
2284 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
2285
2286 model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_page));
2287
2288
2289
2290
2291
2292
2293
2294 gtk_notebook_set_current_page(GTK_NOTEBOOK(data->GR_page), page);
2295 }
2296 */
2297
2298
2299 /*
2300 ** add an empty new account to our temp GList and treeview
2301 */
2302 static void defpref_reset(GtkWidget *widget, gpointer user_data)
2303 {
2304 struct defpref_data *data;
2305 gint result;
2306
2307 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
2308 DB( g_print("\n(defpref_reset) (data=%p)\n", data) );
2309
2310 result = ui_dialog_msg_confirm_alert(
2311 GTK_WINDOW(data->window),
2312 _("Reset All Preferences"),
2313 _("Do you really want to reset\nall preferences to default\nvalues?"),
2314 _("_Reset")
2315 );
2316 if( result == GTK_RESPONSE_OK )
2317 {
2318 homebank_pref_setdefault();
2319 defpref_set(data);
2320 }
2321
2322 }
2323
2324
2325 // the window creation
2326 GtkWidget *defpref_dialog_new (gint initial_selection)
2327 {
2328 struct defpref_data data;
2329 GtkWidget *window, *content, *mainvbox;
2330 GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
2331
2332 window = gtk_dialog_new_with_buttons (_("Preferences"),
2333 GTK_WINDOW(GLOBALS->mainwindow),
2334 0,
2335 _("_Reset"),
2336 55,
2337 _("_Cancel"),
2338 GTK_RESPONSE_REJECT,
2339 _("_OK"),
2340 GTK_RESPONSE_ACCEPT,
2341 NULL);
2342
2343 data.window = window;
2344
2345 //store our window private data
2346 g_object_set_data(G_OBJECT(window), "inst_data", (gpointer)&data);
2347
2348 gtk_window_set_icon_name(GTK_WINDOW (window), ICONNAME_PREFERENCES);
2349
2350 content = gtk_dialog_get_content_area(GTK_DIALOG (window)); // return a vbox
2351 mainvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_MEDIUM);
2352 gtk_box_pack_start (GTK_BOX (content), mainvbox, TRUE, TRUE, 0);
2353
2354 gtk_container_set_border_width(GTK_CONTAINER(mainvbox), SPACING_MEDIUM);
2355
2356 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_MEDIUM);
2357 gtk_box_pack_start (GTK_BOX (mainvbox), hbox, TRUE, TRUE, 0);
2358
2359 //left part
2360 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
2361 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2362
2363 //list
2364 sw = gtk_scrolled_window_new (NULL, NULL);
2365 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
2366 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2367 gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
2368 widget = pref_list_create();
2369 data.LV_page = widget;
2370 gtk_container_add (GTK_CONTAINER (sw), widget);
2371
2372
2373 //right part : notebook
2374 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, SPACING_MEDIUM);
2375 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
2376 gtk_widget_show (vbox);
2377
2378 ebox = gtk_event_box_new();
2379 gtk_widget_set_name(ebox, "hbebox");
2380 GtkStyleContext *context = gtk_widget_get_style_context (ebox);
2381 #if GTK_MINOR_VERSION <= 18
2382 gtk_style_context_add_class (context, GTK_STYLE_CLASS_LIST_ROW);
2383 gtk_widget_set_state_flags(ebox, GTK_STATE_FLAG_SELECTED, TRUE);
2384 #else
2385 GtkCssProvider *provider;
2386 provider = gtk_css_provider_new ();
2387 gtk_css_provider_load_from_data (provider,
2388 "#hbebox { color: @theme_selected_fg_color; background-color: @theme_selected_bg_color; }"
2389 , -1, NULL);
2390 gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER(provider), G_MAXUINT);
2391
2392 // gtk_style_context_set_state(context, GTK_STATE_FLAG_SELECTED);
2393 #endif
2394
2395 gtk_box_pack_start (GTK_BOX (vbox), ebox, FALSE, TRUE, 0);
2396 gtk_widget_show (ebox);
2397
2398 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL);
2399 gtk_container_set_border_width (GTK_CONTAINER (hbox), SPACING_SMALL);
2400 gtk_container_add (GTK_CONTAINER (ebox), hbox);
2401 gtk_widget_show (hbox);
2402
2403 label = gtk_label_new (NULL);
2404 gtk_widget_set_margin_left(label, SPACING_MEDIUM);
2405 gimp_label_set_attributes (GTK_LABEL (label),
2406 PANGO_ATTR_SCALE, PANGO_SCALE_XX_LARGE,
2407 PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD,
2408 -1);
2409
2410 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
2411 gtk_widget_show (label);
2412 data.label = label;
2413
2414 image = gtk_image_new ();
2415 gtk_box_pack_end (GTK_BOX (hbox), image, FALSE, FALSE, 0);
2416 gtk_widget_show (image);
2417 data.image = image;
2418
2419
2420
2421 //notebook
2422 notebook = gtk_notebook_new();
2423 data.GR_page = notebook;
2424 gtk_widget_show(notebook);
2425 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
2426 gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
2427 gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
2428
2429 /*
2430 PREF_GENERAL,
2431 PREF_INTERFACE,
2432 PREF_LOCALE, //old DISPLAY
2433 PREF_TXN, //old COLUMNS
2434 PREF_IMPORT,
2435 PREF_REPORT,
2436 PREF_BACKUP,
2437 PREF_FOLDERS,
2438 PREF_EURO,
2439 PREF_MAX
2440 */
2441
2442 //general
2443 page = defpref_page_general(&data);
2444 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
2445
2446 //interface
2447 page = defpref_page_interface(&data);
2448 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
2449
2450 //locale
2451 page = defpref_page_display(&data);
2452 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
2453
2454 //transaction
2455 page = defpref_page_transactions(&data);
2456 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
2457
2458 //import
2459 page = defpref_page_import(&data);
2460 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
2461
2462 //report
2463 page = defpref_page_reports(&data);
2464 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
2465
2466 //backup
2467 page = defpref_page_filebackup(&data);
2468 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
2469
2470 //folders
2471 page = defpref_page_folders(&data);
2472 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
2473
2474 //euro
2475 page = defpref_page_euro(&data);
2476 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
2477
2478 //plugins
2479 page = defpref_page_plugins(&data);
2480 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
2481
2482
2483 //todo:should move this
2484 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data.CM_euro_enable), PREFS->euro_active);
2485
2486 //connect all our signals
2487 g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
2488
2489 g_signal_connect (data.CM_bak_is_automatic, "toggled", G_CALLBACK (defpref_backuptoggle), NULL);
2490
2491
2492 //path selector
2493 g_signal_connect (data.BT_path_hbfile, "pressed", G_CALLBACK (defpref_pathselect), GINT_TO_POINTER(PRF_PATH_WALLET));
2494 g_signal_connect (data.BT_path_import, "pressed", G_CALLBACK (defpref_pathselect), GINT_TO_POINTER(PRF_PATH_IMPORT));
2495 g_signal_connect (data.BT_path_export, "pressed", G_CALLBACK (defpref_pathselect), GINT_TO_POINTER(PRF_PATH_EXPORT));
2496
2497 g_signal_connect (data.CM_custom_colors, "toggled", G_CALLBACK (defpref_colortoggle), NULL);
2498 g_signal_connect (data.CY_colors, "changed", G_CALLBACK (defpref_colorpreset), NULL);
2499
2500
2501
2502 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data.LV_page)), "changed", G_CALLBACK (defpref_selection), notebook);
2503
2504 g_signal_connect (data.CM_euro_enable, "toggled", G_CALLBACK (defpref_eurotoggle), NULL);
2505
2506 g_signal_connect (data.CY_euro_preset, "changed", G_CALLBACK (defpref_europreset), NULL);
2507
2508 //date
2509 g_signal_connect (data.ST_datefmt, "changed", G_CALLBACK (defpref_date_sample), NULL);
2510
2511 //report
2512 g_signal_connect (data.CY_color_scheme, "changed", G_CALLBACK (defpref_color_scheme_changed), NULL);
2513
2514
2515 //euro number
2516 g_signal_connect (data.ST_euro_symbol , "changed", G_CALLBACK (defpref_numbereuro_sample), NULL);
2517 g_signal_connect (data.CM_euro_isprefix, "toggled", G_CALLBACK (defpref_numbereuro_sample), NULL);
2518 g_signal_connect (data.ST_euro_decimalchar , "changed", G_CALLBACK (defpref_numbereuro_sample), NULL);
2519 g_signal_connect (data.ST_euro_groupingchar, "changed", G_CALLBACK (defpref_numbereuro_sample), NULL);
2520 g_signal_connect (data.NB_euro_fracdigits, "value-changed", G_CALLBACK (defpref_numbereuro_sample), NULL);
2521
2522 //g_signal_connect (data.BT_default, "pressed", G_CALLBACK (defpref_currency_change), NULL);
2523
2524
2525 //setup, init and show window
2526 //defhbfile_setup(&data);
2527 //defhbfile_update(data.LV_arc, NULL);
2528
2529 defpref_set(&data);
2530
2531 defpref_colortoggle(window, NULL);
2532 defpref_eurotoggle(window, NULL);
2533
2534 gtk_window_resize(GTK_WINDOW(window), 640, 256);
2535
2536
2537 //select first row
2538 GtkTreePath *path = gtk_tree_path_new_from_indices(initial_selection, -1);
2539
2540
2541 gtk_tree_selection_select_path (gtk_tree_view_get_selection(GTK_TREE_VIEW(data.LV_page)), path);
2542
2543
2544
2545 gtk_tree_path_free(path);
2546
2547 gtk_widget_show_all (window);
2548 gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), initial_selection);
2549
2550 gint result;
2551 gchar *old_lang;
2552
2553
2554 //wait for the user
2555 result = gtk_dialog_run (GTK_DIALOG (window));
2556
2557 switch( result )
2558 {
2559 case GTK_RESPONSE_ACCEPT:
2560 old_lang = g_strdup(PREFS->language);
2561 defpref_get(&data);
2562 homebank_pref_save();
2563 ui_mainwindow_update(GLOBALS->mainwindow, GINT_TO_POINTER(UF_BALANCE+UF_VISUAL));
2564
2565 DB( g_print("old='%s' new='%s'\n", old_lang, PREFS->language) );
2566
2567 if(g_ascii_strncasecmp(old_lang == NULL ? "" : old_lang, PREFS->language == NULL ? "" : PREFS->language, -1) != 0)
2568 {
2569 ui_dialog_msg_infoerror(GTK_WINDOW(window), GTK_MESSAGE_INFO,
2570 _("Info"),
2571 _("You will have to restart HomeBank\nfor the language change to take effect.")
2572 );
2573
2574 }
2575
2576 g_free(old_lang);
2577 break;
2578
2579 case 55:
2580 defpref_reset (window, NULL);
2581 break;
2582 }
2583
2584
2585 // cleanup and destroy
2586 //defhbfile_cleanup(&data, result);
2587 gtk_widget_destroy (window);
2588
2589 return window;
2590 }
2591
2592 // -------------------------------
2593
2594
2595 static GtkWidget *pref_list_create(void)
2596 {
2597 GtkListStore *store;
2598 GtkWidget *view;
2599 GtkCellRenderer *renderer;
2600 GtkTreeViewColumn *column;
2601 GtkTreeIter iter;
2602 gint i;
2603
2604 /* create list store */
2605 store = gtk_list_store_new(
2606 LST_PREF_MAX,
2607 G_TYPE_STRING,
2608 G_TYPE_STRING,
2609 G_TYPE_INT
2610 );
2611
2612 //treeview
2613 view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
2614 g_object_unref(store);
2615
2616 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (view), FALSE);
2617 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_SINGLE);
2618
2619 /* column 1: icon */
2620 column = gtk_tree_view_column_new();
2621 renderer = gtk_cell_renderer_pixbuf_new ();
2622 g_object_set(renderer, "stock-size", GTK_ICON_SIZE_DND, NULL);
2623 gtk_tree_view_column_pack_start(column, renderer, FALSE);
2624 gtk_tree_view_column_set_attributes(column, renderer, "icon-name", LST_PREF_ICONNAME, NULL);
2625
2626 renderer = gtk_cell_renderer_text_new ();
2627 gtk_tree_view_column_pack_start(column, renderer, TRUE);
2628 gtk_tree_view_column_set_attributes(column, renderer, "text", LST_PREF_NAME, NULL);
2629
2630 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
2631
2632 //populate our combobox model
2633 for(i=0;i<PREF_MAX;i++)
2634 {
2635 gtk_list_store_append(store, &iter);
2636
2637 gtk_list_store_set(store, &iter,
2638 LST_PREF_ICONNAME, pref_iconname[i],
2639 LST_PREF_NAME, _(pref_name[i]),
2640 LST_PREF_PAGE, i,
2641 -1);
2642 }
2643
2644 return(view);
2645 }
2646
2647
2648 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/
2649
2650 /*
2651 extern gchar *list_txn_column_label[];
2652
2653
2654 static void
2655 list_txn_colpref_toggled_cell_data_function (GtkCellRendererToggle *cell,
2656 gchar *path_str,
2657 gpointer data)
2658 {
2659 GtkTreeModel *model = (GtkTreeModel *)data;
2660 GtkTreeIter iter;
2661 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
2662 gboolean fixed;
2663
2664 // get toggled iter
2665 gtk_tree_model_get_iter (model, &iter, path);
2666 gtk_tree_model_get (model, &iter, COLUMN_VISIBLE, &fixed, -1);
2667
2668 // do something with the value
2669 fixed ^= 1;
2670
2671 // set new value
2672 gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_VISIBLE, fixed, -1);
2673
2674 // clean up
2675 gtk_tree_path_free (path);
2676 }
2677
2678
2679 static void list_txn_colpref_get(GtkTreeView *treeview, gint *columns)
2680 {
2681 GtkTreeModel *model;
2682 GtkTreeIter iter;
2683 gboolean valid;
2684 gboolean visible;
2685 gint i, id;
2686
2687 DB( g_print("[lst_txn-colpref] store column order \n") );
2688
2689 model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
2690 valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
2691 i = 0;
2692 while (valid)
2693 {
2694 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
2695 COLUMN_VISIBLE, &visible,
2696 COLUMN_ID, &id,
2697 -1);
2698
2699 DB( g_print(" - column %d: %d\n",id, visible) );
2700 // start at index 2 (status, date always displayed
2701 columns[i+2] = visible == TRUE ? id : -id;
2702
2703 // Make iter point to the next row in the list store
2704 valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
2705 i++;
2706 }
2707 }
2708
2709
2710 GtkWidget *list_txn_colprefcreate(void)
2711 {
2712 GtkListStore *store;
2713 GtkWidget *view;
2714 GtkCellRenderer *renderer;
2715 GtkTreeViewColumn *column;
2716 GtkTreeIter iter;
2717 gint i;
2718
2719 DB( g_print("[lst_txn-colpref] create\n") );
2720
2721
2722 // create list store
2723 store = gtk_list_store_new(
2724 3,
2725 G_TYPE_BOOLEAN,
2726 G_TYPE_STRING,
2727 G_TYPE_UINT
2728 );
2729
2730 // populate
2731 for(i=0 ; i < NUM_LST_DSPOPE-1; i++ ) //-1 cause account column avoid
2732 {
2733 gint id;
2734 gboolean visible;
2735
2736 DB( g_print("eval %d, %s\n", i, list_txn_column_label[i]) );
2737
2738 if(i <= LST_DSPOPE_DATE) // status, date always displayed
2739 continue;
2740
2741 //[i-1] here because lst_ope_columns[] do not store MODEL_TXN_POINTER
2742 id = ABS(PREFS->lst_ope_columns[i-1]);
2743 if(id == 0) id = i; //if we pass here, new column or weird into pref file
2744 visible = (PREFS->lst_ope_columns[i-1] > 0) ? TRUE : FALSE;
2745
2746
2747 DB( g_print(" - pos=%2d, id=%2d - %d '%s'\n", i, id, visible, list_txn_column_label[id]) );
2748
2749 gtk_list_store_append (store, &iter);
2750 gtk_list_store_set (store, &iter,
2751 COLUMN_VISIBLE, visible,
2752 COLUMN_NAME, _(list_txn_column_label[id]),
2753 COLUMN_ID , id,
2754 -1);
2755
2756 }
2757
2758 //treeview
2759 view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
2760 g_object_unref(store);
2761
2762
2763
2764 renderer = gtk_cell_renderer_toggle_new ();
2765 column = gtk_tree_view_column_new_with_attributes (_("Visible"),
2766 renderer,
2767 "active", COLUMN_VISIBLE,
2768 NULL);
2769 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
2770
2771 g_signal_connect (renderer, "toggled",
2772 G_CALLBACK (list_txn_colpref_toggled_cell_data_function), store);
2773
2774
2775 renderer = gtk_cell_renderer_text_new ();
2776 column = gtk_tree_view_column_new_with_attributes (_("Column"),
2777 renderer,
2778 "text", COLUMN_NAME,
2779 NULL);
2780 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
2781
2782 gtk_tree_view_set_reorderable (GTK_TREE_VIEW(view), TRUE);
2783
2784
2785 return(view);
2786 }
2787 */
2788
2789
2790 static void list_ext_colpref_get(GtkTreeView *treeview, GList **columns)
2791 {
2792 GtkTreeModel *model;
2793 GtkTreeIter iter;
2794
2795 g_list_free_full(*columns, g_free);
2796 *columns = NULL;
2797
2798 model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
2799
2800 gboolean valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
2801 while (valid) {
2802 gboolean enabled = FALSE;
2803 const gchar* name;
2804
2805 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
2806 EXT_COLUMN_ENABLED, &enabled,
2807 EXT_COLUMN_PLUGIN_NAME, &name,
2808 -1);
2809
2810 if (enabled) {
2811 *columns = g_list_append(*columns, g_strdup(name));
2812 }
2813
2814 valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
2815 }
2816 }
2817
This page took 0.183289 seconds and 3 git commands to generate.