1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 Maxime DOYEN
4 * This file is part of HomeBank.
6 * HomeBank is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * HomeBank is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "ui-transaction.h"
23 #include "hb-transaction.h"
24 #include "gtk-dateentry.h"
26 #include "ui-category.h"
27 #include "ui-account.h"
32 /****************************************************************************/
34 /****************************************************************************/
43 /* our global datas */
44 extern struct HomeBank
*GLOBALS
;
45 extern struct Preferences
*PREFS
;
48 gchar
*CYA_OPERATION
[] = {
49 N_("Add transaction"),
50 N_("Inherit transaction"),
51 N_("Modify transaction")
55 gchar
*CYA_TXN_STATUS
[] = {
64 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
66 static void deftransaction_template_popover_populate(struct deftransaction_data
*data
, GList
*srclist
);
68 static void deftransaction_update(GtkWidget
*widget
, gpointer user_data
)
70 struct deftransaction_data
*data
;
73 DB( g_print("\n[ui-transaction] update\n") );
75 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
77 //# 1419476 empty category when no split either...
78 if( (data
->ope
->flags
& (OF_SPLIT
)) )
80 //# 1416624 empty category when split
81 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_cat
), 0);
84 /* disable amount+category if split is set */
85 sensitive
= (data
->ope
->flags
& (OF_SPLIT
)) ? FALSE
: TRUE
;
86 gtk_widget_set_sensitive(data
->ST_amount
, sensitive
);
87 gtk_widget_set_sensitive(data
->PO_cat
, sensitive
);
91 static void deftransaction_update_warnsign(GtkWidget
*widget
, gpointer user_data
)
93 struct deftransaction_data
*data
;
94 gboolean warning
= FALSE
;
99 DB( g_print("\n[ui-transaction] update warning sign\n") );
101 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
103 //#1830707 no warning for xfer
104 paymode
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
105 if( paymode
!= PAYMODE_INTXFER
)
107 cat
= ui_cat_comboboxentry_get(GTK_COMBO_BOX(data
->PO_cat
));
108 if(cat
!= NULL
&& cat
->key
> 0)
110 amount
= hb_amount_round(gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
)), 2);
113 type
= (amount
> 0) ? 1 : -1;
114 warning
= (category_type_get(cat
) != type
) ? TRUE
: FALSE
;
121 gtk_widget_show_all(data
->IB_warnsign
);
122 //#GTK+710888: hack waiting a GTK fix
123 gtk_widget_queue_resize (data
->IB_warnsign
);
126 gtk_widget_hide(data
->IB_warnsign
);
131 static void deftransaction_update_transfer(GtkWidget
*widget
, gpointer user_data
)
133 struct deftransaction_data
*data
;
137 DB( g_print("\n[ui-transaction] update transfer\n") );
139 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
143 kacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
145 if(kacc
== 0) { sensitive
= FALSE
; goto end
; }
148 * - target account selected
152 if( gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
)) == PAYMODE_INTXFER
)
154 Account
*srcacc
, *dstacc
;
156 kdst
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_accto
));
158 if(kdst
== 0) { sensitive
= FALSE
; goto end
; }
164 srcacc
= da_acc_get(kacc
);
165 dstacc
= da_acc_get(kdst
);
166 if( srcacc
&& dstacc
)
168 if(srcacc
->kcur
!= dstacc
->kcur
)
176 DB( g_print(" sensitive %d\n", sensitive
) );
179 //gtk_widget_set_sensitive(gtk_dialog_get_action_area(GTK_DIALOG (data->window)), sensitive);
180 gtk_dialog_set_response_sensitive(GTK_DIALOG (data
->window
), GTK_RESPONSE_ACCEPT
, sensitive
);
181 gtk_dialog_set_response_sensitive(GTK_DIALOG (data
->window
), HB_RESPONSE_ADD
, sensitive
);
182 gtk_dialog_set_response_sensitive(GTK_DIALOG (data
->window
), HB_RESPONSE_ADDKEEP
, sensitive
);
187 static void deftransaction_update_payee(GtkWidget
*widget
, gpointer user_data
)
189 struct deftransaction_data
*data
;
194 DB( g_print("\n[ui-transaction] update payee\n") );
196 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
198 //pay = ui_pay_comboboxentry_get(GTK_COMBO_BOX(data->PO_pay));
199 pay
= ui_pay_entry_popover_get(GTK_BOX(data
->PO_pay
));
202 // only set for empty category
203 // #1635053 and also paymode unset
204 // #1817278 and independently
205 cat
= ui_cat_comboboxentry_get(GTK_COMBO_BOX(data
->PO_cat
));
206 if( (cat
== NULL
|| cat
->key
== 0) )
208 g_signal_handlers_block_by_func (G_OBJECT (data
->PO_cat
), G_CALLBACK (deftransaction_update_warnsign
), NULL
);
209 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_cat
), pay
->kcat
);
210 g_signal_handlers_unblock_by_func (G_OBJECT (data
->PO_cat
), G_CALLBACK (deftransaction_update_warnsign
), NULL
);
213 paymode
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
214 if( (paymode
== PAYMODE_NONE
) )
216 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->NU_mode
), pay
->paymode
);
222 static void deftransaction_set_cheque(GtkWidget
*widget
, gpointer user_data
)
224 struct deftransaction_data
*data
;
231 DB( g_print("\n[ui-transaction] set_cheque\n") );
233 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
235 amount
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
238 kacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
242 acc
= da_acc_get( kacc
);
245 DB( g_print(" - should fill for acc %d '%s'\n", kacc
, acc
->name
) );
247 cheque
= ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_cheque
))==TRUE
? acc
->cheque2
: acc
->cheque1
);
248 cheque_str
= g_strdup_printf("%d", cheque
+ 1);
249 gtk_entry_set_text(GTK_ENTRY(data
->ST_info
), cheque_str
);
257 gtk_entry_set_text(GTK_ENTRY(data
->ST_info
), "");
264 //#1676162 update the nb digits of amount
265 static void deftransaction_set_amount_nbdigits(GtkWidget
*widget
, guint32 kacc
)
267 struct deftransaction_data
*data
;
269 DB( g_print("\n[ui-transaction] set_amount_nbdigits\n") );
271 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
273 Account
*srcacc
= da_acc_get(kacc
);
276 Currency
*cur
= da_cur_get(srcacc
->kcur
);
278 DB( g_print("- acc is %d '%s', curr=%d\n", srcacc
->key
, srcacc
->name
, srcacc
->kcur
) );
282 DB( g_print("- set digits to '%s' %d\n", cur
->name
, cur
->frac_digits
) );
283 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(data
->ST_amount
), cur
->frac_digits
);
286 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(data
->ST_amount
), 2);
292 static void deftransaction_update_accto(GtkWidget
*widget
, gpointer user_data
)
294 struct deftransaction_data
*data
;
297 DB( g_print("\n[ui-transaction] update accto\n") );
299 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
301 kacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
303 DB( g_print(" acc is %d\n", kacc
) );
305 deftransaction_set_amount_nbdigits(widget
, kacc
);
306 //g_signal_handlers_block_by_func (G_OBJECT (data->PO_accto), G_CALLBACK (deftransaction_update_transfer), NULL);
307 //ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_accto), 0);
308 //g_signal_handlers_unblock_by_func (G_OBJECT (data->PO_accto), G_CALLBACK (deftransaction_update_transfer), NULL);
310 ui_acc_comboboxentry_populate_except(GTK_COMBO_BOX(data
->PO_accto
), GLOBALS
->h_acc
, kacc
, ACC_LST_INSERT_NORMAL
);
312 deftransaction_update_transfer(widget
, user_data
);
317 void deftransaction_set_amount_from_split(GtkWidget
*widget
, gdouble amount
)
319 struct deftransaction_data
*data
;
321 DB( g_print("\n[ui-transaction] set_amount_from_split\n") );
323 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
325 DB( g_print("- amount=%.2f\n", amount
) );
327 data
->ope
->amount
= amount
;
328 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), amount
);
330 deftransaction_update(widget
, NULL
);
335 static void deftransaction_set(GtkWidget
*widget
, gpointer user_data
)
337 struct deftransaction_data
*data
;
341 DB( g_print("\n[ui-transaction] set\n") );
343 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
347 DB( g_print(" - ope=%p data=%p tags:%p\n", data
->ope
, data
, entry
->tags
) );
349 //DB( g_print(" set date to %d\n", entry->date) );
350 //g_object_set(GTK_DATE_ENTRY(data->PO_date), "date", (guint32)entry->ope_Date);
351 gtk_date_entry_set_date(GTK_DATE_ENTRY(data
->PO_date
), (guint
)entry
->date
);
353 txt
= (entry
->memo
!= NULL
) ? entry
->memo
: "";
354 gtk_entry_set_text(GTK_ENTRY(data
->ST_memo
), txt
);
355 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), entry
->amount
);
356 //gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_amount), (entry->ope_Flags & OF_INCOME) ? 1 : 0);
358 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_cheque
), (entry
->flags
& OF_CHEQ2
) ? 1 : 0);
360 txt
= (entry
->info
!= NULL
) ? entry
->info
: "";
361 gtk_entry_set_text(GTK_ENTRY(data
->ST_info
), txt
);
362 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_cat
), entry
->kcat
);
363 //ui_pay_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_pay), entry->kpay);
364 ui_pay_entry_popover_set_active(GTK_BOX(data
->PO_pay
), entry
->kpay
);
366 tagstr
= tags_tostring(entry
->tags
);
367 DB( g_print(" - tags: '%s'\n", txt
) );
368 txt
= (tagstr
!= NULL
) ? tagstr
: "";
369 gtk_entry_set_text(GTK_ENTRY(data
->ST_tags
), txt
);
372 hbtk_radio_button_set_active(GTK_CONTAINER(data
->RA_status
), entry
->status
);
374 //as we trigger an event on this
375 //let's place it at the end to avoid missvalue on the trigger function
376 g_signal_handlers_block_by_func (G_OBJECT (data
->PO_acc
), G_CALLBACK (deftransaction_update_accto
), NULL
);
377 if( entry
->kacc
> 0 )
379 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_acc
), entry
->kacc
);
381 else //1829007 set first item if only 1 account
383 GtkTreeModel
*model
= gtk_combo_box_get_model(GTK_COMBO_BOX(data
->PO_acc
));
385 if(gtk_tree_model_iter_n_children(model
, NULL
) == 1)
386 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->PO_acc
), 0);
388 g_signal_handlers_unblock_by_func (G_OBJECT (data
->PO_acc
), G_CALLBACK (deftransaction_update_accto
), NULL
);
390 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_accto
), entry
->kxferacc
);
392 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->NU_mode
), entry
->paymode
);
394 DB( g_print(" - acc is: %d\n", gtk_combo_box_get_active(GTK_COMBO_BOX(data
->PO_acc
)) ) );
398 void deftransaction_get(GtkWidget
*widget
, gpointer user_data
)
400 struct deftransaction_data
*data
;
406 DB( g_print("\n[ui-transaction] get\n") );
408 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
412 DB( g_print(" - ope = %p\n", entry
) );
414 //DB( g_print(" get date to %d\n", entry->ope_Date) );
415 entry
->date
= gtk_date_entry_get_date(GTK_DATE_ENTRY(data
->PO_date
));
416 //g_object_get(GTK_DATE_ENTRY(data->PO_date), "date", entry->ope_Date);
418 //free any previous string
424 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_memo
));
425 // ignore if entry is empty
428 entry
->memo
= g_strdup(txt
);
430 //#1716182 add into memo autocomplete
431 if( da_transaction_insert_memo(entry
) )
433 GtkEntryCompletion
*completion
;
437 completion
= gtk_entry_get_completion (GTK_ENTRY(data
->ST_memo
));
438 model
= gtk_entry_completion_get_model (completion
);
439 gtk_list_store_insert_with_values(GTK_LIST_STORE(model
), &iter
, -1,
446 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
447 entry
->amount
= value
;
449 /* for internal transfer add, amount must be expense */
452 if( entry->paymode == PAYMODE_INTXFER && data->type == OPERATION_EDIT_ADD )
454 if( entry->amount > 0 )
459 //free any previous string
465 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_info
));
466 // ignore if entry is empty
469 entry
->info
= g_strdup(txt
);
472 entry
->paymode
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
473 entry
->kcat
= ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data
->PO_cat
));
474 //entry->kpay = ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data->PO_pay));
475 entry
->kpay
= ui_pay_entry_popover_get_key_add_new(GTK_BOX(data
->PO_pay
));
476 entry
->kacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
477 entry
->kxferacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_accto
));
480 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_tags
));
481 DB( g_print(" - tags: '%s'\n", txt
) );
483 entry
->tags
= tags_parse(txt
);
485 entry
->status
= hbtk_radio_button_get_active(GTK_CONTAINER(data
->RA_status
));
487 //#1615245: moved here, after get combo entry key
488 if( entry
->paymode
!= PAYMODE_INTXFER
)
490 //#677351: revert kxferacc to 0
496 entry
->flags
&= (OF_SPLIT
); //(split is set in hb_transaction)
498 if( data
->type
== TRANSACTION_EDIT_ADD
|| data
->type
== TRANSACTION_EDIT_INHERIT
)
499 entry
->flags
|= OF_ADDED
;
501 if( data
->type
== TRANSACTION_EDIT_MODIFY
)
502 entry
->flags
|= OF_CHANGED
;
504 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_cheque
));
505 if(active
== 1) entry
->flags
|= OF_CHEQ2
;
507 //active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_amount));
508 active
= entry
->amount
> 0 ? TRUE
: FALSE
;
509 if(active
== TRUE
) entry
->flags
|= OF_INCOME
;
514 static gboolean
deftransaction_amount_focusout(GtkWidget
*widget
, GdkEventFocus
*event
, gpointer user_data
)
516 struct deftransaction_data
*data
;
520 DB( g_print("\n[ui-transaction] amount focus-out-event %d\n", gtk_widget_is_focus(widget
)) );
522 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
524 //#1681532 not reproduced, so prevent
525 if( GTK_IS_COMBO_BOX(data
->NU_mode
) )
527 paymode
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
528 amount
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
530 // for internal transfer add, amount must be expense by default
531 if( paymode
== PAYMODE_INTXFER
&& data
->type
== TRANSACTION_EDIT_ADD
)
534 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), amount
*= -1);
537 if( paymode
== PAYMODE_CHECK
)
539 deftransaction_set_cheque(widget
, NULL
);
542 deftransaction_update_warnsign(widget
, NULL
);
548 static void deftransaction_toggleamount(GtkWidget
*widget
, GtkEntryIconPosition icon_pos
, GdkEvent
*event
, gpointer user_data
)
550 struct deftransaction_data
*data
;
555 DB( g_print("\n[ui-transaction] toggleamount\n") );
557 if(icon_pos
== GTK_ENTRY_ICON_PRIMARY
)
559 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
561 gtk_spin_button_update(GTK_SPIN_BUTTON(data
->ST_amount
));
563 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
565 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), value
);
567 if( data
->ope
->flags
& OF_SPLIT
)
569 count
= da_splits_length(data
->ope
->splits
);
570 DB( g_print("- count = %d\n", count
) );
573 split
= da_splits_get(data
->ope
->splits
, i
);
578 deftransaction_update_warnsign(widget
, NULL
);
584 static void deftransaction_button_split_cb(GtkWidget
*widget
, gpointer user_data
)
586 struct deftransaction_data
*data
;
591 DB( g_print("\n[ui-transaction] doing split\n") );
593 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
597 amount
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
598 ui_split_dialog(data
->window
, &ope
->splits
, amount
, &deftransaction_set_amount_from_split
);
600 //eval split to garantee disabled items
601 ope
->flags
&= ~(OF_SPLIT
);
602 nbsplit
= da_splits_length(ope
->splits
);
604 data
->ope
->flags
|= (OF_SPLIT
);
606 deftransaction_update(data
->window
, NULL
);
610 static void deftransaction_paymode(GtkWidget
*widget
, gpointer user_data
)
612 struct deftransaction_data
*data
;
617 DB( g_print("\n[ui-transaction] paymode change\n") );
619 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
621 payment
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
624 /* todo: prefill the cheque number ? */
625 if( data
->type
!= TRANSACTION_EDIT_MODIFY
)
627 if(payment
== PAYMODE_CHECK
)
629 deftransaction_set_cheque(widget
, user_data
);
634 if(payment
== PAYMODE_CHECK
)
637 sensitive
= (payment
== PAYMODE_INTXFER
) ? FALSE
: TRUE
;
638 gtk_widget_set_sensitive(data
->BT_split
, sensitive
);
640 sensitive
= page
== 1 ? TRUE
: FALSE
;
641 hb_widget_visible(data
->CM_cheque
, sensitive
);
643 if(payment
== PAYMODE_INTXFER
)
646 // for internal transfer add, amount must be expense by default
647 gdouble amount
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
648 if( data
->type
== TRANSACTION_EDIT_ADD
)
651 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), amount
*= -1);
654 //if( data->type == TRANSACTION_EDIT_MODIFY )
658 gtk_label_set_text_with_mnemonic (GTK_LABEL(data
->LB_accto
), _("From acc_ount:"));
662 gtk_label_set_text_with_mnemonic (GTK_LABEL(data
->LB_accto
), _("To acc_ount:"));
669 deftransaction_update_accto(widget
, user_data
);
670 DB( g_print(" payment: %d, page: %d\n", payment
, page
) );
672 sensitive
= page
== 2 ? TRUE
: FALSE
;
673 hb_widget_visible(data
->LB_accto
, sensitive
);
674 hb_widget_visible(data
->PO_accto
, sensitive
);
680 ** called from outside (register/report detail)
682 gint
deftransaction_external_edit(GtkWindow
*parent
, Transaction
*old_txn
, Transaction
*new_txn
)
688 DB( g_print("\n[ui-transaction] external edit (from out)\n") );
691 dialog
= create_deftransaction_window(GTK_WINDOW(parent
), TRANSACTION_EDIT_MODIFY
, FALSE
, 0);
692 deftransaction_set_transaction(dialog
, new_txn
);
694 result
= gtk_dialog_run (GTK_DIALOG (dialog
));
695 if(result
== GTK_RESPONSE_ACCEPT
)
697 deftransaction_get(dialog
, NULL
);
699 account_balances_sub(old_txn
);
700 account_balances_add(new_txn
);
702 /* update account flag */
703 acc
= da_acc_get(new_txn
->kacc
);
705 acc
->flags
|= AF_CHANGED
;
707 /* ok different case here
711 check for existing child or add it
713 sync (acc change is inside now)
719 * always manage account change
723 if( new_txn
->paymode
== PAYMODE_INTXFER
)
725 if( old_txn
->paymode
!= PAYMODE_INTXFER
)
727 // this call can popup a user dialog to choose
728 transaction_xfer_search_or_add_child(GTK_WINDOW(dialog
), new_txn
, new_txn
->kxferacc
);
734 //use old in case of dst_acc change
735 child
= transaction_xfer_child_strong_get(old_txn
);
736 //#1584342 was faultly old_txn
737 transaction_xfer_child_sync(new_txn
, child
);
742 //#1250061 : manage ability to break an internal xfer
743 if(old_txn
->paymode
== PAYMODE_INTXFER
)
747 DB( g_print(" - should break internal xfer\n") );
749 break_result
= ui_dialog_msg_confirm_alert(
752 _("Do you want to break the internal transfer ?\n\n"
753 "Proceeding will delete the target transaction."),
757 if(break_result
== GTK_RESPONSE_OK
)
759 //we must use old_txn to ensure get the child
760 //#1663789 but we must clean new as well
761 transaction_xfer_remove_child(old_txn
);
763 new_txn
->kxferacc
= 0;
765 else //force paymode to internal xfer
767 new_txn
->paymode
= PAYMODE_INTXFER
;
772 //1638035: manage account change
773 if( old_txn
->kacc
!= new_txn
->kacc
)
775 //todo: maybe we should restrict this also to same currency account
776 //=> no pb for normal, and intxfer is restricted by ui (in theory)
777 transaction_acc_move(new_txn
, old_txn
->kacc
, new_txn
->kacc
);
781 deftransaction_dispose(dialog
, NULL
);
782 gtk_widget_destroy (dialog
);
788 void deftransaction_set_transaction(GtkWidget
*widget
, Transaction
*ope
)
790 struct deftransaction_data
*data
;
792 DB( g_print("\n[ui-transaction] set transaction (from out)\n") );
794 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
798 DB( g_print(" - ope=%p data=%p\n", data
->ope
, data
) );
800 DB( g_print(" - call init\n") );
802 deftransaction_set(widget
, NULL
);
803 deftransaction_paymode(widget
, NULL
);
804 deftransaction_update(widget
, NULL
);
805 deftransaction_update_warnsign(widget
, NULL
);
810 static void deftransaction_setup(struct deftransaction_data
*data
)
813 DB( g_print("\n[ui-transaction] setup\n") );
815 if( data
->showtemplate
)
817 deftransaction_template_popover_populate (data
, GLOBALS
->arc_list
);
818 gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(data
->modelfilter
));
821 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_acc
), GLOBALS
->h_acc
, ACC_LST_INSERT_NORMAL
);
822 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_accto
), GLOBALS
->h_acc
, ACC_LST_INSERT_NORMAL
);
824 ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_cat
), GLOBALS
->h_cat
);
827 //5.2.7 done in popover
828 //ui_pay_comboboxentry_populate(GTK_COMBO_BOX(data->PO_pay), GLOBALS->h_pay);
829 //ui_tag_combobox_populate(GTK_COMBO_BOX_TEXT(data->CY_tags));
834 static void deftransaction_template_popover_onRowActivated(GtkTreeView
*treeview
,
836 GtkTreeViewColumn
*col
,
839 struct deftransaction_data
*data
;
843 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(treeview
), GTK_TYPE_WINDOW
)), "inst_data");
844 model
= gtk_tree_view_get_model(treeview
);
846 if (gtk_tree_model_get_iter(model
, &iter
, path
))
851 gtk_tree_model_get(GTK_TREE_MODEL(model
), &iter
, LST_DSPTPL_DATAS
, &arc
, -1);
854 da_transaction_init_from_template(txn
, arc
);
856 DB( g_print(" calls\n") );
858 deftransaction_set(GTK_WIDGET(treeview
), NULL
);
859 deftransaction_paymode(GTK_WIDGET(treeview
), NULL
);
860 deftransaction_update(GTK_WIDGET(treeview
), NULL
);
862 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data
->MB_template
), FALSE
);
868 static void deftransaction_template_popover_populate(struct deftransaction_data
*data
, GList
*srclist
)
874 //insert all glist item into treeview
876 gtk_list_store_clear(GTK_LIST_STORE(model
));
878 list
= g_list_first(srclist
);
881 Archive
*entry
= list
->data
;
883 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
884 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
885 LST_DSPTPL_DATAS
, entry
,
886 LST_DSPTPL_NAME
, entry
->memo
,
889 //DB( g_print(" populate_treeview: %d %08x\n", i, list->data) );
891 list
= g_list_next(list
);
897 deftransaction_template_popover_refilter (GtkWidget
*widget
, gpointer user_data
)
899 struct deftransaction_data
*data
= user_data
;
901 DB( g_print(" text changed\n") );
903 gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(data
->modelfilter
));
907 static gboolean
deftransaction_template_popover_func_visible (GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
909 struct deftransaction_data
*data
= user_data
;
912 gboolean visible
= TRUE
;
916 showsched
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_showsched
));
917 showallacc
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_showallacc
));
919 gchar
*needle
= g_ascii_strdown(gtk_entry_get_text(GTK_ENTRY(data
->ST_search
)), -1);
921 gtk_tree_model_get (model
, iter
,
922 LST_DSPTPL_DATAS
, &entry
,
923 LST_DSPTPL_NAME
, &str
, -1);
927 if( !showallacc
&& (data
->kacc
!= 0) && (entry
->kacc
!= data
->kacc
) )
931 if( (entry
->flags
& OF_AUTO
) && !showsched
)
937 gchar
*haystack
= g_ascii_strdown(str
, -1);
939 if (str
&& g_strrstr (haystack
, needle
) == NULL
)
944 DB( g_print("filter: '%s' '%s' %d\n", str
, needle
, visible
) );
957 static GtkWidget
*deftransaction_template_popover_create(struct deftransaction_data
*data
)
960 GtkCellRenderer
*renderer
;
961 GtkTreeViewColumn
*column
;
962 GtkWidget
*box
, *widget
, *scrollwin
, *treeview
;
964 box
= gtk_box_new(GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
966 widget
= make_search();
967 data
->ST_search
= widget
;
968 gtk_box_pack_start (GTK_BOX(box
), widget
, FALSE
, FALSE
, 0);
971 scrollwin
= gtk_scrolled_window_new(NULL
,NULL
);
972 gtk_box_pack_start (GTK_BOX(box
), scrollwin
, TRUE
, TRUE
, 0);
973 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
974 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
976 store
= gtk_list_store_new(NUM_LST_DSPTPL
,
980 data
->model
= GTK_TREE_MODEL(store
);
982 data
->modelfilter
= GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(GTK_TREE_MODEL(data
->model
), NULL
));
983 gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(data
->modelfilter
), deftransaction_template_popover_func_visible
, data
, NULL
);
986 treeview
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(data
->modelfilter
));
987 data
->LV_arc
= treeview
;
988 gtk_container_add(GTK_CONTAINER(scrollwin
), treeview
);
990 gtk_widget_grab_focus(treeview
);
992 /* column for bug numbers */
993 renderer
= gtk_cell_renderer_text_new ();
994 column
= gtk_tree_view_column_new_with_attributes (NULL
,
999 //gtk_tree_view_column_set_resizable (column, TRUE);
1000 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
1001 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(treeview
), FALSE
);
1003 widget
= gtk_check_button_new_with_mnemonic(_("Show _scheduled"));
1004 data
->CM_showsched
= widget
;
1005 gtk_box_pack_start (GTK_BOX(box
), widget
, FALSE
, FALSE
, 0);
1007 widget
= gtk_check_button_new_with_mnemonic(_("Show _all accounts"));
1008 data
->CM_showallacc
= widget
;
1009 gtk_box_pack_start (GTK_BOX(box
), widget
, FALSE
, FALSE
, 0);
1011 gtk_widget_show_all (box
);
1013 //#1796564 hide show all template if no account
1014 gtk_widget_set_visible (data
->CM_showallacc
, data
->kacc
== 0 ? FALSE
: TRUE
);
1017 g_signal_connect (data
->CM_showsched
, "toggled", G_CALLBACK (deftransaction_template_popover_refilter
), data
);
1018 g_signal_connect (data
->CM_showallacc
, "toggled", G_CALLBACK (deftransaction_template_popover_refilter
), data
);
1019 g_signal_connect (data
->ST_search
, "search-changed", G_CALLBACK (deftransaction_template_popover_refilter
), data
);
1026 static GtkWidget
*deftransaction_create_template(struct deftransaction_data
*data
)
1028 GtkWidget
*box
, *menubutton
, *image
, *label
;
1030 menubutton
= gtk_menu_button_new ();
1031 data
->MB_template
= menubutton
;
1032 box
= gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1033 label
= gtk_label_new_with_mnemonic (_("Use a _template"));
1034 gtk_box_pack_start (GTK_BOX(box
), label
, FALSE
, FALSE
, 0);
1035 image
= gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON
);
1036 gtk_box_pack_start (GTK_BOX(box
), image
, FALSE
, FALSE
, 0);
1037 gtk_container_add(GTK_CONTAINER(menubutton
), box
);
1039 gtk_menu_button_set_direction (GTK_MENU_BUTTON(menubutton
), GTK_ARROW_DOWN
);
1040 gtk_widget_set_halign (menubutton
, GTK_ALIGN_END
);
1041 gtk_widget_set_hexpand (menubutton
, TRUE
);
1042 gtk_widget_show_all(menubutton
);
1045 GtkWidget
*template = deftransaction_template_popover_create(data
);
1046 GtkWidget
*popover
= create_popover (menubutton
, template, GTK_POS_BOTTOM
);
1047 gtk_widget_set_size_request (popover
, 2*HB_MINWIDTH_LIST
, HB_MINHEIGHT_LIST
);
1048 //gtk_widget_set_vexpand (popover, TRUE);
1049 //gtk_widget_set_hexpand (popover, TRUE);
1051 /*gtk_widget_set_margin_start (popover, 10);
1052 gtk_widget_set_margin_end (popover, 10);
1053 gtk_widget_set_margin_bottom (popover, 10);*/
1055 gtk_menu_button_set_popover(GTK_MENU_BUTTON(menubutton
), popover
);
1057 g_signal_connect (GTK_TREE_VIEW(data
->LV_arc
), "row-activated", G_CALLBACK (deftransaction_template_popover_onRowActivated
), NULL
);
1065 deftransaction_getgeometry(GtkWidget
*widget
, GdkEventConfigure
*event
, gpointer user_data
)
1067 struct WinGeometry
*wg
;
1069 DB( g_print("\n[ui-transaction] get geometry\n") );
1072 wg
= &PREFS
->txn_wg
;
1073 gtk_window_get_size(GTK_WINDOW(widget
), &wg
->w
, NULL
);
1075 DB( g_print(" window: w=%d\n", wg
->w
) );
1081 void deftransaction_dispose(GtkWidget
*widget
, gpointer user_data
)
1083 struct deftransaction_data
*data
;
1085 DB( g_print("\n[ui-transaction] dispose\n") );
1087 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1089 deftransaction_getgeometry(data
->window
, NULL
, data
);
1095 GtkWidget
*create_deftransaction_window (GtkWindow
*parent
, gint type
, gboolean postmode
, guint32 kacc
)
1097 struct deftransaction_data
*data
;
1098 struct WinGeometry
*wg
;
1099 GtkWidget
*dialog
, *content
, *mainvbox
;
1101 GtkWidget
*group_grid
, *hbox
, *label
, *widget
;
1104 DB( g_print("\n[ui-transaction] new\n") );
1106 data
= g_malloc0(sizeof(struct deftransaction_data
));
1109 dialog = gtk_dialog_new_with_buttons (_(CYA_OPERATION[data->type]),
1110 GTK_WINDOW (parent),
1115 dialog
= gtk_dialog_new();
1116 gtk_window_set_title (GTK_WINDOW(dialog
), _(CYA_OPERATION
[type
]));
1117 gtk_window_set_transient_for (GTK_WINDOW(dialog
), GTK_WINDOW(parent
));
1122 //store our window private data
1123 g_object_set_data(G_OBJECT(dialog
), "inst_data", (gpointer
)data
);
1124 DB( g_print(" - window=%p, inst_data=%p\n", dialog
, data
) );
1126 data
->window
= dialog
;
1130 // if you add/remove response_id also change into deftransaction_update_transfer
1131 if(type
== TRANSACTION_EDIT_MODIFY
)
1133 gtk_dialog_add_buttons (GTK_DIALOG(dialog
),
1134 _("_Cancel"), GTK_RESPONSE_REJECT
,
1135 _("_OK"), GTK_RESPONSE_ACCEPT
,
1142 gtk_dialog_add_buttons (GTK_DIALOG(dialog
),
1143 _("_Close"), GTK_RESPONSE_REJECT
,
1144 _("_Add & keep"), HB_RESPONSE_ADDKEEP
,
1145 _("_Add"), HB_RESPONSE_ADD
,
1150 gtk_dialog_add_buttons (GTK_DIALOG(dialog
),
1151 _("_Close"), GTK_RESPONSE_REJECT
,
1152 _("_Post"), HB_RESPONSE_ADD
,
1159 case TRANSACTION_EDIT_ADD
:
1160 gtk_window_set_icon_name(GTK_WINDOW (dialog
), ICONNAME_HB_OPE_ADD
);
1162 case TRANSACTION_EDIT_INHERIT
:
1163 gtk_window_set_icon_name(GTK_WINDOW (dialog
), ICONNAME_HB_OPE_HERIT
);
1165 case TRANSACTION_EDIT_MODIFY
:
1166 gtk_window_set_icon_name(GTK_WINDOW (dialog
), ICONNAME_HB_OPE_EDIT
);
1170 //gtk_window_set_decorated(GTK_WINDOW(dialog), TRUE);
1173 content
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
));
1174 mainvbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
1175 gtk_box_pack_start (GTK_BOX (content
), mainvbox
, TRUE
, TRUE
, 0);
1176 gtk_container_set_border_width (GTK_CONTAINER(mainvbox
), SPACING_MEDIUM
);
1179 group_grid
= gtk_grid_new ();
1180 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1181 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1182 gtk_box_pack_start (GTK_BOX (mainvbox
), group_grid
, FALSE
, FALSE
, 0);
1185 label
= make_label_widget(_("_Date:"));
1186 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1187 widget
= gtk_date_entry_new();
1188 data
->PO_date
= widget
;
1189 gtk_widget_set_halign(widget
, GTK_ALIGN_START
);
1190 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1191 //gtk_widget_set_tooltip_text(widget, _("Date accepted here are:\nday,\nday/month or month/day,\nand complete date into your locale"));
1192 gtk_widget_set_tooltip_text(widget
, _("- type: d, d/m, m/d a complete date\n- use arrow key + ctrl or shift\n- empty for today"));
1194 data
->showtemplate
= FALSE
;
1195 if( data
->type
!= TRANSACTION_EDIT_MODIFY
&& da_archive_length() > 0 && !postmode
)
1197 data
->showtemplate
= TRUE
;
1198 widget
= deftransaction_create_template(data
);
1199 gtk_widget_set_halign (widget
, GTK_ALIGN_END
);
1200 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1204 label
= make_label_widget(_("_Amount:"));
1205 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1206 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 0);
1207 gtk_widget_set_hexpand(hbox
, TRUE
);
1208 gtk_grid_attach (GTK_GRID (group_grid
), hbox
, 1, row
, 1, 1);
1210 widget
= make_amount(label
);
1211 data
->ST_amount
= widget
;
1212 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(widget
), GTK_ENTRY_ICON_PRIMARY
, ICONNAME_HB_TOGGLE_SIGN
);
1213 gtk_entry_set_icon_tooltip_text(GTK_ENTRY(widget
), GTK_ENTRY_ICON_PRIMARY
, _("Toggle amount sign"));
1214 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1216 widget
= make_image_button(ICONNAME_HB_BUTTON_SPLIT
, _("Transaction splits"));
1217 data
->BT_split
= widget
;
1218 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1222 label
= make_label_widget(_("A_ccount:"));
1223 data
->LB_accfrom
= label
;
1224 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1225 widget
= ui_acc_comboboxentry_new(label
);
1226 data
->PO_acc
= widget
;
1227 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
1230 label
= make_label_widget(_("To acc_ount:"));
1231 data
->LB_accto
= label
;
1232 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1233 widget
= ui_acc_comboboxentry_new(label
);
1234 data
->PO_accto
= widget
;
1235 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
1239 label
= make_label_widget(_("Pa_yment:"));
1240 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1241 widget
= make_paymode(label
);
1242 data
->NU_mode
= widget
;
1243 gtk_widget_set_halign(widget
, GTK_ALIGN_START
);
1244 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1246 gtk_widget_set_margin_top(label
, SPACING_SMALL
);
1247 gtk_widget_set_margin_top(widget
, SPACING_SMALL
);
1250 widget
= gtk_check_button_new_with_mnemonic(_("Of notebook _2"));
1251 data
->CM_cheque
= widget
;
1252 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1255 label
= make_label_widget(_("_Info:"));
1256 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1257 widget
= make_string(label
);
1258 data
->ST_info
= widget
;
1259 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1261 gtk_widget_set_margin_bottom(label
, SPACING_SMALL
);
1262 gtk_widget_set_margin_bottom(widget
, SPACING_SMALL
);
1266 label = make_label_widget(_("_Payee:"));
1267 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1268 widget = ui_pay_comboboxentry_new(label);
1269 data->PO_pay = widget;
1270 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1271 //gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available"));
1272 gtk_widget_set_tooltip_text(widget, _("- type some letter for autocompletion\n- type new text to create entry"));
1276 label
= make_label_widget(_("_Payee:"));
1277 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1279 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_MEDIUM
);
1280 gtk_widget_set_hexpand(hbox
, TRUE
);
1281 gtk_grid_attach (GTK_GRID (group_grid
), hbox
, 1, row
, 2, 1);
1283 widget
= ui_pay_entry_popover_new(label
);
1284 data
->PO_pay
= widget
;
1285 gtk_widget_set_hexpand(widget
, TRUE
);
1286 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1287 //widget = gtk_image_new_from_icon_name (ICONNAME_INFO, GTK_ICON_SIZE_BUTTON);
1288 gtk_widget_set_tooltip_text(widget
, _("- type some letter for autocompletion\n- type new text to create entry"));
1289 //gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1291 gtk_widget_set_margin_bottom(label
, SPACING_SMALL
);
1292 gtk_widget_set_margin_bottom(hbox
, SPACING_SMALL
);
1295 label
= make_label_widget(_("_Category:"));
1296 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1297 widget
= ui_cat_comboboxentry_new(label
);
1298 data
->PO_cat
= widget
;
1299 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
1300 //gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available"));
1301 gtk_widget_set_tooltip_text(widget
, _("- type some letter for autocompletion\n- type new text to create entry"));
1304 label
= make_label_widget(_("_Status:"));
1305 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1306 widget
= hbtk_radio_button_new (CYA_TXN_STATUS
, TRUE
);
1307 data
->RA_status
= widget
;
1308 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
1311 label
= make_label_widget(_("M_emo:"));
1312 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1313 widget
= make_memo_entry(label
);
1314 data
->ST_memo
= widget
;
1315 gtk_widget_set_hexpand(widget
, TRUE
);
1316 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
1319 label
= make_label_widget(_("Ta_gs:"));
1320 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1321 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 0);
1322 gtk_widget_set_hexpand(hbox
, TRUE
);
1323 gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET(hbox
)), GTK_STYLE_CLASS_LINKED
);
1324 gtk_grid_attach (GTK_GRID (group_grid
), hbox
, 1, row
, 2, 1);
1326 widget
= make_string(label
);
1327 data
->ST_tags
= widget
;
1328 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1330 widget
= ui_tag_popover_list(data
->ST_tags
);
1331 data
->CY_tags
= widget
;
1332 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1334 gtk_widget_show_all(mainvbox
);
1336 bar
= gtk_info_bar_new ();
1337 data
->IB_warnsign
= bar
;
1338 gtk_info_bar_set_message_type (GTK_INFO_BAR (bar
), GTK_MESSAGE_WARNING
);
1339 label
= gtk_label_new (_("Warning: amount and category sign don't match"));
1340 gtk_box_pack_start (GTK_BOX (gtk_info_bar_get_content_area (GTK_INFO_BAR (bar
))), label
, TRUE
, TRUE
, 0);
1341 gtk_box_pack_start (GTK_BOX (mainvbox
), bar
, TRUE
, TRUE
, 0);
1344 //connect all our signals
1345 //g_signal_connect (dialog, "configure-event", G_CALLBACK (deftransaction_getgeometry), (gpointer)data);
1348 g_signal_connect (data
->PO_acc
, "changed", G_CALLBACK (deftransaction_update_accto
), NULL
);
1349 g_signal_connect (data
->PO_accto
, "changed", G_CALLBACK (deftransaction_update_transfer
), NULL
);
1351 g_signal_connect (G_OBJECT (data
->ST_amount
), "focus-out-event", G_CALLBACK (deftransaction_amount_focusout
), NULL
);
1352 g_signal_connect (G_OBJECT (data
->ST_amount
), "icon-release", G_CALLBACK (deftransaction_toggleamount
), NULL
);
1353 g_signal_connect (G_OBJECT (data
->BT_split
), "clicked", G_CALLBACK (deftransaction_button_split_cb
), NULL
);
1355 g_signal_connect (data
->NU_mode
, "changed", G_CALLBACK (deftransaction_paymode
), NULL
);
1356 g_signal_connect (data
->CM_cheque
, "toggled", G_CALLBACK (deftransaction_paymode
), NULL
);
1358 //g_signal_connect (data->PO_pay , "changed", G_CALLBACK (deftransaction_cb_payee_changed), NULL);
1359 g_signal_connect (ui_pay_entry_popover_get_entry(GTK_BOX(data
->PO_pay
)), "changed", G_CALLBACK (deftransaction_update_payee
), NULL
);
1360 g_signal_connect (data
->PO_cat
, "changed", G_CALLBACK (deftransaction_update_warnsign
), NULL
);
1362 //setup, init and show window
1363 deftransaction_setup(data
);
1365 wg
= &PREFS
->txn_wg
;
1366 gtk_window_set_default_size(GTK_WINDOW(dialog
), wg
->w
, -1);
1368 //gtk_widget_show_all (dialog);
1369 //gtk_widget_hide(data->IB_warnsign);