1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2014 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/>.
32 /* our global datas */
33 extern struct HomeBank
*GLOBALS
;
36 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
39 * ui_pay_comboboxentry_get_name:
41 * get the name of the active payee or -1
43 * Return value: a new allocated name tobe freed with g_free
47 ui_pay_comboboxentry_get_name(GtkComboBox
*entry_box
)
52 cbname
= (gchar
*)gtk_entry_get_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box
))));
56 name
= g_strdup(cbname
);
65 * ui_pay_comboboxentry_get_key_add_new:
67 * get the key of the active payee
68 * and create the payee if it do not exists
70 * Return value: the key or 0
74 ui_pay_comboboxentry_get_key_add_new(GtkComboBox
*entry_box
)
79 name
= ui_pay_comboboxentry_get_name(entry_box
);
81 item
= da_pay_get_by_name(name
);
85 //todo: check prefs + ask the user here 1st time
86 item
= da_pay_malloc();
87 item
->name
= g_strdup(name
);
89 ui_pay_comboboxentry_add(entry_box
, item
);
98 * ui_pay_comboboxentry_get_key:
100 * get the key of the active payee
102 * Return value: the key or 0
106 ui_pay_comboboxentry_get_key(GtkComboBox
*entry_box
)
111 name
= ui_pay_comboboxentry_get_name(entry_box
);
112 item
= da_pay_get_by_name(name
);
122 ui_pay_comboboxentry_set_active(GtkComboBox
*entry_box
, guint32 key
)
128 item
= da_pay_get(key
);
131 gtk_entry_set_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box
))), item
->name
);
135 gtk_entry_set_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box
))), "");
143 * ui_pay_comboboxentry_add:
145 * Add a single element (useful for dynamics add)
151 ui_pay_comboboxentry_add(GtkComboBox
*entry_box
, Payee
*pay
)
153 if( pay
->name
!= NULL
)
158 model
= gtk_combo_box_get_model(GTK_COMBO_BOX(entry_box
));
160 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
161 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
, 0, pay
->name
, -1);
166 ui_pay_comboboxentry_populate_ghfunc(gpointer key
, gpointer value
, struct payPopContext
*ctx
)
171 if( ( pay
->key
!= ctx
->except_key
) )
173 gtk_list_store_append (GTK_LIST_STORE(ctx
->model
), &iter
);
174 gtk_list_store_set (GTK_LIST_STORE(ctx
->model
), &iter
, 0, pay
->name
, -1);
179 * ui_pay_comboboxentry_populate:
181 * Populate the list and completion
187 ui_pay_comboboxentry_populate(GtkComboBox
*entry_box
, GHashTable
*hash
)
189 ui_pay_comboboxentry_populate_except(entry_box
, hash
, -1);
193 ui_pay_comboboxentry_populate_except(GtkComboBox
*entry_box
, GHashTable
*hash
, guint except_key
)
196 GtkEntryCompletion
*completion
;
197 struct payPopContext ctx
;
199 DB( g_print ("ui_pay_comboboxentry_populate\n") );
201 model
= gtk_combo_box_get_model(GTK_COMBO_BOX(entry_box
));
202 completion
= gtk_entry_get_completion(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box
))));
204 /* keep our model alive and detach from comboboxentry and completion */
206 gtk_combo_box_set_model(GTK_COMBO_BOX(entry_box
), NULL
);
207 gtk_entry_completion_set_model (completion
, NULL
);
209 /* clear and populate */
211 ctx
.except_key
= except_key
;
212 gtk_list_store_clear (GTK_LIST_STORE(model
));
213 g_hash_table_foreach(hash
, (GHFunc
)ui_pay_comboboxentry_populate_ghfunc
, &ctx
);
215 /* reatach our model */
216 gtk_combo_box_set_model(GTK_COMBO_BOX(entry_box
), model
);
217 gtk_entry_completion_set_model (completion
, model
);
218 g_object_unref(model
);
220 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model
), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID
, GTK_SORT_ASCENDING
);
227 ui_pay_comboboxentry_compare_func (GtkTreeModel
*model
, GtkTreeIter
*a
, GtkTreeIter
*b
, gpointer userdata
)
230 gchar
*name1
, *name2
;
232 gtk_tree_model_get(model
, a
, 0, &name1
, -1);
233 gtk_tree_model_get(model
, b
, 0, &name2
, -1);
235 retval
= hb_string_utf8_compare(name1
, name2
);
245 ui_pay_comboboxentry_test (GtkCellLayout
*cell_layout
,
246 GtkCellRenderer
*cell
,
247 GtkTreeModel
*tree_model
,
253 gtk_tree_model_get(tree_model
, iter
,
258 g_object_set(cell
, "text", _("(no payee)"), NULL
);
260 g_object_set(cell
, "text", name
, NULL
);
265 * ui_pay_comboboxentry_new:
267 * Create a new payee comboboxentry
269 * Return value: the new widget
273 ui_pay_comboboxentry_new(GtkWidget
*label
)
276 GtkWidget
*comboboxentry
;
277 GtkEntryCompletion
*completion
;
278 GtkCellRenderer
*renderer
;
280 store
= gtk_list_store_new (1,
283 gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store
), ui_pay_comboboxentry_compare_func
, NULL
, NULL
);
285 completion
= gtk_entry_completion_new ();
286 gtk_entry_completion_set_model (completion
, GTK_TREE_MODEL(store
));
287 g_object_set(completion
, "text-column", 0, NULL
);
289 renderer
= gtk_cell_renderer_text_new ();
290 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (completion
), renderer
, TRUE
);
291 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (completion
), renderer
, "text", 0, NULL
);
293 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (completion
),
295 ui_pay_comboboxentry_test
,
298 // dothe same for combobox
300 comboboxentry
= gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store
));
301 gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(comboboxentry
), 0);
303 gtk_cell_layout_clear(GTK_CELL_LAYOUT (comboboxentry
));
305 renderer
= gtk_cell_renderer_text_new ();
306 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (comboboxentry
), renderer
, TRUE
);
307 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (comboboxentry
), renderer
, "text", 0, NULL
);
309 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (comboboxentry
),
311 ui_pay_comboboxentry_test
,
316 gtk_entry_set_completion (GTK_ENTRY (gtk_bin_get_child(GTK_BIN (comboboxentry
))), completion
);
318 g_object_unref(store
);
321 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), comboboxentry
);
323 gtk_widget_set_size_request(comboboxentry
, HB_MINWIDTH_COMBO
, -1);
325 return comboboxentry
;
328 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
332 ui_pay_listview_toggled_cb (GtkCellRendererToggle
*cell
,
336 GtkTreeModel
*model
= (GtkTreeModel
*)data
;
338 GtkTreePath
*path
= gtk_tree_path_new_from_string (path_str
);
341 /* get toggled iter */
342 gtk_tree_model_get_iter (model
, &iter
, path
);
343 gtk_tree_model_get (model
, &iter
, LST_DEFPAY_TOGGLE
, &fixed
, -1);
345 /* do something with the value */
349 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, LST_DEFPAY_TOGGLE
, fixed
, -1);
352 gtk_tree_path_free (path
);
356 ui_pay_listview_compare_func (GtkTreeModel
*model
, GtkTreeIter
*a
, GtkTreeIter
*b
, gpointer userdata
)
358 Payee
*entry1
, *entry2
;
360 gtk_tree_model_get(model
, a
, LST_DEFPAY_DATAS
, &entry1
, -1);
361 gtk_tree_model_get(model
, b
, LST_DEFPAY_DATAS
, &entry2
, -1);
363 return hb_string_utf8_compare(entry1
->name
, entry2
->name
);
367 ui_pay_listview_name_cell_data_function (GtkTreeViewColumn
*col
,
368 GtkCellRenderer
*renderer
,
379 gtk_tree_model_get(model
, iter
, LST_DEFPAY_DATAS
, &entry
, -1);
382 name
= _("(no payee)");
387 string
= g_strdup_printf ("%d > %s [ft=%d im=%d]", entry
->key
, name
, entry
->filter
, entry
->imported
);
388 g_object_set(renderer
, "text", string
, NULL
);
391 g_object_set(renderer
, "text", name
, NULL
);
398 /* = = = = = = = = = = = = = = = = */
402 ui_pay_listview_add(GtkTreeView
*treeview
, Payee
*item
)
404 if( item
->name
!= NULL
)
409 model
= gtk_tree_view_get_model(treeview
);
411 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
412 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
413 LST_DEFPAY_TOGGLE
, FALSE
,
414 LST_DEFPAY_DATAS
, item
,
420 ui_pay_listview_get_selected_key(GtkTreeView
*treeview
)
422 GtkTreeSelection
*selection
;
426 selection
= gtk_tree_view_get_selection(treeview
);
427 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
431 gtk_tree_model_get(model
, &iter
, LST_DEFPAY_DATAS
, &item
, -1);
440 ui_pay_listview_remove_selected(GtkTreeView
*treeview
)
442 GtkTreeSelection
*selection
;
446 selection
= gtk_tree_view_get_selection(treeview
);
447 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
449 gtk_list_store_remove(GTK_LIST_STORE(model
), &iter
);
454 static void ui_pay_listview_populate_ghfunc(gpointer key
, gpointer value
, GtkTreeModel
*model
)
459 DB( g_print(" populate: %p\n", key
) );
461 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
462 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
463 LST_DEFPAY_TOGGLE
, FALSE
,
464 LST_DEFPAY_DATAS
, item
,
468 void ui_pay_listview_populate(GtkWidget
*view
)
472 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(view
));
474 gtk_list_store_clear (GTK_LIST_STORE(model
));
476 g_object_ref(model
); /* Make sure the model stays with us after the tree view unrefs it */
477 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), NULL
); /* Detach model from view */
480 g_hash_table_foreach(GLOBALS
->h_pay
, (GHFunc
)ui_pay_listview_populate_ghfunc
, model
);
482 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), model
); /* Re-attach model to view */
483 g_object_unref(model
);
488 ui_pay_listview_new(gboolean withtoggle
)
492 GtkCellRenderer
*renderer
;
493 GtkTreeViewColumn
*column
;
496 store
= gtk_list_store_new(
503 treeview
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
504 g_object_unref(store
);
506 //gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
509 if( withtoggle
== TRUE
)
511 renderer
= gtk_cell_renderer_toggle_new ();
512 column
= gtk_tree_view_column_new_with_attributes (_("Visible"),
514 "active", LST_DEFPAY_TOGGLE
,
516 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
518 g_signal_connect (renderer
, "toggled",
519 G_CALLBACK (ui_pay_listview_toggled_cb
), store
);
524 renderer
= gtk_cell_renderer_text_new ();
525 column
= gtk_tree_view_column_new();
526 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
527 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_pay_listview_name_cell_data_function
, GINT_TO_POINTER(LST_DEFPAY_DATAS
), NULL
);
528 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
530 // treeview attribute
531 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(treeview
), FALSE
);
532 //gtk_tree_view_set_reorderable (GTK_TREE_VIEW(view), TRUE);
533 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store
), LST_DEFPAY_DATAS
, ui_pay_listview_compare_func
, NULL
, NULL
);
534 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store
), LST_DEFPAY_DATAS
, GTK_SORT_ASCENDING
);
542 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
545 * ui_pay_manage_dialog_load_csv:
549 ui_pay_manage_dialog_load_csv( GtkWidget
*widget
, gpointer user_data
)
551 struct ui_pay_manage_dialog_data
*data
;
552 gchar
*filename
= NULL
;
554 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget
), GTK_TYPE_WINDOW
)), "inst_data");
556 DB( g_print("(ui_pay_manage_dialog) load csv - data %p\n", data
) );
558 if( ui_file_chooser_csv(GTK_WINDOW(data
->window
), GTK_FILE_CHOOSER_ACTION_OPEN
, &filename
, NULL
) == TRUE
)
560 DB( g_print(" + filename is %s\n", filename
) );
562 payee_load_csv(filename
);
563 //todo: add error message
566 ui_pay_listview_populate(data
->LV_pay
);
571 * ui_pay_manage_dialog_save_csv:
575 ui_pay_manage_dialog_save_csv( GtkWidget
*widget
, gpointer user_data
)
577 struct ui_pay_manage_dialog_data
*data
;
578 gchar
*filename
= NULL
;
580 DB( g_print("(ui_pay_manage_dialog) save csv\n") );
582 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
584 if( ui_file_chooser_csv(GTK_WINDOW(data
->window
), GTK_FILE_CHOOSER_ACTION_SAVE
, &filename
, NULL
) == TRUE
)
586 DB( g_print(" + filename is %s\n", filename
) );
588 payee_save_csv(filename
);
595 * ui_pay_manage_dialog_add:
599 ui_pay_manage_dialog_add(GtkWidget
*widget
, gpointer user_data
)
601 struct ui_pay_manage_dialog_data
*data
;
605 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
606 DB( g_print("(defayee) add (data=%p)\n", data
) );
608 name
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_name
));
610 item
= payee_append_if_new(name
);
613 ui_pay_listview_add(GTK_TREE_VIEW(data
->LV_pay
), item
);
617 gtk_entry_set_text(GTK_ENTRY(data
->ST_name
), "");
621 static void ui_pay_manage_dialog_modify_entry_cb(GtkEditable
*editable
, gpointer user_data
)
623 GtkDialog
*window
= user_data
;
626 buffer
= gtk_entry_get_text(GTK_ENTRY(editable
));
627 gtk_dialog_set_response_sensitive(GTK_DIALOG(window
), GTK_RESPONSE_ACCEPT
, strlen(buffer
) > 0 ? TRUE
: FALSE
);
634 static void ui_pay_manage_dialog_modify(GtkWidget
*widget
, gpointer user_data
)
636 struct ui_pay_manage_dialog_data
*data
;
637 GtkWidget
*window
, *content
, *mainvbox
, *getwidget
;
640 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
641 DB( g_print("(defayee) modify %p\n", data
) );
643 key
= ui_pay_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_pay
));
648 item
= da_pay_get( key
);
650 window
= gtk_dialog_new_with_buttons (_("Modify..."),
651 GTK_WINDOW (data
->window
),
659 content
= gtk_dialog_get_content_area(GTK_DIALOG (window
));
660 mainvbox
= gtk_vbox_new (FALSE
, 0);
661 gtk_box_pack_start (GTK_BOX (content
), mainvbox
, TRUE
, TRUE
, 0);
662 gtk_container_set_border_width (GTK_CONTAINER (mainvbox
), HB_BOX_SPACING
);
664 getwidget
= gtk_entry_new();
665 gtk_box_pack_start (GTK_BOX (mainvbox
), getwidget
, TRUE
, TRUE
, 0);
666 gtk_widget_show_all(mainvbox
);
668 g_signal_connect (G_OBJECT (getwidget
), "changed", G_CALLBACK (ui_pay_manage_dialog_modify_entry_cb
), window
);
670 gtk_entry_set_text(GTK_ENTRY(getwidget
), item
->name
);
671 gtk_widget_grab_focus (getwidget
);
673 gtk_entry_set_activates_default (GTK_ENTRY(getwidget
), TRUE
);
675 gtk_dialog_set_default_response(GTK_DIALOG( window
), GTK_RESPONSE_ACCEPT
);
678 gint result
= gtk_dialog_run (GTK_DIALOG (window
));
680 if(result
== GTK_RESPONSE_ACCEPT
)
684 name
= gtk_entry_get_text(GTK_ENTRY(getwidget
));
686 /* ignore if entry is empty */
689 if( payee_rename(item
, name
) )
691 //to redraw the active entry
692 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_pay
));
697 ui_dialog_msg_infoerror(GTK_WINDOW(window
), GTK_MESSAGE_ERROR
,
699 _("Cannot rename this Payee,\n"
700 "from '%s' to '%s',\n"
701 "this name already exists."),
710 // cleanup and destroy
711 gtk_widget_destroy (window
);
717 static void ui_pay_manage_dialog_move_entry_cb(GtkComboBox
*widget
, gpointer user_data
)
719 GtkDialog
*window
= user_data
;
722 buffer
= (gchar
*)gtk_entry_get_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (widget
))));
723 gtk_dialog_set_response_sensitive(GTK_DIALOG(window
), GTK_RESPONSE_ACCEPT
, strlen(buffer
) > 0 ? TRUE
: FALSE
);
730 static void ui_pay_manage_dialog_move(GtkWidget
*widget
, gpointer user_data
)
732 struct ui_pay_manage_dialog_data
*data
;
733 GtkWidget
*window
, *content
, *mainvbox
;
734 GtkWidget
*getwidget
;
735 GtkTreeSelection
*selection
;
739 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
740 DB( g_print("(defayee) move %p\n", data
) );
743 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_pay
));
744 //if true there is a selected node
745 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
749 gtk_tree_model_get(model
, &iter
, LST_DEFPAY_DATAS
, &entry
, -1);
751 window
= gtk_dialog_new_with_buttons (_("Move to..."),
752 GTK_WINDOW (data
->window
),
760 content
= gtk_dialog_get_content_area(GTK_DIALOG (window
));
761 mainvbox
= gtk_vbox_new (FALSE
, 0);
762 gtk_box_pack_start (GTK_BOX (content
), mainvbox
, TRUE
, TRUE
, 0);
763 gtk_container_set_border_width (GTK_CONTAINER (mainvbox
), HB_BOX_SPACING
);
765 getwidget
= ui_pay_comboboxentry_new(NULL
);
766 gtk_box_pack_start (GTK_BOX (mainvbox
), getwidget
, TRUE
, TRUE
, 0);
768 //gtk_combo_box_set_active(GTK_COMBO_BOX(getwidget), oldpos);
769 gtk_dialog_set_response_sensitive(GTK_DIALOG(window
), GTK_RESPONSE_ACCEPT
, FALSE
);
771 gtk_widget_show_all(mainvbox
);
773 g_signal_connect (G_OBJECT (getwidget
), "changed", G_CALLBACK (ui_pay_manage_dialog_move_entry_cb
), window
);
775 //data->tmp_list = g_list_sort(data->tmp_list, (GCompareFunc)ui_pay_manage_dialog_list_sort);
776 ui_pay_comboboxentry_populate_except(GTK_COMBO_BOX(getwidget
), GLOBALS
->h_pay
, entry
->key
);
777 gtk_widget_grab_focus (getwidget
);
780 gint result
= gtk_dialog_run (GTK_DIALOG (window
));
782 if(result
== GTK_RESPONSE_ACCEPT
)
787 npn
= ui_pay_comboboxentry_get_name(GTK_COMBO_BOX(getwidget
)),
789 result
= ui_dialog_msg_question(
791 _("Move this payee to another one ?"),
792 _("This will replace '%s' by '%s',\n"
793 "and then remove '%s'"),
800 if( result
== GTK_RESPONSE_YES
)
805 newpayee
= ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(getwidget
));
807 gtk_combo_box_get_active(GTK_COMBO_BOX(getwidget
));
809 DB( g_print(" -> should move %d - %s to %d - %s\n", entry
->key
, entry
->name
, newpayee
, npn
) );
811 payee_move(entry
->key
, newpayee
);
813 // remove the old payee
814 da_pay_remove(entry
->key
);
815 ui_pay_listview_remove_selected(GTK_TREE_VIEW(data
->LV_pay
));
817 // add the new payee to listview
818 payee
= da_pay_get(newpayee
);
820 ui_pay_listview_add(GTK_TREE_VIEW(data
->LV_pay
), payee
);
827 // cleanup and destroy
828 gtk_widget_destroy (window
);
836 ** remove the selected payee to our treeview and temp GList
838 static void ui_pay_manage_dialog_remove(GtkWidget
*widget
, gpointer user_data
)
840 struct ui_pay_manage_dialog_data
*data
;
846 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
847 DB( g_print("(ui_pay_manage_dialog) remove (data=%p)\n", data
) );
850 key
= ui_pay_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_pay
));
853 if( payee_is_used(key
) == TRUE
)
855 item
= da_pay_get(key
);
857 result
= ui_dialog_msg_question(
858 GTK_WINDOW(data
->window
),
859 _("Remove a payee ?"),
860 _("If you remove '%s', archive and transaction referencing this payee\n"
861 "will set place to 'no payee'"),
866 if( result
== GTK_RESPONSE_YES
)
870 else if( result
== GTK_RESPONSE_NO
)
879 ui_pay_listview_remove_selected(GTK_TREE_VIEW(data
->LV_pay
));
890 static void ui_pay_manage_dialog_update(GtkWidget
*treeview
, gpointer user_data
)
892 struct ui_pay_manage_dialog_data
*data
;
896 DB( g_print("\n(ui_pay_manage_dialog) cursor changed\n") );
898 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(treeview
), GTK_TYPE_WINDOW
)), "inst_data");
900 key
= ui_pay_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_pay
));
902 sensitive
= (key
> 0) ? TRUE
: FALSE
;
903 gtk_widget_set_sensitive(data
->BT_mov
, sensitive
);
904 gtk_widget_set_sensitive(data
->BT_mod
, sensitive
);
905 gtk_widget_set_sensitive(data
->BT_rem
, sensitive
);
913 static void ui_pay_manage_dialog_selection(GtkTreeSelection
*treeselection
, gpointer user_data
)
915 ui_pay_manage_dialog_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), NULL
);
918 static void ui_pay_manage_dialog_onRowActivated (GtkTreeView
*treeview
,
920 GtkTreeViewColumn
*col
,
926 model
= gtk_tree_view_get_model(treeview
);
927 gtk_tree_model_get_iter_first(model
, &iter
);
928 if(gtk_tree_selection_iter_is_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview
)), &iter
) == FALSE
)
930 ui_pay_manage_dialog_modify(GTK_WIDGET(treeview
), NULL
);
937 GtkWidget
*ui_pay_manage_dialog (void)
939 struct ui_pay_manage_dialog_data data
;
940 GtkWidget
*window
, *content
, *mainvbox
, *treeview
, *scrollwin
, *vbox
, *table
;
941 GtkWidget
*separator
;
944 window
= gtk_dialog_new_with_buttons (_("Manage Payees"),
945 GTK_WINDOW(GLOBALS
->mainwindow
),
951 data
.window
= window
;
955 //homebank_window_set_icon_from_file(GTK_WINDOW (window), "payee.svg");
956 gtk_window_set_icon_name(GTK_WINDOW (window
), HB_STOCK_PAYEE
);
958 //store our window private data
959 g_object_set_data(G_OBJECT(window
), "inst_data", (gpointer
)&data
);
960 DB( g_print("(ui_pay_manage_dialog) window=%p, inst_data=%p\n", window
, &data
) );
962 g_signal_connect (window
, "destroy",
963 G_CALLBACK (gtk_widget_destroyed
), &window
);
966 content
= gtk_dialog_get_content_area(GTK_DIALOG (window
));
967 mainvbox
= gtk_vbox_new (FALSE
, HB_BOX_SPACING
);
968 gtk_box_pack_start (GTK_BOX (content
), mainvbox
, TRUE
, TRUE
, 0);
969 gtk_container_set_border_width (GTK_CONTAINER(mainvbox
), HB_MAINBOX_SPACING
);
972 table
= gtk_table_new (2, 2, FALSE
);
973 gtk_table_set_row_spacings (GTK_TABLE (table
), HB_TABROW_SPACING
);
974 gtk_table_set_col_spacings (GTK_TABLE (table
), HB_TABCOL_SPACING
);
975 gtk_box_pack_start (GTK_BOX (mainvbox
), table
, TRUE
, TRUE
, 0);
978 data
.ST_name
= gtk_entry_new ();
979 gtk_table_attach (GTK_TABLE (table
), data
.ST_name
, 0, 1, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
|GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
980 data
.BT_add
= gtk_button_new_from_stock(GTK_STOCK_ADD
);
981 gtk_table_attach (GTK_TABLE (table
), data
.BT_add
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
985 scrollwin
= gtk_scrolled_window_new(NULL
,NULL
);
986 gtk_table_attach (GTK_TABLE (table
), scrollwin
, 0, 1, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
|GTK_FILL
), (GtkAttachOptions
) (GTK_EXPAND
|GTK_FILL
), 0, 0);
988 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
989 //gtk_container_set_border_width (GTK_CONTAINER(scrollwin), 5);
990 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin
), GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
991 //treeview = (GtkWidget *)ui_pay_manage_dialog_list_new(FALSE);
992 treeview
= ui_pay_listview_new(FALSE
);
993 gtk_widget_set_size_request(treeview
, HB_MINWIDTH_LIST
, -1);
994 data
.LV_pay
= treeview
;
995 gtk_container_add(GTK_CONTAINER(scrollwin
), treeview
);
997 vbox
= gtk_vbox_new (FALSE
, HB_BOX_SPACING
);
998 gtk_table_attach (GTK_TABLE (table
), vbox
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (GTK_EXPAND
|GTK_FILL
), 0, 0);
1000 data
.BT_rem
= gtk_button_new_from_stock(GTK_STOCK_REMOVE
);
1001 gtk_box_pack_start (GTK_BOX (vbox
), data
.BT_rem
, FALSE
, FALSE
, 0);
1003 data
.BT_mod
= gtk_button_new_from_stock(GTK_STOCK_EDIT
);
1004 //data.BT_mod = gtk_button_new_with_mnemonic(_("_Modify"));
1005 gtk_box_pack_start (GTK_BOX (vbox
), data
.BT_mod
, FALSE
, FALSE
, 0);
1007 data
.BT_mov
= gtk_button_new_with_mnemonic(_("_Move"));
1008 gtk_box_pack_start (GTK_BOX (vbox
), data
.BT_mov
, FALSE
, FALSE
, 0);
1010 separator
= gtk_hseparator_new();
1011 gtk_box_pack_start (GTK_BOX (vbox
), separator
, FALSE
, FALSE
, HB_BOX_SPACING
);
1014 data
.BT_import
= gtk_button_new_with_mnemonic(_("_Import"));
1015 //data.BT_import = gtk_button_new_from_stock(GTK_STOCK_OPEN);
1016 gtk_box_pack_start (GTK_BOX (vbox
), data
.BT_import
, FALSE
, FALSE
, 0);
1018 data
.BT_export
= gtk_button_new_with_mnemonic(_("E_xport"));
1019 //data.BT_export = gtk_button_new_from_stock(GTK_STOCK_SAVE);
1020 gtk_box_pack_start (GTK_BOX (vbox
), data
.BT_export
, FALSE
, FALSE
, 0);
1024 //connect all our signals
1025 g_signal_connect (G_OBJECT (data
.ST_name
), "activate", G_CALLBACK (ui_pay_manage_dialog_add
), NULL
);
1027 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data
.LV_pay
)), "changed", G_CALLBACK (ui_pay_manage_dialog_selection
), NULL
);
1028 g_signal_connect (GTK_TREE_VIEW(data
.LV_pay
), "row-activated", G_CALLBACK (ui_pay_manage_dialog_onRowActivated
), NULL
);
1030 g_signal_connect (G_OBJECT (data
.BT_add
), "clicked", G_CALLBACK (ui_pay_manage_dialog_add
), NULL
);
1031 g_signal_connect (G_OBJECT (data
.BT_mod
), "clicked", G_CALLBACK (ui_pay_manage_dialog_modify
), NULL
);
1032 g_signal_connect (G_OBJECT (data
.BT_mov
), "clicked", G_CALLBACK (ui_pay_manage_dialog_move
), NULL
);
1033 g_signal_connect (G_OBJECT (data
.BT_rem
), "clicked", G_CALLBACK (ui_pay_manage_dialog_remove
), NULL
);
1035 g_signal_connect (G_OBJECT (data
.BT_import
), "clicked", G_CALLBACK (ui_pay_manage_dialog_load_csv
), NULL
);
1036 g_signal_connect (G_OBJECT (data
.BT_export
), "clicked", G_CALLBACK (ui_pay_manage_dialog_save_csv
), NULL
);
1038 //setup, init and show window
1039 ui_pay_listview_populate(data
.LV_pay
);
1040 ui_pay_manage_dialog_update(data
.LV_pay
, NULL
);
1042 //gtk_window_resize(GTK_WINDOW(window), 200, 320);
1044 gtk_widget_show_all (window
);
1047 gint result
= gtk_dialog_run (GTK_DIALOG (window
));
1051 case GTK_RESPONSE_ACCEPT
:
1052 //do_application_specific_something ();
1055 //do_nothing_since_dialog_was_cancelled ();
1060 // cleanup and destroy
1061 GLOBALS
->changes_count
+= data
.change
;
1062 gtk_widget_destroy (window
);