1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2016 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 "hb-import.h"
23 #include "ui-assist-import.h"
25 #include "list_account.h"
26 #include "list_operation.h"
28 #include "ui-account.h"
29 #include "dsp_mainwindow.h"
33 /****************************************************************************/
35 /****************************************************************************/
49 /* our global datas */
50 extern struct HomeBank
*GLOBALS
;
51 extern struct Preferences
*PREFS
;
54 static gchar
*page_titles
[] =
66 extern gchar
*CYA_IMPORT_DATEORDER
[];
69 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
70 /* account affect listview */
71 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
75 ui_acc_affect_listview_get_selected_key(GtkTreeView
*treeview
)
77 GtkTreeSelection
*selection
;
81 selection
= gtk_tree_view_get_selection(treeview
);
82 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
86 gtk_tree_model_get(model
, &iter
, 0, &item
, -1);
96 ui_acc_affect_listview_srcname_cell_data_function (GtkTreeViewColumn
*col
,
97 GtkCellRenderer
*renderer
,
106 gtk_tree_model_get(model
, iter
, 0, &entry
, -1);
108 name
= entry
->imp_name
;
111 string
= g_markup_printf_escaped("<i>[%d] %s</i>", entry
->key
, name
);
113 string
= g_markup_printf_escaped("<i>%s</i>", name
);
115 g_object_set(renderer
, "markup", string
, NULL
);
120 ui_acc_affect_listview_new_cell_data_function (GtkTreeViewColumn
*col
,
121 GtkCellRenderer
*renderer
,
129 gtk_tree_model_get(model
, iter
, 0, &entry
, -1);
131 if(entry
->imp_key
== 0)
132 name
= _("create new");
134 name
= _("use existing");
136 g_object_set(renderer
, "markup", name
, NULL
);
141 ui_acc_affect_listview_dstname_cell_data_function (GtkTreeViewColumn
*col
,
142 GtkCellRenderer
*renderer
,
147 Account
*entry
, *dst_entry
;
153 gtk_tree_model_get(model
, iter
, 0, &entry
, -1);
155 if(entry
->imp_key
== 0)
159 dst_entry
= da_acc_get(entry
->imp_key
);
160 if( dst_entry
!= NULL
)
161 name
= dst_entry
->name
;
165 string
= g_strdup_printf ("[%d] %s", entry
->imp_key
, name
);
166 g_object_set(renderer
, "text", string
, NULL
);
169 g_object_set(renderer
, "text", name
, NULL
);
175 ui_acc_affect_listview_add(GtkTreeView
*treeview
, Account
*item
)
177 if( item
->name
!= NULL
)
182 model
= gtk_tree_view_get_model(treeview
);
184 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
185 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
189 //gtk_tree_selection_select_iter (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), &iter);
196 ui_acc_affect_listview_new(void)
200 GtkCellRenderer
*renderer
;
201 GtkTreeViewColumn
*column
;
204 store
= gtk_list_store_new(1,
209 treeview
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
210 g_object_unref(store
);
212 // column: import account
213 renderer
= gtk_cell_renderer_text_new ();
214 column
= gtk_tree_view_column_new();
215 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
216 gtk_tree_view_column_set_title(column
, _("Name in the file"));
217 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_acc_affect_listview_srcname_cell_data_function
, NULL
, NULL
);
218 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
220 // column: target account
221 renderer
= gtk_cell_renderer_text_new ();
222 column
= gtk_tree_view_column_new();
223 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
224 gtk_tree_view_column_set_title(column
, _("Action"));
225 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_acc_affect_listview_new_cell_data_function
, NULL
, NULL
);
226 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
228 // column: target account
229 renderer
= gtk_cell_renderer_text_new ();
230 column
= gtk_tree_view_column_new();
231 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
232 gtk_tree_view_column_set_title(column
, _("Name in HomeBank"));
233 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_acc_affect_listview_dstname_cell_data_function
, NULL
, NULL
);
234 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
239 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(treeview
), TRUE
);
241 //gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store), ui_acc_listview_compare_func, NULL, NULL);
242 //gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
249 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
251 //old stuf for transition waiting import rewrite
252 static void da_obsolete_transaction_destroy(GList
*list
)
254 GList
*tmplist
= g_list_first(list
);
256 while (tmplist
!= NULL
)
258 Transaction
*item
= tmplist
->data
;
259 da_transaction_free(item
);
260 tmplist
= g_list_next(tmplist
);
265 static GQueue
*da_obsolete_transaction_get_partial(guint32 minjulian
)
267 GList
*lst_acc
, *lnk_acc
;
271 txn_queue
= g_queue_new ();
273 lst_acc
= g_hash_table_get_values(GLOBALS
->h_acc
);
274 lnk_acc
= g_list_first(lst_acc
);
275 while (lnk_acc
!= NULL
)
277 Account
*acc
= lnk_acc
->data
;
279 lnk_txn
= g_queue_peek_tail_link(acc
->txn_queue
);
280 while (lnk_txn
!= NULL
)
282 Transaction
*txn
= lnk_txn
->data
;
284 if( txn
->date
< minjulian
) //no need to go below mindate
287 g_queue_push_head (txn_queue
, txn
);
289 lnk_txn
= g_list_previous(lnk_txn
);
292 lnk_acc
= g_list_next(lnk_acc
);
294 g_list_free(lst_acc
);
302 /* count account to be imported */
303 static void _import_context_count(struct import_data
*data
)
305 ImportContext
*ictx
= &data
->ictx
;
308 DB( g_print("\n[import] context count\n") );
310 ictx
->nb_src_acc
= ictx
->nb_new_acc
= 0;
312 ictx
->cnt_new_ope
= 0;
315 lacc
= list
= g_hash_table_get_values(GLOBALS
->h_acc
);
318 Account
*item
= list
->data
;
320 if( item
->imported
== TRUE
)
323 if( item
->imp_key
== 0 )
326 list
= g_list_next(list
);
330 /* count transaction */
331 ictx
->cnt_new_ope
= g_list_length(ictx
->trans_list
);
336 static void _import_context_clear(ImportContext
*ictx
)
338 DB( g_print("\n[import] context clear\n") );
341 da_obsolete_transaction_destroy(ictx
->trans_list
);
342 ictx
->trans_list
= NULL
;
343 ictx
->next_acc_key
= da_acc_length();
344 ictx
->datefmt
= PREFS
->dtex_datefmt
;
345 ictx
->encoding
= NULL
;
347 ictx
->cnt_err_date
= 0;
348 ictx
->cnt_new_pay
= 0;
349 ictx
->cnt_new_cat
= 0;
354 static void _import_context_debug(ImportContext
*ictx
)
356 DB( g_print("\n[import] context debug\n") );
359 " -> txnlist=%p, maxacckey=%d\n"
360 " -> nb-acc=%d, nb-newacc=%d\n"
361 " -> ntxn=%d, npay=%d, ncat=%d\n"
362 " -> datefmt=%d, encoding='%s', errdate=%d, ndup=%d\n",
363 ictx
->trans_list
, ictx
->next_acc_key
,
364 ictx
->nb_src_acc
, ictx
->nb_new_acc
,
383 static GList
*homebank_qif_import(gchar
*filename
, ImportContext
*ictx
)
387 DB( g_print("\n[import] homebank QIF\n") );
390 list
= account_import_qif(filename
, ictx
);
398 static void import_clearall(struct import_data
*data
)
403 DB( g_print("\n[import] clear all\n") );
405 // clear account & transactions
406 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_acc
));
407 gtk_list_store_clear (GTK_LIST_STORE(model
));
408 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->imported_ope
));
409 gtk_list_store_clear (GTK_LIST_STORE(model
));
410 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->duplicat_ope
));
411 gtk_list_store_clear (GTK_LIST_STORE(model
));
414 // 1: delete imported accounts
415 lxxx
= list
= g_hash_table_get_values(GLOBALS
->h_acc
);
418 Account
*item
= list
->data
;
420 if( item
->imported
== TRUE
)
422 DB( g_print(" -> delete acc %p '%s'\n", item
, item
->name
) );
423 da_acc_remove(item
->key
);
425 list
= g_list_next(list
);
429 // 2: delete imported payees
430 lxxx
= list
= g_hash_table_get_values(GLOBALS
->h_pay
);
433 Payee
*item
= list
->data
;
435 if( item
->imported
== TRUE
)
437 DB( g_print(" -> delete pay '%s'\n", item
->name
) );
438 da_pay_remove(item
->key
);
440 list
= g_list_next(list
);
444 // 3: delete imported category
445 lxxx
= list
= g_hash_table_get_values(GLOBALS
->h_cat
);
448 Category
*item
= list
->data
;
450 if( item
->imported
== TRUE
)
452 DB( g_print(" -> delete cat '%s'\n", item
->name
) );
453 da_cat_remove(item
->key
);
455 list
= g_list_next(list
);
459 _import_context_clear(&data
->ictx
);
464 static gboolean
ui_import_panel_transaction_is_duplicate(Transaction
*impope
, Transaction
*ope
, gint maxgap
)
468 gboolean retval
= FALSE
;
471 if( (impope
->amount
== ope
->amount
) &&
472 (ope
->date
<= (impope
->date
+ maxgap
)) && (ope
->date
>= (impope
->date
- maxgap
)) )
475 //we focus the test on impope->acc->imp_key (and not impope->kacc)
476 dstkacc
= impope
->kacc
;
477 dstacc
= da_acc_get(dstkacc
);
478 if( dstacc
&& dstacc
->imp_key
> 0 )
480 dstkacc
= dstacc
->imp_key
;
483 DB( g_print("--------\n -> dstkacc=%d, amount & date are similar\n", dstkacc
) );
485 DB( g_print(" -> impope: kacc=%d, %s kxfer=%d, kxferacc=%d\n", impope
->kacc
, impope
->wording
, impope
->kxfer
, impope
->kxferacc
) );
486 DB( g_print(" -> ope: kacc=%d, %s kxfer=%d, kxferacc=%d\n", ope
->kacc
, ope
->wording
, ope
->kxfer
, ope
->kxferacc
) );
489 if(impope
->paymode
!= PAYMODE_INTXFER
)
491 if( dstkacc
== ope
->kacc
)
493 DB( g_print(" -> impope is not a xfer and acc are similar\n") );
499 if( ( (impope
->kxferacc
== ope
->kxferacc
) && ope
->kxfer
!= 0) ||
500 ( impope
->kxferacc
== 0 )
509 static void ui_import_panel_transaction_find_duplicate(struct import_data
*data
)
511 ImportContext
*ictx
= &data
->ictx
;
512 GList
*tmplist
, *implist
;
517 DB( g_print("\n[import] find duplicate\n") );
519 ictx
->nb_duplicate
= 0;
520 if( ictx
->trans_list
)
522 /* 1: get import min bound date */
523 tmplist
= g_list_first(ictx
->trans_list
);
524 item
= tmplist
->data
;
525 mindate
= item
->date
;
526 maxgap
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->NB_maxgap
));
528 /* clear any previous same txn */
529 implist
= g_list_first(ictx
->trans_list
);
530 while (implist
!= NULL
)
532 Transaction
*impope
= implist
->data
;
534 if(impope
->same
!= NULL
)
536 g_list_free(impope
->same
);
539 implist
= g_list_next(implist
);
543 GQueue
*txn_queue
= da_obsolete_transaction_get_partial(mindate
);
545 //tmplist = g_list_first(GLOBALS->ope_list);
546 tmplist
= g_queue_peek_head_link(txn_queue
);
547 while (tmplist
!= NULL
)
549 Transaction
*ope
= tmplist
->data
;
551 if( ope
->date
>= mindate
)
553 //DB( g_print("should check here %d: %s\n", ope->date, ope->wording) );
555 implist
= g_list_first(ictx
->trans_list
);
556 while (implist
!= NULL
)
558 Transaction
*impope
= implist
->data
;
560 if( ui_import_panel_transaction_is_duplicate(impope
, ope
, maxgap
) )
562 //DB( g_print(" found %d: %s\n", impope->date, impope->wording) );
564 impope
->same
= g_list_append(impope
->same
, ope
);
565 ictx
->nb_duplicate
++;
568 implist
= g_list_next(implist
);
572 tmplist
= g_list_next(tmplist
);
575 g_queue_free (txn_queue
);
579 DB( g_print(" nb_duplicate = %d\n", ictx
->nb_duplicate
) );
585 static void ui_import_panel_account_fill(struct import_data
*data
)
587 ImportContext
*ictx
= &data
->ictx
;
589 gchar
*icon_name
= NULL
;
592 DB( g_print("\n[import] panel account fill\n") );
594 if(ictx
->nb_new_acc
== 0)
596 icon_name
= ICONNAME_INFO
;
597 label
= g_strdup( _("All seems all right here, your validation is optional!") );
603 /* file name & path */
604 tmpstr
= g_path_get_basename(data
->filename
);
608 icon_name
= ICONNAME_WARNING
;
609 label
= g_strdup_printf(
610 _("No account information has been found into the file '%s'.\n"
611 "Please select the appropriate action for account below."),
617 gtk_label_set_text(GTK_LABEL(data
->LB_acc
), label
);
618 gtk_image_set_from_icon_name(GTK_IMAGE(data
->IM_acc
), icon_name
, GTK_ICON_SIZE_BUTTON
);
622 gtk_list_store_clear (GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_acc
))));
624 lacc
= list
= g_hash_table_get_values(GLOBALS
->h_acc
);
627 Account
*item
= list
->data
;
629 if( item
->imported
== TRUE
)
631 ui_acc_affect_listview_add(GTK_TREE_VIEW(data
->LV_acc
), item
);
633 list
= g_list_next(list
);
637 DB( _import_context_debug(&data
->ictx
) );
641 /* count transaction with checkbox 'import' */
642 static void import_count_changes(struct import_data
*data
)
649 DB( g_print("\n[import] count_final_changes\n") );
651 data
->imp_cnt_acc
= 0;
653 lacc
= list
= g_hash_table_get_values(GLOBALS
->h_acc
);
656 Account
*item
= list
->data
;
658 if( item
->imported
== TRUE
&& item
->imp_key
!= 0)
662 list
= g_list_next(list
);
667 // then import transactions
668 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->imported_ope
));
670 data
->imp_cnt_trn
= 0;
672 valid
= gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model
), &iter
);
677 gtk_tree_model_get(GTK_TREE_MODEL(model
), &iter
,
678 LST_OPE_IMPTOGGLE
, &toimport
,
684 /* Make iter point to the next row in the list store */
685 valid
= gtk_tree_model_iter_next(GTK_TREE_MODEL(model
), &iter
);
690 static void import_apply(struct import_data
*data
)
697 DB( g_print("\n[import] apply\n") );
699 // 1: persist imported accounts
700 lxxx
= list
= g_hash_table_get_values(GLOBALS
->h_acc
);
703 Account
*item
= list
->data
;
705 if( item
->imported
== TRUE
)
707 //only persist user selected to new account
708 if( item
->imp_key
== 0)
710 //DB( g_print(" -> persist acc %x '%s'\n", item, item->name) );
711 item
->imported
= FALSE
;
712 g_free(item
->imp_name
);
713 item
->imp_name
= NULL
;
716 list
= g_list_next(list
);
720 // 2: persist imported payees
721 lxxx
= list
= g_hash_table_get_values(GLOBALS
->h_pay
);
724 Payee
*item
= list
->data
;
726 if( item
->imported
== TRUE
)
728 //DB( g_print(" -> persist pay '%s'\n", item->name) );
729 item
->imported
= FALSE
;
731 list
= g_list_next(list
);
735 // 3: persist imported categories
736 lxxx
= list
= g_hash_table_get_values(GLOBALS
->h_cat
);
739 Category
*item
= list
->data
;
741 if( item
->imported
== TRUE
)
743 //DB( g_print(" -> persist cat '%s'\n", item->name) );
744 item
->imported
= FALSE
;
746 list
= g_list_next(list
);
750 // 4: insert every transactions
751 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->imported_ope
));
752 valid
= gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model
), &iter
);
758 gtk_tree_model_get(GTK_TREE_MODEL(model
), &iter
,
759 LST_DSPOPE_DATAS
, &item
,
760 LST_OPE_IMPTOGGLE
, &toimport
,
767 //DB(g_print("import %d to acc: %d\n", data->total, item->account) );
768 //todo: here also test imp_key on account and change the key into the transaction
769 acc
= da_acc_get(item
->kacc
);
772 if( acc
->imp_key
> 0)
774 item
->kacc
= acc
->imp_key
;
778 transaction_add(item
, NULL
, 0);
781 /* Make iter point to the next row in the list store */
782 valid
= gtk_tree_model_iter_next(GTK_TREE_MODEL(model
), &iter
);
792 ui_import_assistant_dispose(GtkWidget
*widget
, gpointer user_data
)
794 struct import_data
*data
= user_data
;
796 DB( g_print("\n[import] dispose\n") );
799 gpointer data2
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
800 g_print(" user_data=%08x to be free, data2=%x\n", (gint
)user_data
, (gint
)data2
);
803 g_free( data
->filename
);
805 import_clearall(data
);
810 // todo: optimize this
811 if(data
->imp_cnt_trn
> 0)
813 GLOBALS
->changes_count
+= data
->imp_cnt_trn
;
815 //our global list has changed, so update the treeview
816 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_TITLE
+UF_SENSITIVE
+UF_BALANCE
+UF_REFRESHALL
));
823 //delete-event TRUE abort/FALSE destroy
828 static void ui_import_panel_transaction_fill(struct import_data
*data
)
830 ImportContext
*ictx
= &data
->ictx
;
836 gchar
*icon_name
= NULL
;
838 //DB( g_print("\n[import] fill imp operatoin\n") );
840 if(ictx
->nb_duplicate
== 0)
842 icon_name
= ICONNAME_INFO
;
843 label
= _("All seems all right here, your validation is optional!");
847 icon_name
= ICONNAME_WARNING
;
849 _("Possible duplicate of existing transaction have been found, and disabled for import.\n"
850 "Please check and choose the ones that have to be imported.");
853 gtk_label_set_text(GTK_LABEL(data
->LB_txn
), label
);
854 gtk_image_set_from_icon_name(GTK_IMAGE(data
->IM_txn
), icon_name
, GTK_ICON_SIZE_BUTTON
);
857 view
= data
->imported_ope
;
858 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(view
));
860 gtk_list_store_clear (GTK_LIST_STORE(model
));
862 g_object_ref(model
); /* Make sure the model stays with us after the tree view unrefs it */
863 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), NULL
); /* Detach model from view */
865 tmplist
= g_list_first(ictx
->trans_list
);
866 while (tmplist
!= NULL
)
868 Transaction
*item
= tmplist
->data
;
870 /* append to our treeview */
871 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
873 //DB( g_print(" populate: %s\n", ope->ope_Word) );
875 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
876 LST_DSPOPE_DATAS
, item
,
877 LST_OPE_IMPTOGGLE
, item
->same
== NULL
? TRUE
: FALSE
,
880 //DB( g_print(" - fill: %d, %s %.2f %x\n", item->account, item->wording, item->amount, item->same) );
882 tmplist
= g_list_next(tmplist
);
885 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), model
); /* Re-attach model to view */
887 g_object_unref(model
);
894 static void ui_import_panel_account_change_action_toggled_cb(GtkRadioButton
*radiobutton
, gpointer user_data
)
896 struct import_target_data
*data
;
897 gboolean new_account
;
900 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(radiobutton
), GTK_TYPE_WINDOW
)), "inst_data");
902 DB( g_print("\n[import] account type toggle\n") );
904 new_account
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->radio
[0]));
906 gtk_widget_set_sensitive(data
->label1
, new_account
);
907 gtk_widget_set_sensitive(data
->getwidget1
, new_account
);
909 gtk_widget_set_sensitive(data
->label2
, new_account
^1);
910 gtk_widget_set_sensitive(data
->getwidget2
, new_account
^1);
915 static void ui_import_panel_account_change_action(GtkWidget
*widget
, gpointer user_data
)
917 struct import_data
*data
;
918 struct import_target_data ddata
;
920 GtkWidget
*dialog
, *content_area
, *group_grid
, *label
;
924 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
925 DB( g_print("\n[import] account_change_action\n") );
929 key
= ui_acc_affect_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_acc
));
934 item
= da_acc_get( key
);
936 dialog
= gtk_dialog_new_with_buttons (_("Change account action"),
937 GTK_WINDOW (data
->assistant
),
945 //store our window private data
946 g_object_set_data(G_OBJECT(dialog
), "inst_data", (gpointer
)&ddata
);
948 content_area
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
));
951 group_grid
= gtk_grid_new ();
952 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
953 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
954 gtk_container_set_border_width (GTK_CONTAINER(group_grid
), SPACING_MEDIUM
);
955 gtk_box_pack_start (GTK_BOX (content_area
), group_grid
, TRUE
, TRUE
, SPACING_SMALL
);
958 ddata
.radio
[0] = gtk_radio_button_new_with_label (NULL
, _("create new"));
959 gtk_grid_attach (GTK_GRID (group_grid
), ddata
.radio
[0], 0, row
, 3, 1);
962 label
= make_label(_("_Name:"), 0, 0.5);
963 ddata
.label1
= label
;
964 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
966 ddata
.getwidget1
= gtk_entry_new();
967 gtk_grid_attach (GTK_GRID (group_grid
), ddata
.getwidget1
, 2, row
, 1, 1);
970 ddata
.radio
[1] = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON (ddata
.radio
[0]), _("use existing"));
971 gtk_grid_attach (GTK_GRID (group_grid
), ddata
.radio
[1], 0, row
, 3, 1);
974 label
= make_label(_("A_ccount:"), 0, 0.5);
975 ddata
.label2
= label
;
976 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
978 ddata
.getwidget2
= ui_acc_comboboxentry_new(NULL
);
979 gtk_grid_attach (GTK_GRID (group_grid
), ddata
.getwidget2
, 2, row
, 1, 1);
982 if( ictx
->next_acc_key
> 0 ) //if there were already some accounts
984 gtk_widget_set_sensitive(ddata
.radio
[1], TRUE
);
985 if( item
->imp_key
> 0 )
987 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ddata
.radio
[1]), TRUE
);
992 gtk_widget_set_sensitive(ddata
.radio
[1], FALSE
);
996 gtk_entry_set_text(GTK_ENTRY(ddata
.getwidget1
), item
->name
);
997 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(ddata
.getwidget2
), GLOBALS
->h_acc
, ACC_LST_INSERT_NORMAL
);
998 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(ddata
.getwidget2
), item
->imp_key
);
1000 ui_import_panel_account_change_action_toggled_cb(GTK_RADIO_BUTTON (ddata
.radio
[0]), NULL
);
1002 gtk_widget_show_all(group_grid
);
1004 g_signal_connect (ddata
.radio
[0], "toggled", G_CALLBACK (ui_import_panel_account_change_action_toggled_cb
), NULL
);
1008 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
1010 if(result
== GTK_RESPONSE_ACCEPT
)
1016 key
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(ddata
.getwidget2
));
1018 bnew
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ddata
.radio
[0]));
1022 name
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(ddata
.getwidget1
));
1024 if(strcasecmp(name
, item
->name
))
1027 DB( g_print("name '%s', existing acc %d\n", name
, key
) );
1031 if( account_rename(item
, name
) == FALSE
)
1033 ui_dialog_msg_infoerror(GTK_WINDOW(dialog
), GTK_MESSAGE_ERROR
,
1035 _("Cannot rename this Account,\n"
1036 "from '%s' to '%s',\n"
1037 "this name already exists."),
1051 item
->imp_key
= key
;
1054 //we should refresh duplicate
1055 ui_import_panel_transaction_find_duplicate(data
);
1056 ui_import_panel_transaction_fill(data
);
1060 // cleanup and destroy
1061 gtk_widget_destroy (dialog
);
1067 static void ui_import_panel_filechooser_selection_changed(GtkWidget
*widget
, gpointer user_data
)
1069 struct import_data
*data
= user_data
;
1071 GtkWidget
*current_page
;
1074 page_number
= gtk_assistant_get_current_page (GTK_ASSISTANT(data
->assistant
));
1076 DB( g_print("\n[import] selchange (page %d)\n", page_number
+1) );
1078 data
->valid
= FALSE
;
1080 filename
= gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data
->filechooser
));
1081 if( filename
== NULL
)
1083 gtk_label_set_text(GTK_LABEL(data
->user_info
), _("Please select a file..."));
1084 //current_page = gtk_assistant_get_nth_page (GTK_ASSISTANT(data->assistant), page_number);
1085 //gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), current_page, FALSE);
1089 if( page_number
== PAGE_SELECTFILE
)
1092 g_free( data
->filename
);
1093 data
->filename
= filename
;
1094 //DB( g_print(" filename -> %s\n", data->filename) );
1096 data
->filetype
= homebank_alienfile_recognize(data
->filename
);
1097 switch(data
->filetype
)
1100 gtk_label_set_text(GTK_LABEL(data
->user_info
), _("QIF file recognised !"));
1106 gtk_label_set_text(GTK_LABEL(data
->user_info
), _("OFX file recognised !"));
1109 gtk_label_set_text(GTK_LABEL(data
->user_info
), _("** OFX support is disabled **"));
1113 case FILETYPE_CSV_HB
:
1114 gtk_label_set_text(GTK_LABEL(data
->user_info
), _("CSV transaction file recognised !"));
1119 data
->filetype
= FILETYPE_UNKNOW
;
1120 gtk_label_set_text(GTK_LABEL(data
->user_info
), _("Unknown/Invalid file..."));
1124 current_page
= gtk_assistant_get_nth_page (GTK_ASSISTANT(data
->assistant
), page_number
);
1125 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), current_page
, data
->valid
);
1131 if(data
->valid
== TRUE
)
1133 gtk_widget_show(data
->ok_image
);
1134 gtk_widget_hide(data
->ko_image
);
1138 gtk_widget_show(data
->ko_image
);
1139 gtk_widget_hide(data
->ok_image
);
1146 static void ui_import_panel_transaction_fill_same(GtkTreeSelection
*treeselection
, gpointer user_data
)
1148 struct import_data
*data
;
1149 GtkTreeSelection
*selection
;
1150 GtkTreeModel
*model
, *newmodel
;
1151 GtkTreeIter iter
, newiter
;
1153 GtkWidget
*view
, *widget
;
1155 widget
= GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
));
1158 //DB( g_print("\n[import] fillsame\n") );
1160 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1162 view
= data
->duplicat_ope
;
1164 newmodel
= gtk_tree_view_get_model(GTK_TREE_VIEW(view
));
1166 gtk_list_store_clear (GTK_LIST_STORE(newmodel
));
1170 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->imported_ope
));
1171 //if true there is a selected node
1172 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
1176 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &item
, -1);
1178 if( item
->same
!= NULL
)
1180 tmplist
= g_list_first(item
->same
);
1181 while (tmplist
!= NULL
)
1183 Transaction
*tmp
= tmplist
->data
;
1185 /* append to our treeview */
1186 gtk_list_store_append (GTK_LIST_STORE(newmodel
), &newiter
);
1188 gtk_list_store_set (GTK_LIST_STORE(newmodel
), &newiter
,
1189 LST_DSPOPE_DATAS
, tmp
,
1192 //DB( g_print(" - fill: %s %.2f %x\n", item->wording, item->amount, (unsigned int)item->same) );
1194 tmplist
= g_list_next(tmplist
);
1206 static void ui_import_panel_properties_fill(struct import_data
*data
)
1208 ImportContext
*ictx
= &data
->ictx
;
1211 /* file name & path */
1212 tmpstr
= g_path_get_basename(data
->filename
);
1213 gtk_label_set_text(GTK_LABEL(data
->TX_filename
), tmpstr
);
1216 tmpstr
= g_path_get_dirname(data
->filename
);
1217 gtk_label_set_text(GTK_LABEL(data
->TX_filepath
), tmpstr
);
1220 gtk_label_set_text(GTK_LABEL(data
->TX_encoding
), ictx
->encoding
);
1222 gtk_label_set_text(GTK_LABEL(data
->TX_datefmt
), CYA_IMPORT_DATEORDER
[ictx
->datefmt
]);
1224 /* file content detail */
1225 //TODO: difficult translation here
1226 tmpstr
= g_strdup_printf(_("account: %d - transaction: %d - payee: %d - categorie: %d"),
1232 gtk_label_set_text(GTK_LABEL(data
->TX_filedetails
), tmpstr
);
1235 DB( _import_context_debug(&data
->ictx
) );
1240 static void ui_import_panel_confirmation_fill(struct import_data
*data
)
1242 ImportContext
*ictx
= &data
->ictx
;
1244 /* account summary */
1245 ui_label_set_integer(GTK_LABEL(data
->TX_acc_upd
), data
->imp_cnt_acc
);
1246 ui_label_set_integer(GTK_LABEL(data
->TX_acc_new
), ictx
->nb_src_acc
- data
->imp_cnt_acc
);
1248 /* transaction summary */
1249 ui_label_set_integer(GTK_LABEL(data
->TX_trn_imp
), data
->imp_cnt_trn
);
1250 ui_label_set_integer(GTK_LABEL(data
->TX_trn_nop
), ictx
->cnt_new_ope
- data
->imp_cnt_trn
);
1251 ui_label_set_integer(GTK_LABEL(data
->TX_trn_asg
), data
->imp_cnt_asg
);
1256 ui_import_assistant_apply (GtkWidget
*widget
, gpointer user_data
)
1258 struct import_data
*data
;
1260 DB( g_print("\n[import] apply\n") );
1262 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1270 ui_import_assistant_close_cancel (GtkWidget
*widget
, gpointer user_data
)
1272 struct import_data
*data
;
1273 GtkWidget
*assistant
= (GtkWidget
*) user_data
;
1275 DB( g_print("\n[import] close\n") );
1277 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1279 ui_import_assistant_dispose(widget
, data
);
1285 gtk_widget_destroy (assistant
);
1290 static void _import_tryload_file(struct import_data
*data
)
1292 ImportContext
*ictx
= &data
->ictx
;
1294 DB( g_print("\n[import] try load file\n") );
1296 DB( g_print(" -> encoding='%s'\n", ictx
->encoding
) );
1297 DB( g_print(" -> date format='%s' (%d)\n", CYA_IMPORT_DATEORDER
[ictx
->datefmt
], ictx
->datefmt
) );
1300 switch(data
->filetype
)
1303 /* ofx_acc_list & ofx_ope_list are filled here */
1305 ictx
->trans_list
= homebank_ofx_import(data
->filename
, &data
->ictx
);
1309 ictx
->trans_list
= homebank_qif_import(data
->filename
, &data
->ictx
);
1312 case FILETYPE_CSV_HB
:
1313 ictx
->trans_list
= homebank_csv_import(data
->filename
, &data
->ictx
);
1317 DB( g_print(" -> result: nbtrans=%d, date errors=%d\n", ictx
->cnt_new_ope
, ictx
->cnt_err_date
) );
1323 static void import_file_import(struct import_data
*data
)
1325 ImportContext
*ictx
= &data
->ictx
;
1327 DB( g_print("\n[import] real import\n") );
1329 import_clearall(data
);
1330 ictx
->encoding
= homebank_file_getencoding(data
->filename
);
1331 _import_tryload_file(data
);
1333 // if fail, try to load with different date format
1334 if( ictx
->cnt_err_date
> 0)
1336 const gchar
*encoding
= ictx
->encoding
;
1339 for(i
=0;i
<NUM_PRF_DATEFMT
;i
++)
1343 if(i
!= PREFS
->dtex_datefmt
) //don't reload with user pref date format
1345 do_fix
= ui_dialog_msg_question(
1346 GTK_WINDOW(data
->assistant
),
1347 _("Some date convertion failed"),
1348 _("Reload using date order: '%s' ?"),
1349 CYA_IMPORT_DATEORDER
[i
]
1352 if(do_fix
== GTK_RESPONSE_YES
)
1354 DB( g_print(" fail, reload with '%s'\n", CYA_IMPORT_DATEORDER
[i
]) );
1356 import_clearall(data
);
1357 ictx
->encoding
= encoding
; //#1425986 keep encoding with us
1359 _import_tryload_file(data
);
1361 DB( g_print(" -> reloaded: nbtrans=%d, date errors=%d\n", ictx
->cnt_new_ope
, ictx
->cnt_err_date
) );
1363 if(ictx
->cnt_err_date
== 0)
1372 DB( g_print(" end of try import\n") );
1375 ictx
->trans_list
= da_transaction_sort(ictx
->trans_list
);
1380 * ui_import_assistant_forward_page_func:
1382 * define the page to be called when the user forward
1384 * Return value: the page number
1388 ui_import_assistant_forward_page_func(gint current_page
, gpointer func_data
)
1392 DB( g_print("---------------------------\n") );
1393 DB( g_print("\n[import] forward page func :: page %d\n", current_page
) );
1395 DB( g_print(" -> current: %d %s\n", current_page
, page_titles
[MIN(current_page
, NUM_PAGE
-1)] ) );
1399 struct import_data *data = func_data;
1401 for(i=0;i<NUM_PAGE;i++)
1403 g_print("%d: %d '%s'\n", i,
1404 gtk_assistant_get_page_complete(GTK_ASSISTANT(data->assistant), data->pages[i]),
1410 DB( g_print(" -> current: %d %s\n", current_page
, page_titles
[MIN(current_page
, NUM_PAGE
-1)] ) );
1412 next_page
= current_page
+ 1;
1414 switch(current_page
)
1417 // if no new account, skip the account page
1418 if(ictx->nb_new_acc == 0)
1419 next_page = PAGE_TRANSACTION;
1423 DB( g_print(" -> next: %d %s\n", next_page
, page_titles
[MIN(next_page
, NUM_PAGE
-1)] ) );
1432 ui_import_assistant_prepare (GtkWidget
*widget
, GtkWidget
*page
, gpointer user_data
)
1434 struct import_data
*data
;
1435 ImportContext
*ictx
;
1436 gint current_page
, n_pages
;
1439 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1443 current_page
= gtk_assistant_get_current_page (GTK_ASSISTANT(data
->assistant
));
1444 n_pages
= gtk_assistant_get_n_pages (GTK_ASSISTANT(data
->assistant
));
1446 DB( g_print("\n[import] prepare %d of %d\n", current_page
, n_pages
) );
1448 switch( current_page
)
1451 DB( g_print(" -> 1 intro\n") );
1452 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), page
, TRUE
);
1455 case PAGE_SELECTFILE
:
1456 DB( g_print(" -> 2 file choose\n") );
1458 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), page
, FALSE
);
1459 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), data
->pages
[PAGE_ACCOUNT
], FALSE
);
1460 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), data
->pages
[PAGE_TRANSACTION
], FALSE
);
1461 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), data
->pages
[PAGE_CONFIRM
], FALSE
);
1463 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(data
->filechooser
), PREFS
->path_import
);
1464 DB( g_print(" -> set current folder '%s'\n", PREFS
->path_import
) );
1466 // the page complete is contextual in ui_import_panel_filechooser_selection_changed
1470 DB( g_print(" -> 3 real import\n") );
1472 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), page
, FALSE
);
1473 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), data
->pages
[PAGE_ACCOUNT
], FALSE
);
1475 /* remind folder to preference */
1476 gchar
*folder
= gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(data
->filechooser
));
1477 DB( g_print(" -> store folder '%s'\n", folder
) );
1478 g_free(PREFS
->path_import
);
1479 PREFS
->path_import
= folder
;
1481 import_file_import(data
);
1482 _import_context_count(data
);
1484 if( ictx
->cnt_new_ope
> 0 && ictx
->cnt_err_date
<= 0 )
1486 if(ictx
->nb_new_acc
== 0)
1488 DB( g_print(" -> jump to Transaction page\n") );
1489 //gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), data->pages[PAGE_ACCOUNT], TRUE);
1490 gtk_assistant_next_page(GTK_ASSISTANT(data
->assistant
));
1491 gtk_assistant_next_page(GTK_ASSISTANT(data
->assistant
));
1492 gtk_assistant_next_page(GTK_ASSISTANT(data
->assistant
));
1493 //gtk_assistant_set_current_page (GTK_ASSISTANT(data->assistant), PAGE_TRANSACTION);
1497 DB( g_print(" -> jump to Account page\n") );
1498 //gtk_assistant_set_current_page (GTK_ASSISTANT(data->assistant), PAGE_ACCOUNT);
1499 gtk_assistant_next_page(GTK_ASSISTANT(data
->assistant
));
1500 gtk_assistant_next_page(GTK_ASSISTANT(data
->assistant
));
1503 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), page
, TRUE
);
1507 case PAGE_PROPERTIES
:
1508 DB( g_print(" -> 4 properties\n") );
1511 ui_import_panel_properties_fill(data
);
1513 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), page
, TRUE
);
1517 DB( g_print(" -> 5 account\n") );
1519 ui_import_panel_account_fill(data
);
1521 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), page
, TRUE
);
1524 case PAGE_TRANSACTION
:
1525 DB( g_print(" -> 6 transaction\n") );
1527 //todo: should be optional
1528 data
->imp_cnt_asg
= transaction_auto_assign(ictx
->trans_list
, 0);
1530 ui_import_panel_transaction_find_duplicate(data
);
1532 ui_import_panel_transaction_fill(data
);
1534 if( ictx
->nb_duplicate
> 0 )
1536 gtk_widget_show(data
->GR_duplicate
);
1537 gtk_expander_set_expanded(GTK_EXPANDER(data
->GR_duplicate
), TRUE
);
1541 gtk_widget_hide(data
->GR_duplicate
);
1544 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), page
, TRUE
);
1549 DB( g_print(" -> 7 confirmation\n") );
1552 import_count_changes(data
);
1554 ui_import_panel_confirmation_fill(data
);
1558 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), page
, TRUE
);
1563 title
= g_strdup_printf ( _("Import assistant (%d of %d)"), current_page
+ 1 , n_pages
);
1564 gtk_window_set_title (GTK_WINDOW (data
->assistant
), title
);
1574 ui_import_panel_transaction_refresh (GtkWidget
*widget
, gpointer data
)
1577 DB( g_print("\n[import] refresh transaction\n") );
1579 ui_import_panel_transaction_find_duplicate(data
);
1580 ui_import_panel_transaction_fill(data
);
1585 static void ui_acc_affect_listview_onRowActivated (GtkTreeView
*treeview
,
1587 GtkTreeViewColumn
*col
,
1590 //GtkTreeModel *model;
1592 //model = gtk_tree_view_get_model(treeview);
1593 //gtk_tree_model_get_iter_first(model, &iter);
1594 //if(gtk_tree_selection_iter_is_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), &iter) == FALSE)
1596 ui_import_panel_account_change_action(GTK_WIDGET(treeview
), NULL
);
1601 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1605 ui_import_panel_welcome_create(GtkWidget
*assistant
, struct import_data
*data
)
1607 GtkWidget
*vbox
, *label
, *align
;
1609 align
= gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
1610 gtk_alignment_set_padding(GTK_ALIGNMENT(align
), 0, 0, 0, 0);
1612 vbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
1613 //gtk_container_set_border_width (GTK_CONTAINER(vbox), SPACING_MEDIUM);
1614 gtk_container_add(GTK_CONTAINER(align
), vbox
);
1617 _("Welcome to the HomeBank Import Assistant.\n\n" \
1618 "With this assistant you will be guided throught the process\n" \
1619 "of importing an external file into HomeBank.\n\n" \
1620 "No changes will be made until you click \"Apply\" at the end\n" \
1621 "of this assistant.")
1623 gtk_box_pack_start (GTK_BOX (vbox
), label
, FALSE
, FALSE
, SPACING_SMALL
);
1625 /* supported format */
1629 _("HomeBank can import files in the following formats:\n" \
1631 "- OFX/QFX (optional at compilation time)\n" \
1632 "- CSV (format is specific to HomeBank, see the documentation)\n" \
1635 gtk_box_pack_start (GTK_BOX (vbox
), label
, FALSE
, FALSE
, SPACING_SMALL
);
1638 gtk_widget_show_all (align
);
1640 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), align
);
1641 gtk_assistant_set_page_type (GTK_ASSISTANT (assistant
), align
, GTK_ASSISTANT_PAGE_INTRO
);
1642 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), align
, _(page_titles
[PAGE_WELCOME
]));
1643 //gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), align, TRUE);
1650 ui_import_panel_filechooser_create (GtkWidget
*assistant
, struct import_data
*data
)
1652 GtkWidget
*vbox
, *hbox
, *align
, *widget
, *label
;
1653 GtkFileFilter
*filter
;
1655 vbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
1656 //gtk_container_set_border_width (GTK_CONTAINER(vbox), SPACING_MEDIUM);
1659 // widget = gtk_file_chooser_button_new ("Pick a File", GTK_FILE_CHOOSER_ACTION_OPEN);
1661 widget
= gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_OPEN
);
1665 data
->filechooser
= widget
;
1666 gtk_box_pack_start (GTK_BOX (vbox
), widget
, TRUE
, TRUE
, 0);
1668 filter
= gtk_file_filter_new ();
1669 gtk_file_filter_set_name (filter
, _("Known files"));
1670 gtk_file_filter_add_pattern (filter
, "*.[Qq][Ii][Ff]");
1672 gtk_file_filter_add_pattern (filter
, "*.[OoQq][Ff][Xx]");
1674 gtk_file_filter_add_pattern (filter
, "*.[Cc][Ss][Vv]");
1675 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget
), filter
);
1676 if(data
->filetype
== FILETYPE_UNKNOW
)
1677 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(widget
), filter
);
1679 filter
= gtk_file_filter_new ();
1680 gtk_file_filter_set_name (filter
, _("QIF files"));
1681 gtk_file_filter_add_pattern (filter
, "*.[Qq][Ii][Ff]");
1682 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget
), filter
);
1683 if(data
->filetype
== FILETYPE_QIF
)
1684 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(widget
), filter
);
1687 filter
= gtk_file_filter_new ();
1688 gtk_file_filter_set_name (filter
, _("OFX/QFX files"));
1689 gtk_file_filter_add_pattern (filter
, "*.[OoQq][Ff][Xx]");
1690 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget
), filter
);
1691 if(data
->filetype
== FILETYPE_OFX
)
1692 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(widget
), filter
);
1695 filter
= gtk_file_filter_new ();
1696 gtk_file_filter_set_name (filter
, _("CSV files"));
1697 gtk_file_filter_add_pattern (filter
, "*.[Cc][Ss][Vv]");
1698 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget
), filter
);
1699 if(data
->filetype
== FILETYPE_CSV_HB
)
1700 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(widget
), filter
);
1703 filter
= gtk_file_filter_new ();
1704 gtk_file_filter_set_name (filter
, _("All files"));
1705 gtk_file_filter_add_pattern (filter
, "*");
1706 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget
), filter
);
1709 /* our addon message */
1710 align
= gtk_alignment_new(0.65, 0, 0, 0);
1711 gtk_box_pack_start (GTK_BOX (vbox
), align
, FALSE
, FALSE
, 0);
1713 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 0);
1714 gtk_container_add(GTK_CONTAINER(align
), hbox
);
1716 label
= gtk_label_new("");
1717 data
->user_info
= label
;
1718 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, SPACING_SMALL
);
1720 gimp_label_set_attributes (GTK_LABEL (label
),
1721 PANGO_ATTR_SCALE
, PANGO_SCALE_LARGE
,
1722 PANGO_ATTR_WEIGHT
, PANGO_WEIGHT_BOLD
,
1727 widget
= gtk_image_new_from_icon_name(ICONNAME_HB_FILE_VALID
, GTK_ICON_SIZE_LARGE_TOOLBAR
);
1728 data
->ok_image
= widget
;
1729 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1731 widget
= gtk_image_new_from_icon_name(ICONNAME_HB_FILE_INVALID
, GTK_ICON_SIZE_LARGE_TOOLBAR
);
1732 data
->ko_image
= widget
;
1733 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1736 gtk_widget_show_all (vbox
);
1737 gtk_widget_hide(data
->ok_image
);
1738 gtk_widget_hide(data
->ko_image
);
1741 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), vbox
);
1742 //gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), vbox, GTK_ASSISTANT_PAGE_CONTENT);
1743 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), vbox
, _(page_titles
[PAGE_SELECTFILE
]));
1752 ui_import_panel_import_create (GtkWidget
*assistant
, struct import_data
*data
)
1754 GtkWidget
*align
, *content_grid
;
1755 GtkWidget
*label
, *widget
;
1758 align
= gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
1760 content_grid
= gtk_grid_new();
1761 gtk_grid_set_column_spacing (GTK_GRID (content_grid
), SPACING_MEDIUM
);
1762 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid
), GTK_ORIENTATION_VERTICAL
);
1763 gtk_container_add(GTK_CONTAINER(align
), content_grid
);
1765 widget
= gtk_image_new_from_icon_name(ICONNAME_ERROR
, GTK_ICON_SIZE_DIALOG
);
1766 gtk_grid_attach (GTK_GRID (content_grid
), widget
, 0, 0, 1, 1);
1768 txt
= _("A general error occured, and this file cannot be loaded.");
1769 label
= gtk_label_new(txt
);
1770 gtk_widget_set_valign (label
, GTK_ALIGN_CENTER
);
1771 gtk_grid_attach (GTK_GRID (content_grid
), label
, 1, 0, 1, 1);
1773 gtk_widget_show_all (align
);
1774 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), align
);
1775 //gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), align, GTK_ASSISTANT_PAGE_PROGRESS);
1776 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), align
, _(page_titles
[PAGE_IMPORT
]));
1784 ui_import_panel_properties_create (GtkWidget
*assistant
, struct import_data
*data
)
1786 GtkWidget
*content_grid
, *group_grid
;
1787 GtkWidget
*label
, *widget
;
1790 content_grid
= gtk_grid_new();
1791 gtk_grid_set_row_spacing (GTK_GRID (content_grid
), SPACING_LARGE
);
1792 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid
), GTK_ORIENTATION_VERTICAL
);
1795 // group :: File properties
1796 group_grid
= gtk_grid_new ();
1797 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1798 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1799 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
++, 1, 1);
1801 label
= make_label_group(_("File properties"));
1802 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, 0, 3, 1);
1805 label
= make_label(_("Name:"), 0.0, 0.5);
1806 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
1807 widget
= make_label(NULL
, 0.0, 0.5);
1808 data
->TX_filename
= widget
;
1809 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1812 label
= make_label(_("Path:"), 0.0, 0.5);
1813 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
1814 widget
= make_label(NULL
, 0.0, 0.5);
1815 data
->TX_filepath
= widget
;
1816 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1819 label
= make_label(_("Encoding:"), 0.0, 0.5);
1820 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
1821 widget
= make_label(NULL
, 0.0, 0.5);
1822 data
->TX_encoding
= widget
;
1823 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1826 label
= make_label(_("Date format:"), 0.0, 0.5);
1827 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
1828 widget
= make_label(NULL
, 0.0, 0.5);
1829 data
->TX_datefmt
= widget
;
1830 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1832 // group :: File content
1833 group_grid
= gtk_grid_new ();
1834 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1835 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1836 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
++, 1, 1);
1838 label
= make_label_group(_("File content"));
1839 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, 0, 3, 1);
1842 label
= make_label(_("Content:"), 0.0, 0.5);
1843 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
1844 widget
= make_label(NULL
, 0.0, 0.5);
1845 data
->TX_filedetails
= widget
;
1846 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1849 expander = gtk_expander_new (_("File content"));
1850 gtk_box_pack_start (GTK_BOX (container), expander, TRUE, TRUE, 0);
1851 scrollwin = gtk_scrolled_window_new(NULL,NULL);
1852 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1853 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN);
1854 widget = gtk_text_view_new ();
1855 gtk_container_add(GTK_CONTAINER(scrollwin), widget);
1856 gtk_container_add(GTK_CONTAINER(expander), scrollwin);
1860 gtk_widget_show_all (content_grid
);
1862 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), content_grid
);
1863 //set page type to intro to avoid going back once that point over
1864 gtk_assistant_set_page_type (GTK_ASSISTANT (assistant
), content_grid
, GTK_ASSISTANT_PAGE_INTRO
);
1865 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), content_grid
, _(page_titles
[PAGE_PROPERTIES
]));
1867 return content_grid
;
1872 ui_import_panel_account_create (GtkWidget
*assistant
, struct import_data
*data
)
1874 GtkWidget
*content_grid
, *group_grid
;
1875 GtkWidget
*label
, *widget
, *scrollwin
;
1878 content_grid
= gtk_grid_new();
1879 gtk_grid_set_row_spacing (GTK_GRID (content_grid
), SPACING_LARGE
);
1880 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid
), GTK_ORIENTATION_VERTICAL
);
1884 group_grid
= gtk_grid_new ();
1886 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1887 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1888 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
++, 1, 1);
1890 //label = make_label_group(_("Title"));
1891 //gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 2, 1);
1894 widget
= gtk_image_new ();
1895 data
->IM_acc
= widget
;
1896 gtk_widget_set_valign(widget
, GTK_ALIGN_START
);
1897 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 0, row
, 1, 1);
1898 label
= make_label(NULL
, 0, 0.5);
1899 data
->LB_acc
= label
;
1900 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 2, 1);
1902 // group :: Account list
1903 group_grid
= gtk_grid_new ();
1904 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1905 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1906 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
++, 1, 1);
1908 label
= make_label_group(_("Choose the action for accounts"));
1909 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, 0, 1, 1);
1912 scrollwin
= gtk_scrolled_window_new(NULL
,NULL
);
1913 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
1914 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
1915 gtk_widget_set_size_request(scrollwin
, -1, HB_MINWIDTH_LIST
);
1917 widget
= ui_acc_affect_listview_new();
1918 data
->LV_acc
= widget
;
1919 gtk_container_add(GTK_CONTAINER(scrollwin
), widget
);
1920 gtk_widget_set_hexpand(scrollwin
, TRUE
);
1921 gtk_grid_attach (GTK_GRID (group_grid
), scrollwin
, 0, row
, 1, 1);
1924 widget
= gtk_button_new_with_mnemonic (_("Change _action"));
1925 data
->BT_edit
= widget
;
1926 gtk_widget_set_halign(widget
, GTK_ALIGN_START
);
1927 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 0, row
, 1, 1);
1929 /* signal and other stuff */
1930 g_signal_connect (G_OBJECT (data
->BT_edit
), "clicked", G_CALLBACK (ui_import_panel_account_change_action
), data
);
1931 g_signal_connect (GTK_TREE_VIEW(data
->LV_acc
), "row-activated", G_CALLBACK (ui_acc_affect_listview_onRowActivated
), NULL
);
1933 gtk_widget_show_all (content_grid
);
1934 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), content_grid
);
1935 //gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), content_grid, GTK_ASSISTANT_PAGE_INTRO);
1936 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), content_grid
, _(page_titles
[PAGE_ACCOUNT
]));
1938 return content_grid
;
1943 ui_import_panel_transaction_create (GtkWidget
*assistant
, struct import_data
*data
)
1945 GtkWidget
*content_grid
, *group_grid
;
1946 GtkWidget
*label
, *scrollwin
, *widget
, *expander
;
1949 content_grid
= gtk_grid_new();
1950 gtk_grid_set_row_spacing (GTK_GRID (content_grid
), SPACING_LARGE
);
1951 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid
), GTK_ORIENTATION_VERTICAL
);
1955 group_grid
= gtk_grid_new ();
1956 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1957 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1958 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
++, 1, 1);
1960 //label = make_label_group(_("Title"));
1961 //gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1964 widget
= gtk_image_new ();
1965 data
->IM_txn
= widget
;
1966 gtk_widget_set_valign(widget
, GTK_ALIGN_START
);
1967 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 0, row
, 1, 1);
1968 label
= make_label(NULL
, 0, 0.5);
1969 data
->LB_txn
= label
;
1970 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 2, 1);
1972 // group :: Transactions to import
1973 group_grid
= gtk_grid_new ();
1974 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1975 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1976 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
++, 1, 1);
1978 label
= make_label_group(_("Choose transactions to import"));
1979 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, 0, 2, 1);
1982 scrollwin
= gtk_scrolled_window_new (NULL
, NULL
);
1983 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
1984 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwin
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
1985 gtk_widget_set_hexpand(scrollwin
, TRUE
);
1986 gtk_widget_set_vexpand(scrollwin
, TRUE
);
1987 widget
= create_list_import_transaction(TRUE
);
1988 data
->imported_ope
= widget
;
1989 gtk_container_add (GTK_CONTAINER (scrollwin
), widget
);
1990 gtk_grid_attach (GTK_GRID (group_grid
), scrollwin
, 0, row
, 2, 1);
1992 expander
= gtk_expander_new (_("Detail of existing transaction (possible duplicate)"));
1993 data
->GR_duplicate
= expander
;
1994 gtk_grid_attach (GTK_GRID (group_grid
), expander
, 0, crow
++, 2, 1);
1996 group_grid
= gtk_grid_new ();
1997 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1998 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1999 gtk_container_add (GTK_CONTAINER (expander
), group_grid
);
2002 scrollwin
= gtk_scrolled_window_new (NULL
, NULL
);
2003 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
2004 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwin
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
2005 gtk_widget_set_hexpand(scrollwin
, TRUE
);
2006 //widget = create_list_transaction(LIST_TXN_TYPE_IMPORT, list_imptxn_columns);
2007 widget
= create_list_import_transaction(FALSE
);
2008 data
->duplicat_ope
= widget
;
2009 gtk_container_add (GTK_CONTAINER (scrollwin
), widget
);
2010 gtk_widget_set_size_request(scrollwin
, -1, HB_MINWIDTH_LIST
/2);
2011 gtk_grid_attach (GTK_GRID (group_grid
), scrollwin
, 0, row
, 6, 1);
2014 label
= make_label(_("Date _tolerance:"), 0, 0.5);
2015 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
2017 widget
= make_numeric(label
, 0.0, 14.0);
2018 data
->NB_maxgap
= widget
;
2019 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
2021 //TRANSLATORS: there is a spinner on the left of this label, and so you have 0....x days of date tolerance
2022 label
= make_label(_("days"), 0, 0.5);
2023 gtk_grid_attach (GTK_GRID (group_grid
), label
, 2, row
, 1, 1);
2025 widget
= gtk_button_new_with_mnemonic (_("_Refresh"));
2026 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 3, row
, 1, 1);
2027 g_signal_connect (widget
, "clicked",
2028 G_CALLBACK (ui_import_panel_transaction_refresh
), data
);
2030 widget
= gtk_image_new_from_icon_name(ICONNAME_INFO
, GTK_ICON_SIZE_SMALL_TOOLBAR
);
2031 gtk_widget_set_hexpand(widget
, FALSE
);
2032 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 4, row
, 1, 1);
2034 label
= make_label (_(
2035 "The match is done in order: by account, amount and date.\n" \
2036 "A date tolerance of 0 day means an exact match"), 0, 0.5);
2037 gimp_label_set_attributes (GTK_LABEL (label
),
2038 PANGO_ATTR_SCALE
, PANGO_SCALE_SMALL
,
2040 gtk_widget_set_hexpand(label
, TRUE
);
2041 gtk_grid_attach (GTK_GRID (group_grid
), label
, 5, row
, 1, 1);
2044 gtk_widget_show_all (content_grid
);
2046 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), content_grid
);
2047 // gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), content_grid, GTK_ASSISTANT_PAGE_PROGRESS);
2048 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), content_grid
, _(page_titles
[PAGE_TRANSACTION
]));
2050 return content_grid
;
2055 ui_import_panel_confirmation_create(GtkWidget
*assistant
, struct import_data
*data
)
2057 GtkWidget
*vbox
, *label
, *align
, *widget
, *table
;
2060 align
= gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
2061 gtk_alignment_set_padding(GTK_ALIGNMENT(align
), 0, 0, 0, 0);
2063 vbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
2064 gtk_container_set_border_width (GTK_CONTAINER(vbox
), SPACING_MEDIUM
);
2065 gtk_container_add(GTK_CONTAINER(align
), vbox
);
2068 _("Click \"Apply\" to update your accounts.\n"), 0.5, 0.5);
2069 gtk_box_pack_start (GTK_BOX (vbox
), label
, FALSE
, FALSE
, 0);
2072 table
= gtk_grid_new ();
2073 gtk_container_set_border_width (GTK_CONTAINER (table
), SPACING_SMALL
);
2074 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_SMALL
/2);
2075 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
2076 gtk_box_pack_start (GTK_BOX (vbox
), table
, FALSE
, FALSE
, 0);
2079 label
= make_label(_("Accounts"), 0.0, 0.5);
2080 gimp_label_set_attributes(GTK_LABEL(label
), PANGO_ATTR_WEIGHT
, PANGO_WEIGHT_BOLD
, -1);
2081 gtk_grid_attach (GTK_GRID (table
), label
, 0, row
, 3, 1);
2085 label
= make_label(NULL
, 0.0, 0.5);
2086 //gtk_misc_set_padding (GTK_MISC (label), SPACING_SMALL, 0);
2087 gtk_grid_attach (GTK_GRID (table
), label
, 0, row
, 1, 1);
2088 widget
= make_label(NULL
, 1.0, 0.5);
2089 data
->TX_acc_upd
= widget
;
2090 gtk_grid_attach (GTK_GRID (table
), widget
, 1, row
, 1, 1);
2091 label
= make_label(_("to update"), 0.0, 0.5);
2092 gtk_grid_attach (GTK_GRID (table
), label
, 2, row
, 1, 1);
2096 widget
= make_label(NULL
, 1.0, 0.5);
2097 data
->TX_acc_new
= widget
;
2098 gtk_grid_attach (GTK_GRID (table
), widget
, 1, row
, 1, 1);
2099 label
= make_label(_("to create"), 0.0, 0.5);
2100 gtk_grid_attach (GTK_GRID (table
), label
, 2, row
, 1, 1);
2103 label
= make_label(_("Transactions"), 0.0, 0.5);
2104 gimp_label_set_attributes(GTK_LABEL(label
), PANGO_ATTR_WEIGHT
, PANGO_WEIGHT_BOLD
, -1);
2105 gtk_grid_attach (GTK_GRID (table
), label
, 0, row
, 3, 1);
2109 widget
= make_label(NULL
, 1.0, 0.5);
2110 data
->TX_trn_imp
= widget
;
2111 gtk_grid_attach (GTK_GRID (table
), widget
, 1, row
, 1, 1);
2112 label
= make_label(_("to import"), 0.0, 0.5);
2113 gtk_grid_attach (GTK_GRID (table
), label
, 2, row
, 1, 1);
2117 widget
= make_label(NULL
, 1.0, 0.5);
2118 data
->TX_trn_nop
= widget
;
2119 gtk_grid_attach (GTK_GRID (table
), widget
, 1, row
, 1, 1);
2120 label
= make_label(_("to reject"), 0.0, 0.5);
2121 gtk_grid_attach (GTK_GRID (table
), label
, 2, row
, 1, 1);
2123 /* trn auto-assigned */
2125 widget
= make_label(NULL
, 1.0, 0.5);
2126 data
->TX_trn_asg
= widget
;
2127 gtk_grid_attach (GTK_GRID (table
), widget
, 1, row
, 1, 1);
2128 label
= make_label(_("auto-assigned"), 0.0, 0.5);
2129 gtk_grid_attach (GTK_GRID (table
), label
, 2, row
, 1, 1);
2132 gtk_widget_show_all (align
);
2134 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), align
);
2135 gtk_assistant_set_page_type (GTK_ASSISTANT (assistant
), align
, GTK_ASSISTANT_PAGE_CONFIRM
);
2136 //gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), label, TRUE);
2137 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), align
, _(page_titles
[PAGE_CONFIRM
]));
2143 /* starting point of import */
2144 GtkWidget
*ui_import_assistant_new (gint filetype
)
2146 struct import_data
*data
;
2147 GtkWidget
*assistant
;
2150 data
= g_malloc0(sizeof(struct import_data
));
2151 if(!data
) return NULL
;
2153 data
->filetype
= filetype
;
2155 assistant
= gtk_assistant_new ();
2156 data
->assistant
= assistant
;
2158 //store our window private data
2159 g_object_set_data(G_OBJECT(assistant
), "inst_data", (gpointer
)data
);
2160 //DB( g_print("** \n[import] window=%x, inst_data=%x\n", assistant, data) );
2163 gtk_window_set_modal(GTK_WINDOW (assistant
), TRUE
);
2164 gtk_window_set_transient_for(GTK_WINDOW(assistant
), GTK_WINDOW(GLOBALS
->mainwindow
));
2166 //set a nice dialog size
2167 gtk_window_get_size(GTK_WINDOW(GLOBALS
->mainwindow
), &w
, &h
);
2168 gtk_window_set_default_size (GTK_WINDOW(assistant
), w
*0.8, h
*0.8);
2172 data
->pages
[pos
++] = ui_import_panel_welcome_create (assistant
, data
);
2173 data
->pages
[pos
++] = ui_import_panel_filechooser_create (assistant
, data
);
2174 data
->pages
[pos
++] = ui_import_panel_import_create (assistant
, data
);
2175 data
->pages
[pos
++] = ui_import_panel_properties_create (assistant
, data
);
2176 data
->pages
[pos
++] = ui_import_panel_account_create (assistant
, data
);
2177 data
->pages
[pos
++] = ui_import_panel_transaction_create (assistant
, data
);
2178 data
->pages
[pos
++] = ui_import_panel_confirmation_create (assistant
, data
);
2180 gtk_assistant_set_forward_page_func(GTK_ASSISTANT(assistant
), ui_import_assistant_forward_page_func
, data
, NULL
);
2184 ui_import_panel_filechooser_selection_changed(assistant
, data
);
2186 //connect all our signals
2187 //g_signal_connect (window, "delete-event", G_CALLBACK (hbfile_dispose), (gpointer)data);
2189 g_signal_connect (G_OBJECT (assistant
), "cancel", G_CALLBACK (ui_import_assistant_close_cancel
), assistant
);
2191 g_signal_connect (G_OBJECT (assistant
), "close", G_CALLBACK (ui_import_assistant_close_cancel
), assistant
);
2193 g_signal_connect (G_OBJECT (assistant
), "apply", G_CALLBACK (ui_import_assistant_apply
), NULL
);
2195 g_signal_connect (G_OBJECT (assistant
), "prepare", G_CALLBACK (ui_import_assistant_prepare
), NULL
);
2197 g_signal_connect (G_OBJECT (data
->filechooser
), "selection-changed",
2198 G_CALLBACK (ui_import_panel_filechooser_selection_changed
), (gpointer
)data
);
2200 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->imported_ope
)), "changed",
2201 G_CALLBACK (ui_import_panel_transaction_fill_same
), NULL
);
2203 gtk_widget_show (assistant
);
2205 gtk_assistant_set_page_complete (GTK_ASSISTANT(assistant
), data
->pages
[PAGE_WELCOME
], TRUE
);
2206 gtk_assistant_set_current_page(GTK_ASSISTANT(assistant
), PAGE_SELECTFILE
);