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 "hb-import.h"
23 #include "ui-assist-import.h"
24 #include "dsp-mainwindow.h"
25 #include "list-operation.h"
28 /****************************************************************************/
30 /****************************************************************************/
40 /* our global datas */
41 extern struct HomeBank
*GLOBALS
;
42 extern struct Preferences
*PREFS
;
46 extern gchar
*CYA_IMPORT_DATEORDER
[];
48 extern gchar
*CYA_IMPORT_OFXNAME
[];
49 extern gchar
*CYA_IMPORT_OFXMEMO
[];
52 static void ui_import_page_filechooser_eval(GtkWidget
*widget
, gpointer user_data
);
55 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
59 static void list_txn_cell_data_function_debug (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
64 gtk_tree_model_get(model
, iter
,
65 LST_GENTXN_POINTER
, &gentxn
,
68 text
= g_strdup_printf("%d %d > %d", gentxn
->is_imp_similar
, gentxn
->is_dst_similar
, gentxn
->to_import
);
70 g_object_set(renderer
,
79 static void list_txn_cell_data_function_toggle (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
83 gtk_tree_model_get(model
, iter
,
84 LST_GENTXN_POINTER
, &gentxn
,
87 g_object_set(renderer
, "active", gentxn
->to_import
, NULL
);
91 static void list_txn_cell_data_function_warning (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
94 gchar
*iconname
= NULL
;
96 // get the transaction
97 gtk_tree_model_get(model
, iter
,
98 LST_GENTXN_POINTER
, &gentxn
,
101 //iconname = ( gentxn->julian == 0 ) ? ICONNAME_WARNING : NULL;
102 //if(iconname == NULL)
103 iconname
= ( gentxn
->is_dst_similar
|| gentxn
->is_imp_similar
) ? ICONNAME_HB_OPE_SIMILAR
: NULL
;
105 g_object_set(renderer
, "icon-name", iconname
, NULL
);
109 static void list_txn_cell_data_function_error (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
112 gchar
*iconname
= NULL
;
114 // get the transaction
115 gtk_tree_model_get(model
, iter
,
116 LST_GENTXN_POINTER
, &gentxn
,
119 iconname
= ( gentxn
->julian
== 0 ) ? ICONNAME_ERROR
: NULL
;
121 g_object_set(renderer
, "icon-name", iconname
, NULL
);
125 static void list_txn_cell_data_function_text (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
127 gint colid
= GPOINTER_TO_INT(user_data
);
133 gtk_tree_model_get(model
, iter
,
134 LST_GENTXN_POINTER
, &item
,
139 case LST_DSPOPE_DATE
: //date
145 g_date_set_julian(&date
, item
->julian
);
146 //#1794170 %F is ignored under ms windows
147 //g_date_strftime (buf, 12-1, "%F", &date);
148 g_date_strftime (buf
, 12-1, "%Y-%m-%d", &date
);
154 color
= PREFS
->color_warn
;
157 g_object_set(renderer
,
161 //g_object_set(renderer, "text", item->date, NULL);
163 case LST_DSPOPE_MEMO
: //memo
166 case LST_DSPOPE_PAYEE
: //payee
169 case LST_DSPOPE_CATEGORY
: //category
170 text
= item
->category
;
174 g_object_set(renderer
,
177 //"scale", item->to_import ? 1.0 : 0.8,
178 "strikethrough-set", TRUE
,
179 "strikethrough", item
->to_import
? FALSE
: TRUE
,
186 ** amount cell function
188 static void list_txn_cell_data_function_amount (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
191 gchar formatd_buf
[G_ASCII_DTOSTR_BUF_SIZE
];
194 gtk_tree_model_get(model
, iter
,
195 LST_GENTXN_POINTER
, &item
,
198 //todo: we could use digit and currency of target account
199 //hb_strfnum(buf, G_ASCII_DTOSTR_BUF_SIZE-1, item->amount, GLOBALS->kcur, FALSE);
200 //hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, ope->amount, GLOBALS->minor);
201 g_ascii_formatd(formatd_buf
, G_ASCII_DTOSTR_BUF_SIZE
-1, "%.2f", item
->amount
);
203 color
= get_normal_color_amount(item
->amount
);
205 g_object_set(renderer
,
213 static void list_txn_cell_data_function_info (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
217 gtk_tree_model_get(model
, iter
,
218 LST_GENTXN_POINTER
, &item
,
221 switch(GPOINTER_TO_INT(user_data
))
224 g_object_set(renderer
, "icon-name", get_paymode_icon_name(item
->paymode
), NULL
);
227 g_object_set(renderer
, "text", item
->info
, NULL
);
233 static void list_txn_importfixed_toggled (GtkCellRendererToggle
*cell
, gchar
*path_str
, gpointer data
)
235 GtkTreeModel
*model
= (GtkTreeModel
*)data
;
237 GtkTreePath
*path
= gtk_tree_path_new_from_string (path_str
);
240 gtk_tree_model_get_iter (model
, &iter
, path
);
241 gtk_tree_model_get (model
, &iter
, LST_GENTXN_POINTER
, &gentxn
, -1);
242 gentxn
->to_import
^= 1;
243 gtk_tree_path_free (path
);
247 static gint
list_txn_import_compare_func (GtkTreeModel
*model
, GtkTreeIter
*a
, GtkTreeIter
*b
, gpointer userdata
)
249 gint sortcol
= GPOINTER_TO_INT(userdata
);
251 GenTxn
*gentxn1
, *gentxn2
;
253 gtk_tree_model_get(model
, a
, LST_GENTXN_POINTER
, &gentxn1
, -1);
254 gtk_tree_model_get(model
, b
, LST_GENTXN_POINTER
, &gentxn2
, -1);
258 case LST_DSPOPE_MEMO
:
259 retval
= hb_string_utf8_compare(gentxn1
->memo
, gentxn2
->memo
);
261 case LST_DSPOPE_AMOUNT
:
262 retval
= (gentxn1
->amount
- gentxn2
->amount
) > 0 ? 1 : -1;
264 case LST_DSPOPE_PAYEE
:
265 retval
= hb_string_utf8_compare(gentxn1
->payee
, gentxn2
->payee
);
267 case LST_DSPOPE_CATEGORY
:
268 retval
= hb_string_utf8_compare(gentxn1
->category
, gentxn2
->category
);
270 case LST_DSPOPE_DATE
:
272 retval
= gentxn1
->julian
- gentxn2
->julian
;
280 static GtkTreeViewColumn
*
281 list_txn_import_column_text_create(gchar
*title
, gint sortcolumnid
, gpointer user_data
)
283 GtkTreeViewColumn
*column
;
284 GtkCellRenderer
*renderer
;
286 renderer
= gtk_cell_renderer_text_new ();
287 /*g_object_set(renderer,
288 "ellipsize", PANGO_ELLIPSIZE_END,
289 "ellipsize-set", TRUE,
291 if( sortcolumnid
== LST_DSPOPE_AMOUNT
)
292 g_object_set(renderer
, "xalign", 1.0, NULL
);
294 column
= gtk_tree_view_column_new_with_attributes(title
, renderer
, NULL
);
295 gtk_tree_view_column_set_alignment (column
, 0.5);
296 gtk_tree_view_column_set_sort_column_id (column
, sortcolumnid
);
298 if(sortcolumnid
== LST_DSPOPE_AMOUNT
)
299 gtk_tree_view_column_set_cell_data_func(column
, renderer
, list_txn_cell_data_function_amount
, GINT_TO_POINTER(sortcolumnid
), NULL
);
301 gtk_tree_view_column_set_cell_data_func(column
, renderer
, list_txn_cell_data_function_text
, GINT_TO_POINTER(sortcolumnid
), NULL
);
308 static GtkWidget
*list_txn_import_create(void)
312 GtkCellRenderer
*renderer
;
313 GtkTreeViewColumn
*column
;
315 /* create list store */
316 store
= gtk_list_store_new(
322 treeview
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
323 g_object_unref(store
);
325 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (treeview
), PREFS
->grid_lines
|GTK_TREE_VIEW_GRID_LINES_VERTICAL
);
327 // debug/import checkbox
328 column
= gtk_tree_view_column_new();
330 renderer
= gtk_cell_renderer_text_new ();
331 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
332 gtk_tree_view_column_set_cell_data_func(column
, renderer
, list_txn_cell_data_function_debug
, NULL
, NULL
);
334 renderer
= gtk_cell_renderer_toggle_new ();
335 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
336 gtk_tree_view_column_set_cell_data_func(column
, renderer
, list_txn_cell_data_function_toggle
, NULL
, NULL
);
337 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
338 g_signal_connect (renderer
, "toggled", G_CALLBACK (list_txn_importfixed_toggled
), store
);
341 column
= gtk_tree_view_column_new();
342 //gtk_tree_view_column_set_title(column, _("Import ?"));
343 renderer
= gtk_cell_renderer_pixbuf_new ();
344 //gtk_cell_renderer_set_fixed_size(renderer, 16, -1);
345 //gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1);
346 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
347 gtk_tree_view_column_set_cell_data_func(column
, renderer
, list_txn_cell_data_function_warning
, NULL
, NULL
);
348 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
351 column
= gtk_tree_view_column_new();
352 renderer
= gtk_cell_renderer_pixbuf_new ();
353 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
354 gtk_tree_view_column_set_cell_data_func(column
, renderer
, list_txn_cell_data_function_error
, NULL
, NULL
);
355 renderer
= gtk_cell_renderer_text_new ();
356 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
357 gtk_tree_view_column_set_cell_data_func(column
, renderer
, list_txn_cell_data_function_text
, GINT_TO_POINTER(LST_DSPOPE_DATE
), NULL
);
358 gtk_tree_view_column_set_title (column
, _("Date"));
359 gtk_tree_view_column_set_sort_column_id (column
, LST_DSPOPE_DATE
);
360 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
363 column
= list_txn_import_column_text_create(_("Memo"), LST_DSPOPE_MEMO
, NULL
);
364 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
367 column
= list_txn_import_column_text_create(_("Amount"), LST_DSPOPE_AMOUNT
, NULL
);
368 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
371 column
= gtk_tree_view_column_new();
372 gtk_tree_view_column_set_title(column
, _("Info"));
373 renderer
= gtk_cell_renderer_pixbuf_new ();
374 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
375 gtk_tree_view_column_set_cell_data_func(column
, renderer
, list_txn_cell_data_function_info
, GINT_TO_POINTER(1), NULL
);
376 renderer
= gtk_cell_renderer_text_new ();
377 /*g_object_set(renderer,
378 "ellipsize", PANGO_ELLIPSIZE_END,
379 "ellipsize-set", TRUE,
381 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
382 gtk_tree_view_column_set_cell_data_func(column
, renderer
, list_txn_cell_data_function_info
, GINT_TO_POINTER(2), NULL
);
383 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
386 column
= list_txn_import_column_text_create(_("Payee"), LST_DSPOPE_PAYEE
, NULL
);
387 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
390 column
= list_txn_import_column_text_create(_("Category"), LST_DSPOPE_CATEGORY
, NULL
);
391 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
394 column
= gtk_tree_view_column_new();
395 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
397 //gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store), list_txn_import_compare_func, NULL, NULL);
398 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store
), LST_DSPOPE_DATE
, list_txn_import_compare_func
, GINT_TO_POINTER(LST_DSPOPE_DATE
), NULL
);
399 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store
), LST_DSPOPE_MEMO
, list_txn_import_compare_func
, GINT_TO_POINTER(LST_DSPOPE_MEMO
), NULL
);
400 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store
), LST_DSPOPE_AMOUNT
, list_txn_import_compare_func
, GINT_TO_POINTER(LST_DSPOPE_AMOUNT
), NULL
);
401 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store
), LST_DSPOPE_PAYEE
, list_txn_import_compare_func
, GINT_TO_POINTER(LST_DSPOPE_PAYEE
), NULL
);
402 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store
), LST_DSPOPE_CATEGORY
, list_txn_import_compare_func
, GINT_TO_POINTER(LST_DSPOPE_CATEGORY
), NULL
);
408 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
410 static gint
ui_genacc_comboboxtext_get_active(GtkWidget
*widget
)
416 g_return_val_if_fail(GTK_IS_COMBO_BOX(widget
), key
);
418 if( gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget
), &iter
))
420 model
= gtk_combo_box_get_model (GTK_COMBO_BOX(widget
));
422 gtk_tree_model_get(model
, &iter
,
423 LST_GENACC_KEY
, &key
,
430 static void ui_genacc_comboboxtext_set_active(GtkWidget
*widget
, gint active_key
)
437 g_return_if_fail(GTK_IS_COMBO_BOX(widget
));
439 model
= gtk_combo_box_get_model(GTK_COMBO_BOX(widget
));
440 valid
= gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model
), &iter
);
443 gtk_tree_model_get(model
, &iter
,
444 LST_GENACC_KEY
, &key
,
446 if(key
== active_key
)
447 gtk_combo_box_set_active_iter (GTK_COMBO_BOX(widget
), &iter
);
449 valid
= gtk_tree_model_iter_next(GTK_TREE_MODEL(model
), &iter
);
454 static GtkWidget
*ui_genacc_comboboxtext_new(struct import_data
*data
, GtkWidget
*label
)
457 GtkCellRenderer
*renderer
;
462 store
= gtk_list_store_new (NUM_LST_GENACC
, G_TYPE_STRING
, G_TYPE_INT
);
463 combobox
= gtk_combo_box_new_with_model (GTK_TREE_MODEL(store
));
465 renderer
= gtk_cell_renderer_text_new();
466 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox
), renderer
, FALSE
);
467 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox
), renderer
, "text", LST_GENACC_NAME
);
469 g_object_unref(store
);
471 gtk_list_store_insert_with_values (GTK_LIST_STORE(store
), &iter
, -1,
472 LST_GENACC_NAME
, _("<New account (global)>"),
473 LST_GENACC_KEY
, DST_ACC_GLOBAL
,
476 gtk_list_store_insert_with_values (GTK_LIST_STORE(store
), &iter
, -1,
477 LST_GENACC_NAME
, _("<New account>"),
478 LST_GENACC_KEY
, DST_ACC_NEW
,
481 lacc
= list
= account_glist_sorted(0);
484 Account
*item
= list
->data
;
486 if( !(item
->flags
& AF_CLOSED
) )
488 gtk_list_store_insert_with_values (GTK_LIST_STORE(store
), &iter
, -1,
489 LST_GENACC_NAME
, item
->name
,
490 LST_GENACC_KEY
, item
->key
,
493 list
= g_list_next(list
);
497 gtk_list_store_insert_with_values (GTK_LIST_STORE(store
), &iter
, -1,
498 LST_GENACC_NAME
, _("<Skip this account>"),
499 LST_GENACC_KEY
, DST_ACC_SKIP
,
502 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox
), 0);
505 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), combobox
);
512 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
520 static GtkTargetEntry drop_types
[] =
522 {"text/uri-list", 0, TARGET_URI_LIST
}
527 list_file_add(GtkWidget
*treeview
, GenFile
*genfile
)
533 basename
= g_path_get_basename(genfile
->filepath
);
535 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(treeview
));
537 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
538 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
539 LST_GENFILE_POINTER
, genfile
,
540 LST_GENFILE_NAME
, g_strdup(basename
),
547 static void list_file_drag_data_received (GtkWidget
*widget
,
548 GdkDragContext
*context
,
550 GtkSelectionData
*selection_data
,
551 guint info
, guint time
, GtkWindow
*window
)
553 struct import_data
*data
;
558 if (info
!= TARGET_URI_LIST
)
561 DB( g_print("\n[ui-treeview] drag_data_received\n") );
563 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
565 /* On MS-Windows, it looks like `selection_data->data' is not NULL terminated. */
566 slen
= gtk_selection_data_get_length(selection_data
);
567 newseldata
= g_new (gchar
, slen
+ 1);
568 memcpy (newseldata
, gtk_selection_data_get_data(selection_data
), slen
);
569 newseldata
[slen
] = 0;
571 uris
= g_uri_list_extract_uris (newseldata
);
573 ImportContext
*ictx
= &data
->ictx
;
576 for (str
= uris
; *str
; str
++)
579 GError
*error
= NULL
;
580 gchar
*path
= g_filename_from_uri (*str
, NULL
, &error
);
586 genfile
= da_gen_file_append_from_filename(ictx
, path
);
588 list_file_add(data
->LV_file
, genfile
);
592 g_warning ("Could not convert uri to local path: %s", error
->message
);
593 g_error_free (error
);
601 ui_import_page_filechooser_eval(widget
, NULL
);
606 list_file_valid_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
609 gchar
*iconname
= NULL
;
611 gtk_tree_model_get(model
, iter
,
612 LST_GENFILE_POINTER
, &genfile
,
615 iconname
= (genfile
->filetype
== FILETYPE_UNKNOWN
) ? ICONNAME_HB_FILE_INVALID
: ICONNAME_HB_FILE_VALID
;
617 g_object_set(renderer
, "icon-name", iconname
, NULL
);
626 GtkCellRenderer
*renderer
;
627 GtkTreeViewColumn
*column
;
630 store
= gtk_list_store_new(NUM_LST_FILE
,
636 treeview
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
637 g_object_unref(store
);
640 column
= gtk_tree_view_column_new();
641 gtk_tree_view_column_set_title(column
, _("Valid"));
642 renderer
= gtk_cell_renderer_pixbuf_new ();
643 //gtk_cell_renderer_set_fixed_size(renderer, 16, -1);
644 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
645 gtk_tree_view_column_set_cell_data_func(column
, renderer
, list_file_valid_cell_data_function
, NULL
, NULL
);
646 gtk_tree_view_column_set_alignment (column
, 0.5);
647 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
648 g_object_set(renderer
, "stock-size", GTK_ICON_SIZE_LARGE_TOOLBAR
, NULL
);
651 renderer
= gtk_cell_renderer_text_new ();
652 column
= gtk_tree_view_column_new_with_attributes (_("Name"),
657 gtk_tree_view_column_set_sort_column_id (column
, LST_GENFILE_NAME
);
658 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
662 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(treeview
), TRUE
);
664 //gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store), ui_acc_listview_compare_func, NULL, NULL);
665 //gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
667 gtk_drag_dest_set (GTK_WIDGET (treeview
),
668 GTK_DEST_DEFAULT_ALL
,
670 G_N_ELEMENTS (drop_types
),
673 g_signal_connect (G_OBJECT (treeview
), "drag-data-received",
674 G_CALLBACK (list_file_drag_data_received
), treeview
);
681 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
684 static void ui_import_page_filechooser_remove_action(GtkWidget
*widget
, gpointer user_data
)
686 struct import_data
*data
;
690 GtkTreeSelection
*selection
;
692 DB( g_print("\n[ui-import] page_filechooser_remove_action\n") );
694 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
697 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_file
));
698 //if true there is a selected node
699 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
703 gtk_tree_model_get(model
, &iter
, LST_GENFILE_POINTER
, &genfile
, -1);
705 //remove genacc & gentxn
706 gtk_list_store_remove(GTK_LIST_STORE(model
), &iter
);
708 ictx
->gen_lst_file
= g_list_remove(ictx
->gen_lst_file
, genfile
);
709 da_gen_file_free(genfile
);
712 ui_import_page_filechooser_eval(widget
, NULL
);
716 static void ui_import_page_filechooser_add_action(GtkWidget
*widget
, gpointer user_data
)
718 struct import_data
*data
;
721 GtkFileFilter
*filter
;
724 DB( g_print("\n[ui-import] page_filechooser_add_action\n") );
726 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
729 dialog
= gtk_file_chooser_dialog_new ("Open File",
730 GTK_WINDOW(data
->assistant
),
731 GTK_FILE_CHOOSER_ACTION_OPEN
,
738 gtk_window_set_position(GTK_WINDOW(data
->assistant
), GTK_WIN_POS_CENTER_ON_PARENT
);
740 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(dialog
), PREFS
->path_import
);
741 DB( g_print(" set current folder '%s'\n", PREFS
->path_import
) );
743 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog
), TRUE
);
745 filter
= gtk_file_filter_new ();
746 gtk_file_filter_set_name (filter
, _("Known files"));
747 gtk_file_filter_add_pattern (filter
, "*.[Qq][Ii][Ff]");
749 gtk_file_filter_add_pattern (filter
, "*.[OoQq][Ff][Xx]");
751 gtk_file_filter_add_pattern (filter
, "*.[Cc][Ss][Vv]");
752 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog
), filter
);
753 //if(data->filetype == FILETYPE_UNKNOWN)
754 // gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog), filter);
756 filter
= gtk_file_filter_new ();
757 gtk_file_filter_set_name (filter
, _("QIF files"));
758 gtk_file_filter_add_pattern (filter
, "*.[Qq][Ii][Ff]");
759 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog
), filter
);
760 //if(data->filetype == FILETYPE_QIF)
761 // gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog), filter);
764 filter
= gtk_file_filter_new ();
765 gtk_file_filter_set_name (filter
, _("OFX/QFX files"));
766 gtk_file_filter_add_pattern (filter
, "*.[OoQq][Ff][Xx]");
767 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog
), filter
);
768 //if(data->filetype == FILETYPE_OFX)
769 // gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog), filter);
772 filter
= gtk_file_filter_new ();
773 gtk_file_filter_set_name (filter
, _("CSV files"));
774 gtk_file_filter_add_pattern (filter
, "*.[Cc][Ss][Vv]");
775 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog
), filter
);
776 //if(data->filetype == FILETYPE_CSV_HB)
777 // gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog), filter);
779 filter
= gtk_file_filter_new ();
780 gtk_file_filter_set_name (filter
, _("All files"));
781 gtk_file_filter_add_pattern (filter
, "*");
782 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog
), filter
);
785 res
= gtk_dialog_run (GTK_DIALOG (dialog
));
786 if (res
== GTK_RESPONSE_ACCEPT
)
790 GtkFileChooser
*chooser
= GTK_FILE_CHOOSER (dialog
);
791 list
= gtk_file_chooser_get_filenames(chooser
);
796 DB( g_print(" selected '%p'\n", list
->data
) );
798 genfile
= da_gen_file_append_from_filename(ictx
, list
->data
);
800 list_file_add(data
->LV_file
, genfile
);
802 list
= g_slist_next(list
);
804 g_slist_free_full (list
, g_free
);
806 /* remind folder to preference */
807 gchar
*folder
= gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(chooser
));
808 DB( g_print(" store folder '%s'\n", folder
) );
809 g_free(PREFS
->path_import
);
810 PREFS
->path_import
= folder
;
813 gtk_widget_destroy (dialog
);
815 ui_import_page_filechooser_eval(widget
, NULL
);
820 static void ui_import_page_confirmation_fill(struct import_data
*data
)
822 ImportContext
*ictx
= &data
->ictx
;
826 DB( g_print("\n[ui-import] page_confirmation_fill\n") );
828 node
= g_string_sized_new(255);
830 list
= g_list_first(ictx
->gen_lst_acc
);
833 GenAcc
*genacc
= list
->data
;
834 gchar
*targetname
= NULL
;
836 switch( genacc
->kacc
)
839 targetname
= _("new global account");
842 targetname
= _("new account");
845 targetname
= _("skipped");
849 Account
*acc
= da_acc_get (genacc
->kacc
);
852 targetname
= acc
->name
;
858 g_string_append_printf(node
, "<b>'%s'</b>\n => '%s'", genacc
->name
, targetname
);
861 if( genacc
->kacc
!= DST_ACC_SKIP
)
863 hb_import_gen_acc_count_txn(ictx
, genacc
);
864 g_string_append_printf(node
, _(", %d of %d transactions"), genacc
->n_txnimp
, genacc
->n_txnall
);
867 g_string_append(node
, "\n\n");
869 list
= g_list_next(list
);
872 gtk_label_set_markup (GTK_LABEL(data
->TX_summary
), node
->str
);
874 g_string_free(node
, TRUE
);
878 static gboolean
ui_import_page_import_eval(GtkWidget
*widget
, gpointer user_data
)
880 //struct import_data *data;
881 //ImportContext *ictx;
884 DB( g_print("\n[ui-import] page_import_eval\n") );
887 //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
888 //ictx = &data->ictx;
890 //count = g_list_length (ictx->gen_lst_acc);
892 //DB( g_print(" count=%d (max=%d)\n", count, TXN_MAX_ACCOUNT) );
894 //if( count <= TXN_MAX_ACCOUNT )
901 static void ui_import_page_filechooser_eval(GtkWidget
*widget
, gpointer user_data
)
903 struct import_data
*data
;
908 DB( g_print("\n[ui-import] page_filechooser_eval\n") );
911 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
914 list
= g_list_first(ictx
->gen_lst_file
);
917 GenFile
*genfile
= list
->data
;
919 if(genfile
->filetype
!= FILETYPE_UNKNOWN
)
922 list
= g_list_next(list
);
925 gint index
= gtk_assistant_get_current_page(GTK_ASSISTANT(data
->assistant
));
926 GtkWidget
*current_page
= gtk_assistant_get_nth_page (GTK_ASSISTANT(data
->assistant
), index
);
927 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), current_page
, (count
> 0) ? TRUE
: FALSE
);
932 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
935 static ImpTxnData
*ui_import_page_transaction_data_get(GArray
*txndata
, guint32 idx
)
939 /*g_print(" array @%p, len is %d\n", txndata, txndata->len);
940 for(i=0;i<txndata->len;i++)
941 g_print(" %d %p\n", i, &g_array_index(txndata, ImpTxnData, i) );
943 g_print(" get idx=%d - %p\n", idx, &g_array_index (txndata, ImpTxnData, idx) );
946 if( idx
<= txndata
->len
)
947 return &g_array_index (txndata
, ImpTxnData
, idx
);
954 static void ui_import_page_transaction_cb_fill_same(GtkTreeSelection
*treeselection
, gpointer user_data
)
956 struct import_data
*data
;
958 //ImportContext *ictx;
959 GtkTreeSelection
*selection
;
960 GtkTreeModel
*model
, *dupmodel
;
961 GtkTreeIter iter
, newiter
;
966 DB( g_print("\n[ui-import] page_transaction_cb_fill_same\n") );
968 widget
= GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
));
970 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
972 //ictx = &data->ictx;
974 gint pageidx
= gtk_assistant_get_current_page(GTK_ASSISTANT(data
->assistant
));
975 gint acckey
= pageidx
- (PAGE_IMPORT
);
976 //GenAcc *genacc = da_gen_acc_get_by_key(ictx->gen_lst_acc, acckey);
978 //txndata = &data->txndata[acckey];
979 txndata
= ui_import_page_transaction_data_get(data
->txndata
, acckey
);
981 dupmodel
= gtk_tree_view_get_model(GTK_TREE_VIEW(txndata
->LV_duptxn
));
982 gtk_list_store_clear (GTK_LIST_STORE(dupmodel
));
984 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(txndata
->LV_gentxn
));
986 //if true there is a selected node
987 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
991 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &gentxn
, -1);
993 if( gentxn
->lst_existing
!= NULL
)
995 tmplist
= g_list_first(gentxn
->lst_existing
);
996 while (tmplist
!= NULL
)
998 Transaction
*tmp
= tmplist
->data
;
1000 /* append to our treeview */
1001 //gtk_list_store_append (GTK_LIST_STORE(dupmodel), &newiter);
1002 //gtk_list_store_set (GTK_LIST_STORE(dupmodel), &newiter,
1004 gtk_list_store_insert_with_values(GTK_LIST_STORE(dupmodel
), &newiter
, -1,
1005 LST_DSPOPE_DATAS
, tmp
,
1008 //DB( g_print(" - fill: %s %.2f %x\n", item->memo, item->amount, (unsigned int)item->same) );
1010 tmplist
= g_list_next(tmplist
);
1015 gtk_expander_set_expanded (GTK_EXPANDER(txndata
->EX_duptxn
), (count
> 0) ? TRUE
: FALSE
);
1020 static void ui_import_page_transaction_options_get(struct import_data
*data
)
1022 ImpTxnData
*txndata
;
1023 ImportContext
*ictx
;
1026 DB( g_print("\n[ui-import] options_get\n") );
1030 gint pageidx
= gtk_assistant_get_current_page(GTK_ASSISTANT(data
->assistant
));
1031 gint accidx
= pageidx
- (PAGE_IMPORT
);
1032 //GenAcc *genacc = g_list_nth_data(ictx->gen_lst_acc, accidx);
1034 //txndata = &data->txndata[accidx];
1035 txndata
= ui_import_page_transaction_data_get(data
->txndata
, accidx
);
1037 ictx
->opt_dateorder
= gtk_combo_box_get_active (GTK_COMBO_BOX(txndata
->CY_txn_dateorder
));
1038 ictx
->opt_daygap
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(txndata
->NB_txn_daygap
));
1039 ictx
->opt_ucfirst
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(txndata
->CM_txn_ucfirst
));
1041 ictx
->opt_ofxname
= gtk_combo_box_get_active (GTK_COMBO_BOX(txndata
->CY_txn_ofxname
));
1042 ictx
->opt_ofxmemo
= gtk_combo_box_get_active (GTK_COMBO_BOX(txndata
->CY_txn_ofxmemo
));
1044 ictx
->opt_qifmemo
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(txndata
->CM_txn_qifmemo
));
1045 ictx
->opt_qifswap
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(txndata
->CM_txn_qifswap
));
1047 DB( g_print(" datefmt = '%s' (%d)\n", CYA_IMPORT_DATEORDER
[ictx
->opt_dateorder
], ictx
->opt_dateorder
) );
1051 static void ui_import_page_transaction_update(struct import_data
*data
)
1053 ImpTxnData
*txndata
;
1054 ImportContext
*ictx
;
1055 gboolean sensitive
, visible
;
1056 gboolean iscomplete
;
1057 GtkTreeModel
*model
;
1059 DB( g_print("\n[ui-import] page_transaction_update\n") );
1063 gint pageidx
= gtk_assistant_get_current_page(GTK_ASSISTANT(data
->assistant
));
1064 gint acckey
= pageidx
- (PAGE_IMPORT
);
1065 //GenAcc *genacc = g_list_nth_data(ictx->gen_lst_acc, acckey);
1066 GenAcc
*genacc
= da_gen_acc_get_by_key(ictx
->gen_lst_acc
, acckey
);
1068 //txndata = &data->txndata[acckey];
1069 txndata
= ui_import_page_transaction_data_get(data
->txndata
, acckey
);
1071 DB( g_print(" page idx:%d, genacckey:%d genacc:%p, txndata:%p\n", pageidx
, acckey
, genacc
, txndata
) );
1075 DB( g_print(" genacc id=%d name='%s'\n dstacc=%d\n", acckey
, genacc
->name
, genacc
->kacc
) );
1077 visible
= (genacc
->is_unamed
== TRUE
) && (genacc
->filetype
!= FILETYPE_CSV_HB
) ? TRUE
: FALSE
;
1078 hb_widget_visible (txndata
->IM_unamed
, visible
);
1080 sensitive
= (genacc
->kacc
== DST_ACC_SKIP
) ? FALSE
: TRUE
;
1081 DB( g_print(" sensitive=%d\n", sensitive
) );
1083 gtk_widget_set_sensitive(txndata
->LV_gentxn
, sensitive
);
1084 gtk_widget_set_sensitive(txndata
->EX_duptxn
, sensitive
);
1085 //todo: disable option button
1086 gtk_widget_set_sensitive(txndata
->GR_misc
, sensitive
);
1087 gtk_widget_set_sensitive(txndata
->GR_date
, sensitive
);
1088 gtk_widget_set_sensitive(txndata
->GR_ofx
, sensitive
);
1089 gtk_widget_set_sensitive(txndata
->GR_qif
, sensitive
);
1090 gtk_widget_set_sensitive(txndata
->GR_select
, sensitive
);
1092 //todo: display a warning if incorrect date
1093 gchar
*msg_icon
= NULL
, *msg_label
= NULL
;
1095 iscomplete
= (genacc
->n_txnbaddate
> 0) ? FALSE
: TRUE
;
1096 iscomplete
= (genacc
->kacc
== DST_ACC_SKIP
) ? TRUE
: iscomplete
;
1098 DB( g_print(" nbbaddates=%d, dstacc=%d\n", genacc
->n_txnbaddate
, genacc
->kacc
) );
1099 DB( g_print(" iscomplete=%d\n", iscomplete
) );
1101 //show/hide invalid date group
1103 if(genacc
->n_txnbaddate
> 0)
1106 DB( g_print(" invalid date detected\n" ) );
1107 msg_icon
= ICONNAME_ERROR
;
1109 _("Some date cannot be converted. Please try to change the date order to continue.");
1111 gtk_image_set_from_icon_name(GTK_IMAGE(txndata
->IM_txn
), msg_icon
, GTK_ICON_SIZE_BUTTON
);
1112 gtk_label_set_text(GTK_LABEL(txndata
->LB_txn
), msg_label
);
1113 hb_widget_visible (txndata
->GR_msg
, visible
);
1115 //show/hide duplicate
1117 if( genacc
->kacc
==DST_ACC_GLOBAL
|| genacc
->kacc
==DST_ACC_NEW
|| genacc
->kacc
==DST_ACC_SKIP
)
1119 hb_widget_visible (txndata
->EX_duptxn
, visible
);
1121 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(txndata
->LV_gentxn
));
1123 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model
), LST_DSPOPE_DATE
, GTK_SORT_ASCENDING
);
1124 //gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
1125 //gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
1127 GtkWidget
*page
= gtk_assistant_get_nth_page (GTK_ASSISTANT(data
->assistant
), pageidx
);
1128 gtk_assistant_set_page_complete(GTK_ASSISTANT(data
->assistant
), page
, iscomplete
);
1134 static void ui_import_page_transaction_cb_account_changed(GtkWidget
*widget
, gpointer user_data
)
1136 struct import_data
*data
;
1137 ImpTxnData
*txndata
;
1138 ImportContext
*ictx
;
1141 DB( g_print("\n[ui-import] cb_account_changed\n") );
1143 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1147 gint pageidx
= gtk_assistant_get_current_page(GTK_ASSISTANT(data
->assistant
));
1148 gint acckey
= pageidx
- (PAGE_IMPORT
);
1149 //GenAcc *genacc = g_list_nth_data(ictx->gen_lst_acc, accidx);
1150 GenAcc
*genacc
= da_gen_acc_get_by_key(ictx
->gen_lst_acc
, acckey
);
1152 //txndata = &data->txndata[acckey];
1153 txndata
= ui_import_page_transaction_data_get(data
->txndata
, acckey
);
1155 dstacc
= ui_genacc_comboboxtext_get_active (txndata
->CY_acc
);
1156 genacc
->kacc
= dstacc
;
1158 ui_import_page_transaction_options_get(data
);
1159 hb_import_option_apply(ictx
, genacc
);
1160 hb_import_gen_txn_check_duplicate(ictx
, genacc
);
1161 hb_import_gen_txn_check_target_similar(ictx
, genacc
);
1162 genacc
->is_dupcheck
= TRUE
;
1164 gtk_tree_view_columns_autosize(GTK_TREE_VIEW(txndata
->LV_gentxn
));
1166 ui_import_page_transaction_update(data
);
1170 static void ui_import_page_transaction_cb_option_changed(GtkWidget
*widget
, gpointer user_data
)
1172 struct import_data
*data
;
1173 ImpTxnData
*txndata
;
1174 ImportContext
*ictx
;
1177 DB( g_print("\n[ui-import] cb_option_changed\n") );
1179 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1183 gint pageidx
= gtk_assistant_get_current_page(GTK_ASSISTANT(data
->assistant
));
1184 gint acckey
= pageidx
- (PAGE_IMPORT
);
1185 //GenAcc *genacc = g_list_nth_data(ictx->gen_lst_acc, accidx);
1186 GenAcc
*genacc
= da_gen_acc_get_by_key(ictx
->gen_lst_acc
, acckey
);
1188 //txndata = &data->txndata[acckey];
1189 txndata
= ui_import_page_transaction_data_get(data
->txndata
, acckey
);
1191 ui_import_page_transaction_options_get(data
);
1192 hb_import_option_apply(ictx
, genacc
);
1194 gtk_tree_view_columns_autosize(GTK_TREE_VIEW(txndata
->LV_gentxn
));
1196 ui_import_page_transaction_update(data
);
1200 static void ui_import_page_transaction_fill(struct import_data
*data
)
1202 ImpTxnData
*txndata
;
1203 ImportContext
*ictx
= &data
->ictx
;
1205 GtkTreeModel
*model
;
1208 gchar
*label
= NULL
;
1212 DB( g_print("\n[ui-import] page_transaction_fill\n") );
1214 //get the account, it will be the account into the glist
1215 //of pagenum - PAGE_IMPORT
1216 //gint pageidx = gtk_assistant_get_current_page(GTK_ASSISTANT(data->assistant));
1217 gint acckey
= gtk_assistant_get_current_page(GTK_ASSISTANT(data
->assistant
)) - (PAGE_IMPORT
);
1218 //GenAcc *genacc = g_list_nth_data(ictx->gen_lst_acc, acckey);
1219 GenAcc
*genacc
= da_gen_acc_get_by_key(ictx
->gen_lst_acc
, acckey
);
1220 //nbacc = g_list_length(ictx->gen_lst_acc);
1222 //txndata = &data->txndata[acckey];
1223 txndata
= ui_import_page_transaction_data_get(data
->txndata
, acckey
);
1225 DB( g_print(" genacckey:%d genacc:%p, txndata:%p\n", acckey
, genacc
, txndata
) );
1231 DB( g_print(" genacc id=%d name='%s'\n dstacc=%d\n", acckey
, genacc
->name
, genacc
->kacc
) );
1233 g_signal_handlers_block_by_func(txndata
->CY_acc
, G_CALLBACK(ui_import_page_transaction_cb_account_changed
), NULL
);
1234 ui_genacc_comboboxtext_set_active(txndata
->CY_acc
, genacc
->kacc
);
1235 g_signal_handlers_unblock_by_func(txndata
->CY_acc
, G_CALLBACK(ui_import_page_transaction_cb_account_changed
), NULL
);
1237 ui_import_page_transaction_options_get(data
);
1238 hb_import_option_apply(ictx
, genacc
);
1239 if( genacc
->is_dupcheck
== FALSE
)
1241 hb_import_gen_txn_check_duplicate(ictx
, genacc
);
1242 hb_import_gen_txn_check_target_similar(ictx
, genacc
);
1243 genacc
->is_dupcheck
= TRUE
;
1246 view
= txndata
->LV_gentxn
;
1247 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(view
));
1248 gtk_list_store_clear (GTK_LIST_STORE(model
));
1251 tmplist
= g_list_first(ictx
->gen_lst_txn
);
1252 while (tmplist
!= NULL
)
1254 GenTxn
*item
= tmplist
->data
;
1256 //todo: chnage this, this should be account
1257 if(item
->kacc
== genacc
->key
)
1259 // append to our treeview
1260 //gtk_list_store_append (GTK_LIST_STORE(model), &iter);
1261 //gtk_list_store_set (GTK_LIST_STORE(model), &iter,
1262 gtk_list_store_insert_with_values(GTK_LIST_STORE(model
), &iter
, -1,
1263 LST_GENTXN_POINTER
, item
,
1266 DB( g_print(" fill: %s, %d, %s %.2f\n", item
->account
, item
->julian
, item
->memo
, item
->amount
) );
1269 tmplist
= g_list_next(tmplist
);
1272 //label = g_strdup_printf(_("'%s' - %s"), genacc->name, hb_import_filetype_char_get(genacc));
1273 label
= g_strdup_printf(_("Import <b>%s</b> in_to:"), genacc
->is_unamed
? _("this file") : _("this account") );
1274 gtk_label_set_markup_with_mnemonic (GTK_LABEL(txndata
->LB_acc_title
), label
);
1278 GenFile
*genfile
= da_gen_file_get (ictx
->gen_lst_file
, genacc
->kfile
);
1280 label
= g_strdup_printf(_("Name: %s\nNumber: %s\nFile: %s\nEncoding: %s"), genacc
->name
, genacc
->number
, genfile
->filepath
, genfile
->encoding
);
1281 gtk_widget_set_tooltip_text (GTK_WIDGET(txndata
->LB_acc_title
), label
);
1284 //label = g_strdup_printf(_("Account %d of %d"), acckey+1, nbacc);
1285 //gtk_label_set_markup (GTK_LABEL(txndata->LB_acc_count), label);
1288 label
= g_strdup_printf(_("%d transactions"), count
);
1289 gtk_label_set_markup (GTK_LABEL(txndata
->LB_txn_title
), label
);
1292 visible
= (genacc
->filetype
== FILETYPE_OFX
) ? FALSE
: TRUE
;
1293 hb_widget_visible(GTK_WIDGET(txndata
->GR_date
), visible
);
1295 visible
= (genacc
->filetype
== FILETYPE_OFX
) ? TRUE
: FALSE
;
1296 hb_widget_visible(GTK_WIDGET(txndata
->GR_ofx
), visible
);
1298 visible
= (genacc
->filetype
== FILETYPE_QIF
) ? TRUE
: FALSE
;
1299 hb_widget_visible(GTK_WIDGET(txndata
->GR_qif
), visible
);
1301 gtk_stack_set_visible_child_name(GTK_STACK(txndata
->ST_stack
), visible
? "QIF" : "OFX");
1309 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1313 ui_import_page_intro_cb_dontshow(GtkWidget
*widget
, gpointer user_data
)
1315 PREFS
->dtex_nointro
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget
));
1320 ui_import_page_intro_create(GtkWidget
*assistant
, struct import_data
*data
)
1322 GtkWidget
*mainbox
, *label
, *widget
;
1325 mainbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
1326 gtk_widget_set_halign(mainbox
, GTK_ALIGN_CENTER
);
1327 gtk_widget_set_valign(mainbox
, GTK_ALIGN_CENTER
);
1330 label
= make_label(_("Import transactions from bank or credit card"), 0, 0);
1331 gimp_label_set_attributes(GTK_LABEL(label
),
1332 PANGO_ATTR_WEIGHT
, PANGO_WEIGHT_BOLD
,
1333 PANGO_ATTR_SCALE
, PANGO_SCALE_LARGE
,
1335 gtk_box_pack_start (GTK_BOX (mainbox
), label
, FALSE
, FALSE
, SPACING_SMALL
);
1338 _("With this assistant you will be guided through the process of importing one or several\n" \
1339 "downloaded statements from your bank or credit card, in the following formats:"), 0, 0);
1340 gtk_box_pack_start (GTK_BOX (mainbox
), label
, FALSE
, FALSE
, SPACING_SMALL
);
1342 label
= gtk_label_new(NULL
);
1343 gtk_label_set_markup(GTK_LABEL(label
),
1344 _("<b>Recommended:</b> .OFX or .QFX\n" \
1345 "<i>(Sometimes named Moneyâ„¢ or Quickenâ„¢)</i>\n" \
1346 "<b>Supported:</b> .QIF\n" \
1347 "<i>(Common Quickenâ„¢ file)</i>\n" \
1348 "<b>Advanced users only:</b> .CSV\n"
1349 "<i>(format is specific to HomeBank, see the documentation)</i>"));
1352 /* supported format */
1353 /*label = make_label(
1354 _("HomeBank can import files in the following formats:\n" \
1356 "- OFX/QFX (optional at compilation time)\n" \
1357 "- CSV (format is specific to HomeBank, see the documentation)\n" \
1360 gtk_box_pack_start (GTK_BOX (mainbox
), label
, FALSE
, FALSE
, SPACING_SMALL
);
1364 _("No changes will be made until you click \"Apply\" at the end of this assistant."), 0., 0.0);
1365 gtk_box_pack_start (GTK_BOX (mainbox
), label
, FALSE
, FALSE
, SPACING_SMALL
);
1368 widget
= gtk_check_button_new_with_mnemonic (_("Don't show this again"));
1369 data
->CM_dsta
= widget
;
1370 gtk_box_pack_end (GTK_BOX (mainbox
), widget
, FALSE
, FALSE
, SPACING_SMALL
);
1372 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data
->CM_dsta
), PREFS
->dtex_nointro
);
1375 gtk_widget_show_all (mainbox
);
1377 g_signal_connect (data
->CM_dsta
, "toggled", G_CALLBACK (ui_import_page_intro_cb_dontshow
), data
);
1384 static void ui_import_page_filechooser_update(GtkWidget
*widget
, gpointer user_data
)
1386 struct import_data
*data
;
1387 GtkTreeSelection
*selection
;
1390 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1392 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_file
));
1394 gint count
= gtk_tree_selection_count_selected_rows(selection
);
1396 sensitive
= (count
> 0) ? TRUE
: FALSE
;
1397 gtk_widget_set_sensitive(data
->BT_file_remove
, sensitive
);
1398 //gtk_widget_set_sensitive(data->BT_merge, sensitive);
1399 //gtk_widget_set_sensitive(data->BT_delete, sensitive);
1404 static void ui_import_page_filechooser_selection(GtkTreeSelection
*treeselection
, gpointer user_data
)
1406 ui_import_page_filechooser_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), NULL
);
1411 ui_import_page_filechooser_create (GtkWidget
*assistant
, struct import_data
*data
)
1413 GtkWidget
*mainbox
, *vbox
, *hbox
, *widget
, *label
, *scrollwin
, *tbar
;
1414 GtkToolItem
*toolitem
;
1416 mainbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
1417 //gtk_container_set_border_width (GTK_CONTAINER(vbox), SPACING_SMALL);
1419 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 0);
1420 gtk_box_pack_start (GTK_BOX (mainbox
), hbox
, FALSE
, FALSE
, SPACING_SMALL
);
1422 widget
= gtk_image_new_from_icon_name (ICONNAME_INFO
, GTK_ICON_SIZE_LARGE_TOOLBAR
);
1423 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, SPACING_SMALL
);
1427 _("Drag&Drop one or several files to import.\n" \
1428 "You can also use the add/remove buttons of the list.")
1430 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, SPACING_SMALL
);
1435 vbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, 0);
1436 gtk_box_pack_start (GTK_BOX (mainbox
), vbox
, TRUE
, TRUE
, 0);
1439 scrollwin
= gtk_scrolled_window_new (NULL
, NULL
);
1440 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
1441 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwin
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
1442 gtk_widget_set_hexpand(scrollwin
, TRUE
);
1443 gtk_widget_set_vexpand(scrollwin
, TRUE
);
1444 widget
= list_file_new();
1445 data
->LV_file
= widget
;
1446 gtk_container_add (GTK_CONTAINER (scrollwin
), widget
);
1447 //gtk_grid_attach (GTK_GRID (group_grid), scrollwin, 0, row, 2, 1);
1448 gtk_box_pack_start (GTK_BOX (vbox
), scrollwin
, TRUE
, TRUE
, 0);
1451 tbar
= gtk_toolbar_new();
1452 gtk_toolbar_set_icon_size (GTK_TOOLBAR(tbar
), GTK_ICON_SIZE_MENU
);
1453 gtk_toolbar_set_style(GTK_TOOLBAR(tbar
), GTK_TOOLBAR_ICONS
);
1454 gtk_style_context_add_class (gtk_widget_get_style_context (tbar
), GTK_STYLE_CLASS_INLINE_TOOLBAR
);
1455 gtk_box_pack_start (GTK_BOX (vbox
), tbar
, FALSE
, FALSE
, 0);
1457 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 0);
1458 toolitem
= gtk_tool_item_new();
1459 gtk_container_add (GTK_CONTAINER(toolitem
), hbox
);
1460 gtk_toolbar_insert(GTK_TOOLBAR(tbar
), GTK_TOOL_ITEM(toolitem
), -1);
1462 widget
= make_image_button(ICONNAME_LIST_ADD
, NULL
);
1463 data
->BT_file_add
= widget
;
1464 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1466 widget
= make_image_button(ICONNAME_LIST_REMOVE
, NULL
);
1467 data
->BT_file_remove
= widget
;
1468 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1473 gtk_widget_show_all (mainbox
);
1475 ui_import_page_filechooser_update(assistant
, NULL
);
1478 g_signal_connect (G_OBJECT (data
->BT_file_add
), "clicked", G_CALLBACK (ui_import_page_filechooser_add_action
), data
);
1479 g_signal_connect (G_OBJECT (data
->BT_file_remove
), "clicked", G_CALLBACK (ui_import_page_filechooser_remove_action
), data
);
1482 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_file
)), "changed", G_CALLBACK (ui_import_page_filechooser_selection
), NULL
);
1490 ui_import_page_import_create (GtkWidget
*assistant
, struct import_data
*data
)
1493 GtkWidget
*label
, *widget
;
1496 mainbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1497 //gtk_widget_set_halign(mainbox, GTK_ALIGN_CENTER);
1498 //gtk_widget_set_valign(mainbox, GTK_ALIGN_CENTER);
1500 widget
= gtk_image_new_from_icon_name(ICONNAME_ERROR
, GTK_ICON_SIZE_DIALOG
);
1501 gtk_box_pack_start (GTK_BOX (mainbox
), widget
, FALSE
, FALSE
, 0);
1503 txt
= _("There is too much account in the files you choosed,\n" \
1504 "please use the back button to select less files.");
1505 label
= gtk_label_new(txt
);
1506 gtk_widget_set_valign (label
, GTK_ALIGN_CENTER
);
1507 gtk_box_pack_start (GTK_BOX (mainbox
), label
, FALSE
, FALSE
, 0);
1509 gtk_widget_show_all (mainbox
);
1518 ui_import_page_transaction_cb_activate_link (GtkWidget
*label
, const gchar
*uri
, gpointer user_data
)
1520 GtkTreeModel
*model
;
1525 g_return_val_if_fail(GTK_IS_TREE_VIEW(user_data
), TRUE
);
1527 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(user_data
));
1529 DB( g_print(" comboboxlink '%s' \n", uri
) );
1531 if (g_strcmp0 (uri
, "all") == 0)
1533 valid
= gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model
), &iter
);
1536 gtk_tree_model_get(model
, &iter
,
1537 LST_GENTXN_POINTER
, &gentxn
,
1540 gentxn
->to_import
= TRUE
;
1541 valid
= gtk_tree_model_iter_next(GTK_TREE_MODEL(model
), &iter
);
1545 if (g_strcmp0 (uri
, "non") == 0)
1547 valid
= gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model
), &iter
);
1550 gtk_tree_model_get(model
, &iter
,
1551 LST_GENTXN_POINTER
, &gentxn
,
1554 gentxn
->to_import
= FALSE
;
1555 valid
= gtk_tree_model_iter_next(GTK_TREE_MODEL(model
), &iter
);
1559 if (g_strcmp0 (uri
, "inv") == 0)
1561 valid
= gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model
), &iter
);
1564 gtk_tree_model_get(model
, &iter
,
1565 LST_GENTXN_POINTER
, &gentxn
,
1568 gentxn
->to_import
^= TRUE
;
1569 valid
= gtk_tree_model_iter_next(GTK_TREE_MODEL(model
), &iter
);
1573 gtk_widget_queue_draw(GTK_WIDGET(user_data
));
1580 ui_import_page_transaction_create (GtkWidget
*assistant
, gint idx
, struct import_data
*data
)
1582 ImpTxnData
*txndata
;
1583 GtkWidget
*table
, *box
, *group
, *stack
;
1584 GtkWidget
*label
, *scrollwin
, *expander
, *widget
;
1588 //txndata = &data->txndata[idx];
1589 memset(&tmp
, 0, sizeof(ImpTxnData
));
1590 g_array_insert_vals(data
->txndata
, idx
, &tmp
, 1);
1592 txndata
= ui_import_page_transaction_data_get(data
->txndata
, idx
);
1594 DB( g_print(" txndat=%p\n", txndata
) );
1599 table
= gtk_grid_new ();
1600 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_SMALL
);
1601 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
1605 box
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1606 //gtk_widget_set_hexpand(box, TRUE);
1607 gtk_grid_attach (GTK_GRID(table
), box
, 0, row
, 1, 1);
1609 // XXX (type) + accname
1610 label
= make_label(NULL
, 0.0, 0.5);
1611 txndata
->LB_acc_title
= label
;
1612 //gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_LARGE, -1);
1613 gtk_box_pack_start (GTK_BOX (box
), label
, FALSE
, FALSE
, 0);
1615 widget
= ui_genacc_comboboxtext_new(data
, label
);
1616 //gtk_widget_set_hexpand(widget, TRUE);
1617 txndata
->CY_acc
= widget
;
1618 gtk_box_pack_start (GTK_BOX (box
), widget
, FALSE
, FALSE
, 0);
1620 widget
= gtk_image_new_from_icon_name(ICONNAME_WARNING
, GTK_ICON_SIZE_SMALL_TOOLBAR
);
1621 txndata
->IM_unamed
= widget
;
1622 gtk_widget_set_tooltip_text (widget
, _("Target account identification by name or number failed."));
1623 gtk_box_pack_start (GTK_BOX (box
), widget
, FALSE
, FALSE
, 0);
1626 box
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1627 //gtk_widget_set_hexpand(box, TRUE);
1628 gtk_grid_attach (GTK_GRID(table
), box
, 1, row
, 1, 1);
1631 group
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1632 txndata
->GR_date
= group
;
1633 gtk_box_pack_start (GTK_BOX(box
), group
, FALSE
, FALSE
, 0);
1635 label
= make_label(_("Date order:"), 0, 0.5);
1636 gtk_box_pack_start (GTK_BOX(group
), label
, FALSE
, FALSE
, 0);
1637 widget
= make_cycle(label
, CYA_IMPORT_DATEORDER
);
1638 txndata
->CY_txn_dateorder
= widget
;
1639 gtk_box_pack_start (GTK_BOX(group
), widget
, FALSE
, FALSE
, 0);
1641 stack
= gtk_stack_new();
1642 gtk_box_pack_start (GTK_BOX(box
), stack
, FALSE
, FALSE
, 0);
1643 txndata
->ST_stack
= stack
;
1646 group
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1647 txndata
->GR_qif
= group
;
1648 //gtk_box_pack_start (GTK_BOX(box), group, FALSE, FALSE, 0);
1649 gtk_stack_add_named(GTK_STACK(stack
), group
, "QIF");
1651 widget
= gtk_check_button_new_with_mnemonic (_("_Import memos"));
1652 txndata
->CM_txn_qifmemo
= widget
;
1653 gtk_box_pack_start (GTK_BOX(group
), widget
, FALSE
, FALSE
, 0);
1655 widget
= gtk_check_button_new_with_mnemonic (_("_Swap memos with payees"));
1656 txndata
->CM_txn_qifswap
= widget
;
1657 gtk_box_pack_start (GTK_BOX(group
), widget
, FALSE
, FALSE
, 0);
1660 group
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1661 txndata
->GR_ofx
= group
;
1662 //gtk_box_pack_start (GTK_BOX(box), group, FALSE, FALSE, 0);
1663 gtk_stack_add_named(GTK_STACK(stack
), group
, "OFX");
1665 label
= make_label(_("OFX _Name:"), 0, 0.5);
1666 gtk_box_pack_start (GTK_BOX(group
), label
, FALSE
, FALSE
, 0);
1667 widget
= make_cycle(label
, CYA_IMPORT_OFXNAME
);
1668 txndata
->CY_txn_ofxname
= widget
;
1669 gtk_box_pack_start (GTK_BOX(group
), widget
, FALSE
, FALSE
, 0);
1671 label
= make_label(_("OFX _Memo:"), 0, 0.5);
1672 gtk_box_pack_start (GTK_BOX(group
), label
, FALSE
, FALSE
, 0);
1673 widget
= make_cycle(label
, CYA_IMPORT_OFXMEMO
);
1674 txndata
->CY_txn_ofxmemo
= widget
;
1675 gtk_box_pack_start (GTK_BOX(group
), widget
, FALSE
, FALSE
, 0);
1677 // n transaction ...
1679 box
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1680 //gtk_widget_set_hexpand(box, TRUE);
1681 gtk_grid_attach (GTK_GRID(table
), box
, 0, row
, 1, 1);
1683 group
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1684 txndata
->GR_select
= group
;
1685 gtk_box_pack_start (GTK_BOX (box
), group
, FALSE
, FALSE
, 0);
1687 label
= make_label (_("Select:"), 0, 0.5);
1688 gtk_box_pack_start (GTK_BOX (group
), label
, FALSE
, FALSE
, 0);
1690 label
= make_clicklabel("all", _("All"));
1691 txndata
->BT_all
= label
;
1692 gtk_box_pack_start (GTK_BOX (group
), label
, FALSE
, FALSE
, 0);
1694 label
= make_clicklabel("non", _("None"));
1695 txndata
->BT_non
= label
;
1696 gtk_box_pack_start (GTK_BOX (group
), label
, FALSE
, FALSE
, 0);
1698 label
= make_clicklabel("inv", _("Invert"));
1699 txndata
->BT_inv
= label
;
1700 gtk_box_pack_start (GTK_BOX (group
), label
, FALSE
, FALSE
, 0);
1702 label
= make_label(NULL
, 0.0, 0.0);
1703 txndata
->LB_txn_title
= label
;
1704 gtk_widget_set_valign(label
, GTK_ALIGN_CENTER
);
1705 gtk_box_pack_start (GTK_BOX (group
), label
, FALSE
, FALSE
, 0);
1708 box
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1709 gtk_grid_attach (GTK_GRID(table
), box
, 1, row
, 1, 1);
1711 group
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1712 txndata
->GR_misc
= group
;
1713 gtk_box_pack_start (GTK_BOX (box
), group
, FALSE
, FALSE
, 0);
1715 widget
= gtk_check_button_new_with_mnemonic (_("Sentence _case memo/payee"));
1716 txndata
->CM_txn_ucfirst
= widget
;
1717 gtk_box_pack_start (GTK_BOX(group
), widget
, FALSE
, FALSE
, 0);
1722 box
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1723 txndata
->GR_msg
= box
;
1724 //gtk_widget_set_hexpand(box, TRUE);
1725 gtk_grid_attach (GTK_GRID(table
), box
, 0, row
, 2, 1);
1727 widget
= gtk_image_new ();
1728 txndata
->IM_txn
= widget
;
1729 gtk_widget_set_valign(widget
, GTK_ALIGN_START
);
1730 gtk_box_pack_start (GTK_BOX (box
), widget
, FALSE
, FALSE
, 0);
1731 label
= make_label(NULL
, 0.0, 0.5);
1732 txndata
->LB_txn
= label
;
1733 gtk_box_pack_start (GTK_BOX (box
), label
, FALSE
, FALSE
, 0);
1736 scrollwin
= gtk_scrolled_window_new (NULL
, NULL
);
1737 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
1738 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwin
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
1739 widget
= list_txn_import_create();
1740 txndata
->LV_gentxn
= widget
;
1741 gtk_widget_set_hexpand(scrollwin
, TRUE
);
1742 gtk_widget_set_vexpand(scrollwin
, TRUE
);
1743 gtk_container_add (GTK_CONTAINER (scrollwin
), widget
);
1744 gtk_grid_attach (GTK_GRID(table
), scrollwin
, 0, row
, 2, 1);
1749 expander
= gtk_expander_new (_("Similar transaction in target account (possible duplicate)"));
1750 txndata
->EX_duptxn
= expander
;
1751 //gtk_widget_set_hexpand(expander, TRUE);
1752 gtk_grid_attach (GTK_GRID(table
), expander
, 0, row
, 2, 1);
1755 group
= gtk_grid_new ();
1756 gtk_grid_set_row_spacing (GTK_GRID (group
), SPACING_SMALL
);
1757 gtk_grid_set_column_spacing (GTK_GRID (group
), SPACING_SMALL
);
1758 gtk_container_add (GTK_CONTAINER (expander
), group
);
1761 scrollwin
= gtk_scrolled_window_new (NULL
, NULL
);
1762 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
1763 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwin
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
1764 gtk_widget_set_hexpand(scrollwin
, TRUE
);
1765 //widget = create_list_transaction(LIST_TXN_TYPE_DETAIL, PREFS->lst_ope_columns);
1766 widget
= create_list_transaction(LIST_TXN_TYPE_DETAIL
, PREFS
->lst_impope_columns
);
1767 txndata
->LV_duptxn
= widget
;
1768 gtk_container_add (GTK_CONTAINER (scrollwin
), widget
);
1769 gtk_widget_set_size_request(scrollwin
, -1, HB_MINWIDTH_LIST
/2);
1770 gtk_grid_attach (GTK_GRID (group
), scrollwin
, 0, row
, 5, 1);
1773 label
= make_label(_("Date _gap:"), 0, 0.5);
1774 gtk_grid_attach (GTK_GRID (group
), label
, 0, row
, 1, 1);
1776 widget
= make_numeric(label
, 0.0, HB_DATE_MAX_GAP
);
1777 txndata
->NB_txn_daygap
= widget
;
1778 gtk_grid_attach (GTK_GRID (group
), widget
, 1, row
, 1, 1);
1780 //TRANSLATORS: there is a spinner on the left of this label, and so you have 0....x days of date tolerance
1781 label
= make_label(_("days"), 0, 0.5);
1782 gtk_grid_attach (GTK_GRID (group
), label
, 2, row
, 1, 1);
1784 widget
= gtk_image_new_from_icon_name(ICONNAME_INFO
, GTK_ICON_SIZE_SMALL_TOOLBAR
);
1785 gtk_widget_set_hexpand(widget
, FALSE
);
1786 gtk_grid_attach (GTK_GRID (group
), widget
, 3, row
, 1, 1);
1788 label
= make_label (_(
1789 "The match is done in order: by account, amount and date.\n" \
1790 "A date tolerance of 0 day means an exact match"), 0, 0.5);
1791 gimp_label_set_attributes (GTK_LABEL (label
),
1792 PANGO_ATTR_SCALE
, PANGO_SCALE_SMALL
,
1794 gtk_widget_set_hexpand(label
, TRUE
);
1795 gtk_grid_attach (GTK_GRID (group
), label
, 4, row
, 1, 1);
1798 // init ofx/qfx option to move
1799 gtk_combo_box_set_active(GTK_COMBO_BOX(txndata
->CY_txn_dateorder
), PREFS
->dtex_datefmt
);
1800 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(txndata
->CM_txn_ucfirst
), PREFS
->dtex_ucfirst
);
1802 gtk_combo_box_set_active(GTK_COMBO_BOX(txndata
->CY_txn_ofxname
), PREFS
->dtex_ofxname
);
1803 gtk_combo_box_set_active(GTK_COMBO_BOX(txndata
->CY_txn_ofxmemo
), PREFS
->dtex_ofxmemo
);
1805 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(txndata
->CM_txn_qifmemo
), PREFS
->dtex_qifmemo
);
1806 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(txndata
->CM_txn_qifswap
), PREFS
->dtex_qifswap
);
1808 gtk_widget_show_all (table
);
1809 gtk_widget_hide(txndata
->GR_qif
);
1810 gtk_widget_hide(txndata
->GR_ofx
);
1812 g_signal_connect (txndata
->BT_all
, "activate-link", G_CALLBACK (ui_import_page_transaction_cb_activate_link
), txndata
->LV_gentxn
);
1813 g_signal_connect (txndata
->BT_non
, "activate-link", G_CALLBACK (ui_import_page_transaction_cb_activate_link
), txndata
->LV_gentxn
);
1814 g_signal_connect (txndata
->BT_inv
, "activate-link", G_CALLBACK (ui_import_page_transaction_cb_activate_link
), txndata
->LV_gentxn
);
1816 g_signal_connect (txndata
->CY_acc
, "changed", G_CALLBACK (ui_import_page_transaction_cb_account_changed
), data
);
1817 g_signal_connect (txndata
->CY_txn_dateorder
, "changed", G_CALLBACK (ui_import_page_transaction_cb_account_changed
), data
);
1818 g_signal_connect (txndata
->NB_txn_daygap
, "value-changed", G_CALLBACK (ui_import_page_transaction_cb_account_changed
), data
);
1820 g_signal_connect (txndata
->CY_txn_ofxname
, "changed", G_CALLBACK (ui_import_page_transaction_cb_option_changed
), data
);
1821 g_signal_connect (txndata
->CY_txn_ofxmemo
, "changed", G_CALLBACK (ui_import_page_transaction_cb_option_changed
), data
);
1822 g_signal_connect (txndata
->CM_txn_qifmemo
, "toggled", G_CALLBACK (ui_import_page_transaction_cb_option_changed
), data
);
1823 g_signal_connect (txndata
->CM_txn_qifswap
, "toggled", G_CALLBACK (ui_import_page_transaction_cb_option_changed
), data
);
1824 g_signal_connect (txndata
->CM_txn_ucfirst
, "toggled", G_CALLBACK (ui_import_page_transaction_cb_option_changed
), data
);
1826 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(txndata
->LV_gentxn
)), "changed",
1827 G_CALLBACK (ui_import_page_transaction_cb_fill_same
), NULL
);
1834 ui_import_page_confirmation_create(GtkWidget
*assistant
, struct import_data
*data
)
1836 GtkWidget
*mainbox
, *label
, *widget
, *scrollwin
;
1838 mainbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
1839 //gtk_container_set_border_width (GTK_CONTAINER(mainbox), SPACING_SMALL);
1841 scrollwin
= gtk_scrolled_window_new (NULL
, NULL
);
1842 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_NONE
);
1843 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwin
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
1844 gtk_widget_set_hexpand(scrollwin
, TRUE
);
1845 gtk_widget_set_vexpand(scrollwin
, TRUE
);
1846 widget
= gtk_label_new (NULL
);
1847 data
->TX_summary
= widget
;
1848 gtk_container_add (GTK_CONTAINER (scrollwin
), widget
);
1849 gtk_box_pack_start (GTK_BOX (mainbox
), scrollwin
, TRUE
, TRUE
, 0);
1852 _("Click \"Apply\" to update your accounts.\n"), 0.5, 0.5);
1853 gtk_box_pack_start (GTK_BOX (mainbox
), label
, FALSE
, FALSE
, 0);
1855 gtk_widget_set_margin_top(GTK_WIDGET(label
), SPACING_SMALL
);
1856 gtk_widget_set_margin_bottom(GTK_WIDGET(label
), SPACING_SMALL
);
1858 gtk_widget_show_all (mainbox
);
1865 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1867 * ui_import_assistant_forward_page_func:
1869 * define the page to be called when the user forward
1871 * Return value: the page number
1876 ui_import_assistant_forward_page_func(gint current_page, gpointer func_data)
1878 struct import_data *data;
1884 DB( g_print("---------------------------\n") );
1885 DB( g_print("\n[ui-import] forward page func\n") );
1887 page = gtk_assistant_get_nth_page(GTK_ASSISTANT(data->assistant), current_page);
1889 DB( g_print(" -> current: %d %s\n", current_page, gtk_assistant_get_page_title(GTK_ASSISTANT(data->assistant), page) ) );
1893 struct import_data *data = func_data;
1895 for(i=0;i<NUM_PAGE;i++)
1897 g_print("%d: %d '%s'\n", i,
1898 gtk_assistant_get_page_complete(GTK_ASSISTANT(data->assistant), data->pages[i]),
1903 next_page = current_page + 1;
1905 switch(current_page)
1908 // if no new account, skip the account page
1909 //if(ictx->nb_new_acc == 0)
1910 // next_page = PAGE_TRANSACTION;
1914 page = gtk_assistant_get_nth_page(GTK_ASSISTANT(data->assistant), next_page);
1915 DB( g_print(" -> next: %d %s\n", next_page, gtk_assistant_get_page_title(GTK_ASSISTANT(data->assistant), page) ) );
1922 ui_import_assistant_prepare (GtkWidget
*widget
, GtkWidget
*page
, gpointer user_data
)
1924 struct import_data
*data
;
1925 ImportContext
*ictx
;
1926 gint current_page
, n_pages
;
1928 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1932 current_page
= gtk_assistant_get_current_page (GTK_ASSISTANT(data
->assistant
));
1933 n_pages
= gtk_assistant_get_n_pages (GTK_ASSISTANT(data
->assistant
));
1935 DB( g_print("\n--------\n[ui-import] prepare \n page %d of %d\n", current_page
, n_pages
) );
1937 switch( current_page
)
1940 DB( g_print("\n #1 intro\n") );
1941 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), page
, TRUE
);
1945 DB( g_print("\n #2 file choose\n") );
1946 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), page
, FALSE
);
1948 //open the file add if no file
1949 if( gtk_tree_model_iter_n_children(gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_file
)), NULL
) == 0 )
1951 //g_signal_emit_by_name(data->BT_file_add, "clicked", NULL);
1952 ui_import_page_filechooser_add_action(data
->BT_file_add
, NULL
);
1955 // the page complete is contextual in ui_import_page_filechooser_selection_changed
1956 // check is something valid :: count total rows
1957 ui_import_page_filechooser_eval(widget
, user_data
);
1961 DB( g_print("\n #3 real import\n") );
1962 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), page
, FALSE
);
1964 //todo: more test needed here
1965 //clean any previous txn page
1966 /*for(i=(n_pages-1);i>=PAGE_IMPORT+1;i--)
1968 GtkWidget *page = gtk_assistant_get_nth_page (GTK_ASSISTANT(data->assistant), i);
1973 isacc = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(page), "pgacc"));
1975 DB( g_print(" %d is acc: %d\n", i, isacc) );
1979 gtk_assistant_remove_page(GTK_ASSISTANT(data->assistant), i);
1980 gtk_widget_destroy (page);
1985 hb_import_load_all(&data
->ictx
);
1987 //add 1 page per account
1989 nbacc
= g_list_length (ictx
->gen_lst_acc
);
1993 g_array_free(data
->txndata
, TRUE
);
1994 data
->txndata
= NULL
;
1996 data
->txndata
= g_array_sized_new(FALSE
, TRUE
, sizeof(ImpTxnData
), nbacc
);
1998 //#1820618 patch for glib < 2.58 https://gitlab.gnome.org/GNOME/glib/issues/1374
1999 if( glib_minor_version
< 58 )
2001 g_array_set_size(data
->txndata
, nbacc
);
2004 DB( g_print(" accnb=%d @%p\n", nbacc
, data
->txndata
) );
2007 //_import_context_debug_acc_list(&data->ictx);
2009 //if(nbacc < TXN_MAX_ACCOUNT)
2011 for(key
=1;key
<nbacc
+1;key
++)
2017 genacc
= da_gen_acc_get_by_key(ictx
->gen_lst_acc
, key
);
2019 DB( g_print(" create page txn for '%s' '%s' at page %d\n", genacc
->name
, genacc
->number
, PAGE_IMPORT
+ key
) );
2021 page
= ui_import_page_transaction_create (data
->assistant
, key
, data
);
2022 //g_object_set_data(G_OBJECT(page), "pgacc", (gpointer)TRUE);
2023 gtk_widget_show_all (page
);
2024 gtk_assistant_insert_page (GTK_ASSISTANT (data
->assistant
), page
, PAGE_IMPORT
+ key
);
2025 //gtk_assistant_set_page_title (GTK_ASSISTANT (data->assistant), page, _("Transaction"));
2026 //gtk_assistant_set_page_title (GTK_ASSISTANT (data->assistant), page, genacc->name);
2028 title
= g_strdup_printf("%s %d", (!genacc
->is_unamed
) ? _("Account") : _("Unknown"), key
);
2029 gtk_assistant_set_page_title (GTK_ASSISTANT (data
->assistant
), page
, title
);
2035 if( ui_import_page_import_eval (widget
, NULL
) )
2037 /*if(ictx->nb_new_acc == 0)
2039 DB( g_print(" -> jump to Transaction page\n") );
2040 //gtk_assistant_set_page_complete (GTK_ASSISTANT(data->assistant), data->pages[PAGE_ACCOUNT], TRUE);
2041 gtk_assistant_next_page(GTK_ASSISTANT(data->assistant));
2042 gtk_assistant_next_page(GTK_ASSISTANT(data->assistant));
2043 //gtk_assistant_set_current_page (GTK_ASSISTANT(data->assistant), PAGE_TRANSACTION);
2047 DB( g_print(" -> jump to Account page\n") );
2048 //gtk_assistant_set_current_page (GTK_ASSISTANT(data->assistant), PAGE_ACCOUNT);
2049 gtk_assistant_next_page(GTK_ASSISTANT(data->assistant));
2052 gtk_assistant_next_page(GTK_ASSISTANT(data
->assistant
));
2053 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), page
, TRUE
);
2058 if(current_page
!= (n_pages
- 1))
2060 DB( g_print("\n #4 transaction\n") );
2062 if( current_page
== PAGE_IMPORT
+ 1)
2063 //hack to get rid of back button
2064 gtk_assistant_set_page_type (GTK_ASSISTANT(data
->assistant
), page
, GTK_ASSISTANT_PAGE_INTRO
);
2066 ui_import_page_transaction_fill(data
);
2067 ui_import_page_transaction_update(data
);
2071 DB( g_print("\n #5 confirmation\n") );
2073 //todo: auto assignment should be optional
2074 //data->imp_cnt_asg = transaction_auto_assign(ictx->trans_list, 0);
2075 //ui_import_page_transaction_find_duplicate(data);
2077 ui_import_page_confirmation_fill(data
);
2078 gtk_assistant_set_page_complete (GTK_ASSISTANT(data
->assistant
), page
, TRUE
);
2085 ui_import_assistant_apply (GtkWidget
*widget
, gpointer user_data
)
2087 struct import_data
*data
;
2089 DB( g_print("\n[ui-import] apply\n") );
2091 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
2093 hb_import_apply(&data
->ictx
);
2098 ui_import_assistant_dispose(GtkWidget
*widget
, gpointer user_data
)
2100 struct import_data
*data
= user_data
;
2102 DB( g_print("\n[ui-import] dispose\n") );
2105 gpointer data2
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
2106 g_print(" user_data=%p to be free, data2=%p\n", user_data
, data2
);
2109 da_import_context_destroy(&data
->ictx
);
2113 g_array_free(data
->txndata
, TRUE
);
2117 // todo: optimize this
2118 //if(data->imp_cnt_trn > 0)
2120 //GLOBALS->changes_count += data->imp_cnt_trn;
2122 //our global list has changed, so update the treeview
2123 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_TITLE
+UF_SENSITIVE
+UF_BALANCE
+UF_REFRESHALL
));
2128 //delete-event TRUE abort/FALSE destroy
2134 ui_import_assistant_close_cancel (GtkWidget
*widget
, gpointer user_data
)
2136 struct import_data
*data
;
2137 GtkWidget
*assistant
= (GtkWidget
*) user_data
;
2139 DB( g_print("\n[ui-import] close\n") );
2141 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
2143 ui_import_assistant_dispose(widget
, data
);
2144 gtk_widget_destroy (assistant
);
2148 /* starting point of import */
2149 GtkWidget
*ui_import_assistant_new (gchar
**paths
)
2151 struct import_data
*data
;
2152 GtkWidget
*assistant
, *page
;
2155 DB( g_print("\n[ui-import] new\n") );
2157 data
= g_malloc0(sizeof(struct import_data
));
2158 if(!data
) return NULL
;
2160 assistant
= gtk_assistant_new ();
2161 data
->assistant
= assistant
;
2163 //store our window private data
2164 g_object_set_data(G_OBJECT(assistant
), "inst_data", (gpointer
)data
);
2165 //DB( g_print("** \n[ui-import] window=%x, inst_data=%x\n", assistant, data) );
2167 gtk_window_set_modal(GTK_WINDOW (assistant
), TRUE
);
2168 gtk_window_set_transient_for(GTK_WINDOW(assistant
), GTK_WINDOW(GLOBALS
->mainwindow
));
2170 //set a nice dialog size
2171 gtk_window_get_size(GTK_WINDOW(GLOBALS
->mainwindow
), &w
, &h
);
2172 gtk_window_set_default_size (GTK_WINDOW(assistant
), w
* 0.8, h
* 0.8);
2173 //gtk_window_set_default_size (GTK_WINDOW(assistant), w - 24, h - 24);
2175 page
= ui_import_page_intro_create (assistant
, data
);
2176 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), page
);
2177 gtk_assistant_set_page_type (GTK_ASSISTANT (assistant
), page
, GTK_ASSISTANT_PAGE_INTRO
);
2178 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), page
, _("Welcome"));
2179 gtk_assistant_set_page_complete (GTK_ASSISTANT(assistant
), page
, TRUE
);
2181 page
= ui_import_page_filechooser_create (assistant
, data
);
2182 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), page
);
2183 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), page
, _("Select file(s)"));
2185 page
= ui_import_page_import_create (assistant
, data
);
2186 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), page
);
2187 //gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_PROGRESS);
2188 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), page
, _("Import"));
2190 //3...x transaction page will be added automatically
2192 //page = ui_import_page_transaction_create (assistant, 0, data);
2193 //gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
2194 //hack to hide the back button here
2195 //gtk_assistant_set_page_type (GTK_ASSISTANT(assistant), page, GTK_ASSISTANT_PAGE_INTRO);
2196 //gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, _("Transaction"));
2198 page
= ui_import_page_confirmation_create (assistant
, data
);
2199 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), page
);
2200 gtk_assistant_set_page_type (GTK_ASSISTANT (assistant
), page
, GTK_ASSISTANT_PAGE_CONFIRM
);
2201 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), page
, _("Confirmation"));
2203 //gtk_assistant_set_forward_page_func(GTK_ASSISTANT(assistant), ui_import_assistant_forward_page_func, data, NULL);
2206 //ui_import_page_filechooser_selection_changed(assistant, data);
2207 DB( g_printf(" check list of paths '%p'\n", paths
) );
2210 ImportContext
*ictx
= &data
->ictx
;
2212 gchar
**str
= paths
;
2216 DB( g_printf(" try to append '%s'\n", *str
) );
2218 genfile
= da_gen_file_append_from_filename(ictx
, *str
);
2221 list_file_add(data
->LV_file
, genfile
);
2228 //connect all our signals
2229 //g_signal_connect (window, "delete-event", G_CALLBACK (hbfile_dispose), (gpointer)data);
2230 g_signal_connect (G_OBJECT (assistant
), "cancel", G_CALLBACK (ui_import_assistant_close_cancel
), assistant
);
2231 g_signal_connect (G_OBJECT (assistant
), "close", G_CALLBACK (ui_import_assistant_close_cancel
), assistant
);
2232 g_signal_connect (G_OBJECT (assistant
), "apply", G_CALLBACK (ui_import_assistant_apply
), NULL
);
2233 g_signal_connect (G_OBJECT (assistant
), "prepare", G_CALLBACK (ui_import_assistant_prepare
), NULL
);
2235 gtk_widget_show (assistant
);
2237 if(PREFS
->dtex_nointro
)
2238 gtk_assistant_set_current_page(GTK_ASSISTANT(assistant
), PAGE_FILES
);