1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 Maxime DOYEN
4 * This file is part of HomeBank.
6 * HomeBank is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * HomeBank is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "ui-currency.h"
33 /* our global datas */
34 extern struct HomeBank
*GLOBALS
;
35 extern struct Preferences
*PREFS
;
37 extern Currency4217 iso4217cur
[];
38 extern guint n_iso4217cur
;
41 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
44 * ui_cur_combobox_get_name:
46 * get the name of the active curee or -1
48 * Return value: a new allocated name tobe freed with g_free
52 ui_cur_combobox_get_name(GtkComboBox
*entry_box
)
57 cbname
= (gchar
*)gtk_entry_get_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box
))));
61 name
= g_strdup(cbname
);
70 * ui_cur_combobox_get_key:
72 * get the key of the active curee
74 * Return value: the key or 0
78 ui_cur_combobox_get_key(GtkComboBox
*entry_box
)
84 if (gtk_combo_box_get_active_iter(entry_box
, &iter
) == TRUE
)
86 model
= gtk_combo_box_get_model(entry_box
);
87 gtk_tree_model_get (model
, &iter
, 1, &key
, -1);
95 ui_cur_combobox_set_active(GtkComboBox
*entry_box
, guint32 key
)
102 model
= gtk_combo_box_get_model(entry_box
);
103 valid
= gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model
), &iter
);
106 gtk_tree_model_get (model
, &iter
, 1, &cbkey
, -1);
110 valid
= gtk_tree_model_iter_next(GTK_TREE_MODEL(model
), &iter
);
113 gtk_combo_box_set_active_iter(entry_box
, &iter
);
122 * ui_cur_combobox_add:
124 * Add a single element (useful for dynamics add)
130 ui_cur_combobox_add(GtkComboBox
*entry_box
, Currency
*cur
)
132 if( cur
->name
!= NULL
)
137 model
= gtk_combo_box_get_model(GTK_COMBO_BOX(entry_box
));
139 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
140 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
, 0, cur
->name
, 1, cur
->key
, -1);
145 ui_cur_combobox_populate_ghfunc(gpointer key
, gpointer value
, struct curPopContext
*ctx
)
148 Currency
*cur
= value
;
150 if( ( cur
->key
!= ctx
->except_key
) )
152 gtk_list_store_append (GTK_LIST_STORE(ctx
->model
), &iter
);
153 gtk_list_store_set (GTK_LIST_STORE(ctx
->model
), &iter
, 0, cur
->name
, 1, cur
->key
, -1);
158 ui_cur_combobox_populate_except(GtkComboBox
*entry_box
, GHashTable
*hash
, guint32 except_key
)
161 struct curPopContext ctx
;
163 DB( g_print ("ui_cur_combobox_populate\n") );
165 model
= gtk_combo_box_get_model(GTK_COMBO_BOX(entry_box
));
167 /* keep our model alive and detach from combobox and completion */
169 gtk_combo_box_set_model(GTK_COMBO_BOX(entry_box
), NULL
);
171 /* clear and populate */
173 ctx
.except_key
= except_key
;
174 gtk_list_store_clear (GTK_LIST_STORE(model
));
175 g_hash_table_foreach(hash
, (GHFunc
)ui_cur_combobox_populate_ghfunc
, &ctx
);
177 /* reatach our model */
178 gtk_combo_box_set_model(GTK_COMBO_BOX(entry_box
), model
);
179 g_object_unref(model
);
181 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model
), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID
, GTK_SORT_ASCENDING
);
186 * ui_cur_combobox_populate:
188 * Populate the list and completion
194 ui_cur_combobox_populate(GtkComboBox
*entry_box
, GHashTable
*hash
)
196 ui_cur_combobox_populate_except(entry_box
, hash
, -1);
201 ui_cur_combobox_compare_func (GtkTreeModel
*model
, GtkTreeIter
*a
, GtkTreeIter
*b
, gpointer userdata
)
204 gchar
*name1
, *name2
;
206 gtk_tree_model_get(model
, a
, 0, &name1
, -1);
207 gtk_tree_model_get(model
, b
, 0, &name2
, -1);
209 if (name1
== NULL
|| name2
== NULL
)
211 if (name1
== NULL
&& name2
== NULL
)
214 ret
= (name1
== NULL
) ? -1 : 1;
218 ret
= g_utf8_collate(name1
,name2
);
232 ui_cur_combobox_test (GtkCellLayout
*cell_layout
,
233 GtkCellRenderer
*cell
,
234 GtkTreeModel
*tree_model
,
240 gtk_tree_model_get(tree_model
, iter
,
245 g_object_set(cell
, "text", _("(none)"), NULL
);
247 g_object_set(cell
, "text", name
, NULL
);
255 * ui_cur_combobox_new:
257 * Create a new curee combobox
259 * Return value: the new widget
263 ui_cur_combobox_new(GtkWidget
*label
)
267 GtkCellRenderer
*renderer
;
269 store
= gtk_list_store_new (2,
273 gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store
), ui_cur_combobox_compare_func
, NULL
, NULL
);
275 // dothe same for combobox
277 combobox
= gtk_combo_box_new_with_model(GTK_TREE_MODEL(store
));
279 gtk_cell_layout_clear(GTK_CELL_LAYOUT (combobox
));
281 renderer
= gtk_cell_renderer_text_new ();
282 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox
), renderer
, TRUE
);
283 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox
), renderer
, "text", 0, NULL
);
285 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox
),
287 ui_cur_combobox_test
,
290 g_object_unref(store
);
293 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), combobox
);
295 gtk_widget_set_size_request (combobox
, 10, -1);
302 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
308 ui_cur_listview_toggled_cb (GtkCellRendererToggle
*cell
,
312 GtkTreeModel
*model
= (GtkTreeModel
*)data
;
314 GtkTreePath
*path
= gtk_tree_path_new_from_string (path_str
);
317 /* get toggled iter */
318 gtk_tree_model_get_iter (model
, &iter
, path
);
319 gtk_tree_model_get (model
, &iter
, LST_DEFCUR_TOGGLE
, &fixed
, -1);
321 /* do something with the value */
325 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, LST_DEFCUR_TOGGLE
, fixed
, -1);
328 gtk_tree_path_free (path
);
332 ui_cur_listview_compare_func (GtkTreeModel
*model
, GtkTreeIter
*a
, GtkTreeIter
*b
, gpointer userdata
)
335 Currency
*entry1
, *entry2
;
336 gchar
*name1
, *name2
;
338 gtk_tree_model_get(model
, a
, LST_DEFCUR_DATAS
, &entry1
, -1);
339 gtk_tree_model_get(model
, b
, LST_DEFCUR_DATAS
, &entry2
, -1);
341 name1
= (entry1
->key
== GLOBALS
->kcur
) ? NULL
: entry1
->iso_code
;
342 name2
= (entry2
->key
== GLOBALS
->kcur
) ? NULL
: entry2
->iso_code
;
344 result
= hb_string_compare(name1
,name2
);
350 ui_cur_listview_name_cell_data_function (GtkTreeViewColumn
*col
,
351 GtkCellRenderer
*renderer
,
360 gtk_tree_model_get(model
, iter
, LST_DEFCUR_DATAS
, &entry
, -1);
362 weight
= entry
->key
== GLOBALS
->kcur
? PANGO_WEIGHT_BOLD
: PANGO_WEIGHT_NORMAL
;
365 if( entry
->key
== GLOBALS
->kcur
)
366 string
= g_strdup_printf ("[%d] %s - %s<span size=\"small\">\n(%s)</span>", entry
->key
, entry
->iso_code
, entry
->name
, _("Base currency"));
368 string
= g_strdup_printf ("[%d] %s - %s", entry
->key
, entry
->iso_code
, entry
->name
);
369 g_object_set(renderer
, "weight", weight
, "markup", string
, NULL
);
372 if( entry
->key
== GLOBALS
->kcur
)
373 string
= g_strdup_printf ("%s - %s<span size=\"small\">\n(%s)</span>", entry
->iso_code
, entry
->name
, _("Base currency"));
375 string
= g_strdup_printf ("%s - %s", entry
->iso_code
, entry
->name
);
376 g_object_set(renderer
, "weight", weight
, "markup", string
, NULL
);
384 ui_cur_listview_symbol_cell_data_function (GtkTreeViewColumn
*col
,
385 GtkCellRenderer
*renderer
,
393 gtk_tree_model_get(model
, iter
, LST_DEFCUR_DATAS
, &entry
, -1);
395 weight
= entry
->key
== GLOBALS
->kcur
? PANGO_WEIGHT_BOLD
: PANGO_WEIGHT_NORMAL
;
397 g_object_set(renderer
, "weight", weight
, "text", entry
->symbol
, NULL
);
402 ui_cur_listview_lastmodified_cell_data_function (GtkTreeViewColumn
*col
,
403 GtkCellRenderer
*renderer
,
413 gtk_tree_model_get(model
, iter
, LST_DEFCUR_DATAS
, &entry
, -1);
415 weight
= entry
->key
== GLOBALS
->kcur
? PANGO_WEIGHT_BOLD
: PANGO_WEIGHT_NORMAL
;
419 g_date_set_julian (&date
, entry
->mdate
);
420 g_date_strftime (buffer
, 256-1, PREFS
->date_format
, &date
);
422 //g_snprintf(buf, sizeof(buf), "%d", ope->ope_Date);
424 g_object_set(renderer
, "weight", weight
, "text", buffer
, NULL
);
427 g_object_set(renderer
, "weight", weight
, "text", "-", NULL
);
433 ui_cur_listview_rate_cell_data_function (GtkTreeViewColumn
*col
,
434 GtkCellRenderer
*renderer
,
440 gchar formatd_buf
[G_ASCII_DTOSTR_BUF_SIZE
];
442 gtk_tree_model_get(model
, iter
, LST_DEFCUR_DATAS
, &entry
, -1);
444 if(entry
->key
== GLOBALS
->kcur
)
445 g_object_set(renderer
, "text", "-", NULL
);
448 //g_ascii_formatd(formatd_buf, sizeof (formatd_buf), "%.6f", entry->rate);
449 //g_snprintf(formatd_buf, sizeof (formatd_buf), "%f", entry->rate);
450 hb_str_rate(formatd_buf
, sizeof (formatd_buf
), entry
->rate
);
451 g_object_set(renderer
, "text", formatd_buf
, NULL
);
457 /* = = = = = = = = = = = = = = = = */
461 ui_cur_listview_add(GtkTreeView
*treeview
, Currency
*item
)
463 if( item
->name
!= NULL
)
468 model
= gtk_tree_view_get_model(treeview
);
470 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
471 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
472 LST_DEFCUR_TOGGLE
, FALSE
,
473 LST_DEFCUR_DATAS
, item
,
479 ui_cur_listview_get_selected_key(GtkTreeView
*treeview
)
481 GtkTreeSelection
*selection
;
485 selection
= gtk_tree_view_get_selection(treeview
);
486 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
490 gtk_tree_model_get(model
, &iter
, LST_DEFCUR_DATAS
, &item
, -1);
499 ui_cur_listview_remove_selected(GtkTreeView
*treeview
)
501 GtkTreeSelection
*selection
;
505 selection
= gtk_tree_view_get_selection(treeview
);
506 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
508 gtk_list_store_remove(GTK_LIST_STORE(model
), &iter
);
513 static void ui_cur_listview_populate_ghfunc(gpointer key
, gpointer value
, GtkTreeModel
*model
)
516 Currency
*item
= value
;
518 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
519 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
520 LST_DEFCUR_TOGGLE
, FALSE
,
521 LST_DEFCUR_DATAS
, item
,
525 void ui_cur_listview_populate(GtkWidget
*view
)
529 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(view
));
531 gtk_list_store_clear (GTK_LIST_STORE(model
));
533 g_object_ref(model
); /* Make sure the model stays with us after the tree view unrefs it */
534 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), NULL
); /* Detach model from view */
537 g_hash_table_foreach(GLOBALS
->h_cur
, (GHFunc
)ui_cur_listview_populate_ghfunc
, model
);
539 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), model
); /* Re-attach model to view */
540 g_object_unref(model
);
546 ui_cur_listivew_rate_edited_func (GtkCellRendererText *cell,
547 const gchar *path_string,
548 const gchar *new_text,
551 GtkTreeModel *model = (GtkTreeModel *)data;
552 GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
555 g_print("cell edited '%s' path %s\n", new_text, path_string);
558 gint column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
560 gtk_tree_model_get_iter (model, &iter, path);
564 gtk_tree_model_get(model, &iter, LST_DEFCUR_DATAS, &item, -1);
566 item->rate = atof(new_text);
568 GLOBALS->changes_count++;
571 gtk_tree_path_free (path);
577 ui_cur_listview_new(gboolean withtoggle
)
581 GtkCellRenderer
*renderer
;
582 GtkTreeViewColumn
*column
;
585 store
= gtk_list_store_new(
592 treeview
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
593 g_object_unref(store
);
596 if( withtoggle
== TRUE
)
598 renderer
= gtk_cell_renderer_toggle_new ();
599 column
= gtk_tree_view_column_new_with_attributes (_("Visible"),
601 "active", LST_DEFCUR_TOGGLE
,
603 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
605 g_signal_connect (renderer
, "toggled",
606 G_CALLBACK (ui_cur_listview_toggled_cb
), store
);
610 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (treeview
), PREFS
->grid_lines
);
614 renderer
= gtk_cell_renderer_text_new ();
615 column
= gtk_tree_view_column_new();
616 gtk_tree_view_column_set_title(column
, _("Name"));
617 gtk_tree_view_column_set_alignment (column
, 0.5);
618 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
619 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_cur_listview_name_cell_data_function
, GINT_TO_POINTER(LST_DEFCUR_DATAS
), NULL
);
620 gtk_tree_view_column_set_resizable(column
, TRUE
);
621 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
624 renderer
= gtk_cell_renderer_text_new ();
625 g_object_set(renderer
, "xalign", 0.5, NULL
);
626 column
= gtk_tree_view_column_new();
627 gtk_tree_view_column_set_title(column
, _("Symbol"));
628 gtk_tree_view_column_set_alignment (column
, 0.5);
629 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
630 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_cur_listview_symbol_cell_data_function
, GINT_TO_POINTER(LST_DEFCUR_DATAS
), NULL
);
631 gtk_tree_view_column_set_resizable(column
, TRUE
);
632 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
634 // column 3: base rate
635 renderer
= gtk_cell_renderer_text_new ();
636 //g_object_set (renderer, "editable", TRUE, NULL);
637 g_object_set(renderer
, "xalign", 1.0, NULL
);
638 column
= gtk_tree_view_column_new();
639 gtk_tree_view_column_set_title(column
, _("Exchange rate"));
640 gtk_tree_view_column_set_alignment (column
, 0.5);
641 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
642 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_cur_listview_rate_cell_data_function
, GINT_TO_POINTER(LST_DEFCUR_DATAS
), NULL
);
643 gtk_tree_view_column_set_resizable(column
, TRUE
);
644 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
646 //g_signal_connect (renderer, "edited", G_CALLBACK (ui_cur_listivew_rate_edited_func), GTK_TREE_MODEL(store));
648 // column 4: last modified
649 renderer
= gtk_cell_renderer_text_new ();
650 g_object_set(renderer
, "xalign", 0.5, NULL
);
651 column
= gtk_tree_view_column_new();
652 gtk_tree_view_column_set_title(column
, _("Last modified"));
653 gtk_tree_view_column_set_alignment (column
, 0.5);
654 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
655 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_cur_listview_lastmodified_cell_data_function
, GINT_TO_POINTER(LST_DEFCUR_DATAS
), NULL
);
656 gtk_tree_view_column_set_resizable(column
, TRUE
);
657 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
660 // treeview attribute
661 gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview
), 1);
662 //gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(treeview), TRUE);
663 //gtk_tree_view_set_reorderable (GTK_TREE_VIEW(view), TRUE);
664 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store
), LST_DEFCUR_DATAS
, ui_cur_listview_compare_func
, NULL
, NULL
);
665 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store
), LST_DEFCUR_DATAS
, GTK_SORT_ASCENDING
);
671 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
673 ** update the number sample label
675 static void ui_cur_edit_dialog_update_sample(GtkWidget
*widget
, gpointer user_data
)
677 struct ui_cur_edit_dialog_data
*data
;
679 gchar formatd_buf
[G_ASCII_DTOSTR_BUF_SIZE
];
682 DB( g_printf("[ui_cur_edit] update sample\n") );
684 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
686 cur
.symbol
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_symbol
));
687 cur
.sym_prefix
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_symisprefix
));
688 cur
.decimal_char
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_decimalchar
));
689 cur
.grouping_char
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_groupingchar
));
690 cur
.frac_digits
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->NB_fracdigits
));
692 da_cur_initformat (&cur
);
693 DB( g_print("fmt: %s\n", cur
.format
) );
695 g_ascii_formatd(formatd_buf
, sizeof (formatd_buf
), cur
.format
, HB_NUMBER_SAMPLE
);
697 hb_str_formatd(buf
, 127, formatd_buf
, &cur
, TRUE
);
698 gtk_label_set_text(GTK_LABEL(data
->LB_sample
), buf
);
704 static void ui_cur_edit_dialog_set(GtkWidget
*widget
, Currency
*cur
)
706 struct ui_cur_edit_dialog_data
*data
;
708 gchar formatd_buf
[G_ASCII_DTOSTR_BUF_SIZE
];
711 DB( g_printf("[ui_cur_edit] set\n") );
713 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
715 g_snprintf(label
, 127, "%s - %s", cur
->iso_code
, cur
->name
);
716 gtk_label_set_text (GTK_LABEL(data
->LB_name
), label
);
718 base
= da_cur_get(GLOBALS
->kcur
);
720 g_snprintf(label
, 127, "1 %s _=", base
->iso_code
);
721 gtk_label_set_text_with_mnemonic (GTK_LABEL(data
->LB_rate
), label
);
722 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->NB_rate
), cur
->rate
);
724 da_cur_initformat(cur
);
725 g_ascii_formatd(formatd_buf
, sizeof (formatd_buf
), cur
->format
, HB_NUMBER_SAMPLE
);
726 hb_str_formatd(label
, 127, formatd_buf
, cur
, TRUE
);
727 gtk_label_set_text (GTK_LABEL(data
->LB_sample
), label
);
729 ui_gtk_entry_set_text(data
->ST_symbol
, cur
->symbol
);
730 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_symisprefix
), cur
->sym_prefix
);
731 ui_gtk_entry_set_text(data
->ST_decimalchar
, cur
->decimal_char
);
732 ui_gtk_entry_set_text(data
->ST_groupingchar
, cur
->grouping_char
);
733 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->NB_fracdigits
), cur
->frac_digits
);
739 static void ui_cur_edit_dialog_get(GtkWidget
*widget
, Currency
*cur
)
741 struct ui_cur_edit_dialog_data
*data
;
744 DB( g_printf("[ui_cur_edit] get\n") );
746 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
748 ui_gtk_entry_replace_text(data
->ST_symbol
, &cur
->symbol
);
749 cur
->sym_prefix
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_symisprefix
));
750 ui_gtk_entry_replace_text(data
->ST_decimalchar
, &cur
->decimal_char
);
751 ui_gtk_entry_replace_text(data
->ST_groupingchar
, &cur
->grouping_char
);
752 cur
->frac_digits
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->NB_fracdigits
));
754 da_cur_initformat(cur
);
756 rate
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->NB_rate
));
757 if(cur
->rate
!= rate
)
760 cur
->mdate
= GLOBALS
->today
;
766 void ui_cur_edit_dialog_new(GtkWindow
*parent
, Currency
*cur
)
768 struct ui_cur_edit_dialog_data data
;
769 GtkWidget
*dialog
, *content_area
, *content_grid
, *group_grid
;
770 GtkWidget
*label
, *widget
, *expander
;
773 dialog
= gtk_dialog_new_with_buttons (
783 data
.window
= dialog
;
785 //store our dialog private data
786 g_object_set_data(G_OBJECT(dialog
), "inst_data", (gpointer
)&data
);
787 DB( g_printf("[ui_cur_edit] new dialog=%p, inst_data=%p\n", dialog
, &data
) );
790 content_area
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
)); // return a vbox
792 content_grid
= gtk_grid_new();
793 gtk_grid_set_row_spacing (GTK_GRID (content_grid
), SPACING_LARGE
);
794 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid
), GTK_ORIENTATION_VERTICAL
);
795 gtk_container_set_border_width (GTK_CONTAINER(content_grid
), SPACING_MEDIUM
);
796 gtk_box_pack_start (GTK_BOX (content_area
), content_grid
, TRUE
, TRUE
, 0);
800 group_grid
= gtk_grid_new ();
801 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
802 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
803 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
++, 1, 1);
805 label
= make_label_group(_("Currency"));
806 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, 0, 3, 1);
809 widget
= make_label(NULL
, 0, 0.5);
810 data
.LB_name
= widget
;
811 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
814 group_grid
= gtk_grid_new ();
815 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
816 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
817 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
++, 1, 1);
819 label
= make_label_group(_("Exchange rate"));
820 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, 0, 3, 1);
823 label
= make_label(NULL
, 0, 0.5);
824 data
.LB_rate
= label
;
825 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
826 widget
= make_exchange_rate(label
);
827 data
.NB_rate
= widget
;
828 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
830 gtk_widget_set_sensitive(group_grid
, (GLOBALS
->kcur
== cur
->key
) ? FALSE
: TRUE
);
833 group_grid
= gtk_grid_new ();
834 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
835 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
836 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
++, 1, 1);
838 label
= make_label_group(_("Format"));
839 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, 0, 3, 1);
842 widget
= make_label(NULL
, 0, 0.5);
843 data
.LB_sample
= widget
;
844 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
847 expander
= gtk_expander_new_with_mnemonic (_("_Customize"));
848 gtk_grid_attach (GTK_GRID (group_grid
), expander
, 1, row
, 2, 1);
850 group_grid
= gtk_grid_new ();
851 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
852 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
853 gtk_container_add (GTK_CONTAINER (expander
), group_grid
);
856 label
= make_label_widget(_("_Symbol:"));
857 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
858 widget
= make_string_maxlength(label
, 3);
859 data
.ST_symbol
= widget
;
860 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
863 widget
= gtk_check_button_new_with_mnemonic (_("Is pre_fix"));
864 data
.CM_symisprefix
= widget
;
865 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
868 label
= make_label_widget(_("_Decimal char:"));
869 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
870 widget
= make_string_maxlength(label
, 1);
871 data
.ST_decimalchar
= widget
;
872 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
875 label
= make_label_widget(_("_Frac digits:"));
876 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
877 widget
= make_numeric(label
, 0.0, 8.0);
878 data
.NB_fracdigits
= widget
;
879 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
882 label
= make_label_widget(_("_Grouping char:"));
883 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
884 widget
= make_string_maxlength(label
, 1);
885 data
.ST_groupingchar
= widget
;
886 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
889 //gtk_window_resize(GTK_WINDOW(dialog), 400/PHI, 400);
891 ui_cur_edit_dialog_set(dialog
, cur
);
893 gtk_widget_show_all(content_area
);
896 g_signal_connect (data
.ST_symbol
, "changed", G_CALLBACK (ui_cur_edit_dialog_update_sample
), NULL
);
897 g_signal_connect (data
.CM_symisprefix
, "toggled", G_CALLBACK (ui_cur_edit_dialog_update_sample
), NULL
);
898 g_signal_connect (data
.ST_decimalchar
, "changed", G_CALLBACK (ui_cur_edit_dialog_update_sample
), NULL
);
899 g_signal_connect (data
.ST_groupingchar
, "changed", G_CALLBACK (ui_cur_edit_dialog_update_sample
), NULL
);
900 g_signal_connect (data
.NB_fracdigits
, "value-changed", G_CALLBACK (ui_cur_edit_dialog_update_sample
), NULL
);
903 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
904 if(result
== GTK_RESPONSE_ACCEPT
)
906 ui_cur_edit_dialog_get(dialog
, cur
);
909 // cleanup and destroy
910 gtk_widget_destroy (dialog
);
915 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
926 static void ui_cur_select_rowactivated (GtkTreeView
*treeview
, GtkTreePath
*path
, GtkTreeViewColumn
*col
, gpointer userdata
)
928 struct ui_cur_select_dialog_data
*data
= userdata
;
930 gtk_dialog_response(GTK_DIALOG(data
->window
), GTK_RESPONSE_ACCEPT
);
934 static GtkTreeModel
*ui_cur_select_model_create (void)
942 /* create list store */
943 store
= gtk_list_store_new (NUM_LST_CURSEL
,
951 for (i
= 0; i
< n_iso4217cur
; i
++)
953 cur
= &iso4217cur
[i
];
955 g_snprintf(buffer
, 255-1, "%s - %s", cur
->curr_iso_code
, cur
->name
);
957 gtk_list_store_append (store
, &iter
);
958 gtk_list_store_set (store
, &iter
,
959 LST_CURSEL_NAME
, cur
->name
,
960 LST_CURSEL_ISO
, cur
->curr_iso_code
,
961 LST_CURSEL_FULLNAME
, buffer
,
962 LST_CURSEL_DATA
, cur
,
968 return GTK_TREE_MODEL (store
);
972 static Currency4217
*ui_cur_select_dialog_get_langue(struct ui_cur_select_dialog_data
*data
)
974 GtkTreeSelection
*treeselection
;
978 Currency4217
*curfmt
= NULL
;
980 DB( g_printf("\n[ui_cur_select] get langue\n") );
982 treeselection
= gtk_tree_view_get_selection (GTK_TREE_VIEW(data
->LV_cur
));
983 selected
= gtk_tree_selection_get_selected(treeselection
, &model
, &iter
);
986 gtk_tree_model_get(model
, &iter
, LST_CURSEL_DATA
, &curfmt
, -1);
988 DB( g_printf(" - iso is '%s'\n", curfmt
->curr_iso_code
) );
996 ui_cur_select_search_changed_cb (GtkWidget
*widget
, gpointer user_data
)
998 struct ui_cur_select_dialog_data
*data
= user_data
;
1000 DB( g_printf("\n[ui_cur_select] search changed\n") );
1002 gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(data
->modelfilter
));
1007 /* valid iso is empoty or 3 capital digit */
1008 static guint
currency_iso_code_valid(gchar
*str
)
1014 if( *str
>= 'A' && *str
<= 'Z' )
1023 ui_cur_select_custom_validate_cb(GtkWidget
*widget
, gpointer user_data
)
1025 struct ui_cur_select_dialog_data
*data
= user_data
;
1027 gboolean valid
= TRUE
;
1028 const gchar
*iso
, *name
;
1031 DB( g_printf("\n[ui_cur_select] custom validate\n") );
1033 custom
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_custom
));
1035 DB( g_print(" custom=%d\n", custom
) );
1038 if( custom
== TRUE
)
1042 name
= gtk_entry_get_text (GTK_ENTRY (data
->ST_custname
));
1043 iso
= gtk_entry_get_text (GTK_ENTRY (data
->ST_custiso
));
1045 len
= currency_iso_code_valid((gchar
*)iso
);
1047 DB( g_print(" name='%d', iso='%d'\n", (gint
)strlen(name
), len
) );
1049 if( (len
==0 || len
==3) && (strlen(name
) >= 3 ) )
1052 // don't allow to enter stand 4217 iso code
1055 Currency4217
*stdcur
= iso4217format_get((gchar
*)iso
);
1062 gtk_dialog_set_response_sensitive(GTK_DIALOG(data
->window
), GTK_RESPONSE_ACCEPT
, valid
);
1068 ui_cur_select_custom_activate_cb(GtkWidget
*widget
, gpointer user_data
)
1070 struct ui_cur_select_dialog_data
*data
= user_data
;
1073 DB( g_printf("\n[ui_cur_select] custom activate\n") );
1075 custom
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_custom
));
1077 DB( g_print(" custom=%d\n", custom
) );
1079 gtk_widget_set_sensitive(data
->ST_search
, !custom
);
1080 gtk_widget_set_sensitive(data
->LV_cur
, !custom
);
1082 hb_widget_visible (data
->LB_custname
, custom
);
1083 hb_widget_visible (data
->ST_custname
, custom
);
1084 hb_widget_visible (data
->LB_custiso
, custom
);
1085 hb_widget_visible (data
->ST_custiso
, custom
);
1089 gtk_tree_selection_unselect_all(gtk_tree_view_get_selection (GTK_TREE_VIEW(data
->LV_cur
)));
1090 gtk_window_set_focus(GTK_WINDOW(data
->window
), data
->ST_custname
);
1093 ui_cur_select_custom_validate_cb(data
->window
, data
);
1099 ui_cur_select_model_func_visible (GtkTreeModel
*model
,
1103 // Visible if row is non-empty and first column is “HI”
1105 gboolean visible
= TRUE
;
1106 GtkEntry
*entry
= data
;
1108 if(!GTK_IS_ENTRY(entry
))
1111 gchar
*needle
= g_ascii_strdown(gtk_entry_get_text(entry
), -1);
1113 gtk_tree_model_get (model
, iter
, LST_CURSEL_FULLNAME
, &str
, -1);
1115 gchar
*haystack
= g_ascii_strdown(str
, -1);
1117 if (str
&& g_strrstr (haystack
, needle
) == NULL
)
1122 DB( g_print("filter: '%s' '%s' %d\n", str
, needle
, visible
) );
1132 gint
ui_cur_select_dialog_new(GtkWindow
*parent
, gint select_mode
, struct curSelectContext
*ctx
)
1134 struct ui_cur_select_dialog_data data
;
1135 GtkWidget
*dialog
, *content_area
, *content_grid
, *group_grid
;
1136 GtkWidget
*scrollwin
, *treeview
, *label
, *widget
;
1139 memset(&data
, 0, sizeof(struct ui_cur_select_dialog_data
));
1141 dialog
= gtk_dialog_new_with_buttons (
1142 (select_mode
== CUR_SELECT_MODE_BASE
) ? _("Select base currency") : _("Select currency"),
1143 GTK_WINDOW (parent
),
1146 GTK_RESPONSE_REJECT
,
1148 GTK_RESPONSE_ACCEPT
,
1151 data
.window
= dialog
;
1153 //store our dialog private data
1154 g_object_set_data(G_OBJECT(dialog
), "inst_data", (gpointer
)&data
);
1155 DB( g_printf("\n[ui_cur_select] new dialog=%p, inst_data=%p\n", dialog
, &data
) );
1158 content_area
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
)); // return a vbox
1160 content_grid
= gtk_grid_new();
1161 gtk_grid_set_row_spacing (GTK_GRID (content_grid
), SPACING_LARGE
);
1162 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid
), GTK_ORIENTATION_VERTICAL
);
1163 gtk_container_set_border_width (GTK_CONTAINER(content_grid
), SPACING_MEDIUM
);
1164 gtk_box_pack_start (GTK_BOX (content_area
), content_grid
, TRUE
, TRUE
, 0);
1168 group_grid
= gtk_grid_new ();
1169 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1170 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1171 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
++, 1, 1);
1174 widget
= make_search();
1175 data
.ST_search
= widget
;
1176 gtk_widget_set_hexpand (widget
, TRUE
);
1177 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 4, 1);
1181 scrollwin
= gtk_scrolled_window_new(NULL
,NULL
);
1182 gtk_grid_attach (GTK_GRID (group_grid
), scrollwin
, 1, row
, 4, 1);
1184 gtk_widget_set_vexpand (scrollwin
, TRUE
);
1185 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
1186 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin
), GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
1189 data
.model
= ui_cur_select_model_create();
1190 data
.modelfilter
= gtk_tree_model_filter_new(GTK_TREE_MODEL(data
.model
), NULL
);
1191 gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(data
.modelfilter
), ui_cur_select_model_func_visible
, data
.ST_search
, NULL
);
1192 data
.sortmodel
= gtk_tree_model_sort_new_with_model(data
.modelfilter
);
1195 treeview
= gtk_tree_view_new_with_model (GTK_TREE_MODEL(data
.sortmodel
));
1196 data
.LV_cur
= treeview
;
1197 //gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview), LST_CURSEL_NAME);
1198 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(data
.sortmodel
), LST_CURSEL_NAME
, GTK_SORT_ASCENDING
);
1199 //g_object_unref (model);
1200 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (treeview
), PREFS
->grid_lines
);
1202 gtk_container_add(GTK_CONTAINER(scrollwin
), treeview
);
1205 GtkCellRenderer
*renderer
;
1206 GtkTreeViewColumn
*column
;
1208 renderer
= gtk_cell_renderer_text_new ();
1209 column
= gtk_tree_view_column_new_with_attributes (_("Name"), renderer
, "text", LST_CURSEL_NAME
, NULL
);
1210 gtk_tree_view_column_set_sort_column_id (column
, LST_CURSEL_NAME
);
1211 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview
), column
);
1213 renderer
= gtk_cell_renderer_text_new ();
1214 column
= gtk_tree_view_column_new_with_attributes (_("ISO Code"), renderer
, "text", LST_CURSEL_ISO
, NULL
);
1215 gtk_tree_view_column_set_sort_column_id (column
, LST_CURSEL_ISO
);
1216 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview
), column
);
1218 if( select_mode
== CUR_SELECT_MODE_NORMAL
)
1222 widget
= gtk_check_button_new_with_mnemonic (_("Add a custom _currency"));
1223 data
.CM_custom
= widget
;
1224 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 4, 1);
1226 //custom currency (crypto and discontinued)
1228 label
= make_label_widget(_("_Name:"));
1229 data
.LB_custname
= label
;
1230 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
1231 widget
= make_string(label
);
1232 data
.ST_custname
= widget
;
1233 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1235 label
= make_label_widget(_("_ISO:"));
1236 data
.LB_custiso
= label
;
1237 gtk_grid_attach (GTK_GRID (group_grid
), label
, 3, row
, 1, 1);
1238 widget
= make_string_maxlength(label
, 3);
1239 data
.ST_custiso
= widget
;
1240 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 4, row
, 1, 1);
1242 g_signal_connect (G_OBJECT (data
.CM_custom
) , "toggled", G_CALLBACK (ui_cur_select_custom_activate_cb
), &data
);
1243 g_signal_connect (G_OBJECT (data
.ST_custname
), "changed", G_CALLBACK (ui_cur_select_custom_validate_cb
), &data
);
1244 g_signal_connect (G_OBJECT (data
.ST_custiso
) , "changed", G_CALLBACK (ui_cur_select_custom_validate_cb
), &data
);
1248 gtk_window_resize(GTK_WINDOW(dialog
), 400/PHI
, 400);
1251 gtk_widget_show_all(content_area
);
1252 hb_widget_visible (data
.LB_custname
, FALSE
);
1253 hb_widget_visible (data
.ST_custname
, FALSE
);
1254 hb_widget_visible (data
.LB_custiso
, FALSE
);
1255 hb_widget_visible (data
.ST_custiso
, FALSE
);
1259 g_signal_connect (G_OBJECT(data
.ST_search
), "search-changed", G_CALLBACK (ui_cur_select_search_changed_cb
), &data
);
1260 g_signal_connect (G_OBJECT(data
.LV_cur
), "row-activated", G_CALLBACK (ui_cur_select_rowactivated
), &data
);
1262 //init picker struct
1263 memset(ctx
, 0, sizeof(struct curSelectContext
));
1265 // wait for the user
1266 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
1267 if(result
== GTK_RESPONSE_ACCEPT
)
1271 custom
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
.CM_custom
));
1274 ctx
->cur_4217
= ui_cur_select_dialog_get_langue(&data
);
1277 //never fill custom in base mode
1278 if( select_mode
!= CUR_SELECT_MODE_BASE
)
1280 ctx
->cur_name
= g_strdup(gtk_entry_get_text (GTK_ENTRY(data
.ST_custname
)));
1281 ctx
->cur_iso
= g_strdup(gtk_entry_get_text (GTK_ENTRY(data
.ST_custiso
)));
1285 // cleanup and destroy
1286 gtk_widget_destroy (dialog
);
1292 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1295 gint
ui_cur_manage_dialog_update_currencies(GtkWindow
*parent
)
1297 GError
*error
= NULL
;
1298 gboolean retcode
= FALSE
;
1300 DB( g_printf("\n[ui_cur_manage] update currencies\n") );
1302 // do nothing if just the base currency
1303 if(da_cur_length() <= 1)
1306 retcode
= currency_online_sync(&error
);
1308 DB( g_print("retcode: %d\n", retcode
) );
1312 gchar
*msg
= _("Unknown error");
1315 msg
= error
->message
;
1317 g_warning("update online: '%s'", msg
);
1319 ui_dialog_msg_infoerror(GTK_WINDOW(parent
), GTK_MESSAGE_ERROR
,
1320 _("Update online error"),
1326 g_error_free (error
);
1334 ui_cur_manage_dialog_sync(GtkWidget
*widget
, gpointer user_data
)
1336 struct ui_cur_manage_dialog_data
*data
;
1339 DB( g_printf("\n[ui_cur_manage] sync online\n") );
1341 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1343 retcode
= ui_cur_manage_dialog_update_currencies(GTK_WINDOW(data
->window
));
1347 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_cur
));
1348 //todo: (or not) msg with changes
1357 static void ui_cur_manage_dialog_update(GtkWidget
*treeview
, gpointer user_data
)
1359 struct ui_cur_manage_dialog_data
*data
;
1360 GtkTreeSelection
*selection
;
1361 GtkTreeModel
*model
;
1366 DB( g_printf("\n[ui_cur_manage] update\n") );
1368 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(treeview
), GTK_TYPE_WINDOW
)), "inst_data");
1370 sensitive
= da_cur_length() <= 1 ? FALSE
: TRUE
;
1371 gtk_widget_set_sensitive (data
->BB_update
, sensitive
);
1374 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_cur
));
1376 //if true there is a selected node
1377 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
1379 gtk_tree_model_get(model
, &iter
, LST_DEFCUR_DATAS
, &item
, -1);
1381 gtk_widget_set_sensitive(data
->BT_edit
, TRUE
);
1383 sensitive
= !(currency_is_used(item
->key
));
1384 //gtk_widget_set_sensitive(data->BT_mov, sensitive);
1385 //gtk_widget_set_sensitive(data->BT_mod, sensitive);
1386 gtk_widget_set_sensitive(data
->BT_rem
, sensitive
);
1388 //disable set as base on actual base currency
1389 //disable on custom currency
1391 if( (item
->key
== GLOBALS
->kcur
) || (item
->flags
& CF_CUSTOM
) )
1393 gtk_widget_set_sensitive(data
->BT_base
, sensitive
);
1397 gtk_widget_set_sensitive(data
->BT_edit
, FALSE
);
1398 gtk_widget_set_sensitive(data
->BT_rem
, FALSE
);
1399 gtk_widget_set_sensitive(data
->BT_base
, FALSE
);
1405 * ui_cur_manage_dialog_add:
1409 ui_cur_manage_dialog_add(GtkWidget
*widget
, gpointer user_data
)
1411 struct ui_cur_manage_dialog_data
*data
;
1412 struct curSelectContext selectCtx
;
1416 DB( g_printf("\n[ui_cur_manage] add\n") );
1418 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1420 result
= ui_cur_select_dialog_new(GTK_WINDOW(data
->window
), CUR_SELECT_MODE_NORMAL
, &selectCtx
);
1421 if( result
== GTK_RESPONSE_ACCEPT
)
1423 Currency
*item
= NULL
;
1426 if( selectCtx
.cur_4217
!= NULL
)
1428 Currency4217
*curfmt
;
1430 curfmt
= selectCtx
.cur_4217
;
1432 DB( g_printf("- user selected: '%s' '%s'\n", curfmt
->curr_iso_code
, curfmt
->name
) );
1433 item
= da_cur_get_by_iso_code(curfmt
->curr_iso_code
);
1436 item
= currency_add_from_user(curfmt
);
1442 DB( g_printf("- user custom: '%s' '%s'\n", selectCtx
.cur_iso
, selectCtx
.cur_name
) );
1444 item
= da_cur_malloc ();
1445 item
->flags
|= CF_CUSTOM
;
1446 item
->name
= g_strdup(selectCtx
.cur_name
);
1447 item
->iso_code
= g_strdup(selectCtx
.cur_iso
);
1448 item
->symbol
= g_strdup(item
->iso_code
);
1449 item
->frac_digits
= 2;
1450 item
->sym_prefix
= FALSE
;
1451 item
->decimal_char
= g_strdup(".");
1452 item
->grouping_char
= NULL
;
1454 added
= da_cur_append(item
);
1457 //not append (duplicate)
1462 g_free(selectCtx
.cur_iso
);
1463 g_free(selectCtx
.cur_name
);
1468 ui_cur_listview_add(GTK_TREE_VIEW(data
->LV_cur
), item
);
1469 gtk_tree_sortable_sort_column_changed(GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_cur
))));
1471 ui_cur_manage_dialog_update (widget
, user_data
);
1472 GLOBALS
->changes_count
++;
1480 ui_cur_manage_dialog_modify(GtkWidget
*widget
, gpointer user_data
)
1482 struct ui_cur_manage_dialog_data
*data
;
1483 GtkTreeSelection
*selection
;
1484 GtkTreeModel
*model
;
1487 DB( g_printf("\n[ui_cur_manage] modify\n") );
1490 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1492 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_cur
));
1493 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
1497 gtk_tree_model_get(model
, &iter
, LST_DEFCUR_DATAS
, &item
, -1);
1501 ui_cur_edit_dialog_new(GTK_WINDOW(data
->window
), item
);
1502 GLOBALS
->changes_count
++;
1510 ** remove the selected curee to our treeview and temp GList
1512 static void ui_cur_manage_dialog_remove(GtkWidget
*widget
, gpointer user_data
)
1514 struct ui_cur_manage_dialog_data
*data
;
1516 gboolean do_remove
, result
;
1518 DB( g_printf("\n[ui_cur_manage] remove\n") );
1520 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1523 key
= ui_cur_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_cur
));
1530 if( currency_is_used(key
) == TRUE
)
1536 cur
= da_cur_get(key
);
1538 title
= g_strdup_printf (
1539 _("Are you sure you want to permanently delete '%s'?"), cur
->name
);
1541 secondtext
= _("If you delete a currency, it will be permanently lost.");
1543 result
= ui_dialog_msg_confirm_alert(
1544 GTK_WINDOW(data
->window
),
1552 do_remove
= (result
== GTK_RESPONSE_OK
) ? TRUE
:FALSE
;
1558 ui_cur_listview_remove_selected(GTK_TREE_VIEW(data
->LV_cur
));
1559 ui_cur_manage_dialog_update (widget
, user_data
);
1567 ** button callback: set base currency
1569 static void ui_cur_manage_dialog_setbase(GtkWidget
*widget
, gpointer user_data
)
1571 struct ui_cur_manage_dialog_data
*data
;
1575 DB( g_printf("\n[ui_cur_manage] setbase\n") );
1578 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1580 key
= ui_cur_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_cur
));
1583 do_change
= ui_dialog_msg_question(
1584 GTK_WINDOW(data
->window
),
1585 _("Change the base currency"),
1586 _("If you proceed, rates of other currencies\n"
1587 "will be set to 0, don't forget to update it"),
1590 if(do_change
== GTK_RESPONSE_YES
)
1592 hbfile_change_basecurrency(key
);
1593 gtk_tree_view_columns_autosize(GTK_TREE_VIEW(data
->LV_cur
));
1605 static void ui_cur_manage_dialog_selection(GtkTreeSelection
*treeselection
, gpointer user_data
)
1607 ui_cur_manage_dialog_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), NULL
);
1610 static void ui_cur_manage_dialog_onRowActivated (GtkTreeView
*treeview
,
1612 GtkTreeViewColumn
*col
,
1616 //model = gtk_tree_view_get_model(treeview);
1617 //gtk_tree_model_get_iter_first(model, &iter);
1618 //if(gtk_tree_selection_iter_is_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), &iter) == FALSE)
1620 ui_cur_manage_dialog_modify(GTK_WIDGET(treeview
), NULL
);
1629 static void ui_cur_manage_dialog_setup(struct ui_cur_manage_dialog_data
*data
)
1632 DB( g_printf("\n[ui_cur_manage] setup\n") );
1635 ui_cur_listview_populate(data
->LV_cur
);
1637 //ui_cur_combobox_populate(data->CY_curr, GLOBALS->h_cur);
1638 //ui_cur_combobox_set_active(GTK_COMBO_BOX(data->CY_curr), GLOBALS->kcur);
1648 GtkWidget
*ui_cur_manage_dialog (void)
1650 struct ui_cur_manage_dialog_data data
;
1651 GtkWidget
*dialog
, *content_area
, *content_grid
, *group_grid
, *bbox
;
1652 GtkWidget
*widget
, *scrollwin
, *treeview
;
1653 gint crow
, row
, w
, h
;
1655 dialog
= gtk_dialog_new_with_buttons (_("Currencies"),
1656 GTK_WINDOW(GLOBALS
->mainwindow
),
1659 GTK_RESPONSE_ACCEPT
,
1662 data
.window
= dialog
;
1665 //set the dialog icon
1666 gtk_window_set_icon_name(GTK_WINDOW (dialog
), ICONNAME_HB_CURRENCY
);
1668 //set a nice dialog size
1669 gtk_window_get_size(GTK_WINDOW(GLOBALS
->mainwindow
), &w
, &h
);
1670 gtk_window_set_default_size (GTK_WINDOW(dialog
), -1, h
/PHI
);
1673 //store our window private data
1674 g_object_set_data(G_OBJECT(dialog
), "inst_data", (gpointer
)&data
);
1675 DB( g_printf("[ui_cur_manage] new dialog=%p, inst_data=%p\n", dialog
, &data
) );
1677 g_signal_connect (dialog
, "destroy",
1678 G_CALLBACK (gtk_widget_destroyed
), &dialog
);
1680 content_area
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
)); // return a vbox
1682 content_grid
= gtk_grid_new();
1683 gtk_grid_set_row_spacing (GTK_GRID (content_grid
), SPACING_LARGE
);
1684 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid
), GTK_ORIENTATION_VERTICAL
);
1685 gtk_container_set_border_width (GTK_CONTAINER(content_grid
), SPACING_MEDIUM
);
1686 gtk_box_pack_start (GTK_BOX (content_area
), content_grid
, TRUE
, TRUE
, 0);
1689 // group :: --------
1690 group_grid
= gtk_grid_new ();
1691 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1692 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1693 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
++, 1, 1);
1696 bbox
= gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, SPACING_MEDIUM
);
1697 data
.BB_update
= bbox
;
1698 gtk_grid_attach (GTK_GRID(group_grid
), bbox
, 0, row
, 1, 1);
1700 widget
= gtk_button_new_from_icon_name (ICONNAME_HB_REFRESH
, GTK_ICON_SIZE_BUTTON
);
1701 gtk_container_add (GTK_CONTAINER (bbox
), widget
);
1703 g_signal_connect (G_OBJECT (widget
), "clicked", G_CALLBACK (ui_cur_manage_dialog_sync
), NULL
);
1705 widget
= make_label_widget (_("Update online"));
1706 gtk_container_add (GTK_CONTAINER (bbox
), widget
);
1709 scrollwin
= gtk_scrolled_window_new(NULL
,NULL
);
1710 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
1711 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin
), GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
1712 gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrollwin
), HB_MINHEIGHT_LIST
);
1713 treeview
= ui_cur_listview_new(FALSE
);
1714 data
.LV_cur
= treeview
;
1715 gtk_container_add(GTK_CONTAINER(scrollwin
), treeview
);
1716 gtk_widget_set_vexpand (scrollwin
, TRUE
);
1717 gtk_widget_set_hexpand (scrollwin
, TRUE
);
1718 gtk_grid_attach (GTK_GRID(group_grid
), scrollwin
, 0, row
, 2, 1);
1721 bbox
= gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL
);
1722 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox
), GTK_BUTTONBOX_START
);
1723 gtk_box_set_spacing (GTK_BOX (bbox
), SPACING_SMALL
);
1724 gtk_grid_attach (GTK_GRID (group_grid
), bbox
, 0, row
, 2, 1);
1726 widget
= gtk_button_new_with_mnemonic(_("_Add"));
1727 data
.BT_add
= widget
;
1728 gtk_container_add (GTK_CONTAINER (bbox
), widget
);
1730 widget
= gtk_button_new_with_mnemonic(_("_Edit"));
1731 data
.BT_edit
= widget
;
1732 gtk_container_add (GTK_CONTAINER (bbox
), widget
);
1734 widget
= gtk_button_new_with_mnemonic(_("_Delete"));
1735 data
.BT_rem
= widget
;
1736 gtk_container_add (GTK_CONTAINER (bbox
), widget
);
1738 widget
= gtk_button_new_with_mnemonic(_("Set as base"));
1739 data
.BT_base
= widget
;
1740 gtk_container_add (GTK_CONTAINER (bbox
), widget
);
1743 //connect all our signals
1744 //g_signal_connect (G_OBJECT (data.ST_name), "activate", G_CALLBACK (ui_cur_manage_dialog_add), NULL);
1746 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data
.LV_cur
)), "changed", G_CALLBACK (ui_cur_manage_dialog_selection
), NULL
);
1747 g_signal_connect (GTK_TREE_VIEW(data
.LV_cur
), "row-activated", G_CALLBACK (ui_cur_manage_dialog_onRowActivated
), NULL
);
1749 g_signal_connect (G_OBJECT (data
.BT_add
), "clicked", G_CALLBACK (ui_cur_manage_dialog_add
), NULL
);
1750 g_signal_connect (G_OBJECT (data
.BT_rem
), "clicked", G_CALLBACK (ui_cur_manage_dialog_remove
), NULL
);
1751 g_signal_connect (G_OBJECT (data
.BT_edit
), "clicked", G_CALLBACK (ui_cur_manage_dialog_modify
), NULL
);
1752 //g_signal_connect (G_OBJECT (data.BT_mov), "clicked", G_CALLBACK (ui_cur_manage_dialog_move), NULL);
1753 g_signal_connect (G_OBJECT (data
.BT_base
), "clicked", G_CALLBACK (ui_cur_manage_dialog_setbase
), NULL
);
1755 //setup, init and show window
1756 ui_cur_manage_dialog_setup(&data
);
1758 ui_cur_manage_dialog_update(data
.LV_cur
, NULL
);
1760 //gtk_window_resize(GTK_WINDOW(dialog), 256, 414);
1762 gtk_widget_show_all (dialog
);
1765 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
1769 case GTK_RESPONSE_ACCEPT
:
1770 //do_application_specific_something ();
1773 //do_nothing_since_dialog_was_cancelled ();
1778 // cleanup and destroy
1779 GLOBALS
->changes_count
+= data
.change
;
1780 gtk_widget_destroy (dialog
);