1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2017 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/>.
23 #include "dsp_account.h"
24 #include "dsp_mainwindow.h"
26 #include "list_operation.h"
27 #include "ui-widgets.h"
28 #include "ui-filter.h"
29 #include "ui-transaction.h"
30 #include "gtk-dateentry.h"
32 #include "ui-account.h"
34 #include "ui-category.h"
37 /****************************************************************************/
39 /****************************************************************************/
48 /* our global datas */
49 extern struct HomeBank
*GLOBALS
;
50 extern struct Preferences
*PREFS
;
55 //extern gchar *CYA_FLT_SELECT[];
57 extern gchar
*CYA_FLT_TYPE
[];
58 extern gchar
*CYA_FLT_STATUS
[];
61 static void register_panel_collect_filtered_txn(GtkWidget
*view
);
62 static void register_panel_listview_populate(GtkWidget
*view
);
63 static void register_panel_action(GtkWidget
*widget
, gpointer user_data
);
64 static void register_panel_update(GtkWidget
*widget
, gpointer user_data
);
66 static void register_panel_export_csv(GtkWidget
*widget
, gpointer user_data
);
68 static void register_panel_make_archive(GtkWidget
*widget
, gpointer user_data
);
70 static void status_selected_foreach_func (GtkTreeModel
*model
, GtkTreePath
*path
, GtkTreeIter
*iter
, gpointer userdata
);
72 static void ui_multipleedit_dialog_prefill( GtkWidget
*widget
, Transaction
*ope
, gint column_id
);
73 static void register_panel_edit_multiple(GtkWidget
*widget
, Transaction
*txn
, gint column_id
, gpointer user_data
);
75 static void register_panel_selection(GtkTreeSelection
*treeselection
, gpointer user_data
);
76 static void register_panel_onRowActivated (GtkTreeView
*treeview
, GtkTreePath
*path
, GtkTreeViewColumn
*col
, gpointer userdata
);
80 static void ui_multipleedit_dialog_prefill( GtkWidget
*widget
, Transaction
*ope
, gint column_id
)
82 struct ui_multipleedit_dialog_data
*data
;
85 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
87 DB( g_print ("\n[ui-multipleedit] prefill\n") );
90 //if(col_id >= LST_DSPOPE_DATE && col_id != LST_DSPOPE_BALANCE)
95 gtk_date_entry_set_date(GTK_DATE_ENTRY(data
->PO_date
), (guint
)ope
->date
);
96 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data
->CM_date
), TRUE
);
99 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->NU_mode
), ope
->paymode
);
100 gtk_entry_set_text(GTK_ENTRY(data
->ST_info
), (ope
->info
!= NULL
) ? ope
->info
: "");
101 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data
->CM_mode
), TRUE
);
102 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data
->CM_info
), TRUE
);
104 case LST_DSPOPE_PAYEE
:
105 ui_pay_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_pay
), ope
->kpay
);
106 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data
->CM_pay
), TRUE
);
108 case LST_DSPOPE_WORDING
:
109 gtk_entry_set_text(GTK_ENTRY(data
->ST_memo
), (ope
->wording
!= NULL
) ? ope
->wording
: "");
110 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data
->CM_memo
), TRUE
);
112 case LST_DSPOPE_CATEGORY
:
113 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_cat
), ope
->kcat
);
114 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data
->CM_cat
), TRUE
);
116 case LST_DSPOPE_TAGS
:
117 tagstr
= transaction_tags_tostring(ope
);
118 gtk_entry_set_text(GTK_ENTRY(data
->ST_tags
), (tagstr
!= NULL
) ? tagstr
: "");
120 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data
->CM_tags
), TRUE
);
127 static void ui_multipleedit_dialog_update( GtkWidget
*widget
, gpointer user_data
)
129 struct ui_multipleedit_dialog_data
*data
;
131 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
133 DB( g_print ("\n[ui-multipleedit] update\n") );
136 gtk_widget_set_sensitive (data
->PO_date
, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_date
)) );
138 if(data
->NU_mode
&& data
->ST_info
)
140 gtk_widget_set_sensitive (data
->NU_mode
, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_mode
)) );
141 gtk_widget_set_sensitive (data
->ST_info
, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_info
)) );
145 gtk_widget_set_sensitive (data
->PO_acc
, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_acc
)) );
148 gtk_widget_set_sensitive (data
->PO_pay
, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_pay
)) );
151 gtk_widget_set_sensitive (data
->PO_cat
, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_cat
)) );
154 gtk_widget_set_sensitive (data
->ST_tags
, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_tags
)) );
157 gtk_widget_set_sensitive (data
->ST_memo
, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_memo
)) );
161 static void ui_multipleedit_dialog_init( GtkWidget
*widget
, gpointer user_data
)
163 struct ui_multipleedit_dialog_data
*data
;
165 GList
*selection
, *list
;
167 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
169 DB( g_print ("\n[ui-multipleedit] init\n") );
171 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->treeview
));
172 selection
= gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->treeview
)), &model
);
174 data
->has_xfer
= FALSE
;
176 list
= g_list_last(selection
);
182 gtk_tree_model_get_iter(model
, &iter
, list
->data
);
183 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &entry
, -1);
185 if(entry
->paymode
== PAYMODE_INTXFER
)
186 data
->has_xfer
= TRUE
;
188 list
= g_list_previous(list
);
191 g_list_foreach(selection
, (GFunc
)gtk_tree_path_free
, NULL
);
192 g_list_free(selection
);
197 static void ui_multipleedit_dialog_apply( GtkWidget
*widget
, gpointer user_data
)
199 struct ui_multipleedit_dialog_data
*data
;
201 GList
*selection
, *list
;
203 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
205 DB( g_print ("\n[ui-multipleedit] apply\n") );
207 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->treeview
));
208 selection
= gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->treeview
)), &model
);
210 list
= g_list_last(selection
);
216 gboolean change
= FALSE
;
218 gtk_tree_model_get_iter(model
, &iter
, list
->data
);
219 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &txn
, -1);
221 DB( g_print(" modifying %s %.2f\n", txn
->wording
, txn
->amount
) );
223 if( list_txn_column_id_isvisible(GTK_TREE_VIEW(data
->treeview
), LST_DSPOPE_DATE
) == TRUE
)
225 if( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_date
)) )
227 txn
->date
= gtk_date_entry_get_date(GTK_DATE_ENTRY(data
->PO_date
));
228 DB( g_print(" -> date: '%d'\n", txn
->date
) );
233 if( list_txn_column_id_isvisible(GTK_TREE_VIEW(data
->treeview
), LST_DSPOPE_INFO
) == TRUE
)
235 if( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_mode
)) )
237 txn
->paymode
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
241 if( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_info
)) )
250 txt
= gtk_entry_get_text(GTK_ENTRY(data
->ST_info
));
253 txn
->info
= g_strdup(txt
);
259 if( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_acc
)) )
261 guint32 nkacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
263 account_balances_sub(txn
);
264 if( transaction_acc_move(txn
, txn
->kacc
, nkacc
) )
268 account_balances_add(txn
);
269 DB( g_print(" -> acc: '%d'\n", nkacc
) );
270 gtk_tree_model_get_iter(model
, &iter
, list
->data
);
271 gtk_list_store_remove(GTK_LIST_STORE(model
), &iter
);
276 if( list_txn_column_id_isvisible(GTK_TREE_VIEW(data
->treeview
), LST_DSPOPE_PAYEE
) == TRUE
)
278 if( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_pay
)) )
280 txn
->kpay
= ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data
->PO_pay
));
281 DB( g_print(" -> payee: '%d'\n", txn
->kpay
) );
286 if( list_txn_column_id_isvisible(GTK_TREE_VIEW(data
->treeview
), LST_DSPOPE_CATEGORY
) == TRUE
)
288 if( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_cat
)) )
290 if(!(txn
->flags
& OF_SPLIT
))
292 txn
->kcat
= ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data
->PO_cat
));
293 DB( g_print(" -> category: '%d'\n", txn
->kcat
) );
299 if( list_txn_column_id_isvisible(GTK_TREE_VIEW(data
->treeview
), LST_DSPOPE_TAGS
) == TRUE
)
301 if( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_tags
)) )
303 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_tags
));
306 transaction_tags_parse(txn
, txt
);
307 DB( g_print(" -> tags: '%s'\n", txt
) );
313 if( list_txn_column_id_isvisible(GTK_TREE_VIEW(data
->treeview
), LST_DSPOPE_WORDING
) == TRUE
)
315 if( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_memo
)) )
319 g_free(txn
->wording
);
324 txt
= gtk_entry_get_text(GTK_ENTRY(data
->ST_memo
));
327 txn
->wording
= g_strdup(txt
);
333 /* since 5.1 date and amount are no more editable
334 case LST_DSPOPE_DATE:
335 txn->date = gtk_date_entry_get_date(GTK_DATE_ENTRY(widget1));
336 data->do_sort = TRUE;
337 refreshbalance = TRUE;
339 case LST_DSPOPE_EXPENSE:
340 case LST_DSPOPE_INCOME:
341 case LST_DSPOPE_AMOUNT:
342 txn->flags &= ~(OF_INCOME); //delete flag
343 txn->amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget1));
344 if(txn->amount > 0) txn->flags |= OF_INCOME;
345 refreshbalance = TRUE;
351 txn
->flags
|= OF_CHANGED
;
352 GLOBALS
->changes_count
++;
355 if( data
->has_xfer
&& txn
->paymode
== PAYMODE_INTXFER
)
359 ltxn
= transaction_xfer_child_strong_get(txn
);
360 if(ltxn
!= NULL
) //should never be the case
362 DB( g_print(" - strong link found, do sync\n") );
363 transaction_xfer_sync_child(txn
, ltxn
);
367 list
= g_list_previous(list
);
370 g_list_foreach(selection
, (GFunc
)gtk_tree_path_free
, NULL
);
371 g_list_free(selection
);
376 static gboolean
ui_multipleedit_dialog_destroy( GtkWidget
*widget
, gpointer user_data
)
378 struct ui_multipleedit_dialog_data
*data
;
380 data
= g_object_get_data(G_OBJECT(widget
), "inst_data");
382 DB( g_print ("\n[ui-multipleedit] destroy event occurred\n") );
389 static GtkWidget
*ui_multipleedit_dialog_new(GtkWindow
*parent
, GtkTreeView
*treeview
)
391 struct ui_multipleedit_dialog_data
*data
;
392 GtkWidget
*dialog
, *content_area
;
393 GtkWidget
*group_grid
, *label
, *widget
, *toggle
;
396 DB( g_print ("\n[ui-multipleedit] new\n") );
398 data
= g_malloc0(sizeof(struct ui_multipleedit_dialog_data
));
400 dialog
= gtk_dialog_new_with_buttons (NULL
,
409 //g_signal_connect (dialog, "delete_event", G_CALLBACK (register_panel_dispose), (gpointer)data);
410 g_signal_connect (dialog
, "destroy", G_CALLBACK (ui_multipleedit_dialog_destroy
), (gpointer
)data
);
412 //store our window private data
413 g_object_set_data(G_OBJECT(dialog
), "inst_data", (gpointer
)data
);
414 DB( g_print(" - new window=%p, inst_data=%p\n", dialog
, data
) );
416 data
->window
= dialog
;
417 data
->treeview
= treeview
;
419 ui_multipleedit_dialog_init(dialog
, NULL
);
422 gtk_window_set_title (GTK_WINDOW (data
->window
), _("Multiple edit transactions"));
424 content_area
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
));
426 group_grid
= gtk_grid_new ();
427 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
428 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
429 gtk_container_set_border_width (GTK_CONTAINER(group_grid
), SPACING_MEDIUM
);
430 gtk_container_add (GTK_CONTAINER (content_area
), group_grid
);
434 if( list_txn_column_id_isvisible(GTK_TREE_VIEW(data
->treeview
), LST_DSPOPE_DATE
) == TRUE
)
437 label
= make_label_widget(_("_Date:"));
438 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
439 widget
= gtk_check_button_new();
440 data
->CM_date
= widget
;
441 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
442 widget
= gtk_date_entry_new();
443 data
->PO_date
= widget
;
444 gtk_widget_set_hexpand (widget
, TRUE
);
445 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
447 g_signal_connect (data
->CM_date
, "toggled", G_CALLBACK (ui_multipleedit_dialog_update
), NULL
);
450 if( list_txn_column_id_isvisible(GTK_TREE_VIEW(data
->treeview
), LST_DSPOPE_INFO
) == TRUE
)
453 label
= make_label_widget(_("Pa_yment:"));
454 data
->LB_mode
= label
;
455 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
456 toggle
= gtk_check_button_new();
457 data
->CM_mode
= toggle
;
458 gtk_grid_attach (GTK_GRID (group_grid
), toggle
, 1, row
, 1, 1);
459 widget
= make_paymode_nointxfer (label
);
460 data
->NU_mode
= widget
;
461 gtk_widget_set_hexpand (widget
, TRUE
);
462 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
464 g_signal_connect (data
->CM_mode
, "toggled", G_CALLBACK (ui_multipleedit_dialog_update
), NULL
);
467 label
= make_label_widget(_("_Info:"));
468 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
469 widget
= gtk_check_button_new();
470 data
->CM_info
= widget
;
471 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
472 widget
= make_string(label
);
473 data
->ST_info
= widget
;
474 gtk_widget_set_hexpand (widget
, TRUE
);
475 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
477 g_signal_connect (data
->CM_info
, "toggled", G_CALLBACK (ui_multipleedit_dialog_update
), NULL
);
481 label
= make_label_widget(_("A_ccount:"));
482 data
->LB_acc
= label
;
483 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
484 widget
= gtk_check_button_new();
485 data
->CM_acc
= widget
;
486 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
487 widget
= ui_acc_comboboxentry_new(label
);
488 data
->PO_acc
= widget
;
489 gtk_widget_set_hexpand (widget
, TRUE
);
490 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
492 g_signal_connect (data
->CM_acc
, "toggled", G_CALLBACK (ui_multipleedit_dialog_update
), NULL
);
494 if( list_txn_column_id_isvisible(GTK_TREE_VIEW(data
->treeview
), LST_DSPOPE_PAYEE
) == TRUE
)
497 label
= make_label_widget(_("_Payee:"));
498 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
499 widget
= gtk_check_button_new();
500 data
->CM_pay
= widget
;
501 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
502 widget
= ui_pay_comboboxentry_new(label
);
503 data
->PO_pay
= widget
;
504 gtk_widget_set_hexpand (widget
, TRUE
);
505 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
507 g_signal_connect (data
->CM_pay
, "toggled", G_CALLBACK (ui_multipleedit_dialog_update
), NULL
);
510 if( list_txn_column_id_isvisible(GTK_TREE_VIEW(data
->treeview
), LST_DSPOPE_CATEGORY
) == TRUE
)
513 label
= make_label_widget(_("_Category:"));
514 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
515 widget
= gtk_check_button_new();
516 data
->CM_cat
= widget
;
517 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
518 widget
= ui_cat_comboboxentry_new(label
);
519 data
->PO_cat
= widget
;
520 gtk_widget_set_hexpand (widget
, TRUE
);
521 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
523 g_signal_connect (data
->CM_cat
, "toggled", G_CALLBACK (ui_multipleedit_dialog_update
), NULL
);
526 if( list_txn_column_id_isvisible(GTK_TREE_VIEW(data
->treeview
), LST_DSPOPE_TAGS
) == TRUE
)
529 label
= make_label_widget(_("Ta_gs:"));
530 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
531 widget
= gtk_check_button_new();
532 data
->CM_tags
= widget
;
533 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
534 widget
= make_string(label
);
535 data
->ST_tags
= widget
;
536 gtk_widget_set_hexpand (widget
, TRUE
);
537 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
539 g_signal_connect (data
->CM_tags
, "toggled", G_CALLBACK (ui_multipleedit_dialog_update
), NULL
);
542 if( list_txn_column_id_isvisible(GTK_TREE_VIEW(data
->treeview
), LST_DSPOPE_WORDING
) == TRUE
)
545 label
= make_label_widget(_("M_emo:"));
546 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
547 widget
= gtk_check_button_new();
548 data
->CM_memo
= widget
;
549 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
550 widget
= make_memo_entry(label
);
551 data
->ST_memo
= widget
;
552 gtk_widget_set_hexpand (widget
, TRUE
);
553 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
555 g_signal_connect (data
->CM_memo
, "toggled", G_CALLBACK (ui_multipleedit_dialog_update
), NULL
);
559 ui_multipleedit_dialog_update(dialog
, NULL
);
561 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_acc
), GLOBALS
->h_acc
, ACC_LST_INSERT_NORMAL
);
562 ui_pay_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_pay
), GLOBALS
->h_pay
);
563 ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_cat
), GLOBALS
->h_cat
);
565 gtk_widget_show_all (dialog
);
567 if(data
->has_xfer
== TRUE
)
569 hb_widget_visible (data
->LB_acc
, FALSE
);
570 hb_widget_visible (data
->CM_acc
, FALSE
);
571 hb_widget_visible (data
->PO_acc
, FALSE
);
574 if( list_txn_column_id_isvisible(GTK_TREE_VIEW(data
->treeview
), LST_DSPOPE_INFO
) == TRUE
)
576 if(data
->has_xfer
== TRUE
)
578 hb_widget_visible (data
->LB_mode
, FALSE
);
579 hb_widget_visible (data
->CM_mode
, FALSE
);
580 hb_widget_visible (data
->NU_mode
, FALSE
);
588 /* account action functions -------------------- */
591 static void register_panel_action_editfilter(GtkAction
*action
, gpointer user_data
)
593 struct register_panel_data
*data
= user_data
;
595 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_FILTER
));
602 static void register_panel_action_add(GtkAction
*action
, gpointer user_data
)
604 struct register_panel_data
*data
= user_data
;
606 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_ADD
));
609 static void register_panel_action_inherit(GtkAction
*action
, gpointer user_data
)
611 struct register_panel_data
*data
= user_data
;
613 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_INHERIT
));
616 static void register_panel_action_edit(GtkAction
*action
, gpointer user_data
)
618 struct register_panel_data
*data
= user_data
;
620 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_EDIT
));
623 static void register_panel_action_multiedit(GtkAction
*action
, gpointer user_data
)
625 struct register_panel_data
*data
= user_data
;
627 register_panel_edit_multiple(data
->window
, NULL
, 0, user_data
);
630 static void register_panel_action_reconcile(GtkAction
*action
, gpointer user_data
)
632 struct register_panel_data
*data
= user_data
;
634 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_RECONCILE
));
637 static void register_panel_action_clear(GtkAction
*action
, gpointer user_data
)
639 struct register_panel_data
*data
= user_data
;
641 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_CLEAR
));
644 static void register_panel_action_none(GtkAction
*action
, gpointer user_data
)
646 struct register_panel_data
*data
= user_data
;
648 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_NONE
));
651 static void register_panel_action_remove(GtkAction
*action
, gpointer user_data
)
653 struct register_panel_data
*data
= user_data
;
655 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_DELETE
));
660 static void register_panel_action_createtemplate(GtkAction
*action
, gpointer user_data
)
662 struct register_panel_data
*data
= user_data
;
664 register_panel_make_archive(data
->window
, NULL
);
669 static void register_panel_action_exportcsv(GtkAction
*action
, gpointer user_data
)
671 struct register_panel_data
*data
= user_data
;
673 register_panel_export_csv(data
->window
, NULL
);
677 static void register_panel_action_check_internal_xfer(GtkAction
*action
, gpointer user_data
)
679 struct register_panel_data
*data
= user_data
;
686 DB( g_print("check intenal xfer\n\n") );
689 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
));
690 valid
= gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model
), &iter
);
695 gtk_tree_model_get (model
, &iter
,
696 LST_DSPOPE_DATAS
, &txn
,
699 if( txn
->paymode
== PAYMODE_INTXFER
)
701 if( transaction_xfer_child_strong_get(txn
) == NULL
)
703 DB( g_print(" - invalid xfer: '%s'\n", txn
->wording
) );
705 //test unrecoverable (kxferacc = 0)
706 if( txn
->kxferacc
<= 0 )
708 DB( g_print(" - unrecoverable, revert to normal xfer\n") );
709 txn
->flags
|= OF_CHANGED
;
710 txn
->paymode
= PAYMODE_XFER
;
716 badxferlist
= g_list_append(badxferlist
, txn
);
721 valid
= gtk_tree_model_iter_next(GTK_TREE_MODEL(model
), &iter
);
724 count
= g_list_length (badxferlist
);
725 DB( g_print(" - found %d invalid int xfer\n", count
) );
729 ui_dialog_msg_infoerror(GTK_WINDOW(data
->window
), GTK_MESSAGE_INFO
,
730 _("Check internal transfert result"),
731 _("No inconsistency found !")
738 do_fix
= ui_dialog_msg_question(
739 GTK_WINDOW(data
->window
),
740 _("Check internal transfert result"),
741 _("Inconsistency were found: %d\n"
742 "do you want to review and fix ?"),
746 if(do_fix
== GTK_RESPONSE_YES
)
748 GList
*tmplist
= g_list_first(badxferlist
);
751 while (tmplist
!= NULL
)
753 Transaction
*stxn
= tmplist
->data
;
755 // (open dialog to select date tolerance in days)
756 // ( with info message)
757 // ( with check/fix button and progress bar)
760 //-display the src txn
761 //-enable to display 1 of xxx if more than 1
763 transaction_xfer_search_or_add_child(GTK_WINDOW(data
->window
), stxn
, TRUE
);
765 tmplist
= g_list_next(tmplist
);
770 g_list_free (badxferlist
);
775 static void register_panel_action_exportqif(GtkAction
*action
, gpointer user_data
)
777 struct register_panel_data
*data
= user_data
;
780 DB( g_print("(qif) test qif export\n\n") );
782 if( ui_file_chooser_qif(GTK_WINDOW(data
->window
), &filename
) == TRUE
)
784 hb_export_qif_account_single(filename
, data
->acc
);
790 static void register_panel_action_converttoeuro(GtkAction
*action
, gpointer user_data
)
792 struct register_panel_data
*data
= user_data
;
796 DB( g_print("action convert to euro\n") );
798 msg
= g_strdup_printf(_("Every transaction amount will be divided by %.6f."), PREFS
->euro_value
);
800 result
= ui_dialog_msg_confirm_alert(
801 GTK_WINDOW(data
->window
),
802 _("Are you sure you want to convert this account\nto Euro as Major currency?"),
809 if(result
== GTK_RESPONSE_OK
)
811 account_convert_euro(data
->acc
);
812 register_panel_update(data
->LV_ope
, GINT_TO_POINTER(UF_BALANCE
));
817 static void register_panel_action_assign(GtkAction
*action
, gpointer user_data
)
819 struct register_panel_data
*data
= user_data
;
821 gboolean usermode
= TRUE
;
823 count
= transaction_auto_assign(g_queue_peek_head_link(data
->acc
->txn_queue
), data
->accnum
);
824 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_ope
));
825 GLOBALS
->changes_count
+= count
;
833 txt
= _("No transaction changed");
835 txt
= _("transaction changed: %d");
837 ui_dialog_msg_infoerror(GTK_WINDOW(data
->window
), GTK_MESSAGE_INFO
,
838 _("Automatic assignment result"),
846 static void register_panel_action_close(GtkAction
*action
, gpointer user_data
)
848 struct register_panel_data
*data
= user_data
;
850 DB( g_print("action close\n") );
852 DB( g_print("window %p\n", data
->window
) );
854 gtk_widget_destroy (GTK_WIDGET (data
->window
));
856 //g_signal_emit_by_name(data->window, "delete-event", NULL, &result);
861 /* these 5 functions are independant from account window */
863 /* account functions -------------------- */
865 static void register_panel_export_csv(GtkWidget
*widget
, gpointer user_data
)
867 struct register_panel_data
*data
;
868 gchar
*filename
= NULL
;
874 DB( g_print("\n[account] export csv\n") );
876 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
878 if( ui_file_chooser_csv(GTK_WINDOW(data
->window
), GTK_FILE_CHOOSER_ACTION_SAVE
, &filename
, NULL
) == TRUE
)
881 DB( g_print(" + filename is %s\n", filename
) );
883 io
= g_io_channel_new_file(filename
, "w", NULL
);
887 g_io_channel_write_chars(io
, "date;paymode;info;payee;wording;amount;category;tags\n", -1, NULL
, NULL
);
890 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
));
892 valid
= gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model
), &iter
);
899 gchar
*info
, *payeename
, *categoryname
;
903 char amountbuf
[G_ASCII_DTOSTR_BUF_SIZE
];
905 gtk_tree_model_get (model
, &iter
,
906 LST_DSPOPE_DATAS
, &ope
,
909 hb_sprint_date(datebuf
, ope
->date
);
912 if(info
== NULL
) info
= "";
913 payee
= da_pay_get(ope
->kpay
);
914 payeename
= (payee
->name
== NULL
) ? "" : payee
->name
;
915 category
= da_cat_get(ope
->kcat
);
916 categoryname
= (category
->name
== NULL
) ? "" : da_cat_get_fullname(category
);
917 tags
= transaction_tags_tostring(ope
);
920 //g_ascii_dtostr (amountbuf, sizeof (amountbuf), ope->amount);
921 g_ascii_formatd (amountbuf
, sizeof (amountbuf
), "%.2f", ope
->amount
);
925 DB( g_print("amount = %f '%s'\n", ope
->amount
, amountbuf
) );
928 outstr
= g_strdup_printf("%s;%d;%s;%s;%s;%s;%s;%s\n",
936 tags
!= NULL
? tags
: ""
939 DB( g_print("%s", outstr
) );
941 g_io_channel_write_chars(io
, outstr
, -1, NULL
, NULL
);
947 valid
= gtk_tree_model_iter_next(GTK_TREE_MODEL(model
), &iter
);
950 g_io_channel_unref (io
);
963 static void register_panel_edit_multiple(GtkWidget
*widget
, Transaction
*txn
, gint column_id
, gpointer user_data
)
965 struct register_panel_data
*data
;
968 DB( g_print("\n[account] edit multiple\n") );
970 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
972 DB( g_print(" - txn:%p, column: %d\n", txn
, column_id
) );
974 dialog
= ui_multipleedit_dialog_new(GTK_WINDOW(data
->window
), GTK_TREE_VIEW(data
->LV_ope
));
976 if(txn
!= NULL
&& column_id
!= 0)
978 ui_multipleedit_dialog_prefill(dialog
, txn
, column_id
);
982 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
984 if( result
== GTK_RESPONSE_ACCEPT
)
986 ui_multipleedit_dialog_apply (dialog
, NULL
);
989 gtk_widget_destroy (dialog
);
991 register_panel_update(data
->LV_ope
, GINT_TO_POINTER(UF_BALANCE
));
996 ** make an archive with the active transaction
998 static void register_panel_make_archive(GtkWidget
*widget
, gpointer user_data
)
1000 struct register_panel_data
*data
;
1002 DB( g_print("\n[account] make archive\n") );
1004 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1006 GtkWidget
*p_dialog
= NULL
;
1007 GtkTreeModel
*model
;
1008 GList
*selection
, *list
;
1011 count
= gtk_tree_selection_count_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
)));
1015 p_dialog
= gtk_message_dialog_new
1017 GTK_WINDOW(data
->window
),
1018 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
1019 GTK_MESSAGE_WARNING
,
1021 _("Do you want to create a template with\neach of the selected transaction ?")
1025 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
1026 _("%d archives will be created"),
1027 GLOBALS->changes_count
1031 result
= gtk_dialog_run( GTK_DIALOG( p_dialog
) );
1032 gtk_widget_destroy( p_dialog
);
1035 if(result
== GTK_RESPONSE_YES
)
1038 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
));
1039 selection
= gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
)), &model
);
1041 list
= g_list_first(selection
);
1048 gtk_tree_model_get_iter(model
, &iter
, list
->data
);
1049 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &ope
, -1);
1051 DB( g_print(" create archive %s %.2f\n", ope
->wording
, ope
->amount
) );
1053 item
= da_archive_malloc();
1055 da_archive_init_from_transaction(item
, ope
);
1057 GLOBALS
->arc_list
= g_list_append(GLOBALS
->arc_list
, item
);
1058 GLOBALS
->changes_count
++;
1060 list
= g_list_next(list
);
1063 g_list_foreach(selection
, (GFunc
)gtk_tree_path_free
, NULL
);
1064 g_list_free(selection
);
1070 static void register_panel_cb_filter_daterange(GtkWidget
*widget
, gpointer user_data
)
1072 struct register_panel_data
*data
;
1075 DB( g_print("\n[account] filter_daterange\n") );
1077 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1079 range
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_range
));
1081 if(range
!= FLT_RANGE_OTHER
)
1083 filter_preset_daterange_set(data
->filter
, range
, data
->accnum
);
1084 // add eventual x days into future display
1085 if( PREFS
->date_future_nbdays
> 0 )
1086 filter_preset_daterange_add_futuregap(data
->filter
, PREFS
->date_future_nbdays
);
1088 register_panel_collect_filtered_txn(data
->LV_ope
);
1089 register_panel_listview_populate(data
->LV_ope
);
1093 if(ui_flt_manage_dialog_new(data
->window
, data
->filter
, FALSE
) != GTK_RESPONSE_REJECT
)
1095 register_panel_collect_filtered_txn(data
->LV_ope
);
1096 register_panel_listview_populate(data
->LV_ope
);
1097 register_panel_update(data
->LV_ope
, GINT_TO_POINTER(UF_SENSITIVE
+UF_BALANCE
));
1104 static void register_panel_cb_filter_type(GtkWidget
*widget
, gpointer user_data
)
1106 struct register_panel_data
*data
;
1109 DB( g_print("\n[account] filter_type\n") );
1110 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1112 type
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_type
));
1114 filter_preset_type_set(data
->filter
, type
);
1116 register_panel_collect_filtered_txn(data
->LV_ope
);
1117 register_panel_listview_populate(data
->LV_ope
);
1121 static void register_panel_cb_filter_status(GtkWidget
*widget
, gpointer user_data
)
1123 struct register_panel_data
*data
;
1126 DB( g_print("\n[account] filter_status\n") );
1127 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1129 status
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_status
));
1131 filter_preset_status_set(data
->filter
, status
);
1133 register_panel_collect_filtered_txn(data
->LV_ope
);
1134 register_panel_listview_populate(data
->LV_ope
);
1138 static void register_panel_cb_filter_reset(GtkWidget
*widget
, gpointer user_data
)
1140 struct register_panel_data
*data
;
1142 DB( g_print("\n[account] filter_reset\n") );
1143 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1145 filter_default_all_set(data
->filter
);
1146 filter_preset_daterange_set (data
->filter
, PREFS
->date_range_txn
, data
->accnum
);
1147 if(PREFS
->hidereconciled
)
1148 filter_preset_status_set (data
->filter
, 1);
1150 register_panel_collect_filtered_txn(data
->LV_ope
);
1151 register_panel_listview_populate(data
->LV_ope
);
1153 g_signal_handler_block(data
->CY_range
, data
->handler_id
[HID_RANGE
]);
1154 g_signal_handler_block(data
->CY_type
, data
->handler_id
[HID_TYPE
]);
1155 g_signal_handler_block(data
->CY_status
, data
->handler_id
[HID_STATUS
]);
1157 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_range
), data
->filter
->range
);
1158 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_type
), data
->filter
->type
);
1159 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_status
), data
->filter
->status
);
1161 g_signal_handler_unblock(data
->CY_status
, data
->handler_id
[HID_STATUS
]);
1162 g_signal_handler_unblock(data
->CY_type
, data
->handler_id
[HID_TYPE
]);
1163 g_signal_handler_unblock(data
->CY_range
, data
->handler_id
[HID_RANGE
]);
1168 static void register_panel_balance_refresh(GtkWidget
*view
)
1170 struct register_panel_data
*data
;
1173 GtkTreeModel
*model
;
1177 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(view
, GTK_TYPE_WINDOW
)), "inst_data");
1179 DB( g_print("\n[account] balance refresh\n") );
1181 balance
= data
->acc
->initial
;
1183 //#1270687: sort if date changed
1186 DB( g_print(" - complete txn sort\n") );
1188 da_transaction_queue_sort(data
->acc
->txn_queue
);
1189 data
->do_sort
= FALSE
;
1192 list
= g_queue_peek_head_link(data
->acc
->txn_queue
);
1193 while (list
!= NULL
)
1195 Transaction
*ope
= list
->data
;
1198 if(!(ope
->status
== TXN_STATUS_REMIND
))
1199 balance
+= ope
->amount
;
1201 ope
->balance
= balance
;
1203 if(ope
->date
== ldate
)
1209 ope
->pos
= lpos
= 1;
1213 list
= g_list_next(list
);
1216 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
));
1217 list_txn_sort_force(GTK_TREE_SORTABLE(model
), NULL
);
1222 static void register_panel_collect_filtered_txn(GtkWidget
*view
)
1224 struct register_panel_data
*data
;
1228 DB( g_print("\n[register_panel] collect_filtered_txn\n") );
1230 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(view
, GTK_TYPE_WINDOW
)), "inst_data");
1232 if(data
->gpatxn
!= NULL
)
1233 g_ptr_array_free (data
->gpatxn
, TRUE
);
1236 guint nbtxn
= g_queue_get_length (data
->acc
->txn_queue
);
1237 g_print(" - nb txn %d\n", nbtxn
);
1240 data
->gpatxn
= g_ptr_array_sized_new(64);
1244 list
= g_queue_peek_head_link(data
->acc
->txn_queue
); i
=0;
1245 while (list
!= NULL
)
1247 Transaction
*ope
= list
->data
;
1249 if(filter_test(data
->filter
, ope
) == 1)
1251 g_ptr_array_add(data
->gpatxn
, (gpointer
)ope
);
1260 if( !(i
% 1000) ) { g_print(" - progress %d/%d\n", i
, nbtxn
); }
1264 list
= g_list_next(list
);
1267 g_signal_handler_block(data
->ST_search
, data
->handler_id
[HID_SEARCH
]);
1268 gtk_entry_set_text (GTK_ENTRY(data
->ST_search
), "");
1269 g_signal_handler_unblock(data
->ST_search
, data
->handler_id
[HID_SEARCH
]);
1275 static void register_panel_listview_populate(GtkWidget
*widget
)
1277 struct register_panel_data
*data
;
1278 GtkTreeModel
*model
;
1282 gint sort_column_id
;
1286 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1288 DB( g_print("\n[register_panel] listview_populate\n") );
1290 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
));
1292 // ref model to keep it
1293 //g_object_ref(model);
1294 //gtk_tree_view_set_model(GTK_TREE_VIEW(data->LV_ope), NULL);
1295 gtk_list_store_clear (GTK_LIST_STORE(model
));
1298 // perf: if you leave the sort, insert is damned slow
1299 gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(GTK_LIST_STORE(model
)), &sort_column_id
, &order
);
1301 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(GTK_LIST_STORE(model
)), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID
, PREFS
->lst_ope_sort_order
);
1303 hastext
= gtk_entry_get_text_length (GTK_ENTRY(data
->ST_search
)) >= 2;
1304 needle
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_search
));
1306 //build the mask flag for quick search
1310 qs_flag
= list_txn_get_quicksearch_column_mask(GTK_TREE_VIEW(data
->LV_ope
));
1314 data
->totalsum
= 0.0;
1316 for(i
=0;i
<data
->gpatxn
->len
;i
++)
1318 Transaction
*txn
= g_ptr_array_index(data
->gpatxn
, i
);
1319 gboolean insert
= TRUE
;
1323 insert
= filter_txn_search_match(needle
, txn
, qs_flag
);
1328 //gtk_list_store_append (GTK_LIST_STORE(model), &iter);
1329 //gtk_list_store_set (GTK_LIST_STORE(model), &iter,
1330 gtk_list_store_insert_with_values(GTK_LIST_STORE(model
), &iter
, -1,
1331 LST_DSPOPE_DATAS
, txn
,
1334 data
->totalsum
+= txn
->amount
;
1339 //gtk_tree_view_set_model(GTK_TREE_VIEW(data->LV_ope), model); /* Re-attach model to view */
1340 //g_object_unref(model);
1342 // push back the sort id
1343 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(GTK_LIST_STORE(model
)), sort_column_id
, order
);
1345 /* update info range text */
1349 daterange
= filter_daterange_text_get(data
->filter
);
1350 gtk_widget_set_tooltip_markup(GTK_WIDGET(data
->CY_range
), daterange
);
1354 register_panel_update(data
->LV_ope
, GINT_TO_POINTER(UF_SENSITIVE
+UF_BALANCE
));
1358 static gint
txn_list_get_count_reconciled(GtkTreeView
*treeview
)
1360 GtkTreeModel
*model
;
1361 GList
*lselection
, *list
;
1364 model
= gtk_tree_view_get_model(treeview
);
1365 lselection
= gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(treeview
), &model
);
1367 list
= g_list_last(lselection
);
1374 gtk_tree_model_get_iter(model
, &iter
, list
->data
);
1375 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &txn
, -1);
1376 if(txn
->status
== TXN_STATUS_RECONCILED
)
1379 list
= g_list_previous(list
);
1382 g_list_foreach(lselection
, (GFunc
)gtk_tree_path_free
, NULL
);
1383 g_list_free(lselection
);
1389 static void status_selected_foreach_func (GtkTreeModel
*model
, GtkTreePath
*path
, GtkTreeIter
*iter
, gpointer userdata
)
1391 gint targetstatus
= GPOINTER_TO_INT(userdata
);
1394 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &txn
, -1);
1396 account_balances_sub(txn
);
1398 switch(targetstatus
)
1400 case TXN_STATUS_NONE
:
1403 case TXN_STATUS_CLEARED
:
1404 case TXN_STATUS_RECONCILED
:
1405 txn
->status
= TXN_STATUS_NONE
;
1406 txn
->flags
|= OF_CHANGED
;
1411 case TXN_STATUS_CLEARED
:
1414 case TXN_STATUS_NONE
:
1415 txn
->status
= TXN_STATUS_CLEARED
;
1416 txn
->flags
|= OF_CHANGED
;
1418 case TXN_STATUS_CLEARED
:
1419 txn
->status
= TXN_STATUS_NONE
;
1420 txn
->flags
|= OF_CHANGED
;
1425 case TXN_STATUS_RECONCILED
:
1428 case TXN_STATUS_NONE
:
1429 case TXN_STATUS_CLEARED
:
1430 txn
->status
= TXN_STATUS_RECONCILED
;
1431 txn
->flags
|= OF_CHANGED
;
1433 case TXN_STATUS_RECONCILED
:
1434 txn
->status
= TXN_STATUS_CLEARED
;
1435 txn
->flags
|= OF_CHANGED
;
1443 account_balances_add(txn
);
1445 /* #492755 let the child transfer unchnaged */
1450 static void delete_active_transaction(GtkTreeView
*treeview
)
1452 GtkTreeModel
*model
;
1455 model
= gtk_tree_view_get_model(treeview
);
1456 list
= gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(treeview
), &model
);
1462 gtk_tree_model_get_iter(model
, &iter
, list
->data
);
1463 gtk_list_store_remove(GTK_LIST_STORE(model
), &iter
);
1466 g_list_foreach(list
, (GFunc
)gtk_tree_path_free
, NULL
);
1474 static void register_panel_action(GtkWidget
*widget
, gpointer user_data
)
1476 struct register_panel_data
*data
;
1477 gint action
= GPOINTER_TO_INT(user_data
);
1480 DB( g_print("\n[account] action\n") );
1482 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1483 //data = INST_DATA(widget);
1485 DB( g_print(" - action=%d\n", action
) );
1490 case ACTION_ACCOUNT_ADD
:
1492 case ACTION_ACCOUNT_INHERIT
:
1495 Transaction
*src_txn
;
1498 homebank_app_date_get_julian();
1500 if(action
== ACTION_ACCOUNT_ADD
)
1502 DB( g_print("(transaction) add multiple\n") );
1503 src_txn
= da_transaction_malloc();
1504 src_txn
->date
= GLOBALS
->today
;
1505 src_txn
->kacc
= data
->accnum
;
1506 type
= TRANSACTION_EDIT_ADD
;
1510 DB( g_print("(transaction) inherit multiple\n") );
1511 src_txn
= da_transaction_clone(list_txn_get_active_transaction(GTK_TREE_VIEW(data
->LV_ope
)));
1513 src_txn
->status
= TXN_STATUS_NONE
;
1514 type
= TRANSACTION_EDIT_INHERIT
;
1517 dialog
= create_deftransaction_window(GTK_WINDOW(data
->window
), type
, FALSE
);
1518 result
= GTK_RESPONSE_ADD
;
1519 while(result
== GTK_RESPONSE_ADD
|| result
== GTK_RESPONSE_ADDKEEP
)
1521 /* clone source transaction */
1522 if( result
== GTK_RESPONSE_ADD
)
1524 data
->cur_ope
= da_transaction_clone (src_txn
);
1526 if( PREFS
->heritdate
== FALSE
) //fix: 318733 / 1335285
1527 data
->cur_ope
->date
= GLOBALS
->today
;
1530 deftransaction_set_transaction(dialog
, data
->cur_ope
);
1532 result
= gtk_dialog_run (GTK_DIALOG (dialog
));
1533 if(result
== GTK_RESPONSE_ADD
|| result
== GTK_RESPONSE_ADDKEEP
|| result
== GTK_RESPONSE_ACCEPT
)
1535 deftransaction_get(dialog
, NULL
);
1536 transaction_add(data
->cur_ope
, data
->LV_ope
, data
->accnum
);
1537 register_panel_update(widget
, GINT_TO_POINTER(UF_BALANCE
));
1538 data
->acc
->flags
|= AF_ADDED
;
1539 GLOBALS
->changes_count
++;
1541 src_txn
->date
= data
->cur_ope
->date
;
1544 if( result
== GTK_RESPONSE_ADD
)
1546 da_transaction_free (data
->cur_ope
);
1551 deftransaction_dispose(dialog
, NULL
);
1552 da_transaction_free (src_txn
);
1554 gtk_widget_destroy (dialog
);
1558 case ACTION_ACCOUNT_EDIT
:
1560 Transaction
*active_txn
;
1562 active_txn
= list_txn_get_active_transaction(GTK_TREE_VIEW(data
->LV_ope
));
1566 Transaction
*old_txn
, *new_txn
;
1568 old_txn
= da_transaction_clone (active_txn
);
1569 new_txn
= active_txn
;
1571 result
= deftransaction_external_edit(GTK_WINDOW(data
->window
), old_txn
, new_txn
);
1573 if(result
== GTK_RESPONSE_ACCEPT
)
1575 //#1270687: sort if date changed
1576 if(old_txn
->date
!= new_txn
->date
)
1577 data
->do_sort
= TRUE
;
1579 // different account : delete from the display
1580 if( new_txn
->kacc
!= data
->accnum
)
1582 delete_active_transaction(GTK_TREE_VIEW(data
->LV_ope
));
1585 //da_transaction_copy(new_txn, old_txn);
1587 register_panel_update(widget
, GINT_TO_POINTER(UF_BALANCE
));
1589 data
->acc
->flags
|= AF_CHANGED
;
1590 GLOBALS
->changes_count
++;
1593 da_transaction_free (old_txn
);
1598 case ACTION_ACCOUNT_DELETE
:
1600 GtkWidget
*p_dialog
= NULL
;
1601 GtkTreeModel
*model
;
1602 GList
*selection
, *list
;
1606 DB( g_print(" - delete\n") );
1608 //count = gtk_tree_selection_count_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_ope)));
1610 //todo: replace with a call to ui_dialog_msg_question ?
1612 p_dialog
= gtk_message_dialog_new
1614 GTK_WINDOW(data
->window
),
1616 GTK_MESSAGE_WARNING
,
1618 _("Do you want to delete\neach of the selected transaction ?")
1622 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
1623 _("%d transactions will be definitively lost.\n"),
1624 GLOBALS->changes_count
1629 result
= gtk_dialog_run( GTK_DIALOG( p_dialog
) );
1630 gtk_widget_destroy( p_dialog
);
1633 if(result
== GTK_RESPONSE_YES
)
1636 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
));
1637 selection
= gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
)), &model
);
1639 // #1418968 Transaction list scroll reset when deleting transaction
1640 //g_object_ref(model); /* Make sure the model stays with us after the tree view unrefs it */
1641 //gtk_tree_view_set_model(GTK_TREE_VIEW(data->LV_ope), NULL); /* Detach model from view */
1644 DB( g_print(" delete %d line\n", g_list_length(selection
)) );
1647 list
= g_list_last(selection
);
1653 gtk_tree_model_get_iter(model
, &iter
, list
->data
);
1654 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &entry
, -1);
1656 DB( g_print(" delete %s %.2f\n", entry
->wording
, entry
->amount
) );
1658 account_balances_sub(entry
);
1660 /* v3.4: also delete child transfer */
1661 if( entry
->paymode
== PAYMODE_INTXFER
)
1663 transaction_xfer_remove_child( entry
);
1666 gtk_list_store_remove(GTK_LIST_STORE(model
), &iter
);
1668 g_queue_remove(data
->acc
->txn_queue
, entry
);
1669 //#1419304 we keep the deleted txn to a trash stack
1670 //da_transaction_free(entry);
1671 g_trash_stack_push(&GLOBALS
->txn_stk
, entry
);
1673 GLOBALS
->changes_count
++;
1676 list
= g_list_previous(list
);
1679 g_list_foreach(selection
, (GFunc
)gtk_tree_path_free
, NULL
);
1680 g_list_free(selection
);
1682 // #1418968 Transaction list scroll reset when deleting transaction
1683 //gtk_tree_view_set_model(GTK_TREE_VIEW(data->LV_ope), model); /* Re-attach model to view */
1684 //g_object_unref(model);
1686 register_panel_update(widget
, GINT_TO_POINTER(UF_BALANCE
));
1688 data
->acc
->flags
|= AF_CHANGED
;
1695 case ACTION_ACCOUNT_NONE
:
1697 GtkTreeSelection
*selection
;
1700 count
= txn_list_get_count_reconciled(GTK_TREE_VIEW(data
->LV_ope
));
1705 result
= ui_dialog_msg_confirm_alert(
1706 GTK_WINDOW(data
->window
),
1707 _("Are you sure you want to change the status to None?"),
1708 _("Some transaction in your selection are already Reconciled."),
1713 result
= GTK_RESPONSE_OK
;
1715 if( result
== GTK_RESPONSE_OK
)
1717 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
));
1718 gtk_tree_selection_selected_foreach(selection
, (GtkTreeSelectionForeachFunc
)status_selected_foreach_func
,
1719 GINT_TO_POINTER(TXN_STATUS_NONE
));
1721 DB( g_print(" - none\n") );
1723 gtk_widget_queue_draw (data
->LV_ope
);
1724 //gtk_widget_queue_resize (data->LV_acc);
1726 register_panel_update(widget
, GINT_TO_POINTER(UF_BALANCE
));
1728 data
->acc
->flags
|= AF_CHANGED
;
1729 GLOBALS
->changes_count
++;
1735 case ACTION_ACCOUNT_CLEAR
:
1737 GtkTreeSelection
*selection
;
1739 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
));
1740 gtk_tree_selection_selected_foreach(selection
, (GtkTreeSelectionForeachFunc
)status_selected_foreach_func
,
1741 GINT_TO_POINTER(TXN_STATUS_CLEARED
));
1743 DB( g_print(" - clear\n") );
1745 gtk_widget_queue_draw (data
->LV_ope
);
1746 //gtk_widget_queue_resize (data->LV_acc);
1748 register_panel_update(widget
, GINT_TO_POINTER(UF_BALANCE
));
1750 data
->acc
->flags
|= AF_CHANGED
;
1751 GLOBALS
->changes_count
++;
1757 case ACTION_ACCOUNT_RECONCILE
:
1759 GtkTreeSelection
*selection
;
1762 count
= txn_list_get_count_reconciled(GTK_TREE_VIEW(data
->LV_ope
));
1767 result
= ui_dialog_msg_confirm_alert(
1768 GTK_WINDOW(data
->window
),
1769 _("Are you sure you want to toggle the status Reconciled?"),
1770 _("Some transaction in your selection are already Reconciled."),
1775 result
= GTK_RESPONSE_OK
;
1777 if( result
== GTK_RESPONSE_OK
)
1779 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
));
1780 gtk_tree_selection_selected_foreach(selection
, (GtkTreeSelectionForeachFunc
)status_selected_foreach_func
,
1781 GINT_TO_POINTER(TXN_STATUS_RECONCILED
));
1783 DB( g_print(" - reconcile\n") );
1785 gtk_widget_queue_draw (data
->LV_ope
);
1786 //gtk_widget_queue_resize (data->LV_acc);
1788 register_panel_update(widget
, GINT_TO_POINTER(UF_BALANCE
));
1790 data
->acc
->flags
|= AF_CHANGED
;
1791 GLOBALS
->changes_count
++;
1798 case ACTION_ACCOUNT_FILTER
:
1801 if(ui_flt_manage_dialog_new(data
->window
, data
->filter
, FALSE
) != GTK_RESPONSE_REJECT
)
1803 register_panel_collect_filtered_txn(data
->LV_ope
);
1804 register_panel_listview_populate(data
->LV_ope
);
1805 register_panel_update(data
->LV_ope
, GINT_TO_POINTER(UF_SENSITIVE
+UF_BALANCE
));
1807 g_signal_handler_block(data
->CY_range
, data
->handler_id
[HID_RANGE
]);
1808 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_range
), FLT_RANGE_OTHER
);
1809 g_signal_handler_unblock(data
->CY_range
, data
->handler_id
[HID_RANGE
]);
1821 static void register_panel_toggle_minor(GtkWidget
*widget
, gpointer user_data
)
1823 struct register_panel_data
*data
;
1825 DB( g_print("\n[account] toggle\n") );
1827 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1829 register_panel_update(data
->LV_ope
, GINT_TO_POINTER(UF_BALANCE
));
1830 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_ope
));
1834 static void register_panel_selection(GtkTreeSelection
*treeselection
, gpointer user_data
)
1837 DB( g_print("\n[account] selection changed cb\n") );
1840 register_panel_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), GINT_TO_POINTER(UF_SENSITIVE
));
1845 static void register_panel_update(GtkWidget
*widget
, gpointer user_data
)
1847 struct register_panel_data
*data
;
1848 GtkTreeSelection
*selection
;
1849 gint flags
= GPOINTER_TO_INT(user_data
);
1852 DB( g_print("\n[account] update\n") );
1854 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1855 //data = INST_DATA(widget);
1857 GLOBALS
->minor
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_minor
));
1859 /* set window title */
1860 if(flags
& UF_TITLE
)
1862 DB( g_print(" - UF_TITLE\n") );
1866 /* update disabled things */
1867 if(flags
& UF_SENSITIVE
)
1871 DB( g_print(" - UF_SENSITIVE\n") );
1873 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
));
1874 count
= gtk_tree_selection_count_selected_rows(selection
);
1875 DB( g_print(" - count = %d\n", count
) );
1879 if (active = gtk_tree_selection_get_selected(selection, &model, &iter))
1883 path = gtk_tree_model_get_path(model, &iter);
1884 indices = gtk_tree_path_get_indices(path);
1886 data->accnum = indices[0];
1888 DB( g_print(" active is %d, sel=%d\n", indices[0], active) );
1892 //5.3.1 if closed account : disable any change
1893 if( data
->acc
->flags
& AF_CLOSED
)
1895 gtk_widget_set_sensitive (data
->TB_bar
, FALSE
);
1896 //gtk_widget_set_sensitive (data->TB_tools, FALSE);
1897 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/ToolBar/Assign"), FALSE
);
1899 gtk_widget_set_sensitive (gtk_ui_manager_get_widget(data
->ui
, "/MenuBar/TxnMenu"), FALSE
);
1900 gtk_widget_set_sensitive (gtk_ui_manager_get_widget(data
->ui
, "/MenuBar/ToolsMenu"), FALSE
);
1905 gtk_widget_set_sensitive (data
->TB_bar
, TRUE
);
1906 //gtk_widget_set_sensitive (data->TB_tools, TRUE);
1907 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/ToolBar/Assign"), TRUE
);
1909 gtk_widget_set_sensitive (gtk_ui_manager_get_widget(data
->ui
, "/MenuBar/TxnMenu"), TRUE
);
1910 gtk_widget_set_sensitive (gtk_ui_manager_get_widget(data
->ui
, "/MenuBar/ToolsMenu"), TRUE
);
1913 // multiple: disable inherit, edit
1914 sensitive
= (count
!= 1 ) ? FALSE
: TRUE
;
1915 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/MenuBar/TxnMenu/Inherit"), sensitive
);
1916 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/MenuBar/TxnMenu/Edit"), sensitive
);
1917 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/TxnBar/Inherit"), sensitive
);
1918 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/TxnBar/Edit"), sensitive
);
1920 // single: disable multiedit
1921 sensitive
= (count
<= 1 ) ? FALSE
: TRUE
;
1922 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/MenuBar/TxnMenu/MultiEdit"), sensitive
);
1923 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/TxnBar/MultiEdit"), sensitive
);
1925 // no selection: disable reconcile, delete
1926 sensitive
= (count
> 0 ) ? TRUE
: FALSE
;
1927 gtk_widget_set_sensitive (gtk_ui_manager_get_widget(data
->ui
, "/MenuBar/TxnMenu/TxnStatusMenu"), sensitive
);
1928 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/MenuBar/TxnMenu/Delete"), sensitive
);
1929 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/MenuBar/TxnMenu/Template"), sensitive
);
1930 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/TxnBar/Delete"), sensitive
);
1931 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/TxnBar/Cleared"), sensitive
);
1932 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/TxnBar/Reconciled"), sensitive
);
1933 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/TxnBar/Template"), sensitive
);
1936 sensitive
= PREFS
->euro_active
;
1937 gtk_action_set_visible(gtk_ui_manager_get_action(data
->ui
, "/MenuBar/ToolsMenu/ConvToEuro"), sensitive
);
1941 /* update toolbar & list */
1942 if(flags
& UF_VISUAL
)
1944 DB( g_print(" - UF_VISUAL\n") );
1946 if(PREFS
->toolbar_style
== 0)
1947 gtk_toolbar_unset_style(GTK_TOOLBAR(data
->TB_bar
));
1949 gtk_toolbar_set_style(GTK_TOOLBAR(data
->TB_bar
), PREFS
->toolbar_style
-1);
1952 if( PREFS
->euro_active
)
1954 gtk_widget_show(data
->CM_minor
);
1958 gtk_widget_hide(data
->CM_minor
);
1962 /* update balances */
1963 if(flags
& UF_BALANCE
)
1965 DB( g_print(" - UF_BALANCE\n") );
1967 register_panel_balance_refresh(widget
);
1969 hb_label_set_colvalue(GTK_LABEL(data
->TX_balance
[0]), data
->acc
->bal_bank
, data
->acc
->kcur
, GLOBALS
->minor
);
1970 hb_label_set_colvalue(GTK_LABEL(data
->TX_balance
[1]), data
->acc
->bal_today
, data
->acc
->kcur
, GLOBALS
->minor
);
1971 hb_label_set_colvalue(GTK_LABEL(data
->TX_balance
[2]), data
->acc
->bal_future
, data
->acc
->kcur
, GLOBALS
->minor
);
1973 ui_mainwindow_populate_accounts(GLOBALS
->mainwindow
, NULL
);
1976 /* update fltinfo */
1977 DB( g_print(" - statusbar\n") );
1979 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
));
1980 count
= gtk_tree_selection_count_selected_rows(selection
);
1981 DB( g_print(" - nb selected = %d\n", count
) );
1983 /* if more than one ope selected, we make a sum to display to the user */
1984 gdouble opeexp
= 0.0;
1985 gdouble opeinc
= 0.0;
1992 GList
*list
, *tmplist
;
1993 GtkTreeModel
*model
;
1996 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
));
1998 list
= gtk_tree_selection_get_selected_rows(selection
, &model
);
2000 tmplist
= g_list_first(list
);
2001 while (tmplist
!= NULL
)
2005 gtk_tree_model_get_iter(model
, &iter
, tmplist
->data
);
2006 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &item
, -1);
2008 if( item
->flags
& OF_INCOME
)
2009 opeinc
+= item
->amount
;
2011 opeexp
+= item
->amount
;
2013 DB( g_print(" - %s, %.2f\n", item
->wording
, item
->amount
) );
2015 tmplist
= g_list_next(tmplist
);
2019 DB( g_print(" %f - %f = %f\n", opeinc
, opeexp
, opeinc
+ opeexp
) );
2021 hb_strfmon(buf1
, 64-1, opeinc
, data
->acc
->kcur
, GLOBALS
->minor
);
2022 hb_strfmon(buf2
, 64-1, -opeexp
, data
->acc
->kcur
, GLOBALS
->minor
);
2023 hb_strfmon(buf3
, 64-1, opeinc
+ opeexp
, data
->acc
->kcur
, GLOBALS
->minor
);
2030 //msg = g_strdup_printf (_("transaction selected: %d, hidden: %d"), count, data->hidden);
2031 hb_strfmon(buf3
, 64-1, data
->totalsum
, data
->acc
->kcur
, GLOBALS
->minor
);
2032 msg
= g_strdup_printf(_("%d items (%s)"), data
->total
, buf3
);
2035 //TRANSLATORS: detail of the 3 %s which are some amount of selected transaction, 1=total 2=income, 3=expense
2036 //msg = g_strdup_printf (_("transaction selected: %d, hidden: %d / %s ( %s - %s)"), count, data->hidden, buf3, buf1, buf2);
2037 msg
= g_strdup_printf(_("%d items (%d selected %s)"), data
->total
, count
, buf3
);
2039 gtk_label_set_markup(GTK_LABEL(data
->TX_selection
), msg
);
2045 void register_panel_onRowActivated (GtkTreeView
*treeview
, GtkTreePath
*path
, GtkTreeViewColumn
*col
, gpointer userdata
)
2047 struct register_panel_data
*data
;
2048 GtkTreeModel
*model
;
2053 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(treeview
), GTK_TYPE_WINDOW
)), "inst_data");
2055 //5.3.1 if closed account : disable any change
2056 if( data
->acc
->flags
& AF_CLOSED
)
2060 col_id
= gtk_tree_view_column_get_sort_column_id (col
);
2062 count
= gtk_tree_selection_count_selected_rows(gtk_tree_view_get_selection(treeview
));
2064 model
= gtk_tree_view_get_model(treeview
);
2066 //get transaction double clicked to initiate the widget
2067 gtk_tree_model_get_iter(model
, &iter
, path
);
2068 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &ope
, -1);
2071 DB( g_print ("%d rows been double-clicked on column=%d! ope=%s\n", count
, col_id
, ope
->wording
) );
2075 register_panel_action(GTK_WIDGET(treeview
), GINT_TO_POINTER(ACTION_ACCOUNT_EDIT
));
2079 if(col_id
>= LST_DSPOPE_DATE
&& col_id
!= LST_DSPOPE_BALANCE
)
2081 register_panel_edit_multiple (data
->window
, ope
, col_id
, data
);
2088 static gint listview_context_cb (GtkWidget *widget, GdkEventButton *event, GtkWidget *menu)
2091 if (event->button == 3)
2095 if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (treeview),
2096 (gint) event->x, (gint) event->y, &path, NULL, NULL, NULL))
2098 gtk_tree_view_set_cursor (GTK_TREE_VIEW (treeview), path, NULL, FALSE);
2099 gtk_tree_path_free (path);
2105 gtk_menu_popup (GTK_MENU(menu), NULL, NULL, NULL, NULL,
2106 event->button, event->time);
2108 // On indique à l'appelant que l'on a géré cet événement.
2113 // On indique à l'appelant que l'on n'a pas géré cet événement.
2121 ** populate the account window
2123 void register_panel_window_init(GtkWidget
*widget
, gpointer user_data
)
2125 struct register_panel_data
*data
;
2128 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
2130 DB( g_print("\n[account] init window\n") );
2132 if( data
->acc
->flags
& AF_CLOSED
)
2134 name
= g_strdup_printf(_("[closed account] %s"), data
->acc
->name
);
2135 gtk_label_set_text (GTK_LABEL(data
->LB_name
), name
);
2139 gtk_label_set_text (GTK_LABEL(data
->LB_name
), data
->acc
->name
);
2141 DB( g_print(" - sort transactions\n") );
2142 da_transaction_queue_sort(data
->acc
->txn_queue
);
2144 //DB( g_print(" mindate=%d, maxdate=%d %x\n", data->filter->mindate,data->filter->maxdate) );
2146 DB( g_print(" - call update visual\n") );
2147 register_panel_update(widget
, GINT_TO_POINTER(UF_VISUAL
));
2149 DB( g_print(" - set range or populate+update sensitive+balance\n") );
2151 register_panel_cb_filter_reset(widget
, user_data
);
2159 register_panel_getgeometry(GtkWidget
*widget
, GdkEventConfigure
*event
, gpointer user_data
)
2161 //struct register_panel_data *data = user_data;
2162 struct WinGeometry
*wg
;
2164 DB( g_print("\n[account] get geometry\n") );
2166 //store position and size
2167 wg
= &PREFS
->acc_wg
;
2168 gtk_window_get_position(GTK_WINDOW(widget
), &wg
->l
, &wg
->t
);
2169 gtk_window_get_size(GTK_WINDOW(widget
), &wg
->w
, &wg
->h
);
2170 GdkWindow
*gdk_window
= gtk_widget_get_window(GTK_WIDGET(widget
));
2171 GdkWindowState state
= gdk_window_get_state(gdk_window
);
2172 wg
->s
= (state
& GDK_WINDOW_STATE_MAXIMIZED
) ? 1 : 0;
2174 DB( g_print(" window: l=%d, t=%d, w=%d, h=%d s=%d, state=%d\n", wg
->l
, wg
->t
, wg
->w
, wg
->h
, wg
->s
, state
& GDK_WINDOW_STATE_MAXIMIZED
) );
2182 static gboolean
register_panel_dispose(GtkWidget
*widget
, GdkEvent
*event
, gpointer user_data
)
2184 //struct register_panel_data *data = user_data;
2186 //data = g_object_get_data(G_OBJECT(widget), "inst_data");
2188 DB( g_print("\n[account] delete-event\n") );
2193 /* Another callback */
2194 static gboolean
register_panel_destroy( GtkWidget
*widget
,
2195 gpointer user_data
)
2197 struct register_panel_data
*data
;
2199 data
= g_object_get_data(G_OBJECT(widget
), "inst_data");
2202 DB( g_print ("\n[account] destroy event occurred\n") );
2206 //enable define windows
2207 GLOBALS
->define_off
--;
2209 /* unset transaction edit mutex */
2211 data
->acc
->window
= NULL
;
2213 /* free title and filter */
2214 DB( g_print(" user_data=%p to be free\n", user_data
) );
2215 g_free(data
->wintitle
);
2217 if(data
->gpatxn
!= NULL
)
2218 g_ptr_array_free (data
->gpatxn
, TRUE
);
2220 da_filter_free(data
->filter
);
2225 //our global list has changed, so update the treeview
2226 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_TITLE
+UF_SENSITIVE
+UF_BALANCE
+UF_REFRESHALL
));
2232 static void quick_search_text_changed_cb (GtkWidget
*widget
, gpointer user_data
)
2234 struct register_panel_data
*data
= user_data
;
2236 register_panel_listview_populate (data
->window
);
2240 static GtkActionEntry entries
[] = {
2242 /* name, icon-name, label */
2243 { "AccountMenu" , NULL
, N_("A_ccount"), NULL
, NULL
, NULL
},
2244 { "TxnMenu" , NULL
, N_("Transacti_on"), NULL
, NULL
, NULL
},
2245 { "TxnStatusMenu", NULL
, N_("_Status"), NULL
, NULL
, NULL
},
2246 { "ToolsMenu" , NULL
, N_("_Tools"), NULL
, NULL
, NULL
},
2248 { "Close" , ICONNAME_CLOSE
, N_("_Close") , "<control>W", N_("Close the current account"), G_CALLBACK (register_panel_action_close
) },
2250 /* name, icon-name, label, accelerator, tooltip */
2251 { "Filter" , ICONNAME_HB_FILTER
, N_("_Filter..."), NULL
, N_("Open the list filter"), G_CALLBACK (register_panel_action_editfilter
) },
2252 { "ConvToEuro" , NULL
, N_("Convert to Euro..."), NULL
, N_("Convert this account to Euro currency"), G_CALLBACK (register_panel_action_converttoeuro
) },
2254 { "Add" , ICONNAME_HB_OPE_ADD
, N_("_Add..."), NULL
, N_("Add a new transaction"), G_CALLBACK (register_panel_action_add
) },
2255 { "Inherit" , ICONNAME_HB_OPE_HERIT
, N_("_Inherit..."), NULL
, N_("Inherit from the active transaction"), G_CALLBACK (register_panel_action_inherit
) },
2256 { "Edit" , ICONNAME_HB_OPE_EDIT
, N_("_Edit..."), NULL
, N_("Edit the active transaction"), G_CALLBACK (register_panel_action_edit
) },
2258 { "None" , NULL
, N_("_None"), "<control>N", N_("Toggle none for selected transaction(s)"), G_CALLBACK (register_panel_action_none
) },
2259 { "Cleared" , ICONNAME_HB_OPE_CLEARED
, N_("_Cleared"), "<control>C", N_("Toggle cleared for selected transaction(s)"), G_CALLBACK (register_panel_action_clear
) },
2260 { "Reconciled" , ICONNAME_HB_OPE_RECONCILED
, N_("_Reconciled"), "<control>R", N_("Toggle reconciled for selected transaction(s)"), G_CALLBACK (register_panel_action_reconcile
) },
2262 { "MultiEdit" , ICONNAME_HB_OPE_MULTIEDIT
, N_("_Multiple Edit..."), NULL
, N_("Edit multiple transaction"), G_CALLBACK (register_panel_action_multiedit
) },
2263 { "Template" , ICONNAME_CONVERT
, N_("Create template..."), NULL
, N_("Create template"), G_CALLBACK (register_panel_action_createtemplate
) },
2264 { "Delete" , ICONNAME_HB_OPE_DELETE
, N_("_Delete..."), NULL
, N_("Delete selected transaction(s)"), G_CALLBACK (register_panel_action_remove
) },
2266 { "Assign" , ICONNAME_HB_ASSIGN_RUN
, N_("Auto. assignments"), NULL
, N_("Run automatic assignments"), G_CALLBACK (register_panel_action_assign
) },
2267 { "ExportQIF" , NULL
, N_("Export QIF..."), NULL
, N_("Export as QIF"), G_CALLBACK (register_panel_action_exportqif
) },
2268 { "ExportCSV" , NULL
, N_("Export CSV..."), NULL
, N_("Export as CSV"), G_CALLBACK (register_panel_action_exportcsv
) },
2270 { "ChkIntXfer" , NULL
, N_("Check internal xfer..."), NULL
, NULL
, G_CALLBACK (register_panel_action_check_internal_xfer
) },
2273 static guint n_entries
= G_N_ELEMENTS (entries
);
2275 static const gchar
*ui_info
=
2277 "<menubar name='MenuBar'>"
2279 " <menu action='AccountMenu'>"
2280 " <menuitem action='ExportQIF'/>"
2281 " <menuitem action='ExportCSV'/>"
2283 " <menuitem action='Close'/>"
2286 " <menu action='TxnMenu'>"
2287 " <menuitem action='Add'/>"
2288 " <menuitem action='Inherit'/>"
2289 " <menuitem action='Edit'/>"
2291 " <menu action='TxnStatusMenu'>"
2292 " <menuitem action='None'/>"
2293 " <menuitem action='Cleared'/>"
2294 " <menuitem action='Reconciled'/>"
2296 " <menuitem action='MultiEdit'/>"
2297 " <menuitem action='Template'/>"
2298 " <menuitem action='Delete'/>"
2301 " <menu action='ToolsMenu'>"
2302 " <menuitem action='Filter'/>"
2303 " <menuitem action='Assign'/>"
2305 " <menuitem action='ChkIntXfer'/>"
2308 " <menuitem action='ConvToEuro'/>"
2312 "<toolbar name='TxnBar'>"
2313 " <toolitem action='Add'/>"
2314 " <toolitem action='Inherit'/>"
2315 " <toolitem action='Edit'/>"
2317 " <toolitem action='Cleared'/>"
2318 " <toolitem action='Reconciled'/>"
2320 " <toolitem action='MultiEdit'/>"
2321 " <toolitem action='Template'/>"
2322 " <toolitem action='Delete'/>"
2324 "<toolbar name='ToolBar'>"
2325 " <toolitem action='Filter'/>"
2326 " <toolitem action='Assign'/>"
2331 GtkWidget
*register_panel_window_new(guint32 accnum
, Account
*acc
)
2333 struct register_panel_data
*data
;
2334 struct WinGeometry
*wg
;
2335 GtkWidget
*window
, *mainbox
, *table
, *sw
;
2336 GtkWidget
*treeview
, *label
, *widget
;
2337 //GtkWidget *menu, *menu_items;
2339 GtkActionGroup
*actions
;
2341 GError
*error
= NULL
;
2343 DB( g_print("\n[account] create_register_panel_window\n") );
2345 data
= g_malloc0(sizeof(struct register_panel_data
));
2346 if(!data
) return NULL
;
2348 //disable define windows
2349 GLOBALS
->define_off
++;
2350 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_SENSITIVE
));
2352 /* create window, etc */
2353 window
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
2354 data
->window
= window
;
2357 data
->wintitle
= NULL
;
2358 data
->accnum
= accnum
;
2361 /* set transaction edit mutex */
2363 data
->acc
->window
= GTK_WINDOW(window
);
2365 //g_free(data->wintitle);
2366 data
->wintitle
= g_strdup_printf("%s - HomeBank", data
->acc
->name
);
2367 gtk_window_set_title (GTK_WINDOW (window
), data
->wintitle
);
2369 // connect our dispose function
2370 g_signal_connect (window
, "delete_event",
2371 G_CALLBACK (register_panel_dispose
), (gpointer
)data
);
2373 // connect our dispose function
2374 g_signal_connect (window
, "destroy",
2375 G_CALLBACK (register_panel_destroy
), (gpointer
)data
);
2377 // connect our dispose function
2378 g_signal_connect (window
, "configure-event",
2379 G_CALLBACK (register_panel_getgeometry
), (gpointer
)data
);
2381 //store our window private data
2382 g_object_set_data(G_OBJECT(window
), "inst_data", (gpointer
)data
);
2383 DB( g_print(" - new window=%p, inst_data=%p\n", window
, data
) );
2385 //set the window icon
2386 gtk_window_set_icon_name(GTK_WINDOW (window
), ICONNAME_HB_OPE_SHOW
);
2390 //start test uimanager
2392 actions
= gtk_action_group_new ("Account");
2395 gtk_action_group_set_translation_domain(actions
, GETTEXT_PACKAGE
);
2398 DB( g_print(" - add actions: %p user_data: %p\n", actions
, data
) );
2399 gtk_action_group_add_actions (actions
, entries
, n_entries
, data
);
2401 /* set which action should have priority in the toolbar */
2402 action
= gtk_action_group_get_action(actions
, "Add");
2403 g_object_set(action
, "is_important", TRUE
, "short_label", _("Add"), NULL
);
2405 action
= gtk_action_group_get_action(actions
, "Inherit");
2406 g_object_set(action
, "is_important", TRUE
, "short_label", _("Inherit"), NULL
);
2408 action
= gtk_action_group_get_action(actions
, "Edit");
2409 g_object_set(action
, "is_important", TRUE
, "short_label", _("Edit"), NULL
);
2411 action
= gtk_action_group_get_action(actions
, "Filter");
2412 g_object_set(action
, "is_important", TRUE
, "short_label", _("Filter"), NULL
);
2414 //action = gtk_action_group_get_action(actions, "Reconciled");
2415 //g_object_set(action, "is_important", TRUE, "short_label", _("Reconciled"), NULL);
2418 ui
= gtk_ui_manager_new ();
2420 DB( g_print(" - insert action group:\n") );
2421 gtk_ui_manager_insert_action_group (ui
, actions
, 0);
2423 GtkAccelGroup
*ag
= gtk_ui_manager_get_accel_group (ui
);
2425 DB( g_print(" - add_accel_group actions=%x, ui=%x, ag=%x\n", (gint
)actions
, (gint
)ui
, (gint
)ag
) );
2427 gtk_window_add_accel_group (GTK_WINDOW (window
), ag
);
2429 DB( g_print(" - add ui from string:\n") );
2430 if (!gtk_ui_manager_add_ui_from_string (ui
, ui_info
, -1, &error
))
2432 g_message ("building menus failed: %s", error
->message
);
2433 g_error_free (error
);
2437 data
->actions
= actions
;
2440 mainbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, 0);
2441 gtk_container_add (GTK_CONTAINER (window
), mainbox
);
2443 widget
= gtk_ui_manager_get_widget (ui
, "/MenuBar");
2444 //data->menu = widget;
2445 gtk_box_pack_start (GTK_BOX (mainbox
), widget
, FALSE
, FALSE
, 0);
2447 table
= gtk_grid_new();
2448 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_SMALL
);
2449 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
2450 gtk_container_set_border_width (GTK_CONTAINER(table
), SPACING_SMALL
);
2451 gtk_box_pack_start (GTK_BOX (mainbox
), table
, FALSE
, FALSE
, 0);
2453 // account name (+ balance)
2454 label
= gtk_label_new(NULL
);
2455 data
->LB_name
= label
;
2456 gimp_label_set_attributes (GTK_LABEL (label
), PANGO_ATTR_SCALE
, PANGO_SCALE_LARGE
, -1);
2457 gtk_widget_set_halign (label
, GTK_ALIGN_START
);
2458 gtk_widget_set_hexpand (label
, TRUE
);
2459 gtk_grid_attach (GTK_GRID(table
), label
, 0, 0, 1, 1);
2464 label
= gtk_label_new(_("Bank:"));
2465 gtk_grid_attach (GTK_GRID(table
), label
, 2, 0, 1, 1);
2466 widget
= gtk_label_new(NULL
);
2467 data
->TX_balance
[0] = widget
;
2468 gtk_grid_attach (GTK_GRID(table
), widget
, 3, 0, 1, 1);
2470 label
= gtk_label_new(_("Today:"));
2471 gtk_grid_attach (GTK_GRID(table
), label
, 5, 0, 1, 1);
2472 widget
= gtk_label_new(NULL
);
2473 data
->TX_balance
[1] = widget
;
2474 gtk_grid_attach (GTK_GRID(table
), widget
, 6, 0, 1, 1);
2476 label
= gtk_label_new(_("Future:"));
2477 gtk_grid_attach (GTK_GRID(table
), label
, 8, 0, 1, 1);
2479 widget
= gtk_label_new(NULL
);
2480 data
->TX_balance
[2] = widget
;
2481 gtk_grid_attach (GTK_GRID(table
), widget
, 9, 0, 1, 1);
2484 widget
= make_search (NULL
);
2485 data
->ST_search
= widget
;
2486 gtk_widget_set_size_request(widget
, HB_MINWIDTH_SEARCH
, -1);
2487 gtk_grid_attach (GTK_GRID(table
), widget
, 12, 0, 1, 1);
2489 data
->handler_id
[HID_SEARCH
] = g_signal_connect (data
->ST_search
, "search-changed", G_CALLBACK (quick_search_text_changed_cb
), data
);
2492 table
= gtk_grid_new();
2493 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_SMALL
);
2494 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
2495 gtk_container_set_border_width (GTK_CONTAINER(table
), SPACING_SMALL
);
2496 gtk_box_pack_start (GTK_BOX (mainbox
), table
, FALSE
, FALSE
, 0);
2499 label
= make_label_widget(_("_Range:"));
2500 gtk_grid_attach (GTK_GRID(table
), label
, 0, 0, 1, 1);
2501 data
->CY_range
= make_daterange(label
, TRUE
);
2502 gtk_grid_attach (GTK_GRID(table
), data
->CY_range
, 1, 0, 1, 1);
2504 label
= make_label_widget(_("_Type:"));
2505 gtk_grid_attach (GTK_GRID(table
), label
, 2, 0, 1, 1);
2506 data
->CY_type
= make_cycle(label
, CYA_FLT_TYPE
);
2507 gtk_grid_attach (GTK_GRID(table
), data
->CY_type
, 3, 0, 1, 1);
2509 label
= make_label_widget(_("_Status:"));
2510 gtk_grid_attach (GTK_GRID(table
), label
, 4, 0, 1, 1);
2511 data
->CY_status
= make_cycle(label
, CYA_FLT_STATUS
);
2512 gtk_grid_attach (GTK_GRID(table
), data
->CY_status
, 5, 0, 1, 1);
2514 widget
= gtk_button_new_with_mnemonic (_("Reset _filters"));
2515 data
->BT_reset
= widget
;
2516 gtk_grid_attach (GTK_GRID(table
), widget
, 6, 0, 1, 1);
2518 //TRANSLATORS: this is for Euro specific users, a toggle to display in 'Minor' currency
2519 widget
= gtk_check_button_new_with_mnemonic (_("Euro _minor"));
2520 data
->CM_minor
= widget
;
2521 gtk_grid_attach (GTK_GRID(table
), widget
, 8, 0, 1, 1);
2523 label
= make_label(NULL
, 0.0, 0.5);
2524 data
->TX_selection
= label
;
2525 gtk_widget_set_halign (label
, GTK_ALIGN_END
);
2526 gtk_widget_set_hexpand (label
, TRUE
);
2527 gtk_grid_attach (GTK_GRID(table
), label
, 10, 0, 1, 1);
2530 label = make_label_widget(_("_Month:"));
2531 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
2532 data->CY_month = make_cycle(label, CYA_SELECT);
2533 gtk_box_pack_start (GTK_BOX (hbox), data->CY_month, FALSE, FALSE, 0);
2535 label = make_label_widget(_("_Year:"),);
2536 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
2537 data->NB_year = make_year(label);
2538 gtk_box_pack_start (GTK_BOX (hbox), data->NB_year, FALSE, FALSE, 0);
2542 sw
= gtk_scrolled_window_new (NULL
, NULL
);
2543 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw
), GTK_SHADOW_ETCHED_IN
);
2544 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_ALWAYS
);
2545 treeview
= (GtkWidget
*)create_list_transaction(LIST_TXN_TYPE_BOOK
, PREFS
->lst_ope_columns
);
2546 data
->LV_ope
= treeview
;
2547 gtk_container_add (GTK_CONTAINER (sw
), treeview
);
2548 gtk_box_pack_start (GTK_BOX (mainbox
), sw
, TRUE
, TRUE
, 0);
2550 list_txn_set_save_column_width(GTK_TREE_VIEW(treeview
), TRUE
);
2553 table
= gtk_grid_new();
2554 gtk_box_pack_start (GTK_BOX (mainbox
), table
, FALSE
, FALSE
, 0);
2556 widget
= gtk_ui_manager_get_widget (ui
, "/TxnBar");
2557 data
->TB_bar
= widget
;
2558 //gtk_widget_set_halign (widget, GTK_ALIGN_START);
2559 //gtk_style_context_add_class (gtk_widget_get_style_context (widget), GTK_STYLE_CLASS_INLINE_TOOLBAR);
2560 gtk_widget_set_hexpand (widget
, TRUE
);
2561 gtk_grid_attach (GTK_GRID(table
), widget
, 0, 0, 1, 1);
2563 widget
= gtk_ui_manager_get_widget (ui
, "/ToolBar");
2564 data
->TB_tools
= widget
;
2565 //gtk_widget_set_halign (widget, GTK_ALIGN_END);
2566 //gtk_style_context_add_class (gtk_widget_get_style_context (widget), GTK_STYLE_CLASS_INLINE_TOOLBAR);
2567 gtk_widget_set_hexpand (widget
, TRUE
);
2568 gtk_grid_attach (GTK_GRID(table
), widget
, 2, 0, 1, 1);
2571 if(PREFS
->toolbar_style
== 0)
2573 gtk_toolbar_unset_style(GTK_TOOLBAR(data
->TB_bar
));
2574 gtk_toolbar_unset_style(GTK_TOOLBAR(data
->TB_tools
));
2578 gtk_toolbar_set_style(GTK_TOOLBAR(data
->TB_bar
), PREFS
->toolbar_style
-1);
2579 gtk_toolbar_set_style(GTK_TOOLBAR(data
->TB_tools
), PREFS
->toolbar_style
-1);
2583 //todo: should move this
2584 gtk_widget_grab_focus(GTK_WIDGET(data
->LV_ope
));
2585 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_minor
),GLOBALS
->minor
);
2586 g_object_set_data(G_OBJECT(gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
))), "minor", data
->CM_minor
);
2589 data
->handler_id
[HID_RANGE
] = g_signal_connect (data
->CY_range
, "changed", G_CALLBACK (register_panel_cb_filter_daterange
), NULL
);
2590 data
->handler_id
[HID_TYPE
] = g_signal_connect (data
->CY_type
, "changed", G_CALLBACK (register_panel_cb_filter_type
), NULL
);
2591 data
->handler_id
[HID_STATUS
] = g_signal_connect (data
->CY_status
, "changed", G_CALLBACK (register_panel_cb_filter_status
), NULL
);
2593 g_signal_connect (data
->BT_reset
, "clicked", G_CALLBACK (register_panel_cb_filter_reset
), NULL
);
2595 g_signal_connect (data
->CM_minor
, "toggled", G_CALLBACK (register_panel_toggle_minor
), NULL
);
2597 //g_signal_connect (GTK_TREE_VIEW(treeview), "cursor-changed", G_CALLBACK (register_panel_update), (gpointer)2);
2598 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview
)), "changed", G_CALLBACK (register_panel_selection
), NULL
);
2599 g_signal_connect (GTK_TREE_VIEW(treeview
), "row-activated", G_CALLBACK (register_panel_onRowActivated
), GINT_TO_POINTER(2));
2602 //todo: test context menu
2604 menu = gtk_menu_new();
2605 menu_items = gtk_ui_manager_get_widget (ui, "/MenuBar/TxnMenu/Add");
2607 menu_items = gtk_menu_item_new_with_label ("test");
2608 gtk_widget_show(menu_items);
2609 gtk_menu_shell_append (GTK_MENU (menu), menu_items);
2612 g_signal_connect (treeview, "button-press-event", G_CALLBACK (listview_context_cb),
2613 // todo: here is not a GtkMenu but GtkImageMenuItem...
2615 //gtk_ui_manager_get_widget (ui, "/MenuBar")
2619 //setup, init and show window
2620 wg
= &PREFS
->acc_wg
;
2623 gtk_window_move(GTK_WINDOW(window
), wg
->l
, wg
->t
);
2624 gtk_window_resize(GTK_WINDOW(window
), wg
->w
, wg
->h
);
2627 gtk_window_maximize(GTK_WINDOW(window
));
2629 gtk_widget_show_all (window
);
2631 /* make sure splash is up */
2632 while (gtk_events_pending ())
2633 gtk_main_iteration ();
2635 /* setup to moove later */
2636 data
->filter
= da_filter_malloc();
2637 DB( g_print(" - filter ok %x\n", (gint
)data
->filter
) );