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 //1336928 combobox tags
92 static void deftransaction_update_tags(GtkWidget
*widget
, gpointer user_data
)
94 struct deftransaction_data
*data
;
97 DB( g_print("\n[ui-transaction] update tags\n") );
99 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
101 newtag
= gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(data
->CY_tags
));
102 ui_gtk_entry_tag_name_append(GTK_ENTRY(data
->ST_tags
), newtag
);
105 //revert back to ----
106 g_signal_handlers_block_by_func (G_OBJECT (data
->CY_tags
), G_CALLBACK (deftransaction_update_tags
), NULL
);
107 hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(data
->CY_tags
), 0);
108 g_signal_handlers_unblock_by_func (G_OBJECT (data
->CY_tags
), G_CALLBACK (deftransaction_update_tags
), NULL
);
112 static void deftransaction_update_warnsign(GtkWidget
*widget
, gpointer user_data
)
114 struct deftransaction_data
*data
;
115 gboolean warning
= FALSE
;
120 DB( g_print("\n[ui-transaction] update warning sign\n") );
122 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
124 cat
= ui_cat_comboboxentry_get(GTK_COMBO_BOX(data
->PO_cat
));
125 if(cat
!= NULL
&& cat
->key
> 0)
127 amount
= hb_amount_round(gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
)), 2);
130 amttype
= (amount
> 0) ? 1 : -1;
131 warning
= (category_type_get(cat
) != amttype
) ? TRUE
: FALSE
;
137 gtk_widget_show_all(data
->IB_warnsign
);
138 //#GTK+710888: hack waiting a GTK fix
139 gtk_widget_queue_resize (data
->IB_warnsign
);
142 gtk_widget_hide(data
->IB_warnsign
);
147 static void deftransaction_update_transfer(GtkWidget
*widget
, gpointer user_data
)
149 struct deftransaction_data
*data
;
153 DB( g_print("\n[ui-transaction] update transfer\n") );
155 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
159 kacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
161 if(kacc
== 0) { sensitive
= FALSE
; goto end
; }
164 * - target account selected
168 if( gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
)) == PAYMODE_INTXFER
)
170 Account
*srcacc
, *dstacc
;
172 kdst
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_accto
));
174 if(kdst
== 0) { sensitive
= FALSE
; goto end
; }
180 srcacc
= da_acc_get(kacc
);
181 dstacc
= da_acc_get(kdst
);
182 if( srcacc
&& dstacc
)
184 if(srcacc
->kcur
!= dstacc
->kcur
)
192 DB( g_print(" sensitive %d\n", sensitive
) );
195 //gtk_widget_set_sensitive(gtk_dialog_get_action_area(GTK_DIALOG (data->window)), sensitive);
196 gtk_dialog_set_response_sensitive(GTK_DIALOG (data
->window
), GTK_RESPONSE_ACCEPT
, sensitive
);
197 gtk_dialog_set_response_sensitive(GTK_DIALOG (data
->window
), HB_RESPONSE_ADD
, sensitive
);
198 gtk_dialog_set_response_sensitive(GTK_DIALOG (data
->window
), HB_RESPONSE_ADDKEEP
, sensitive
);
203 static void deftransaction_update_payee(GtkWidget
*widget
, gpointer user_data
)
205 struct deftransaction_data
*data
;
210 DB( g_print("\n[ui-transaction] update payee\n") );
212 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
214 pay
= ui_pay_comboboxentry_get(GTK_COMBO_BOX(data
->PO_pay
));
217 // only set for empty category
218 // #1635053 and also paymode unset
219 // #1817278 and independently
220 cat
= ui_cat_comboboxentry_get(GTK_COMBO_BOX(data
->PO_cat
));
221 if( (cat
== NULL
|| cat
->key
== 0) )
223 g_signal_handlers_block_by_func (G_OBJECT (data
->PO_cat
), G_CALLBACK (deftransaction_update_warnsign
), NULL
);
224 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_cat
), pay
->kcat
);
225 g_signal_handlers_unblock_by_func (G_OBJECT (data
->PO_cat
), G_CALLBACK (deftransaction_update_warnsign
), NULL
);
228 paymode
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
229 if( (paymode
== PAYMODE_NONE
) )
231 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->NU_mode
), pay
->paymode
);
237 static void deftransaction_set_cheque(GtkWidget
*widget
, gpointer user_data
)
239 struct deftransaction_data
*data
;
246 DB( g_print("\n[ui-transaction] set_cheque\n") );
248 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
250 amount
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
253 kacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
257 acc
= da_acc_get( kacc
);
260 DB( g_print(" - should fill for acc %d '%s'\n", kacc
, acc
->name
) );
262 cheque
= ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_cheque
))==TRUE
? acc
->cheque2
: acc
->cheque1
);
263 cheque_str
= g_strdup_printf("%d", cheque
+ 1);
264 gtk_entry_set_text(GTK_ENTRY(data
->ST_info
), cheque_str
);
272 gtk_entry_set_text(GTK_ENTRY(data
->ST_info
), "");
279 //#1676162 update the nb digits of amount
280 static void deftransaction_set_amount_nbdigits(GtkWidget
*widget
, guint32 kacc
)
282 struct deftransaction_data
*data
;
284 DB( g_print("\n[ui-transaction] set_amount_nbdigits\n") );
286 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
288 Account
*srcacc
= da_acc_get(kacc
);
291 Currency
*cur
= da_cur_get(srcacc
->kcur
);
293 DB( g_print("- acc is %d '%s', curr=%d\n", srcacc
->key
, srcacc
->name
, srcacc
->kcur
) );
297 DB( g_print("- set digits to '%s' %d\n", cur
->name
, cur
->frac_digits
) );
298 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(data
->ST_amount
), cur
->frac_digits
);
301 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(data
->ST_amount
), 2);
307 static void deftransaction_update_accto(GtkWidget
*widget
, gpointer user_data
)
309 struct deftransaction_data
*data
;
312 DB( g_print("\n[ui-transaction] update accto\n") );
314 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
316 kacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
318 DB( g_print(" acc is %d\n", kacc
) );
320 deftransaction_set_amount_nbdigits(widget
, kacc
);
321 //g_signal_handlers_block_by_func (G_OBJECT (data->PO_accto), G_CALLBACK (deftransaction_update_transfer), NULL);
322 //ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_accto), 0);
323 //g_signal_handlers_unblock_by_func (G_OBJECT (data->PO_accto), G_CALLBACK (deftransaction_update_transfer), NULL);
325 ui_acc_comboboxentry_populate_except(GTK_COMBO_BOX(data
->PO_accto
), GLOBALS
->h_acc
, kacc
, ACC_LST_INSERT_NORMAL
);
327 deftransaction_update_transfer(widget
, user_data
);
332 void deftransaction_set_amount_from_split(GtkWidget
*widget
, gdouble amount
)
334 struct deftransaction_data
*data
;
336 DB( g_print("\n[ui-transaction] set_amount_from_split\n") );
338 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
340 DB( g_print("- amount=%.2f\n", amount
) );
342 data
->ope
->amount
= amount
;
343 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), amount
);
345 deftransaction_update(widget
, NULL
);
350 static void deftransaction_set(GtkWidget
*widget
, gpointer user_data
)
352 struct deftransaction_data
*data
;
356 DB( g_print("\n[ui-transaction] set\n") );
358 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
362 DB( g_print(" - ope=%p data=%p tags:%p\n", data
->ope
, data
, entry
->tags
) );
364 //DB( g_print(" set date to %d\n", entry->date) );
365 //g_object_set(GTK_DATE_ENTRY(data->PO_date), "date", (guint32)entry->ope_Date);
366 gtk_date_entry_set_date(GTK_DATE_ENTRY(data
->PO_date
), (guint
)entry
->date
);
368 txt
= (entry
->memo
!= NULL
) ? entry
->memo
: "";
369 gtk_entry_set_text(GTK_ENTRY(data
->ST_memo
), txt
);
370 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), entry
->amount
);
371 //gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_amount), (entry->ope_Flags & OF_INCOME) ? 1 : 0);
373 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_cheque
), (entry
->flags
& OF_CHEQ2
) ? 1 : 0);
375 txt
= (entry
->info
!= NULL
) ? entry
->info
: "";
376 gtk_entry_set_text(GTK_ENTRY(data
->ST_info
), txt
);
377 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_cat
), entry
->kcat
);
378 ui_pay_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_pay
), entry
->kpay
);
380 tagstr
= tags_tostring(entry
->tags
);
381 DB( g_print(" - tags: '%s'\n", txt
) );
382 txt
= (tagstr
!= NULL
) ? tagstr
: "";
383 gtk_entry_set_text(GTK_ENTRY(data
->ST_tags
), txt
);
386 hbtk_radio_button_set_active(GTK_CONTAINER(data
->RA_status
), entry
->status
);
388 //as we trigger an event on this
389 //let's place it at the end to avoid missvalue on the trigger function
390 g_signal_handlers_block_by_func (G_OBJECT (data
->PO_acc
), G_CALLBACK (deftransaction_update_accto
), NULL
);
391 if( entry
->kacc
> 0 )
393 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_acc
), entry
->kacc
);
395 else //1829007 set first item if only 1 account
397 GtkTreeModel
*model
= gtk_combo_box_get_model(GTK_COMBO_BOX(data
->PO_acc
));
399 if(gtk_tree_model_iter_n_children(model
, NULL
) == 1)
400 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->PO_acc
), 0);
402 g_signal_handlers_unblock_by_func (G_OBJECT (data
->PO_acc
), G_CALLBACK (deftransaction_update_accto
), NULL
);
404 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_accto
), entry
->kxferacc
);
406 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->NU_mode
), entry
->paymode
);
408 DB( g_print(" - acc is: %d\n", gtk_combo_box_get_active(GTK_COMBO_BOX(data
->PO_acc
)) ) );
412 void deftransaction_get(GtkWidget
*widget
, gpointer user_data
)
414 struct deftransaction_data
*data
;
420 DB( g_print("\n[ui-transaction] get\n") );
422 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
426 DB( g_print(" - ope = %p\n", entry
) );
428 //DB( g_print(" get date to %d\n", entry->ope_Date) );
429 entry
->date
= gtk_date_entry_get_date(GTK_DATE_ENTRY(data
->PO_date
));
430 //g_object_get(GTK_DATE_ENTRY(data->PO_date), "date", entry->ope_Date);
432 //free any previous string
438 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_memo
));
439 // ignore if entry is empty
442 entry
->memo
= g_strdup(txt
);
444 //#1716182 add into memo autocomplete
445 if( da_transaction_insert_memo(entry
) )
447 GtkEntryCompletion
*completion
;
451 completion
= gtk_entry_get_completion (GTK_ENTRY(data
->ST_memo
));
452 model
= gtk_entry_completion_get_model (completion
);
453 gtk_list_store_insert_with_values(GTK_LIST_STORE(model
), &iter
, -1,
460 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
461 entry
->amount
= value
;
463 /* for internal transfer add, amount must be expense */
466 if( entry->paymode == PAYMODE_INTXFER && data->type == OPERATION_EDIT_ADD )
468 if( entry->amount > 0 )
473 //free any previous string
479 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_info
));
480 // ignore if entry is empty
483 entry
->info
= g_strdup(txt
);
486 entry
->paymode
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
487 entry
->kcat
= ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data
->PO_cat
));
488 entry
->kpay
= ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data
->PO_pay
));
489 entry
->kacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
490 entry
->kxferacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_accto
));
493 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_tags
));
494 DB( g_print(" - tags: '%s'\n", txt
) );
496 entry
->tags
= tags_parse(txt
);
498 entry
->status
= hbtk_radio_button_get_active(GTK_CONTAINER(data
->RA_status
));
500 //#1615245: moved here, after get combo entry key
501 if( entry
->paymode
!= PAYMODE_INTXFER
)
503 //#677351: revert kxferacc to 0
509 entry
->flags
&= (OF_SPLIT
); //(split is set in hb_transaction)
511 if( data
->type
== TRANSACTION_EDIT_ADD
|| data
->type
== TRANSACTION_EDIT_INHERIT
)
512 entry
->flags
|= OF_ADDED
;
514 if( data
->type
== TRANSACTION_EDIT_MODIFY
)
515 entry
->flags
|= OF_CHANGED
;
517 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_cheque
));
518 if(active
== 1) entry
->flags
|= OF_CHEQ2
;
520 //active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_amount));
521 active
= entry
->amount
> 0 ? TRUE
: FALSE
;
522 if(active
== TRUE
) entry
->flags
|= OF_INCOME
;
527 static gboolean
deftransaction_amount_focusout(GtkWidget
*widget
, GdkEventFocus
*event
, gpointer user_data
)
529 struct deftransaction_data
*data
;
533 DB( g_print("\n[ui-transaction] amount focus-out-event %d\n", gtk_widget_is_focus(widget
)) );
535 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
537 //#1681532 not reproduced, so prevent
538 if( GTK_IS_COMBO_BOX(data
->NU_mode
) )
540 paymode
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
541 amount
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
543 // for internal transfer add, amount must be expense by default
544 if( paymode
== PAYMODE_INTXFER
&& data
->type
== TRANSACTION_EDIT_ADD
)
547 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), amount
*= -1);
550 if( paymode
== PAYMODE_CHECK
)
552 deftransaction_set_cheque(widget
, NULL
);
555 deftransaction_update_warnsign(widget
, NULL
);
561 static void deftransaction_toggleamount(GtkWidget
*widget
, GtkEntryIconPosition icon_pos
, GdkEvent
*event
, gpointer user_data
)
563 struct deftransaction_data
*data
;
568 DB( g_print("\n[ui-transaction] toggleamount\n") );
570 if(icon_pos
== GTK_ENTRY_ICON_PRIMARY
)
572 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
574 gtk_spin_button_update(GTK_SPIN_BUTTON(data
->ST_amount
));
576 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
578 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), value
);
580 if( data
->ope
->flags
& OF_SPLIT
)
582 count
= da_splits_length(data
->ope
->splits
);
583 DB( g_print("- count = %d\n", count
) );
586 split
= da_splits_get(data
->ope
->splits
, i
);
591 deftransaction_update_warnsign(widget
, NULL
);
597 static void deftransaction_button_split_cb(GtkWidget
*widget
, gpointer user_data
)
599 struct deftransaction_data
*data
;
604 DB( g_print("\n[ui-transaction] doing split\n") );
606 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
610 amount
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
611 ui_split_dialog(data
->window
, &ope
->splits
, amount
, &deftransaction_set_amount_from_split
);
613 //eval split to garantee disabled items
614 ope
->flags
&= ~(OF_SPLIT
);
615 nbsplit
= da_splits_length(ope
->splits
);
617 data
->ope
->flags
|= (OF_SPLIT
);
619 deftransaction_update(data
->window
, NULL
);
623 static void deftransaction_paymode(GtkWidget
*widget
, gpointer user_data
)
625 struct deftransaction_data
*data
;
630 DB( g_print("\n[ui-transaction] paymode change\n") );
632 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
634 payment
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
637 /* todo: prefill the cheque number ? */
638 if( data
->type
!= TRANSACTION_EDIT_MODIFY
)
640 if(payment
== PAYMODE_CHECK
)
642 deftransaction_set_cheque(widget
, user_data
);
647 if(payment
== PAYMODE_CHECK
)
650 sensitive
= (payment
== PAYMODE_INTXFER
) ? FALSE
: TRUE
;
651 gtk_widget_set_sensitive(data
->BT_split
, sensitive
);
653 sensitive
= page
== 1 ? TRUE
: FALSE
;
654 hb_widget_visible(data
->CM_cheque
, sensitive
);
656 if(payment
== PAYMODE_INTXFER
)
659 // for internal transfer add, amount must be expense by default
660 gdouble amount
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
661 if( data
->type
== TRANSACTION_EDIT_ADD
)
664 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), amount
*= -1);
667 //if( data->type == TRANSACTION_EDIT_MODIFY )
671 gtk_label_set_text_with_mnemonic (GTK_LABEL(data
->LB_accto
), _("From acc_ount:"));
675 gtk_label_set_text_with_mnemonic (GTK_LABEL(data
->LB_accto
), _("To acc_ount:"));
682 deftransaction_update_accto(widget
, user_data
);
683 DB( g_print(" payment: %d, page: %d\n", payment
, page
) );
685 sensitive
= page
== 2 ? TRUE
: FALSE
;
686 hb_widget_visible(data
->LB_accto
, sensitive
);
687 hb_widget_visible(data
->PO_accto
, sensitive
);
693 ** called from outside (register/report detail)
695 gint
deftransaction_external_edit(GtkWindow
*parent
, Transaction
*old_txn
, Transaction
*new_txn
)
701 DB( g_print("\n[ui-transaction] external edit (from out)\n") );
704 dialog
= create_deftransaction_window(GTK_WINDOW(parent
), TRANSACTION_EDIT_MODIFY
, FALSE
, 0);
705 deftransaction_set_transaction(dialog
, new_txn
);
707 result
= gtk_dialog_run (GTK_DIALOG (dialog
));
708 if(result
== GTK_RESPONSE_ACCEPT
)
710 deftransaction_get(dialog
, NULL
);
712 account_balances_sub(old_txn
);
713 account_balances_add(new_txn
);
715 /* update account flag */
716 acc
= da_acc_get(new_txn
->kacc
);
718 acc
->flags
|= AF_CHANGED
;
720 /* ok different case here
724 check for existing child or add it
726 sync (acc change is inside now)
732 * always manage account change
736 if( new_txn
->paymode
== PAYMODE_INTXFER
)
738 if( old_txn
->paymode
!= PAYMODE_INTXFER
)
740 // this call can popup a user dialog to choose
741 transaction_xfer_search_or_add_child(GTK_WINDOW(dialog
), new_txn
, new_txn
->kxferacc
);
747 //use old in case of dst_acc change
748 child
= transaction_xfer_child_strong_get(old_txn
);
749 //#1584342 was faultly old_txn
750 transaction_xfer_child_sync(new_txn
, child
);
755 //#1250061 : manage ability to break an internal xfer
756 if(old_txn
->paymode
== PAYMODE_INTXFER
)
760 DB( g_print(" - should break internal xfer\n") );
762 break_result
= ui_dialog_msg_confirm_alert(
765 _("Do you want to break the internal transfer ?\n\n"
766 "Proceeding will delete the target transaction."),
770 if(break_result
== GTK_RESPONSE_OK
)
772 //we must use old_txn to ensure get the child
773 //#1663789 but we must clean new as well
774 transaction_xfer_remove_child(old_txn
);
776 new_txn
->kxferacc
= 0;
778 else //force paymode to internal xfer
780 new_txn
->paymode
= PAYMODE_INTXFER
;
785 //1638035: manage account change
786 if( old_txn
->kacc
!= new_txn
->kacc
)
788 //todo: maybe we should restrict this also to same currency account
789 //=> no pb for normal, and intxfer is restricted by ui (in theory)
790 transaction_acc_move(new_txn
, old_txn
->kacc
, new_txn
->kacc
);
794 deftransaction_dispose(dialog
, NULL
);
795 gtk_widget_destroy (dialog
);
801 void deftransaction_set_transaction(GtkWidget
*widget
, Transaction
*ope
)
803 struct deftransaction_data
*data
;
805 DB( g_print("\n[ui-transaction] set transaction (from out)\n") );
807 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
811 DB( g_print(" - ope=%p data=%p\n", data
->ope
, data
) );
813 DB( g_print(" - call init\n") );
815 deftransaction_set(widget
, NULL
);
816 deftransaction_paymode(widget
, NULL
);
817 deftransaction_update(widget
, NULL
);
818 deftransaction_update_warnsign(widget
, NULL
);
823 static void deftransaction_setup(struct deftransaction_data
*data
)
826 DB( g_print("\n[ui-transaction] setup\n") );
828 ui_pay_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_pay
), GLOBALS
->h_pay
);
829 ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_cat
), GLOBALS
->h_cat
);
830 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_acc
), GLOBALS
->h_acc
, ACC_LST_INSERT_NORMAL
);
831 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_accto
), GLOBALS
->h_acc
, ACC_LST_INSERT_NORMAL
);
833 if( data
->showtemplate
)
835 deftransaction_template_popover_populate (data
, GLOBALS
->arc_list
);
836 gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(data
->modelfilter
));
839 ui_tag_combobox_populate(GTK_COMBO_BOX_TEXT(data
->CY_tags
));
844 create_popover (GtkWidget
*parent
,
850 popover
= gtk_popover_new (parent
);
851 gtk_popover_set_position (GTK_POPOVER (popover
), pos
);
852 gtk_container_add (GTK_CONTAINER (popover
), child
);
853 gtk_widget_show (child
);
855 gtk_widget_set_margin_start (child
, SPACING_POPOVER
);
856 gtk_widget_set_margin_end (child
, SPACING_POPOVER
);
857 gtk_widget_set_margin_top (child
, SPACING_POPOVER
);
858 gtk_widget_set_margin_bottom (child
, SPACING_POPOVER
);
864 static void deftransaction_template_popover_onRowActivated(GtkTreeView
*treeview
,
866 GtkTreeViewColumn
*col
,
869 struct deftransaction_data
*data
;
873 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(treeview
), GTK_TYPE_WINDOW
)), "inst_data");
874 model
= gtk_tree_view_get_model(treeview
);
876 if (gtk_tree_model_get_iter(model
, &iter
, path
))
881 gtk_tree_model_get(GTK_TREE_MODEL(model
), &iter
, LST_DSPTPL_DATAS
, &arc
, -1);
884 da_transaction_init_from_template(txn
, arc
);
886 DB( g_print(" calls\n") );
888 deftransaction_set(GTK_WIDGET(treeview
), NULL
);
889 deftransaction_paymode(GTK_WIDGET(treeview
), NULL
);
890 deftransaction_update(GTK_WIDGET(treeview
), NULL
);
892 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data
->MB_template
), FALSE
);
898 static void deftransaction_template_popover_populate(struct deftransaction_data
*data
, GList
*srclist
)
904 //insert all glist item into treeview
906 gtk_list_store_clear(GTK_LIST_STORE(model
));
908 list
= g_list_first(srclist
);
911 Archive
*entry
= list
->data
;
913 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
914 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
915 LST_DSPTPL_DATAS
, entry
,
916 LST_DSPTPL_NAME
, entry
->memo
,
919 //DB( g_print(" populate_treeview: %d %08x\n", i, list->data) );
921 list
= g_list_next(list
);
927 deftransaction_template_popover_refilter (GtkWidget
*widget
, gpointer user_data
)
929 struct deftransaction_data
*data
= user_data
;
931 DB( g_print(" text changed\n") );
933 gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(data
->modelfilter
));
937 static gboolean
deftransaction_template_popover_func_visible (GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
939 struct deftransaction_data
*data
= user_data
;
942 gboolean visible
= TRUE
;
946 showsched
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_showsched
));
947 showallacc
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data
->CM_showallacc
));
949 gchar
*needle
= g_ascii_strdown(gtk_entry_get_text(GTK_ENTRY(data
->ST_search
)), -1);
951 gtk_tree_model_get (model
, iter
,
952 LST_DSPTPL_DATAS
, &entry
,
953 LST_DSPTPL_NAME
, &str
, -1);
957 if( !showallacc
&& (data
->kacc
!= 0) && (entry
->kacc
!= data
->kacc
) )
961 if( (entry
->flags
& OF_AUTO
) && !showsched
)
967 gchar
*haystack
= g_ascii_strdown(str
, -1);
969 if (str
&& g_strrstr (haystack
, needle
) == NULL
)
974 DB( g_print("filter: '%s' '%s' %d\n", str
, needle
, visible
) );
987 static GtkWidget
*deftransaction_template_popover_create(struct deftransaction_data
*data
)
990 GtkCellRenderer
*renderer
;
991 GtkTreeViewColumn
*column
;
992 GtkWidget
*box
, *widget
, *scrollwin
, *treeview
;
994 box
= gtk_box_new(GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
996 widget
= make_search();
997 data
->ST_search
= widget
;
998 gtk_box_pack_start (GTK_BOX(box
), widget
, FALSE
, FALSE
, 0);
1001 scrollwin
= gtk_scrolled_window_new(NULL
,NULL
);
1002 gtk_box_pack_start (GTK_BOX(box
), scrollwin
, TRUE
, TRUE
, 0);
1003 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
1004 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
1006 store
= gtk_list_store_new(NUM_LST_DSPTPL
,
1010 data
->model
= GTK_TREE_MODEL(store
);
1012 data
->modelfilter
= GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(GTK_TREE_MODEL(data
->model
), NULL
));
1013 gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(data
->modelfilter
), deftransaction_template_popover_func_visible
, data
, NULL
);
1016 treeview
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(data
->modelfilter
));
1017 data
->LV_arc
= treeview
;
1018 gtk_container_add(GTK_CONTAINER(scrollwin
), treeview
);
1020 gtk_widget_grab_focus(treeview
);
1022 /* column for bug numbers */
1023 renderer
= gtk_cell_renderer_text_new ();
1024 column
= gtk_tree_view_column_new_with_attributes (NULL
,
1029 //gtk_tree_view_column_set_resizable (column, TRUE);
1030 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
1031 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(treeview
), FALSE
);
1033 widget
= gtk_check_button_new_with_mnemonic(_("Show _scheduled"));
1034 data
->CM_showsched
= widget
;
1035 gtk_box_pack_start (GTK_BOX(box
), widget
, FALSE
, FALSE
, 0);
1037 widget
= gtk_check_button_new_with_mnemonic(_("Show _all accounts"));
1038 data
->CM_showallacc
= widget
;
1039 gtk_box_pack_start (GTK_BOX(box
), widget
, FALSE
, FALSE
, 0);
1041 gtk_widget_show_all (box
);
1043 //#1796564 hide show all template if no account
1044 gtk_widget_set_visible (data
->CM_showallacc
, data
->kacc
== 0 ? FALSE
: TRUE
);
1047 g_signal_connect (data
->CM_showsched
, "toggled", G_CALLBACK (deftransaction_template_popover_refilter
), data
);
1048 g_signal_connect (data
->CM_showallacc
, "toggled", G_CALLBACK (deftransaction_template_popover_refilter
), data
);
1049 g_signal_connect (data
->ST_search
, "search-changed", G_CALLBACK (deftransaction_template_popover_refilter
), data
);
1056 static GtkWidget
*deftransaction_create_template(struct deftransaction_data
*data
)
1058 GtkWidget
*box
, *menubutton
, *image
, *label
;
1060 menubutton
= gtk_menu_button_new ();
1061 data
->MB_template
= menubutton
;
1062 box
= gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1063 label
= gtk_label_new_with_mnemonic (_("Use a _template"));
1064 gtk_box_pack_start (GTK_BOX(box
), label
, FALSE
, FALSE
, 0);
1065 image
= gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON
);
1066 gtk_box_pack_start (GTK_BOX(box
), image
, FALSE
, FALSE
, 0);
1067 gtk_container_add(GTK_CONTAINER(menubutton
), box
);
1069 gtk_menu_button_set_direction (GTK_MENU_BUTTON(menubutton
), GTK_ARROW_DOWN
);
1070 gtk_widget_set_halign (menubutton
, GTK_ALIGN_END
);
1071 gtk_widget_set_hexpand (menubutton
, TRUE
);
1072 gtk_widget_show_all(menubutton
);
1075 GtkWidget
*template = deftransaction_template_popover_create(data
);
1076 GtkWidget
*popover
= create_popover (menubutton
, template, GTK_POS_BOTTOM
);
1077 gtk_widget_set_size_request (popover
, 2*HB_MINWIDTH_LIST
, HB_MINHEIGHT_LIST
);
1078 //gtk_widget_set_vexpand (popover, TRUE);
1079 //gtk_widget_set_hexpand (popover, TRUE);
1081 /*gtk_widget_set_margin_start (popover, 10);
1082 gtk_widget_set_margin_end (popover, 10);
1083 gtk_widget_set_margin_bottom (popover, 10);*/
1085 gtk_menu_button_set_popover(GTK_MENU_BUTTON(menubutton
), popover
);
1087 g_signal_connect (GTK_TREE_VIEW(data
->LV_arc
), "row-activated", G_CALLBACK (deftransaction_template_popover_onRowActivated
), NULL
);
1095 deftransaction_getgeometry(GtkWidget
*widget
, GdkEventConfigure
*event
, gpointer user_data
)
1097 struct WinGeometry
*wg
;
1099 DB( g_print("\n[ui-transaction] get geometry\n") );
1102 wg
= &PREFS
->txn_wg
;
1103 gtk_window_get_size(GTK_WINDOW(widget
), &wg
->w
, NULL
);
1105 DB( g_print(" window: w=%d\n", wg
->w
) );
1111 void deftransaction_dispose(GtkWidget
*widget
, gpointer user_data
)
1113 struct deftransaction_data
*data
;
1115 DB( g_print("\n[ui-transaction] dispose\n") );
1117 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1119 deftransaction_getgeometry(data
->window
, NULL
, data
);
1125 GtkWidget
*create_deftransaction_window (GtkWindow
*parent
, gint type
, gboolean postmode
, guint32 kacc
)
1127 struct deftransaction_data
*data
;
1128 struct WinGeometry
*wg
;
1129 GtkWidget
*dialog
, *content
, *mainvbox
;
1131 GtkWidget
*group_grid
, *hbox
, *label
, *widget
;
1134 DB( g_print("\n[ui-transaction] new\n") );
1136 data
= g_malloc0(sizeof(struct deftransaction_data
));
1139 dialog = gtk_dialog_new_with_buttons (_(CYA_OPERATION[data->type]),
1140 GTK_WINDOW (parent),
1145 dialog
= gtk_dialog_new();
1146 gtk_window_set_title (GTK_WINDOW(dialog
), _(CYA_OPERATION
[type
]));
1147 gtk_window_set_transient_for (GTK_WINDOW(dialog
), GTK_WINDOW(parent
));
1152 //store our window private data
1153 g_object_set_data(G_OBJECT(dialog
), "inst_data", (gpointer
)data
);
1154 DB( g_print(" - window=%p, inst_data=%p\n", dialog
, data
) );
1156 data
->window
= dialog
;
1160 // if you add/remove response_id also change into deftransaction_update_transfer
1161 if(type
== TRANSACTION_EDIT_MODIFY
)
1163 gtk_dialog_add_buttons (GTK_DIALOG(dialog
),
1164 _("_Cancel"), GTK_RESPONSE_REJECT
,
1165 _("_OK"), GTK_RESPONSE_ACCEPT
,
1172 gtk_dialog_add_buttons (GTK_DIALOG(dialog
),
1173 _("_Close"), GTK_RESPONSE_REJECT
,
1174 _("_Add & keep"), HB_RESPONSE_ADDKEEP
,
1175 _("_Add"), HB_RESPONSE_ADD
,
1180 gtk_dialog_add_buttons (GTK_DIALOG(dialog
),
1181 _("_Close"), GTK_RESPONSE_REJECT
,
1182 _("_Post"), HB_RESPONSE_ADD
,
1189 case TRANSACTION_EDIT_ADD
:
1190 gtk_window_set_icon_name(GTK_WINDOW (dialog
), ICONNAME_HB_OPE_ADD
);
1192 case TRANSACTION_EDIT_INHERIT
:
1193 gtk_window_set_icon_name(GTK_WINDOW (dialog
), ICONNAME_HB_OPE_HERIT
);
1195 case TRANSACTION_EDIT_MODIFY
:
1196 gtk_window_set_icon_name(GTK_WINDOW (dialog
), ICONNAME_HB_OPE_EDIT
);
1200 //gtk_window_set_decorated(GTK_WINDOW(dialog), TRUE);
1203 content
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
));
1204 mainvbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
1205 gtk_box_pack_start (GTK_BOX (content
), mainvbox
, TRUE
, TRUE
, 0);
1206 gtk_container_set_border_width (GTK_CONTAINER(mainvbox
), SPACING_MEDIUM
);
1209 group_grid
= gtk_grid_new ();
1210 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1211 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1212 gtk_box_pack_start (GTK_BOX (mainvbox
), group_grid
, FALSE
, FALSE
, 0);
1215 label
= make_label_widget(_("_Date:"));
1216 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1217 widget
= gtk_date_entry_new();
1218 data
->PO_date
= widget
;
1219 gtk_widget_set_halign(widget
, GTK_ALIGN_START
);
1220 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1221 gtk_widget_set_tooltip_text(widget
, _("Date accepted here are:\nday,\nday/month or month/day,\nand complete date into your locale"));
1223 data
->showtemplate
= FALSE
;
1224 if( data
->type
!= TRANSACTION_EDIT_MODIFY
&& da_archive_length() > 0 && !postmode
)
1226 data
->showtemplate
= TRUE
;
1227 widget
= deftransaction_create_template(data
);
1228 gtk_widget_set_halign (widget
, GTK_ALIGN_END
);
1229 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1233 label
= make_label_widget(_("_Amount:"));
1234 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1235 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 0);
1236 gtk_widget_set_hexpand(hbox
, TRUE
);
1237 gtk_grid_attach (GTK_GRID (group_grid
), hbox
, 1, row
, 1, 1);
1239 widget
= make_amount(label
);
1240 data
->ST_amount
= widget
;
1241 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(widget
), GTK_ENTRY_ICON_PRIMARY
, ICONNAME_HB_TOGGLE_SIGN
);
1242 gtk_entry_set_icon_tooltip_text(GTK_ENTRY(widget
), GTK_ENTRY_ICON_PRIMARY
, _("Toggle amount sign"));
1243 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1245 widget
= make_image_button(ICONNAME_HB_BUTTON_SPLIT
, _("Transaction splits"));
1246 data
->BT_split
= widget
;
1247 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1251 label
= make_label_widget(_("A_ccount:"));
1252 data
->LB_accfrom
= label
;
1253 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1254 widget
= ui_acc_comboboxentry_new(label
);
1255 data
->PO_acc
= widget
;
1256 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
1259 label
= make_label_widget(_("To acc_ount:"));
1260 data
->LB_accto
= label
;
1261 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1262 widget
= ui_acc_comboboxentry_new(label
);
1263 data
->PO_accto
= widget
;
1264 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
1268 label
= make_label_widget(_("Pa_yment:"));
1269 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1270 widget
= make_paymode(label
);
1271 data
->NU_mode
= widget
;
1272 gtk_widget_set_halign(widget
, GTK_ALIGN_START
);
1273 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1275 gtk_widget_set_margin_top(label
, SPACING_SMALL
);
1276 gtk_widget_set_margin_top(widget
, SPACING_SMALL
);
1279 widget
= gtk_check_button_new_with_mnemonic(_("Of notebook _2"));
1280 data
->CM_cheque
= widget
;
1281 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1284 label
= make_label_widget(_("_Info:"));
1285 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1286 widget
= make_string(label
);
1287 data
->ST_info
= widget
;
1288 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1290 gtk_widget_set_margin_bottom(label
, SPACING_SMALL
);
1291 gtk_widget_set_margin_bottom(widget
, SPACING_SMALL
);
1295 label
= make_label_widget(_("_Payee:"));
1296 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1297 widget
= ui_pay_comboboxentry_new(label
);
1298 data
->PO_pay
= 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"));
1303 label
= make_label_widget(_("_Category:"));
1304 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1305 widget
= ui_cat_comboboxentry_new(label
);
1306 data
->PO_cat
= widget
;
1307 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
1308 gtk_widget_set_tooltip_text(widget
, _("Autocompletion and direct seizure\nis available"));
1310 gtk_widget_set_margin_bottom(label
, SPACING_SMALL
);
1311 gtk_widget_set_margin_bottom(widget
, SPACING_SMALL
);
1315 label
= make_label_widget(_("_Status:"));
1316 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1317 widget
= hbtk_radio_button_new (CYA_TXN_STATUS
, TRUE
);
1318 data
->RA_status
= widget
;
1319 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
1322 label
= make_label_widget(_("M_emo:"));
1323 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1324 widget
= make_memo_entry(label
);
1325 data
->ST_memo
= widget
;
1326 gtk_widget_set_hexpand(widget
, TRUE
);
1327 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
1330 label
= make_label_widget(_("Ta_gs:"));
1331 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1332 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 0);
1333 gtk_widget_set_hexpand(hbox
, TRUE
);
1334 gtk_grid_attach (GTK_GRID (group_grid
), hbox
, 1, row
, 2, 1);
1336 widget
= make_string(label
);
1337 data
->ST_tags
= widget
;
1338 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1340 widget
= ui_tag_combobox_new(NULL
);
1341 data
->CY_tags
= widget
;
1342 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1344 gtk_widget_show_all(mainvbox
);
1346 bar
= gtk_info_bar_new ();
1347 data
->IB_warnsign
= bar
;
1348 gtk_info_bar_set_message_type (GTK_INFO_BAR (bar
), GTK_MESSAGE_WARNING
);
1349 label
= gtk_label_new (_("Warning: amount and category sign don't match"));
1350 gtk_box_pack_start (GTK_BOX (gtk_info_bar_get_content_area (GTK_INFO_BAR (bar
))), label
, TRUE
, TRUE
, 0);
1351 gtk_box_pack_start (GTK_BOX (mainvbox
), bar
, TRUE
, TRUE
, 0);
1354 //connect all our signals
1355 //g_signal_connect (dialog, "configure-event", G_CALLBACK (deftransaction_getgeometry), (gpointer)data);
1358 g_signal_connect (data
->PO_acc
, "changed", G_CALLBACK (deftransaction_update_accto
), NULL
);
1359 g_signal_connect (data
->PO_accto
, "changed", G_CALLBACK (deftransaction_update_transfer
), NULL
);
1361 g_signal_connect (G_OBJECT (data
->ST_amount
), "focus-out-event", G_CALLBACK (deftransaction_amount_focusout
), NULL
);
1362 g_signal_connect (G_OBJECT (data
->ST_amount
), "icon-release", G_CALLBACK (deftransaction_toggleamount
), NULL
);
1363 g_signal_connect (G_OBJECT (data
->BT_split
), "clicked", G_CALLBACK (deftransaction_button_split_cb
), NULL
);
1365 g_signal_connect (data
->NU_mode
, "changed", G_CALLBACK (deftransaction_paymode
), NULL
);
1366 g_signal_connect (data
->CM_cheque
, "toggled", G_CALLBACK (deftransaction_paymode
), NULL
);
1368 g_signal_connect (data
->PO_pay
, "changed", G_CALLBACK (deftransaction_update_payee
), NULL
);
1369 g_signal_connect (data
->PO_cat
, "changed", G_CALLBACK (deftransaction_update_warnsign
), NULL
);
1371 g_signal_connect (data
->CY_tags
, "changed", G_CALLBACK (deftransaction_update_tags
), NULL
);
1373 //setup, init and show window
1374 deftransaction_setup(data
);
1376 wg
= &PREFS
->txn_wg
;
1377 gtk_window_set_default_size(GTK_WINDOW(dialog
), wg
->w
, -1);
1379 //gtk_widget_show_all (dialog);
1380 //gtk_widget_hide(data->IB_warnsign);