1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2014 Maxime DOYEN
4 * This file is part of HomeBank.
6 * HomeBank is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * HomeBank is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
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"
33 #include "ui-category.h"
36 /****************************************************************************/
38 /****************************************************************************/
47 /* our global datas */
48 extern struct HomeBank
*GLOBALS
;
49 extern struct Preferences
*PREFS
;
54 //extern gchar *CYA_FLT_SELECT[];
56 extern gchar
*CYA_FLT_TYPE
[];
57 extern gchar
*CYA_FLT_STATUS
[];
60 static void register_panel_collect_filtered_txn(GtkWidget
*view
);
61 static void register_panel_listview_populate(GtkWidget
*view
);
62 static void register_panel_action(GtkWidget
*widget
, gpointer user_data
);
63 static void register_panel_update(GtkWidget
*widget
, gpointer user_data
);
65 static void register_panel_export_csv(GtkWidget
*widget
, gpointer user_data
);
67 static void register_panel_make_archive(GtkWidget
*widget
, gpointer user_data
);
69 static void reconcile_selected_foreach_func (GtkTreeModel
*model
, GtkTreePath
*path
, GtkTreeIter
*iter
, gpointer userdata
);
70 Transaction
*get_active_transaction(GtkTreeView
*treeview
);
71 static void register_panel_selection(GtkTreeSelection
*treeselection
, gpointer user_data
);
72 static void register_panel_onRowActivated (GtkTreeView
*treeview
, GtkTreePath
*path
, GtkTreeViewColumn
*col
, gpointer userdata
);
76 /* account action functions -------------------- */
79 static void register_panel_action_editfilter(GtkAction
*action
, gpointer user_data
)
81 struct register_panel_data
*data
= user_data
;
83 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_FILTER
));
86 static void register_panel_action_add(GtkAction
*action
, gpointer user_data
)
88 struct register_panel_data
*data
= user_data
;
90 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_ADD
));
93 static void register_panel_action_inherit(GtkAction
*action
, gpointer user_data
)
95 struct register_panel_data
*data
= user_data
;
97 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_INHERIT
));
100 static void register_panel_action_edit(GtkAction
*action
, gpointer user_data
)
102 struct register_panel_data
*data
= user_data
;
104 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_EDIT
));
107 static void register_panel_action_reconcile(GtkAction
*action
, gpointer user_data
)
109 struct register_panel_data
*data
= user_data
;
111 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_RECONCILE
));
114 static void register_panel_action_remove(GtkAction
*action
, gpointer user_data
)
116 struct register_panel_data
*data
= user_data
;
118 register_panel_action(data
->window
, GINT_TO_POINTER(ACTION_ACCOUNT_REMOVE
));
123 static void register_panel_action_createtemplate(GtkAction
*action
, gpointer user_data
)
125 struct register_panel_data
*data
= user_data
;
127 register_panel_make_archive(data
->window
, NULL
);
132 static void register_panel_action_exportcsv(GtkAction
*action
, gpointer user_data
)
134 struct register_panel_data
*data
= user_data
;
136 register_panel_export_csv(data
->window
, NULL
);
140 static void register_panel_action_exportqif(GtkAction
*action
, gpointer user_data
)
142 struct register_panel_data
*data
= user_data
;
145 DB( g_print("(qif) test qif export\n\n") );
147 if( ui_file_chooser_qif(GTK_WINDOW(data
->window
), &filename
) == TRUE
)
149 hb_export_qif_account_single(filename
, data
->acc
);
155 static void register_panel_action_assign(GtkAction
*action
, gpointer user_data
)
157 struct register_panel_data
*data
= user_data
;
159 gboolean usermode
= TRUE
;
162 count
= transaction_auto_assign(GLOBALS
->ope_list
, data
->accnum
);
163 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_ope
));
164 GLOBALS
->changes_count
+= count
;
172 txt
= _("No transaction changed");
174 txt
= _("transaction auto assigned: %d");
176 ui_dialog_msg_infoerror(GTK_WINDOW(data
->window
), GTK_MESSAGE_INFO
,
177 _("Auto assigment result"),
185 static void register_panel_action_close(GtkAction
*action
, gpointer user_data
)
187 struct register_panel_data
*data
= user_data
;
189 DB( g_print("action close\n") );
191 DB( g_print("window %p\n", data
->window
) );
193 gtk_widget_destroy (GTK_WIDGET (data
->window
));
195 //g_signal_emit_by_name(data->window, "delete-event", NULL, &result);
200 /* these 5 functions are independant from account window */
202 /* account functions -------------------- */
204 static void register_panel_export_csv(GtkWidget
*widget
, gpointer user_data
)
206 struct register_panel_data
*data
;
207 gchar
*filename
= NULL
;
213 DB( g_print("\n[account] export csv\n") );
215 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
217 if( ui_file_chooser_csv(GTK_WINDOW(data
->window
), GTK_FILE_CHOOSER_ACTION_SAVE
, &filename
, NULL
) == TRUE
)
220 DB( g_print(" + filename is %s\n", filename
) );
222 io
= g_io_channel_new_file(filename
, "w", NULL
);
226 g_io_channel_write_chars(io
, "date;paymode;info;payee;wording;amount;category;tags\n", -1, NULL
, NULL
);
229 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
));
231 valid
= gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model
), &iter
);
238 gchar
*info
, *payeename
, *categoryname
;
242 char amountbuf
[G_ASCII_DTOSTR_BUF_SIZE
];
244 gtk_tree_model_get (model
, &iter
,
245 LST_DSPOPE_DATAS
, &ope
,
249 date
= g_date_new_julian (ope
->date
);
250 if( PREFS
->dtex_datefmt
== PRF_DATEFMT_MDY
)
252 g_sprintf(datebuf
, "%02d/%02d/%04d",
253 g_date_get_month(date
),
254 g_date_get_day(date
),
255 g_date_get_year(date
)
260 g_sprintf(datebuf
, "%02d/%02d/%04d",
261 g_date_get_day(date
),
262 g_date_get_month(date
),
263 g_date_get_year(date
)
270 if(info
== NULL
) info
= "";
271 payee
= da_pay_get(ope
->kpay
);
272 payeename
= (payee
->name
== NULL
) ? "" : payee
->name
;
273 category
= da_cat_get(ope
->kcat
);
274 categoryname
= (category
->name
== NULL
) ? "" : da_cat_get_fullname(category
);
275 tags
= transaction_tags_tostring(ope
);
278 //g_ascii_dtostr (amountbuf, sizeof (amountbuf), ope->amount);
279 g_ascii_formatd (amountbuf
, sizeof (amountbuf
), "%.2f", ope
->amount
);
283 DB( g_print("amount = %f '%s'\n", ope
->amount
, amountbuf
) );
286 outstr
= g_strdup_printf("%s;%d;%s;%s;%s;%s;%s;%s\n",
294 tags
!= NULL
? tags
: ""
297 DB( g_print("%s", outstr
) );
299 g_io_channel_write_chars(io
, outstr
, -1, NULL
, NULL
);
305 valid
= gtk_tree_model_iter_next(GTK_TREE_MODEL(model
), &iter
);
308 g_io_channel_unref (io
);
320 ** make an archive with the active transaction
322 static void register_panel_make_archive(GtkWidget
*widget
, gpointer user_data
)
324 struct register_panel_data
*data
;
326 DB( g_print("\n[account] make archive\n") );
328 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
330 GtkWidget
*p_dialog
= NULL
;
332 GList
*selection
, *list
;
335 count
= gtk_tree_selection_count_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
)));
339 p_dialog
= gtk_message_dialog_new
342 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
345 _("Do you want to create a template with\neach of the selected transaction ?")
349 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
350 _("%d archives will be created"),
351 GLOBALS->changes_count
355 result
= gtk_dialog_run( GTK_DIALOG( p_dialog
) );
356 gtk_widget_destroy( p_dialog
);
359 if(result
== GTK_RESPONSE_YES
)
362 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
));
363 selection
= gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
)), &model
);
365 list
= g_list_first(selection
);
372 gtk_tree_model_get_iter(model
, &iter
, list
->data
);
373 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &ope
, -1);
375 DB( g_print(" create archive %s %.2f\n", ope
->wording
, ope
->amount
) );
377 item
= da_archive_malloc();
380 item
->amount
= ope
->amount
;
381 item
->kacc
= ope
->kacc
;
382 item
->kxferacc
= ope
->kxferacc
;
383 item
->paymode
= ope
->paymode
;
384 item
->flags
= ope
->flags
& (OF_INCOME
);
385 item
->kpay
= ope
->kpay
;
386 item
->kcat
= ope
->kcat
;
387 if(ope
->wording
!= NULL
)
388 item
->wording
= g_strdup(ope
->wording
);
390 item
->wording
= g_strdup(_("(new archive)"));
392 GLOBALS
->arc_list
= g_list_append(GLOBALS
->arc_list
, item
);
393 GLOBALS
->changes_count
++;
395 list
= g_list_next(list
);
398 g_list_foreach(selection
, (GFunc
)gtk_tree_path_free
, NULL
);
399 g_list_free(selection
);
405 static void register_panel_cb_filter_daterange(GtkWidget
*widget
, gpointer user_data
)
407 struct register_panel_data
*data
;
410 DB( g_print("\n[account] filter_daterange\n") );
412 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
414 range
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_range
));
416 if(range
!= FLT_RANGE_OTHER
)
418 filter_preset_daterange_set(data
->filter
, range
);
419 register_panel_collect_filtered_txn(data
->LV_ope
);
420 register_panel_listview_populate(data
->LV_ope
);
424 if(ui_flt_manage_dialog_new(data
->filter
, FALSE
) != GTK_RESPONSE_REJECT
)
426 register_panel_collect_filtered_txn(data
->LV_ope
);
427 register_panel_listview_populate(data
->LV_ope
);
428 register_panel_update(data
->LV_ope
, GINT_TO_POINTER(UF_SENSITIVE
+UF_BALANCE
));
435 static void register_panel_cb_filter_type(GtkWidget
*widget
, gpointer user_data
)
437 struct register_panel_data
*data
;
440 DB( g_print("\n[account] filter_type\n") );
441 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
443 type
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_type
));
445 filter_preset_type_set(data
->filter
, type
);
447 register_panel_collect_filtered_txn(data
->LV_ope
);
448 register_panel_listview_populate(data
->LV_ope
);
452 static void register_panel_cb_filter_status(GtkWidget
*widget
, gpointer user_data
)
454 struct register_panel_data
*data
;
457 DB( g_print("\n[account] filter_status\n") );
458 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
460 status
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_status
));
462 filter_preset_status_set(data
->filter
, status
);
464 register_panel_collect_filtered_txn(data
->LV_ope
);
465 register_panel_listview_populate(data
->LV_ope
);
469 static void register_panel_cb_filter_reset(GtkWidget
*widget
, gpointer user_data
)
471 struct register_panel_data
*data
;
473 DB( g_print("\n[account] filter_reset\n") );
474 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
476 filter_default_all_set(data
->filter
);
477 filter_preset_daterange_set (data
->filter
, PREFS
->date_range_txn
);
478 if(PREFS
->hidereconciled
)
479 filter_preset_status_set (data
->filter
, 1);
481 register_panel_collect_filtered_txn(data
->LV_ope
);
482 register_panel_listview_populate(data
->LV_ope
);
484 g_signal_handler_block(data
->CY_range
, data
->handler_id
[HID_RANGE
]);
485 g_signal_handler_block(data
->CY_type
, data
->handler_id
[HID_TYPE
]);
486 g_signal_handler_block(data
->CY_status
, data
->handler_id
[HID_STATUS
]);
488 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_range
), data
->filter
->range
);
489 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_type
), data
->filter
->type
);
490 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_status
), data
->filter
->status
);
492 g_signal_handler_unblock(data
->CY_status
, data
->handler_id
[HID_STATUS
]);
493 g_signal_handler_unblock(data
->CY_type
, data
->handler_id
[HID_TYPE
]);
494 g_signal_handler_unblock(data
->CY_range
, data
->handler_id
[HID_RANGE
]);
499 static void register_panel_balance_refresh(GtkWidget
*view
)
501 struct register_panel_data
*data
;
508 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(view
, GTK_TYPE_WINDOW
)), "inst_data");
510 DB( g_print("\n[account] balance refresh\n") );
512 balance
= data
->acc
->initial
;
514 //#1270687: sort if date changed
517 DB( g_print(" - complete txn sort\n") );
518 GLOBALS
->ope_list
= da_transaction_sort(GLOBALS
->ope_list
);
519 data
->do_sort
= FALSE
;
522 list
= g_list_first(GLOBALS
->ope_list
);
528 if(ope
->kacc
== data
->accnum
)
531 if(!(ope
->flags
& OF_REMIND
))
532 balance
+= ope
->amount
;
534 ope
->balance
= balance
;
537 if(ope
->date
== ldate
)
547 list
= g_list_next(list
);
550 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
));
551 list_transaction_sort_force(GTK_TREE_SORTABLE(model
), NULL
);
556 static void register_panel_collect_filtered_txn(GtkWidget
*view
)
558 struct register_panel_data
*data
;
562 DB( g_print("\n[register_panel] collect_filtered_txn\n") );
564 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(view
, GTK_TYPE_WINDOW
)), "inst_data");
566 if(data
->gpatxn
!= NULL
)
567 g_ptr_array_free (data
->gpatxn
, TRUE
);
570 guint nbtxn
= g_list_length (GLOBALS
->ope_list
);
571 g_print(" - nb txn %d\n", nbtxn
);
574 data
->gpatxn
= g_ptr_array_sized_new(64);
578 list
= g_list_first(GLOBALS
->ope_list
); i
=0;
581 Transaction
*ope
= list
->data
;
583 if(ope
->kacc
== data
->accnum
)
585 if(filter_test(data
->filter
, ope
) == 1)
587 g_ptr_array_add(data
->gpatxn
, (gpointer
)ope
);
597 if( !(i
% 1000) ) { g_print(" - progress %d/%d\n", i
, nbtxn
); }
601 list
= g_list_next(list
);
604 g_signal_handler_block(data
->ST_search
, data
->handler_id
[HID_SEARCH
]);
605 gtk_entry_set_text (GTK_ENTRY(data
->ST_search
), "");
606 g_signal_handler_unblock(data
->ST_search
, data
->handler_id
[HID_SEARCH
]);
612 static void register_panel_listview_populate(GtkWidget
*widget
)
614 struct register_panel_data
*data
;
623 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
625 DB( g_print("\n[register_panel] listview_populate\n") );
627 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
));
628 gtk_list_store_clear (GTK_LIST_STORE(model
));
630 // ref model to keep it
632 gtk_tree_view_set_model(GTK_TREE_VIEW(data
->LV_ope
), NULL
);
634 // perf: if you leave the sort, insert is damned slow
635 gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(GTK_LIST_STORE(model
)), &sort_column_id
, &order
);
637 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
);
639 hastext
= gtk_entry_get_text_length (GTK_ENTRY(data
->ST_search
)) >= 2;
640 needle
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_search
));
642 //build the mask flag for quick search
646 qs_flag
= list_transaction_get_quicksearch_column_mask(GTK_TREE_VIEW(data
->LV_ope
));
650 data
->totalsum
= 0.0;
652 for(i
=0;i
<data
->gpatxn
->len
;i
++)
654 Transaction
*txn
= g_ptr_array_index(data
->gpatxn
, i
);
655 gboolean insert
= TRUE
;
659 insert
= filter_txn_search_match(needle
, txn
, qs_flag
);
664 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
666 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
667 LST_DSPOPE_DATAS
, txn
,
670 data
->totalsum
+= txn
->amount
;
675 gtk_tree_view_set_model(GTK_TREE_VIEW(data
->LV_ope
), model
); /* Re-attach model to view */
676 g_object_unref(model
);
678 // push back the sort id
679 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(GTK_LIST_STORE(model
)), sort_column_id
, order
);
681 /* update info range text */
685 daterange
= filter_daterange_text_get(data
->filter
);
686 gtk_widget_set_tooltip_markup(GTK_WIDGET(data
->CY_range
), daterange
);
690 register_panel_update(data
->LV_ope
, GINT_TO_POINTER(UF_SENSITIVE
+UF_BALANCE
));
695 static void reconcile_selected_foreach_func (GtkTreeModel
*model
, GtkTreePath
*path
, GtkTreeIter
*iter
, gpointer userdata
)
699 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &trn
, -1);
701 account_balances_sub(trn
);
703 trn
->flags
^= OF_VALID
;
704 //#1308745 remind flags is exclusive with reconciled
705 if(trn
->flags
& OF_VALID
)
706 trn
->flags
&= ~(OF_REMIND
);
708 trn
->flags
|= OF_CHANGED
;
710 account_balances_add(trn
);
712 /* #492755 let the chld transfer unchnaged */
717 Transaction
*get_active_transaction(GtkTreeView
*treeview
)
725 model
= gtk_tree_view_get_model(treeview
);
726 list
= gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(treeview
), &model
);
732 gtk_tree_model_get_iter(model
, &iter
, list
->data
);
733 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &ope
, -1);
736 g_list_foreach(list
, (GFunc
)gtk_tree_path_free
, NULL
);
743 static void remove_active_transaction(GtkTreeView
*treeview
)
748 model
= gtk_tree_view_get_model(treeview
);
749 list
= gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(treeview
), &model
);
755 gtk_tree_model_get_iter(model
, &iter
, list
->data
);
756 gtk_list_store_remove(GTK_LIST_STORE(model
), &iter
);
759 g_list_foreach(list
, (GFunc
)gtk_tree_path_free
, NULL
);
767 static void register_panel_action(GtkWidget
*widget
, gpointer user_data
)
769 struct register_panel_data
*data
;
770 gint action
= GPOINTER_TO_INT(user_data
);
773 DB( g_print("\n[account] action\n") );
775 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
776 //data = INST_DATA(widget);
778 DB( g_print(" - action=%d\n", action
) );
783 case ACTION_ACCOUNT_ADD
:
785 case ACTION_ACCOUNT_INHERIT
:
788 Transaction
*src_txn
;
791 homebank_app_date_get_julian();
793 if(action
== ACTION_ACCOUNT_ADD
)
795 DB( g_print("(transaction) add multiple\n") );
796 src_txn
= da_transaction_malloc();
797 src_txn
->date
= GLOBALS
->today
;
798 src_txn
->kacc
= data
->accnum
;
799 type
= TRANSACTION_EDIT_ADD
;
803 DB( g_print("(transaction) inherit multiple\n") );
804 src_txn
= da_transaction_clone(get_active_transaction(GTK_TREE_VIEW(data
->LV_ope
)));
805 type
= TRANSACTION_EDIT_INHERIT
;
808 dialog
= create_deftransaction_window(GTK_WINDOW(data
->window
), type
);
809 result
= GTK_RESPONSE_ADD
;
810 while(result
== GTK_RESPONSE_ADD
)
812 /* clone source transaction */
813 data
->cur_ope
= da_transaction_clone (src_txn
);
815 if( PREFS
->heritdate
== FALSE
) //fix: 318733 / 1335285
816 data
->cur_ope
->date
= GLOBALS
->today
;
818 deftransaction_set_transaction(dialog
, data
->cur_ope
);
820 result
= gtk_dialog_run (GTK_DIALOG (dialog
));
821 if(result
== GTK_RESPONSE_ADD
|| result
== GTK_RESPONSE_ACCEPT
)
823 deftransaction_get(dialog
, NULL
);
824 transaction_add(data
->cur_ope
, data
->LV_ope
, data
->accnum
);
825 register_panel_update(widget
, GINT_TO_POINTER(UF_BALANCE
));
826 data
->acc
->flags
|= AF_ADDED
;
827 GLOBALS
->changes_count
++;
829 src_txn
->date
= data
->cur_ope
->date
;
832 da_transaction_free (data
->cur_ope
);
834 deftransaction_dispose(dialog
, NULL
);
835 da_transaction_free (src_txn
);
837 gtk_widget_destroy (dialog
);
841 case ACTION_ACCOUNT_EDIT
:
843 Transaction
*old_txn
;
846 old_txn
= get_active_transaction(GTK_TREE_VIEW(data
->LV_ope
));
849 dialog
= create_deftransaction_window(GTK_WINDOW(data
->window
), TRANSACTION_EDIT_MODIFY
);
851 data
->cur_ope
= da_transaction_clone (old_txn
); // to keep old datas, just in case
852 deftransaction_set_transaction(dialog
, data
->cur_ope
);
854 result
= gtk_dialog_run (GTK_DIALOG (dialog
));
855 if(result
== GTK_RESPONSE_ACCEPT
)
857 deftransaction_get(dialog
, NULL
);
859 account_balances_sub(old_txn
);
860 account_balances_add(data
->cur_ope
);
862 // different accoutn : remove from the display
863 if( data
->cur_ope
->kacc
!= data
->accnum
)
865 remove_active_transaction(GTK_TREE_VIEW(data
->LV_ope
));
868 if( data
->cur_ope
->paymode
== PAYMODE_INTXFER
)
870 //nota: if kxfer is 0, the user may have just changed the paymode to xfer
871 DB( g_print(" - kxfer = %d\n", data
->cur_ope
->kxfer
) );
873 if(data
->cur_ope
->kxfer
> 0) //1) search a strong linked child
877 DB( g_print(" - old_txn: kacc=%d kxferacc=%d\n", old_txn
->kacc
, old_txn
->kxferacc
) );
879 ltxn
= transaction_strong_get_child_transfer(old_txn
);
880 if(ltxn
!= NULL
) //should never be the case
882 DB( g_print(" - strong link found, do sync\n") );
883 transaction_xfer_sync_child(data
->cur_ope
, ltxn
);
887 DB( g_print(" - no, somethin' went wrong here...\n") );
892 //2) any standard transaction that match ?
893 transaction_xfer_search_or_add_child(data
->cur_ope
, data
->LV_ope
);
897 //#1250061 : manage ability to break an internal xfer
898 if(old_txn
->paymode
== PAYMODE_INTXFER
&& data
->cur_ope
->paymode
!= PAYMODE_INTXFER
)
902 DB( g_print(" - should break internal xfer\n") );
904 p_dialog
= gtk_message_dialog_new
910 _("Do you want to break the internal transfer ?\n\n"
911 "Proceeding will delete the target transaction.")
914 result
= gtk_dialog_run( GTK_DIALOG( p_dialog
) );
915 gtk_widget_destroy( p_dialog
);
917 if(result
== GTK_RESPONSE_YES
)
919 transaction_xfer_delete_child(data
->cur_ope
);
921 else //force paymode to internal xfer
923 data
->cur_ope
->paymode
= PAYMODE_INTXFER
;
927 //#1270687: sort if date changed
928 if(old_txn
->date
!= data
->cur_ope
->date
)
929 data
->do_sort
= TRUE
;
931 da_transaction_copy(data
->cur_ope
, old_txn
);
933 register_panel_update(widget
, GINT_TO_POINTER(UF_BALANCE
));
935 data
->acc
->flags
|= AF_CHANGED
;
936 GLOBALS
->changes_count
++;
940 da_transaction_free (data
->cur_ope
);
943 deftransaction_dispose(dialog
, NULL
);
944 gtk_widget_destroy (dialog
);
950 case ACTION_ACCOUNT_REMOVE
:
952 GtkWidget
*p_dialog
= NULL
;
954 GList
*selection
, *list
;
958 DB( g_print(" - remove\n") );
960 //count = gtk_tree_selection_count_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_ope)));
962 //todo: replace with a call to ui_dialog_msg_question ?
964 p_dialog
= gtk_message_dialog_new
970 _("Do you want to delete\neach of the selected transaction ?")
974 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
975 _("%d transactions will be definitively lost.\n"),
976 GLOBALS->changes_count
981 result
= gtk_dialog_run( GTK_DIALOG( p_dialog
) );
982 gtk_widget_destroy( p_dialog
);
985 if(result
== GTK_RESPONSE_YES
)
988 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
));
989 selection
= gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
)), &model
);
991 g_object_ref(model
); /* Make sure the model stays with us after the tree view unrefs it */
992 gtk_tree_view_set_model(GTK_TREE_VIEW(data
->LV_ope
), NULL
); /* Detach model from view */
995 DB( g_print(" remove %d line\n", g_list_length(selection
)) );
998 list
= g_list_last(selection
);
1004 gtk_tree_model_get_iter(model
, &iter
, list
->data
);
1005 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &entry
, -1);
1007 DB( g_print(" delete %s %.2f\n", entry
->wording
, entry
->amount
) );
1009 account_balances_sub(entry
);
1011 /* v3.4: also remove child transfer */
1012 if( entry
->paymode
== PAYMODE_INTXFER
)
1014 transaction_xfer_delete_child( entry
);
1017 gtk_list_store_remove(GTK_LIST_STORE(model
), &iter
);
1018 GLOBALS
->ope_list
= g_list_remove(GLOBALS
->ope_list
, entry
);
1019 da_transaction_free(entry
);
1021 GLOBALS
->changes_count
++;
1024 list
= g_list_previous(list
);
1027 g_list_foreach(selection
, (GFunc
)gtk_tree_path_free
, NULL
);
1028 g_list_free(selection
);
1030 gtk_tree_view_set_model(GTK_TREE_VIEW(data
->LV_ope
), model
); /* Re-attach model to view */
1031 g_object_unref(model
);
1033 register_panel_update(widget
, GINT_TO_POINTER(UF_BALANCE
));
1035 data
->acc
->flags
|= AF_CHANGED
;
1042 case ACTION_ACCOUNT_RECONCILE
:
1044 GtkTreeSelection
*selection
;
1046 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
));
1047 gtk_tree_selection_selected_foreach(selection
, (GtkTreeSelectionForeachFunc
)reconcile_selected_foreach_func
, data
);
1049 DB( g_print(" - reconcile\n") );
1051 gtk_widget_queue_draw (data
->LV_ope
);
1052 //gtk_widget_queue_resize (data->LV_acc);
1055 register_panel_update(widget
, GINT_TO_POINTER(UF_BALANCE
));
1057 data
->acc
->flags
|= AF_CHANGED
;
1058 GLOBALS
->changes_count
++;
1064 case ACTION_ACCOUNT_FILTER
:
1067 if(ui_flt_manage_dialog_new(data
->filter
, FALSE
) != GTK_RESPONSE_REJECT
)
1069 register_panel_collect_filtered_txn(data
->LV_ope
);
1070 register_panel_listview_populate(data
->LV_ope
);
1071 register_panel_update(data
->LV_ope
, GINT_TO_POINTER(UF_SENSITIVE
+UF_BALANCE
));
1073 g_signal_handler_block(data
->CY_range
, data
->handler_id
[HID_RANGE
]);
1074 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_range
), FLT_RANGE_OTHER
);
1075 g_signal_handler_unblock(data
->CY_range
, data
->handler_id
[HID_RANGE
]);
1087 static void register_panel_toggle_minor(GtkWidget
*widget
, gpointer user_data
)
1089 struct register_panel_data
*data
;
1091 DB( g_print("\n[account] toggle\n") );
1093 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1095 register_panel_update(data
->LV_ope
, GINT_TO_POINTER(UF_BALANCE
));
1096 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_ope
));
1100 static void register_panel_selection(GtkTreeSelection
*treeselection
, gpointer user_data
)
1103 DB( g_print("\n[account] selection changed cb\n") );
1106 register_panel_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), GINT_TO_POINTER(UF_SENSITIVE
));
1111 static void register_panel_update(GtkWidget
*widget
, gpointer user_data
)
1113 struct register_panel_data
*data
;
1114 GtkTreeSelection
*selection
;
1115 gint flags
= GPOINTER_TO_INT(user_data
);
1118 DB( g_print("\n[account] update\n") );
1120 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1121 //data = INST_DATA(widget);
1123 GLOBALS
->minor
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_minor
));
1126 /* set window title */
1127 if(flags
& UF_TITLE
)
1129 DB( printf(" - UF_TITLE\n") );
1133 /* update disabled things */
1134 if(flags
& UF_SENSITIVE
)
1138 DB( printf(" - UF_SENSITIVE\n") );
1140 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
));
1141 count
= gtk_tree_selection_count_selected_rows(selection
);
1142 DB( printf(" - count = %d\n", count
) );
1146 if (active = gtk_tree_selection_get_selected(selection, &model, &iter))
1150 path = gtk_tree_model_get_path(model, &iter);
1151 indices = gtk_tree_path_get_indices(path);
1153 data->accnum = indices[0];
1155 DB( printf(" active is %d, sel=%d\n", indices[0], active) );
1159 // multiple: disable inherit, edit
1160 sensitive
= (count
!= 1 ) ? FALSE
: TRUE
;
1161 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/TxnBar/Inherit"), sensitive
);
1162 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/TxnBar/Edit"), sensitive
);
1164 sensitive
= (count
> 0 ) ? TRUE
: FALSE
;
1165 // no selection: disable reconcile, remove
1166 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/MenuBar/TransactionMenu/Reconcile"), sensitive
);
1167 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/MenuBar/TransactionMenu/Remove"), sensitive
);
1168 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/MenuBar/TransactionMenu/Template"), sensitive
);
1170 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/TxnBar/Remove"), sensitive
);
1171 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/TxnBar/Reconcile"), sensitive
);
1172 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/TxnBar/Template"), sensitive
);
1175 // multiple: disable inherit, edit
1176 sensitive
= (count
!= 1 ) ? FALSE
: TRUE
;
1177 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/MenuBar/TransactionMenu/Inherit"), sensitive
);
1178 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/MenuBar/TransactionMenu/Edit"), sensitive
);
1182 /* update toolbar & list */
1183 if(flags
& UF_VISUAL
)
1185 DB( printf(" - UF_VISUAL\n") );
1187 if(PREFS
->toolbar_style
== 0)
1188 gtk_toolbar_unset_style(GTK_TOOLBAR(data
->TB_bar
));
1190 gtk_toolbar_set_style(GTK_TOOLBAR(data
->TB_bar
), PREFS
->toolbar_style
-1);
1193 if( PREFS
->euro_active
)
1195 gtk_widget_show(data
->CM_minor
);
1199 gtk_widget_hide(data
->CM_minor
);
1203 /* update balances */
1204 if(flags
& UF_BALANCE
)
1206 DB( printf(" - UF_BALANCE\n") );
1208 register_panel_balance_refresh(widget
);
1211 hb_label_set_colvaluecurr(GTK_LABEL(data->TX_balance[0]), data->acc->bal_bank, data->acc->kcur);
1212 hb_label_set_colvaluecurr(GTK_LABEL(data->TX_balance[1]), data->acc->bal_today, data->acc->kcur);
1213 hb_label_set_colvaluecurr(GTK_LABEL(data->TX_balance[2]), data->acc->bal_future, data->acc->kcur);
1215 hb_label_set_colvalue(GTK_LABEL(data
->TX_balance
[0]), data
->acc
->bal_bank
, GLOBALS
->minor
);
1216 hb_label_set_colvalue(GTK_LABEL(data
->TX_balance
[1]), data
->acc
->bal_today
, GLOBALS
->minor
);
1217 hb_label_set_colvalue(GTK_LABEL(data
->TX_balance
[2]), data
->acc
->bal_future
, GLOBALS
->minor
);
1219 ui_mainwindow_populate_accounts(GLOBALS
->mainwindow
, NULL
);
1222 /* update fltinfo */
1223 DB( printf(" - statusbar\n") );
1225 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_ope
));
1226 count
= gtk_tree_selection_count_selected_rows(selection
);
1227 DB( printf(" - nb selected = %d\n", count
) );
1229 /* if more than one ope selected, we make a sum to display to the user */
1230 gdouble opeexp
= 0.0;
1231 gdouble opeinc
= 0.0;
1238 GList
*list
, *tmplist
;
1239 GtkTreeModel
*model
;
1242 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
));
1244 list
= gtk_tree_selection_get_selected_rows(selection
, &model
);
1246 tmplist
= g_list_first(list
);
1247 while (tmplist
!= NULL
)
1251 gtk_tree_model_get_iter(model
, &iter
, tmplist
->data
);
1252 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &item
, -1);
1254 if( item
->flags
& OF_INCOME
)
1255 opeinc
+= item
->amount
;
1257 opeexp
+= item
->amount
;
1259 DB( printf(" - %s, %.2f\n", item
->wording
, item
->amount
) );
1261 tmplist
= g_list_next(tmplist
);
1265 DB( printf(" %f - %f = %f\n", opeinc
, opeexp
, opeinc
+ opeexp
) );
1268 hb_strfmon(buf1, 64-1, opeinc, data->acc->kcur);
1269 hb_strfmon(buf2, 64-1, -opeexp, data->acc->kcur);
1270 hb_strfmon(buf3, 64-1, opeinc + opeexp, data->acc->kcur);
1272 mystrfmon(buf1
, 64-1, opeinc
, GLOBALS
->minor
);
1273 mystrfmon(buf2
, 64-1, -opeexp
, GLOBALS
->minor
);
1274 mystrfmon(buf3
, 64-1, opeinc
+ opeexp
, GLOBALS
->minor
);
1281 //msg = g_strdup_printf (_("transaction selected: %d, hidden: %d"), count, data->hidden);
1282 mystrfmon(buf3
, 64-1, data
->totalsum
, GLOBALS
->minor
);
1283 msg
= g_strdup_printf(_("%d items (%s)"), data
->total
, buf3
);
1286 //TRANSLATORS: detail of the 3 %s which are some amount of selected transaction, 1=total 2=income, 3=expense
1287 //msg = g_strdup_printf (_("transaction selected: %d, hidden: %d / %s ( %s - %s)"), count, data->hidden, buf3, buf1, buf2);
1288 msg
= g_strdup_printf(_("%d items (%d selected %s)"), data
->total
, count
, buf3
);
1290 gtk_label_set_markup(GTK_LABEL(data
->TX_selection
), msg
);
1296 void register_panel_onRowActivated (GtkTreeView
*treeview
, GtkTreePath
*path
, GtkTreeViewColumn
*col
, gpointer userdata
)
1298 struct register_panel_data
*data
;
1299 GtkTreeModel
*model
;
1302 GList
*selection
, *list
;
1304 gchar
*tagstr
, *txt
;
1305 gboolean refreshbalance
;
1307 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(treeview
), GTK_TYPE_WINDOW
)), "inst_data");
1309 col_id
= gtk_tree_view_column_get_sort_column_id (col
);
1311 count
= gtk_tree_selection_count_selected_rows(gtk_tree_view_get_selection(treeview
));
1313 model
= gtk_tree_view_get_model(treeview
);
1315 //get transaction double clicked to initiate the widget
1316 gtk_tree_model_get_iter(model
, &iter
, path
);
1317 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &ope
, -1);
1320 DB( g_print ("%d rows been double-clicked on column=%d! ope=%s\n", count
, col_id
, ope
->wording
) );
1324 register_panel_action(GTK_WIDGET(treeview
), GINT_TO_POINTER(ACTION_ACCOUNT_EDIT
));
1327 if(col_id
>= LST_DSPOPE_DATE
&& col_id
!= LST_DSPOPE_BALANCE
)
1329 GtkWidget
*parentwindow
, *dialog
, *mainbox
, *widget1
, *widget2
, *content
;
1331 parentwindow
= gtk_widget_get_ancestor(GTK_WIDGET(treeview
), GTK_TYPE_WINDOW
);
1333 dialog
= gtk_dialog_new_with_buttons (NULL
,
1334 GTK_WINDOW (parentwindow
),
1337 GTK_RESPONSE_REJECT
,
1339 GTK_RESPONSE_ACCEPT
,
1342 gtk_window_set_position(GTK_WINDOW(dialog
), GTK_WIN_POS_MOUSE
);
1344 w
= gtk_tree_view_column_get_width(GTK_TREE_VIEW_COLUMN(col
));
1345 gtk_window_set_default_size (GTK_WINDOW(dialog
), w
+ 40, 0);
1347 content
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
));
1349 mainbox
= gtk_hbox_new (FALSE
, 0);
1350 gtk_container_set_border_width (GTK_CONTAINER (mainbox
), HB_BOX_SPACING
);
1351 gtk_box_pack_start (GTK_BOX (content
), mainbox
, FALSE
, FALSE
, 0);
1353 widget1
= widget2
= NULL
;
1357 case LST_DSPOPE_DATE
:
1358 gtk_window_set_title (GTK_WINDOW (dialog
), _("Modify date..."));
1359 widget1
= gtk_dateentry_new();
1360 gtk_dateentry_set_date(GTK_DATE_ENTRY(widget1
), (guint
)ope
->date
);
1362 case LST_DSPOPE_INFO
:
1363 gtk_window_set_title (GTK_WINDOW (dialog
), _("Modify info..."));
1364 widget1
= make_paymode(NULL
);
1365 widget2
= make_string(NULL
);
1366 gtk_combo_box_set_active(GTK_COMBO_BOX(widget1
), ope
->paymode
);
1367 gtk_entry_set_text(GTK_ENTRY(widget2
), ope
->info
);
1369 case LST_DSPOPE_PAYEE
:
1370 gtk_window_set_title (GTK_WINDOW (dialog
), _("Modify payee..."));
1371 widget1
= ui_pay_comboboxentry_new(NULL
);
1372 ui_pay_comboboxentry_populate(GTK_COMBO_BOX(widget1
), GLOBALS
->h_pay
);
1373 ui_pay_comboboxentry_set_active(GTK_COMBO_BOX(widget1
), ope
->kpay
);
1375 case LST_DSPOPE_WORDING
:
1376 gtk_window_set_title (GTK_WINDOW (dialog
), _("Modify description..."));
1377 widget1
= make_string(NULL
);
1378 gtk_entry_set_text(GTK_ENTRY(widget1
), ope
->wording
);
1380 case LST_DSPOPE_EXPENSE
:
1381 case LST_DSPOPE_INCOME
:
1382 case LST_DSPOPE_AMOUNT
:
1383 gtk_window_set_title (GTK_WINDOW (dialog
), _("Modify amount..."));
1384 widget1
= make_amount(NULL
);
1385 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget1
), ope
->amount
);
1387 case LST_DSPOPE_CATEGORY
:
1388 gtk_window_set_title (GTK_WINDOW (dialog
), _("Modify category..."));
1389 widget1
= ui_cat_comboboxentry_new(FALSE
);
1390 ui_cat_comboboxentry_populate(GTK_COMBO_BOX(widget1
), GLOBALS
->h_cat
);
1391 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(widget1
), ope
->kcat
);
1393 case LST_DSPOPE_TAGS
:
1394 gtk_window_set_title (GTK_WINDOW (dialog
), _("Modify tags..."));
1395 widget1
= make_string(NULL
);
1397 tagstr
= transaction_tags_tostring(ope
);
1399 txt
= (tagstr
!= NULL
) ? tagstr
: "";
1400 gtk_entry_set_text(GTK_ENTRY(widget1
), txt
);
1406 if(widget1
!= NULL
) gtk_box_pack_start (GTK_BOX (mainbox
), widget1
, TRUE
, TRUE
, 0);
1407 if(widget2
!= NULL
) gtk_box_pack_start (GTK_BOX (mainbox
), widget2
, TRUE
, TRUE
, 0);
1409 gtk_widget_show_all(mainbox
);
1412 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
1414 if(result
== GTK_RESPONSE_ACCEPT
)
1416 selection
= gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(treeview
), &model
);
1418 refreshbalance
= FALSE
;
1420 list
= g_list_first(selection
);
1426 gtk_tree_model_get_iter(model
, &iter
, list
->data
);
1427 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &ope
, -1);
1429 DB( g_print(" modifying %s %.2f\n", ope
->wording
, ope
->amount
) );
1433 case LST_DSPOPE_DATE
:
1434 ope
->date
= gtk_dateentry_get_date(GTK_DATE_ENTRY(widget1
));
1435 data
->do_sort
= TRUE
;
1436 refreshbalance
= TRUE
;
1438 case LST_DSPOPE_INFO
:
1439 ope
->paymode
= gtk_combo_box_get_active(GTK_COMBO_BOX(widget1
));
1440 txt
= gtk_entry_get_text(GTK_ENTRY(widget2
));
1444 ope
->info
= g_strdup(txt
);
1447 case LST_DSPOPE_PAYEE
:
1448 ope
->kpay
= ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(widget1
));
1449 DB( g_print(" -> payee: '%d'\n", ope
->kpay
) );
1451 case LST_DSPOPE_WORDING
:
1452 txt
= gtk_entry_get_text(GTK_ENTRY(widget1
));
1455 g_free(ope
->wording
);
1456 ope
->wording
= g_strdup(txt
);
1459 case LST_DSPOPE_EXPENSE
:
1460 case LST_DSPOPE_INCOME
:
1461 case LST_DSPOPE_AMOUNT
:
1462 ope
->flags
&= ~(OF_INCOME
); //remove flag
1463 ope
->amount
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget1
));
1464 if(ope
->amount
> 0) ope
->flags
|= OF_INCOME
;
1465 refreshbalance
= TRUE
;
1467 case LST_DSPOPE_CATEGORY
:
1468 if(!(ope
->flags
& OF_SPLIT
))
1470 ope
->kcat
= ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(widget1
));
1471 //bad .... ope->category = gtk_combo_box_get_active(GTK_COMBO_BOX(widget1));
1472 DB( g_print(" -> category: '%d'\n", ope
->kcat
) );
1475 case LST_DSPOPE_TAGS
:
1476 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(widget1
));
1479 DB( g_print(" -> tags: '%s'\n", txt
) );
1481 transaction_tags_parse(ope
, txt
);
1488 ope
->flags
|= OF_CHANGED
;
1489 GLOBALS
->changes_count
++;
1491 list
= g_list_next(list
);
1495 register_panel_update(GTK_WIDGET(treeview
), GINT_TO_POINTER(UF_BALANCE
));
1498 g_list_foreach(selection
, (GFunc
)gtk_tree_path_free
, NULL
);
1499 g_list_free(selection
);
1502 // cleanup and destroy
1503 gtk_widget_destroy (dialog
);
1512 static gint listview_context_cb (GtkWidget *widget, GdkEventButton *event, GtkWidget *menu)
1515 if (event->button == 3)
1519 if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (treeview),
1520 (gint) event->x, (gint) event->y, &path, NULL, NULL, NULL))
1522 gtk_tree_view_set_cursor (GTK_TREE_VIEW (treeview), path, NULL, FALSE);
1523 gtk_tree_path_free (path);
1529 gtk_menu_popup (GTK_MENU(menu), NULL, NULL, NULL, NULL,
1530 event->button, event->time);
1532 // On indique à l'appelant que l'on a géré cet événement.
1537 // On indique à l'appelant que l'on n'a pas géré cet événement.
1545 ** populate the account window
1547 void register_panel_window_init(GtkWidget
*widget
, gpointer user_data
)
1550 DB( g_print("\n[account] init window\n") );
1552 DB( g_print(" - sort transactions\n") );
1553 GLOBALS
->ope_list
= da_transaction_sort(GLOBALS
->ope_list
);
1555 //DB( g_print(" mindate=%d, maxdate=%d %x\n", data->filter->mindate,data->filter->maxdate) );
1557 DB( g_print(" - call update visual\n") );
1558 register_panel_update(widget
, GINT_TO_POINTER(UF_VISUAL
));
1560 DB( g_print(" - set range or populate+update sensitive+balance\n") );
1562 register_panel_cb_filter_reset(widget
, user_data
);
1570 register_panel_getgeometry(GtkWidget
*widget
, GdkEventConfigure
*event
, gpointer user_data
)
1572 //struct register_panel_data *data = user_data;
1573 struct WinGeometry
*wg
;
1575 DB( g_print("\n[account] get geometry\n") );
1577 //store position and size
1578 wg
= &PREFS
->acc_wg
;
1579 gtk_window_get_position(GTK_WINDOW(widget
), &wg
->l
, &wg
->t
);
1580 gtk_window_get_size(GTK_WINDOW(widget
), &wg
->w
, &wg
->h
);
1581 GdkWindow
*gdk_window
= gtk_widget_get_window(GTK_WIDGET(widget
));
1582 GdkWindowState state
= gdk_window_get_state(gdk_window
);
1583 wg
->s
= (state
& GDK_WINDOW_STATE_MAXIMIZED
) ? 1 : 0;
1585 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
) );
1593 static gboolean
register_panel_dispose(GtkWidget
*widget
, GdkEvent
*event
, gpointer user_data
)
1595 //struct register_panel_data *data = user_data;
1598 DB( g_print("\n[account] delete-event\n") );
1604 /* Another callback */
1605 static gboolean
register_panel_destroy( GtkWidget
*widget
,
1606 gpointer user_data
)
1608 struct register_panel_data
*data
;
1610 data
= g_object_get_data(G_OBJECT(widget
), "inst_data");
1613 DB( g_print ("\n[account] destroy event occurred\n") );
1617 //enable define windows
1618 GLOBALS
->define_off
--;
1620 /* unset transaction edit mutex */
1622 data
->acc
->window
= NULL
;
1624 /* free title and filter */
1625 DB( g_print(" user_data=%p to be free\n", user_data
) );
1626 g_free(data
->wintitle
);
1628 if(data
->gpatxn
!= NULL
)
1629 g_ptr_array_free (data
->gpatxn
, TRUE
);
1631 da_filter_free(data
->filter
);
1636 //our global list has changed, so update the treeview
1637 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_TITLE
+UF_SENSITIVE
+UF_BALANCE
+UF_REFRESHALL
));
1644 quick_search_activate_cb (GtkEntry
*entry
, gpointer user_data
)
1646 struct register_panel_data
*data
= user_data
;
1648 register_panel_listview_populate (data
->LV_ope
);
1652 static gint
quick_search_text_changed_timeout (gpointer user_data
)
1654 struct register_panel_data
*data
= user_data
;
1656 DB( g_print("quick search timed out !\n") );
1658 register_panel_listview_populate (data
->window
);
1660 data
->timer_tag
= 0;
1666 quick_search_text_changed_cb (GtkEntry
*entry
,
1670 struct register_panel_data
*data
= user_data
;
1674 has_text
= gtk_entry_get_text_length (entry
) > 0;
1675 gtk_entry_set_icon_sensitive (entry
,
1676 GTK_ENTRY_ICON_SECONDARY
,
1679 if(data
->timer_tag
== 0 )
1680 data
->timer_tag
= g_timeout_add( DEFAULT_DELAY
, quick_search_text_changed_timeout
, (gpointer
)user_data
);
1687 quick_search_icon_press_cb (GtkEntry
*entry
,
1689 GdkEventButton
*event
,
1692 if (position
== GTK_ENTRY_ICON_SECONDARY
)
1693 gtk_entry_set_text (entry
, "");
1697 static GtkActionEntry entries
[] = {
1699 /* name, stock id, label */
1700 { "AccountMenu" , NULL
, N_("_Account"), NULL
, NULL
, NULL
},
1701 { "TransactionMenu", NULL
, N_("Transacti_on"), NULL
, NULL
, NULL
},
1702 { "ActionsMenu" , NULL
, N_("_Actions"), NULL
, NULL
, NULL
},
1703 { "ToolsMenu" , NULL
, N_("_Tools"), NULL
, NULL
, NULL
},
1705 { "Close" , GTK_STOCK_CLOSE
, N_("_Close") , NULL
, N_("Close the current account"), G_CALLBACK (register_panel_action_close
) },
1707 /* name, stock id, label, accelerator, tooltip */
1708 { "Filter" , "hb-filter" , N_("_Filter..."), NULL
, N_("Open the list filter"), G_CALLBACK (register_panel_action_editfilter
) },
1710 { "Add" , HB_STOCK_OPE_ADD
, N_("_Add..."), NULL
, N_("Add a new transaction"), G_CALLBACK (register_panel_action_add
) },
1711 { "Inherit" , HB_STOCK_OPE_HERIT
, N_("_Inherit..."), NULL
, N_("Inherit from the active transaction"), G_CALLBACK (register_panel_action_inherit
) },
1712 { "Edit" , HB_STOCK_OPE_EDIT
, N_("_Edit..."), NULL
, N_("Edit the active transaction"), G_CALLBACK (register_panel_action_edit
) },
1713 { "Reconcile" , "hb-ope-valid" , N_("_Reconciled"), "r", N_("Toggle reconciled status of active transactions"), G_CALLBACK (register_panel_action_reconcile
) },
1714 { "Remove" , HB_STOCK_OPE_DELETE
, N_("_Remove..."), NULL
, N_("Remove the active transactions"), G_CALLBACK (register_panel_action_remove
) },
1715 { "Template" , GTK_STOCK_CONVERT
, N_("Create template..."), NULL
, N_("Create template"), G_CALLBACK (register_panel_action_createtemplate
) },
1717 { "Assign" , "hb-assign-run" , N_("Auto. Assignments"), NULL
, N_("Run auto assignments"), G_CALLBACK (register_panel_action_assign
) },
1718 { "ExportQIF" , "hb-file-export" , N_("Export QIF..."), NULL
, N_("Export as QIF"), G_CALLBACK (register_panel_action_exportqif
) },
1719 { "ExportCSV" , "hb-file-export" , N_("Export CSV..."), NULL
, N_("Export as CSV"), G_CALLBACK (register_panel_action_exportcsv
) },
1722 static guint n_entries
= G_N_ELEMENTS (entries
);
1724 static const gchar
*ui_info
=
1726 " <menubar name='MenuBar'>"
1728 " <menu action='AccountMenu'>"
1729 " <menuitem action='Close'/>"
1732 " <menu action='TransactionMenu'>"
1733 " <menuitem action='Add'/>"
1734 " <menuitem action='Inherit'/>"
1735 " <menuitem action='Edit'/>"
1736 " <menuitem action='Remove'/>"
1738 " <menuitem action='Reconcile'/>"
1740 " <menuitem action='Template'/>"
1743 " <menu action='ActionsMenu'>"
1744 " <menuitem action='Assign'/>"
1746 " <menuitem action='ExportQIF'/>"
1747 " <menuitem action='ExportCSV'/>"
1750 " <menu action='ToolsMenu'>"
1751 " <menuitem action='Filter'/>"
1756 " <toolbar name='TxnBar'>"
1757 " <toolitem action='Reconcile'/>"
1758 " <toolitem action='Add'/>"
1759 " <toolitem action='Inherit'/>"
1760 " <toolitem action='Edit'/>"
1761 " <toolitem action='Remove'/>"
1763 " <toolitem action='Template'/>"
1765 " <toolbar name='ToolBar'>"
1766 " <toolitem action='Filter'/>"
1767 " <toolitem action='Assign'/>"
1769 " <toolitem action='ExportQIF'/>"
1770 " <toolitem action='ExportCSV'/>"
1778 GtkWidget
*register_panel_window_new(guint32 accnum
, Account
*acc
)
1780 struct register_panel_data
*data
;
1781 struct WinGeometry
*wg
;
1782 GtkWidget
*window
, *mainbox
, *hbox
, *hbox2
, *align
, *sw
;
1783 GtkWidget
*treeview
, *label
, *widget
;
1785 GtkActionGroup
*actions
;
1787 GError
*error
= NULL
;
1789 DB( g_print("\n[account] create_register_panel_window\n") );
1791 data
= g_malloc0(sizeof(struct register_panel_data
));
1792 if(!data
) return NULL
;
1794 //disable define windows
1795 GLOBALS
->define_off
++;
1796 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_SENSITIVE
));
1798 /* create window, etc */
1799 window
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
1800 data
->window
= window
;
1803 data
->wintitle
= NULL
;
1804 data
->accnum
= accnum
;
1807 /* set transaction edit mutex */
1809 data
->acc
->window
= GTK_WINDOW(window
);
1811 //g_free(data->wintitle);
1812 data
->wintitle
= g_strdup_printf("%s - HomeBank", data
->acc
->name
);
1813 gtk_window_set_title (GTK_WINDOW (window
), data
->wintitle
);
1815 // connect our dispose function
1816 g_signal_connect (window
, "delete_event",
1817 G_CALLBACK (register_panel_dispose
), (gpointer
)data
);
1819 // connect our dispose function
1820 g_signal_connect (window
, "destroy",
1821 G_CALLBACK (register_panel_destroy
), (gpointer
)data
);
1823 // connect our dispose function
1824 g_signal_connect (window
, "configure-event",
1825 G_CALLBACK (register_panel_getgeometry
), (gpointer
)data
);
1830 //gtk_window_set_icon_from_file(GTK_WINDOW (WI_account), "./pixmaps/.png", NULL);
1832 //store our window private data
1833 g_object_set_data(G_OBJECT(window
), "inst_data", (gpointer
)data
);
1834 DB( g_print(" - new window=%p, inst_data=%p\n", window
, data
) );
1836 //set the window icon
1837 //homebank_window_set_icon_from_file(GTK_WINDOW (window), "ope_show.svg");
1838 gtk_window_set_icon_name(GTK_WINDOW (window
), HB_STOCK_OPE_SHOW
);
1842 //start test uimanager
1844 actions
= gtk_action_group_new ("Account");
1847 gtk_action_group_set_translation_domain(actions
, GETTEXT_PACKAGE
);
1850 DB( g_print(" - add actions: %p user_data: %p\n", actions
, data
) );
1851 gtk_action_group_add_actions (actions
, entries
, n_entries
, data
);
1853 /* set which action should have priority in the toolbar */
1854 action
= gtk_action_group_get_action(actions
, "Add");
1855 g_object_set(action
, "is_important", TRUE
, "short_label", _("Add"), NULL
);
1857 action
= gtk_action_group_get_action(actions
, "Inherit");
1858 g_object_set(action
, "is_important", TRUE
, "short_label", _("Inherit"), NULL
);
1860 action
= gtk_action_group_get_action(actions
, "Edit");
1861 g_object_set(action
, "is_important", TRUE
, "short_label", _("Edit"), NULL
);
1863 action
= gtk_action_group_get_action(actions
, "Filter");
1864 g_object_set(action
, "is_important", TRUE
, "short_label", _("Filter"), NULL
);
1866 action
= gtk_action_group_get_action(actions
, "Reconcile");
1867 g_object_set(action
, "is_important", TRUE
, "short_label", _("Reconcile"), NULL
);
1870 ui
= gtk_ui_manager_new ();
1872 DB( g_print(" - insert action group:\n") );
1873 gtk_ui_manager_insert_action_group (ui
, actions
, 0);
1875 GtkAccelGroup
*ag
= gtk_ui_manager_get_accel_group (ui
);
1877 DB( g_print(" - add_accel_group actions=%x, ui=%x, ag=%x\n", (gint
)actions
, (gint
)ui
, (gint
)ag
) );
1879 gtk_window_add_accel_group (GTK_WINDOW (window
), ag
);
1881 DB( g_print(" - add ui from string:\n") );
1882 if (!gtk_ui_manager_add_ui_from_string (ui
, ui_info
, -1, &error
))
1884 g_message ("building menus failed: %s", error
->message
);
1885 g_error_free (error
);
1889 data
->actions
= actions
;
1892 mainbox
= gtk_vbox_new (FALSE
, 0);
1893 gtk_container_add (GTK_CONTAINER (window
), mainbox
);
1895 widget
= gtk_ui_manager_get_widget (ui
, "/MenuBar");
1896 //data->menu = widget;
1897 gtk_box_pack_start (GTK_BOX (mainbox
), widget
, FALSE
, FALSE
, 0);
1899 hbox
= gtk_hbox_new (FALSE
, 3*HB_BOX_SPACING
);
1900 gtk_container_set_border_width (GTK_CONTAINER(hbox
), HB_BOX_SPACING
);
1901 gtk_box_pack_start (GTK_BOX (mainbox
), hbox
, FALSE
, FALSE
, 0);
1903 // account name (+ balance)
1904 align
= gtk_alignment_new(0.0, 0.5, 0.0, 1.0);
1905 gtk_alignment_set_padding(GTK_ALIGNMENT(align
), 0, 0, 0, 4*HB_BOX_SPACING
);
1906 gtk_box_pack_start (GTK_BOX (hbox
), align
, TRUE
, TRUE
, 0);
1908 label
= gtk_label_new(data
->acc
->name
);
1909 gimp_label_set_attributes (GTK_LABEL (label
), PANGO_ATTR_SCALE
, PANGO_SCALE_LARGE
, -1);
1910 gtk_container_add (GTK_CONTAINER (align
), label
);
1913 hbox2
= gtk_hbox_new (FALSE
, HB_BOX_SPACING
);
1914 gtk_box_pack_start (GTK_BOX (hbox
), hbox2
, FALSE
, FALSE
, 0);
1916 label
= gtk_label_new(NULL
);
1917 data
->TX_balance
[2] = label
;
1918 gtk_box_pack_end (GTK_BOX (hbox2
), label
, FALSE
, FALSE
, 0);
1919 label
= gtk_label_new(_("Future:"));
1920 gtk_box_pack_end (GTK_BOX (hbox2
), label
, FALSE
, FALSE
, 0);
1922 label
= gtk_label_new(NULL
);
1923 data
->TX_balance
[1] = label
;
1924 gtk_box_pack_end (GTK_BOX (hbox2
), label
, FALSE
, FALSE
, 0);
1925 label
= gtk_label_new(_("Today:"));
1926 gtk_box_pack_end (GTK_BOX (hbox2
), label
, FALSE
, FALSE
, 0);
1928 label
= gtk_label_new(NULL
);
1929 data
->TX_balance
[0] = label
;
1930 gtk_box_pack_end (GTK_BOX (hbox2
), label
, FALSE
, FALSE
, 0);
1931 label
= gtk_label_new(_("Bank:"));
1932 gtk_box_pack_end (GTK_BOX (hbox2
), label
, FALSE
, FALSE
, 0);
1936 widget
= gtk_entry_new ();
1937 data
->ST_search
= widget
;
1938 gtk_entry_set_icon_from_stock (GTK_ENTRY (widget
), GTK_ENTRY_ICON_PRIMARY
, GTK_STOCK_FIND
);
1939 gtk_entry_set_icon_from_stock (GTK_ENTRY (widget
), GTK_ENTRY_ICON_SECONDARY
, GTK_STOCK_CLEAR
);
1940 gtk_widget_set_size_request(widget
, 240, -1);
1941 gtk_box_pack_end (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1943 g_signal_connect (widget
, "activate", G_CALLBACK (quick_search_activate_cb
), data
);
1944 data
->handler_id
[HID_SEARCH
] = g_signal_connect (widget
, "notify::text", G_CALLBACK (quick_search_text_changed_cb
), data
);
1945 g_signal_connect (widget
, "icon-press", G_CALLBACK (quick_search_icon_press_cb
), data
);
1949 hbox
= gtk_hbox_new (FALSE
, HB_BOX_SPACING
);
1950 gtk_container_set_border_width (GTK_CONTAINER(hbox
), HB_BOX_SPACING
/2);
1952 gtk_box_pack_start (GTK_BOX (mainbox
), hbox
, FALSE
, FALSE
, 0);
1954 label
= make_label(_("_Range:"), 1.0, 0.5);
1955 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, 0);
1956 data
->CY_range
= make_daterange(label
, TRUE
);
1957 gtk_box_pack_start (GTK_BOX (hbox
), data
->CY_range
, FALSE
, FALSE
, 0);
1959 label
= make_label(_("_Type:"), 1.0, 0.5);
1960 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, 0);
1961 data
->CY_type
= make_cycle(label
, CYA_FLT_TYPE
);
1962 gtk_box_pack_start (GTK_BOX (hbox
), data
->CY_type
, FALSE
, FALSE
, 0);
1964 label
= make_label(_("_Status:"), 1.0, 0.5);
1965 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, 0);
1966 data
->CY_status
= make_cycle(label
, CYA_FLT_STATUS
);
1967 gtk_box_pack_start (GTK_BOX (hbox
), data
->CY_status
, FALSE
, FALSE
, 0);
1969 widget
= gtk_button_new_with_mnemonic (_("Reset _Filter"));
1970 data
->BT_reset
= widget
;
1971 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1973 //TRANSLATORS: this is for Euro specific users, a toggle to display in 'Minor' currency
1974 widget
= gtk_check_button_new_with_mnemonic (_("_Minor currency"));
1975 data
->CM_minor
= widget
;
1976 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1978 label
= gtk_label_new(NULL
);
1979 data
->TX_selection
= label
;
1980 gtk_misc_set_alignment(GTK_MISC(label
), 1.0, 0.5);
1981 gtk_box_pack_end (GTK_BOX (hbox
), label
, TRUE
, TRUE
, 0);
1985 label = make_label(_("_Month:"), 1.0, 0.5);
1986 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1987 data->CY_month = make_cycle(label, CYA_SELECT);
1988 gtk_box_pack_start (GTK_BOX (hbox), data->CY_month, FALSE, FALSE, 0);
1990 label = make_label(_("_Year:"), 1.0, 0.5);
1991 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1992 data->NB_year = make_year(label);
1993 gtk_box_pack_start (GTK_BOX (hbox), data->NB_year, FALSE, FALSE, 0);
1997 sw
= gtk_scrolled_window_new (NULL
, NULL
);
1998 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw
), GTK_SHADOW_ETCHED_IN
);
1999 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_ALWAYS
);
2000 treeview
= (GtkWidget
*)create_list_transaction(TRN_LIST_TYPE_BOOK
, PREFS
->lst_ope_columns
);
2001 data
->LV_ope
= treeview
;
2002 gtk_container_add (GTK_CONTAINER (sw
), treeview
);
2003 gtk_box_pack_start (GTK_BOX (mainbox
), sw
, TRUE
, TRUE
, 0);
2006 hbox
= gtk_hbox_new (FALSE
, 0);
2007 gtk_box_pack_start (GTK_BOX (mainbox
), hbox
, FALSE
, FALSE
, 0);
2009 widget
= gtk_ui_manager_get_widget (ui
, "/TxnBar");
2010 data
->TB_bar
= widget
;
2011 //gtk_widget_set_halign (widget, GTK_ALIGN_START);
2012 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
2014 widget
= gtk_ui_manager_get_widget (ui
, "/ToolBar");
2015 data
->TB_tools
= widget
;
2016 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
2019 if(PREFS
->toolbar_style
== 0)
2021 gtk_toolbar_unset_style(GTK_TOOLBAR(data
->TB_bar
));
2022 gtk_toolbar_unset_style(GTK_TOOLBAR(data
->TB_tools
));
2026 gtk_toolbar_set_style(GTK_TOOLBAR(data
->TB_bar
), PREFS
->toolbar_style
-1);
2027 gtk_toolbar_set_style(GTK_TOOLBAR(data
->TB_tools
), PREFS
->toolbar_style
-1);
2031 //todo: should move this
2032 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_minor
),GLOBALS
->minor
);
2033 g_object_set_data(G_OBJECT(gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_ope
))), "minor", data
->CM_minor
);
2036 data
->handler_id
[HID_RANGE
] = g_signal_connect (data
->CY_range
, "changed", G_CALLBACK (register_panel_cb_filter_daterange
), NULL
);
2037 data
->handler_id
[HID_TYPE
] = g_signal_connect (data
->CY_type
, "changed", G_CALLBACK (register_panel_cb_filter_type
), NULL
);
2038 data
->handler_id
[HID_STATUS
] = g_signal_connect (data
->CY_status
, "changed", G_CALLBACK (register_panel_cb_filter_status
), NULL
);
2040 g_signal_connect (data
->BT_reset
, "clicked", G_CALLBACK (register_panel_cb_filter_reset
), NULL
);
2042 g_signal_connect (data
->CM_minor
, "toggled", G_CALLBACK (register_panel_toggle_minor
), NULL
);
2044 //g_signal_connect (GTK_TREE_VIEW(treeview), "cursor-changed", G_CALLBACK (register_panel_update), (gpointer)2);
2045 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview
)), "changed", G_CALLBACK (register_panel_selection
), NULL
);
2046 g_signal_connect (GTK_TREE_VIEW(treeview
), "row-activated", G_CALLBACK (register_panel_onRowActivated
), GINT_TO_POINTER(2));
2049 //todo: test context menu
2051 menu = gtk_menu_new();
2052 menu_items = gtk_ui_manager_get_widget (ui, "/MenuBar/TransactionMenu/Add");
2054 menu_items = gtk_menu_item_new_with_label ("test");
2055 gtk_widget_show(menu_items);
2056 gtk_menu_shell_append (GTK_MENU (menu), menu_items);
2059 g_signal_connect (treeview, "button-press-event", G_CALLBACK (listview_context_cb),
2060 // todo: here is not a GtkMenu but GtkImageMenuItem...
2062 //gtk_ui_manager_get_widget (ui, "/MenuBar")
2066 //setup, init and show window
2067 wg
= &PREFS
->acc_wg
;
2070 gtk_window_move(GTK_WINDOW(window
), wg
->l
, wg
->t
);
2071 gtk_window_resize(GTK_WINDOW(window
), wg
->w
, wg
->h
);
2074 gtk_window_maximize(GTK_WINDOW(window
));
2076 gtk_widget_show_all (window
);
2078 /* make sure splash is up */
2079 while (gtk_events_pending ())
2080 gtk_main_iteration ();
2082 /* setup to moove later */
2083 data
->filter
= da_filter_malloc();
2084 DB( g_print(" - filter ok %x\n", (gint
)data
->filter
) );