]> Dogcows Code - chaz/homebank/blob - src/ui-transaction.c
import homebank-5.2.7
[chaz/homebank] / src / ui-transaction.c
1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 Maxime DOYEN
3 *
4 * This file is part of HomeBank.
5 *
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.
10 *
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.
15 *
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/>.
18 */
19
20 #include "homebank.h"
21
22 #include "ui-transaction.h"
23 #include "hb-transaction.h"
24 #include "gtk-dateentry.h"
25 #include "ui-payee.h"
26 #include "ui-category.h"
27 #include "ui-account.h"
28 #include "ui-split.h"
29 #include "ui-tag.h"
30
31
32 /****************************************************************************/
33 /* Debug macros */
34 /****************************************************************************/
35 #define MYDEBUG 0
36
37 #if MYDEBUG
38 #define DB(x) (x);
39 #else
40 #define DB(x);
41 #endif
42
43 /* our global datas */
44 extern struct HomeBank *GLOBALS;
45 extern struct Preferences *PREFS;
46
47
48 gchar *CYA_OPERATION[] = {
49 N_("Add transaction"),
50 N_("Inherit transaction"),
51 N_("Modify transaction")
52 };
53
54
55 gchar *CYA_TXN_STATUS[] = {
56 N_("None"),
57 N_("Cleared"),
58 N_("Reconciled"),
59 N_("Remind"),
60 NULL
61 };
62
63
64 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
65
66 static void deftransaction_template_popover_populate(struct deftransaction_data *data, GList *srclist);
67
68 static void deftransaction_update(GtkWidget *widget, gpointer user_data)
69 {
70 struct deftransaction_data *data;
71 gboolean sensitive;
72
73 DB( g_print("\n[ui-transaction] update\n") );
74
75 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
76
77 //# 1419476 empty category when no split either...
78 if( (data->ope->flags & (OF_SPLIT)) )
79 {
80 //# 1416624 empty category when split
81 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_cat), 0);
82 }
83
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);
88 }
89
90
91 static void deftransaction_update_warnsign(GtkWidget *widget, gpointer user_data)
92 {
93 struct deftransaction_data *data;
94 gboolean warning = FALSE;
95 gdouble amount;
96 gint paymode, type;
97 Category *cat;
98
99 DB( g_print("\n[ui-transaction] update warning sign\n") );
100
101 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
102
103 //#1830707 no warning for xfer
104 paymode = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode));
105 if( paymode != PAYMODE_INTXFER )
106 {
107 cat = ui_cat_comboboxentry_get(GTK_COMBO_BOX(data->PO_cat));
108 if(cat != NULL && cat->key > 0)
109 {
110 amount = hb_amount_round(gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)), 2);
111 if(amount != 0.0)
112 {
113 type = (amount > 0) ? 1 : -1;
114 warning = (category_type_get(cat) != type) ? TRUE : FALSE;
115 }
116 }
117 }
118
119 if(warning)
120 {
121 gtk_widget_show_all(data->IB_warnsign);
122 //#GTK+710888: hack waiting a GTK fix
123 gtk_widget_queue_resize (data->IB_warnsign);
124 }
125 else
126 gtk_widget_hide(data->IB_warnsign);
127
128 }
129
130
131 static void deftransaction_update_transfer(GtkWidget *widget, gpointer user_data)
132 {
133 struct deftransaction_data *data;
134 gboolean sensitive;
135 guint kacc, kdst;
136
137 DB( g_print("\n[ui-transaction] update transfer\n") );
138
139 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
140
141 sensitive = TRUE;
142
143 kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc));
144
145 if(kacc == 0) { sensitive = FALSE; goto end; }
146
147 /* coherent seizure
148 * - target account selected
149 * - source != target
150 * - same currency
151 */
152 if( gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode)) == PAYMODE_INTXFER )
153 {
154 Account *srcacc, *dstacc;
155
156 kdst = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_accto));
157
158 if(kdst == 0) { sensitive = FALSE; goto end; }
159 if(kdst == kacc) {
160 sensitive = FALSE;
161 goto end;
162 }
163
164 srcacc = da_acc_get(kacc);
165 dstacc = da_acc_get(kdst);
166 if( srcacc && dstacc )
167 {
168 if(srcacc->kcur != dstacc->kcur)
169 {
170 sensitive = FALSE;
171 }
172 }
173 }
174
175 end:
176 DB( g_print(" sensitive %d\n", sensitive) );
177
178 //#1437551
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);
183
184 }
185
186
187 static void deftransaction_update_payee(GtkWidget *widget, gpointer user_data)
188 {
189 struct deftransaction_data *data;
190 Category *cat;
191 gint paymode;
192 Payee *pay;
193
194 DB( g_print("\n[ui-transaction] update payee\n") );
195
196 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
197
198 //pay = ui_pay_comboboxentry_get(GTK_COMBO_BOX(data->PO_pay));
199 pay = ui_pay_entry_popover_get(GTK_BOX(data->PO_pay));
200 if( pay != NULL )
201 {
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) )
207 {
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);
211 }
212
213 paymode = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode));
214 if( (paymode == PAYMODE_NONE) )
215 {
216 gtk_combo_box_set_active(GTK_COMBO_BOX(data->NU_mode), pay->paymode);
217 }
218 }
219 }
220
221
222 static void deftransaction_set_cheque(GtkWidget *widget, gpointer user_data)
223 {
224 struct deftransaction_data *data;
225 gdouble amount;
226 gint kacc;
227 Account *acc;
228 guint cheque;
229 gchar *cheque_str;
230
231 DB( g_print("\n[ui-transaction] set_cheque\n") );
232
233 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
234
235 amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
236 if( amount < 0 )
237 {
238 kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc));
239 //#1410166
240 if( kacc > 0 )
241 {
242 acc = da_acc_get( kacc );
243 if(acc != NULL)
244 {
245 DB( g_print(" - should fill for acc %d '%s'\n", kacc, acc->name) );
246
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);
250 g_free(cheque_str);
251 }
252 }
253 }
254 else
255 if( amount > 0 )
256 {
257 gtk_entry_set_text(GTK_ENTRY(data->ST_info), "");
258 }
259
260 }
261
262
263
264 //#1676162 update the nb digits of amount
265 static void deftransaction_set_amount_nbdigits(GtkWidget *widget, guint32 kacc)
266 {
267 struct deftransaction_data *data;
268
269 DB( g_print("\n[ui-transaction] set_amount_nbdigits\n") );
270
271 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
272
273 Account *srcacc = da_acc_get(kacc);
274 if(srcacc != NULL)
275 {
276 Currency *cur = da_cur_get(srcacc->kcur);
277
278 DB( g_print("- acc is %d '%s', curr=%d\n", srcacc->key, srcacc->name, srcacc->kcur) );
279
280 if(cur != NULL)
281 {
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);
284 }
285 else
286 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(data->ST_amount), 2);
287
288 }
289 }
290
291
292 static void deftransaction_update_accto(GtkWidget *widget, gpointer user_data)
293 {
294 struct deftransaction_data *data;
295 guint kacc;
296
297 DB( g_print("\n[ui-transaction] update accto\n") );
298
299 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
300
301 kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc));
302
303 DB( g_print(" acc is %d\n", kacc) );
304
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);
309
310 ui_acc_comboboxentry_populate_except(GTK_COMBO_BOX(data->PO_accto), GLOBALS->h_acc, kacc, ACC_LST_INSERT_NORMAL);
311
312 deftransaction_update_transfer(widget, user_data);
313 }
314
315
316
317 void deftransaction_set_amount_from_split(GtkWidget *widget, gdouble amount)
318 {
319 struct deftransaction_data *data;
320
321 DB( g_print("\n[ui-transaction] set_amount_from_split\n") );
322
323 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
324
325 DB( g_print("- amount=%.2f\n", amount) );
326
327 data->ope->amount = amount;
328 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), amount);
329
330 deftransaction_update(widget, NULL);
331
332 }
333
334
335 static void deftransaction_set(GtkWidget *widget, gpointer user_data)
336 {
337 struct deftransaction_data *data;
338 Transaction *entry;
339 gchar *tagstr, *txt;
340
341 DB( g_print("\n[ui-transaction] set\n") );
342
343 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
344
345 entry = data->ope;
346
347 DB( g_print(" - ope=%p data=%p tags:%p\n", data->ope, data, entry->tags) );
348
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);
352
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);
357
358 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_cheque), (entry->flags & OF_CHEQ2) ? 1 : 0);
359
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);
365
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);
370 g_free(tagstr);
371
372 hbtk_radio_button_set_active(GTK_CONTAINER(data->RA_status), entry->status );
373
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 )
378 {
379 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_acc), entry->kacc);
380 }
381 else //1829007 set first item if only 1 account
382 {
383 GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(data->PO_acc));
384
385 if(gtk_tree_model_iter_n_children(model, NULL) == 1)
386 gtk_combo_box_set_active(GTK_COMBO_BOX(data->PO_acc), 0);
387 }
388 g_signal_handlers_unblock_by_func (G_OBJECT (data->PO_acc), G_CALLBACK (deftransaction_update_accto), NULL);
389
390 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_accto), entry->kxferacc);
391
392 gtk_combo_box_set_active(GTK_COMBO_BOX(data->NU_mode), entry->paymode);
393
394 DB( g_print(" - acc is: %d\n", gtk_combo_box_get_active(GTK_COMBO_BOX(data->PO_acc)) ) );
395 }
396
397
398 void deftransaction_get(GtkWidget *widget, gpointer user_data)
399 {
400 struct deftransaction_data *data;
401 Transaction *entry;
402 gchar *txt;
403 gdouble value;
404 gint active;
405
406 DB( g_print("\n[ui-transaction] get\n") );
407
408 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
409
410 entry = data->ope;
411
412 DB( g_print(" - ope = %p\n", entry) );
413
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);
417
418 //free any previous string
419 if( entry->memo )
420 {
421 g_free(entry->memo);
422 entry->memo = NULL;
423 }
424 txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_memo));
425 // ignore if entry is empty
426 if (txt && *txt)
427 {
428 entry->memo = g_strdup(txt);
429
430 //#1716182 add into memo autocomplete
431 if( da_transaction_insert_memo(entry) )
432 {
433 GtkEntryCompletion *completion;
434 GtkTreeModel *model;
435 GtkTreeIter iter;
436
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,
440 0, txt,
441 -1);
442 }
443
444 }
445
446 value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
447 entry->amount = value;
448
449 /* for internal transfer add, amount must be expense */
450 // #617936
451 /*
452 if( entry->paymode == PAYMODE_INTXFER && data->type == OPERATION_EDIT_ADD )
453 {
454 if( entry->amount > 0 )
455 entry->amount *= -1;
456 }
457 */
458
459 //free any previous string
460 if( entry->info )
461 {
462 g_free(entry->info);
463 entry->info = NULL;
464 }
465 txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_info));
466 // ignore if entry is empty
467 if (txt && *txt)
468 {
469 entry->info = g_strdup(txt);
470 }
471
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));
478
479 /* tags */
480 txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_tags));
481 DB( g_print(" - tags: '%s'\n", txt) );
482 g_free(entry->tags);
483 entry->tags = tags_parse(txt);
484
485 entry->status = hbtk_radio_button_get_active(GTK_CONTAINER(data->RA_status));
486
487 //#1615245: moved here, after get combo entry key
488 if( entry->paymode != PAYMODE_INTXFER )
489 {
490 //#677351: revert kxferacc to 0
491 entry->kxferacc = 0;
492 }
493
494 /* flags */
495 //entry->flags = 0;
496 entry->flags &= (OF_SPLIT); //(split is set in hb_transaction)
497
498 if( data->type == TRANSACTION_EDIT_ADD || data->type == TRANSACTION_EDIT_INHERIT)
499 entry->flags |= OF_ADDED;
500
501 if( data->type == TRANSACTION_EDIT_MODIFY)
502 entry->flags |= OF_CHANGED;
503
504 active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_cheque));
505 if(active == 1) entry->flags |= OF_CHEQ2;
506
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;
510
511 }
512
513
514 static gboolean deftransaction_amount_focusout(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
515 {
516 struct deftransaction_data *data;
517 gushort paymode;
518 gdouble amount;
519
520 DB( g_print("\n[ui-transaction] amount focus-out-event %d\n", gtk_widget_is_focus(widget)) );
521
522 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
523
524 //#1681532 not reproduced, so prevent
525 if( GTK_IS_COMBO_BOX(data->NU_mode) )
526 {
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));
529
530 // for internal transfer add, amount must be expense by default
531 if( paymode == PAYMODE_INTXFER && data->type == TRANSACTION_EDIT_ADD )
532 {
533 if(amount > 0)
534 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), amount *= -1);
535 }
536
537 if( paymode == PAYMODE_CHECK )
538 {
539 deftransaction_set_cheque(widget, NULL);
540 }
541
542 deftransaction_update_warnsign(widget, NULL);
543 }
544 return FALSE;
545 }
546
547
548 static void deftransaction_toggleamount(GtkWidget *widget, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data)
549 {
550 struct deftransaction_data *data;
551 guint count, i;
552 Split *split;
553 gdouble value;
554
555 DB( g_print("\n[ui-transaction] toggleamount\n") );
556
557 if(icon_pos == GTK_ENTRY_ICON_PRIMARY)
558 {
559 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
560
561 gtk_spin_button_update(GTK_SPIN_BUTTON(data->ST_amount));
562
563 value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
564 value *= -1;
565 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), value);
566
567 if( data->ope->flags & OF_SPLIT )
568 {
569 count = da_splits_length(data->ope->splits);
570 DB( g_print("- count = %d\n", count) );
571 for(i=0;i<count;i++)
572 {
573 split = da_splits_get(data->ope->splits, i);
574 split->amount *= -1;
575 }
576 }
577
578 deftransaction_update_warnsign(widget, NULL);
579 }
580
581 }
582
583
584 static void deftransaction_button_split_cb(GtkWidget *widget, gpointer user_data)
585 {
586 struct deftransaction_data *data;
587 Transaction *ope;
588 gdouble amount;
589 gint nbsplit;
590
591 DB( g_print("\n[ui-transaction] doing split\n") );
592
593 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
594
595 ope = data->ope;
596
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);
599
600 //eval split to garantee disabled items
601 ope->flags &= ~(OF_SPLIT);
602 nbsplit = da_splits_length(ope->splits);
603 if(nbsplit > 0)
604 data->ope->flags |= (OF_SPLIT);
605
606 deftransaction_update(data->window, NULL);
607 }
608
609
610 static void deftransaction_paymode(GtkWidget *widget, gpointer user_data)
611 {
612 struct deftransaction_data *data;
613 gint payment;
614 gint page;
615 gboolean sensitive;
616
617 DB( g_print("\n[ui-transaction] paymode change\n") );
618
619 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
620
621 payment = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode));
622 page = 0;
623
624 /* todo: prefill the cheque number ? */
625 if( data->type != TRANSACTION_EDIT_MODIFY )
626 {
627 if(payment == PAYMODE_CHECK)
628 {
629 deftransaction_set_cheque(widget, user_data);
630 }
631 }
632
633
634 if(payment == PAYMODE_CHECK)
635 page = 1;
636
637 sensitive = (payment == PAYMODE_INTXFER) ? FALSE : TRUE;
638 gtk_widget_set_sensitive(data->BT_split, sensitive);
639
640 sensitive = page == 1 ? TRUE : FALSE;
641 hb_widget_visible(data->CM_cheque, sensitive);
642
643 if(payment == PAYMODE_INTXFER)
644 {
645 page = 2;
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 )
649 {
650 if(amount > 0)
651 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), amount *= -1);
652 }
653 //else //#1460370
654 //if( data->type == TRANSACTION_EDIT_MODIFY )
655 // {
656 if(amount > 0)
657 {
658 gtk_label_set_text_with_mnemonic (GTK_LABEL(data->LB_accto), _("From acc_ount:"));
659 }
660 else
661 {
662 gtk_label_set_text_with_mnemonic (GTK_LABEL(data->LB_accto), _("To acc_ount:"));
663 }
664 //}
665
666
667 }
668
669 deftransaction_update_accto(widget, user_data);
670 DB( g_print(" payment: %d, page: %d\n", payment, page) );
671
672 sensitive = page == 2 ? TRUE : FALSE;
673 hb_widget_visible(data->LB_accto, sensitive);
674 hb_widget_visible(data->PO_accto, sensitive);
675
676 }
677
678
679 /*
680 ** called from outside (register/report detail)
681 */
682 gint deftransaction_external_edit(GtkWindow *parent, Transaction *old_txn, Transaction *new_txn)
683 {
684 GtkWidget *dialog;
685 gboolean result;
686 Account *acc;
687
688 DB( g_print("\n[ui-transaction] external edit (from out)\n") );
689
690
691 dialog = create_deftransaction_window(GTK_WINDOW(parent), TRANSACTION_EDIT_MODIFY, FALSE, 0);
692 deftransaction_set_transaction(dialog, new_txn);
693
694 result = gtk_dialog_run (GTK_DIALOG (dialog));
695 if(result == GTK_RESPONSE_ACCEPT)
696 {
697 deftransaction_get(dialog, NULL);
698
699 account_balances_sub(old_txn);
700 account_balances_add(new_txn);
701
702 /* update account flag */
703 acc = da_acc_get(new_txn->kacc);
704 if(acc)
705 acc->flags |= AF_CHANGED;
706
707 /* ok different case here
708
709 * new is intxfer
710 a) old was not
711 check for existing child or add it
712 b) old was
713 sync (acc change is inside now)
714
715 * new is not intxfer
716 a) old was
717 manage break intxfer
718
719 * always manage account change
720
721 */
722
723 if( new_txn->paymode == PAYMODE_INTXFER )
724 {
725 if( old_txn->paymode != PAYMODE_INTXFER )
726 {
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);
729 }
730 else
731 {
732 Transaction *child;
733
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);
738 }
739 }
740 else
741 {
742 //#1250061 : manage ability to break an internal xfer
743 if(old_txn->paymode == PAYMODE_INTXFER)
744 {
745 gint break_result;
746
747 DB( g_print(" - should break internal xfer\n") );
748
749 break_result = ui_dialog_msg_confirm_alert(
750 GTK_WINDOW(parent),
751 NULL,
752 _("Do you want to break the internal transfer ?\n\n"
753 "Proceeding will delete the target transaction."),
754 _("_Break")
755 );
756
757 if(break_result == GTK_RESPONSE_OK)
758 {
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);
762 new_txn->kxfer = 0;
763 new_txn->kxferacc = 0;
764 }
765 else //force paymode to internal xfer
766 {
767 new_txn->paymode = PAYMODE_INTXFER;
768 }
769 }
770 }
771
772 //1638035: manage account change
773 if( old_txn->kacc != new_txn->kacc )
774 {
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);
778 }
779 }
780
781 deftransaction_dispose(dialog, NULL);
782 gtk_widget_destroy (dialog);
783
784 return result;
785 }
786
787
788 void deftransaction_set_transaction(GtkWidget *widget, Transaction *ope)
789 {
790 struct deftransaction_data *data;
791
792 DB( g_print("\n[ui-transaction] set transaction (from out)\n") );
793
794 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
795
796 data->ope = ope;
797
798 DB( g_print(" - ope=%p data=%p\n", data->ope, data) );
799
800 DB( g_print(" - call init\n") );
801
802 deftransaction_set(widget, NULL);
803 deftransaction_paymode(widget, NULL);
804 deftransaction_update(widget, NULL);
805 deftransaction_update_warnsign(widget, NULL);
806
807 }
808
809
810 static void deftransaction_setup(struct deftransaction_data *data)
811 {
812
813 DB( g_print("\n[ui-transaction] setup\n") );
814
815 if( data->showtemplate )
816 {
817 deftransaction_template_popover_populate (data, GLOBALS->arc_list);
818 gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(data->modelfilter));
819 }
820
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);
823
824 ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data->PO_cat), GLOBALS->h_cat);
825
826
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));
830
831 }
832
833
834 static void deftransaction_template_popover_onRowActivated(GtkTreeView *treeview,
835 GtkTreePath *path,
836 GtkTreeViewColumn *col,
837 gpointer userdata)
838 {
839 struct deftransaction_data *data;
840 GtkTreeModel *model;
841 GtkTreeIter iter;
842
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);
845
846 if (gtk_tree_model_get_iter(model, &iter, path))
847 {
848 Archive *arc;
849 Transaction *txn;
850
851 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, LST_DSPTPL_DATAS, &arc, -1);
852
853 txn = data->ope;
854 da_transaction_init_from_template(txn, arc);
855
856 DB( g_print(" calls\n") );
857
858 deftransaction_set(GTK_WIDGET(treeview), NULL);
859 deftransaction_paymode(GTK_WIDGET(treeview), NULL);
860 deftransaction_update(GTK_WIDGET(treeview), NULL);
861
862 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data->MB_template), FALSE);
863 }
864 }
865
866
867
868 static void deftransaction_template_popover_populate(struct deftransaction_data *data, GList *srclist)
869 {
870 GtkTreeModel *model;
871 GtkTreeIter iter;
872 GList *list;
873
874 //insert all glist item into treeview
875 model = data->model;
876 gtk_list_store_clear(GTK_LIST_STORE(model));
877
878 list = g_list_first(srclist);
879 while (list != NULL)
880 {
881 Archive *entry = list->data;
882
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,
887 -1);
888
889 //DB( g_print(" populate_treeview: %d %08x\n", i, list->data) );
890
891 list = g_list_next(list);
892 }
893 }
894
895
896 static void
897 deftransaction_template_popover_refilter (GtkWidget *widget, gpointer user_data)
898 {
899 struct deftransaction_data *data = user_data;
900
901 DB( g_print(" text changed\n") );
902
903 gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(data->modelfilter));
904 }
905
906
907 static gboolean deftransaction_template_popover_func_visible (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
908 {
909 struct deftransaction_data *data = user_data;
910 Archive *entry;
911 gchar *str;
912 gboolean visible = TRUE;
913 gboolean showsched;
914 gboolean showallacc;
915
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));
918
919 gchar *needle = g_ascii_strdown(gtk_entry_get_text(GTK_ENTRY(data->ST_search)), -1);
920
921 gtk_tree_model_get (model, iter,
922 LST_DSPTPL_DATAS, &entry,
923 LST_DSPTPL_NAME, &str, -1);
924
925 if( entry )
926 {
927 if( !showallacc && (data->kacc != 0) && (entry->kacc != data->kacc) )
928 visible = FALSE;
929 else
930 {
931 if( (entry->flags & OF_AUTO) && !showsched)
932 {
933 visible = FALSE;
934 }
935 else
936 {
937 gchar *haystack = g_ascii_strdown(str, -1);
938
939 if (str && g_strrstr (haystack, needle) == NULL )
940 {
941 visible = FALSE;
942 }
943
944 DB( g_print("filter: '%s' '%s' %d\n", str, needle, visible) );
945
946 g_free(haystack);
947 }
948 }
949 }
950 g_free(needle);
951 g_free (str);
952
953 return visible;
954 }
955
956
957 static GtkWidget *deftransaction_template_popover_create(struct deftransaction_data *data)
958 {
959 GtkListStore *store;
960 GtkCellRenderer *renderer;
961 GtkTreeViewColumn *column;
962 GtkWidget *box, *widget, *scrollwin, *treeview;
963
964 box = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
965
966 widget = make_search();
967 data->ST_search = widget;
968 gtk_box_pack_start (GTK_BOX(box), widget, FALSE, FALSE, 0);
969
970
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);
975
976 store = gtk_list_store_new(NUM_LST_DSPTPL,
977 G_TYPE_POINTER,
978 G_TYPE_STRING);
979
980 data->model = GTK_TREE_MODEL(store);
981
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);
984
985
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);
989
990 gtk_widget_grab_focus(treeview);
991
992 /* column for bug numbers */
993 renderer = gtk_cell_renderer_text_new ();
994 column = gtk_tree_view_column_new_with_attributes (NULL,
995 renderer,
996 "text",
997 LST_DSPTPL_NAME,
998 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);
1002
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);
1006
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);
1010
1011 gtk_widget_show_all (box);
1012
1013 //#1796564 hide show all template if no account
1014 gtk_widget_set_visible (data->CM_showallacc, data->kacc == 0 ? FALSE : TRUE);
1015
1016 //signals
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);
1020
1021 return box;
1022 }
1023
1024
1025
1026 static GtkWidget *deftransaction_create_template(struct deftransaction_data *data)
1027 {
1028 GtkWidget *box, *menubutton, *image, *label;
1029
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);
1038
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);
1043
1044
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);
1050
1051 /*gtk_widget_set_margin_start (popover, 10);
1052 gtk_widget_set_margin_end (popover, 10);
1053 gtk_widget_set_margin_bottom (popover, 10);*/
1054
1055 gtk_menu_button_set_popover(GTK_MENU_BUTTON(menubutton), popover);
1056
1057 g_signal_connect (GTK_TREE_VIEW(data->LV_arc), "row-activated", G_CALLBACK (deftransaction_template_popover_onRowActivated), NULL);
1058
1059
1060 return menubutton;
1061 }
1062
1063
1064 static gboolean
1065 deftransaction_getgeometry(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data)
1066 {
1067 struct WinGeometry *wg;
1068
1069 DB( g_print("\n[ui-transaction] get geometry\n") );
1070
1071 //store size
1072 wg = &PREFS->txn_wg;
1073 gtk_window_get_size(GTK_WINDOW(widget), &wg->w, NULL);
1074
1075 DB( g_print(" window: w=%d\n", wg->w) );
1076
1077 return FALSE;
1078 }
1079
1080
1081 void deftransaction_dispose(GtkWidget *widget, gpointer user_data)
1082 {
1083 struct deftransaction_data *data;
1084
1085 DB( g_print("\n[ui-transaction] dispose\n") );
1086
1087 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
1088
1089 deftransaction_getgeometry(data->window, NULL, data);
1090
1091 g_free(data);
1092 }
1093
1094
1095 GtkWidget *create_deftransaction_window (GtkWindow *parent, gint type, gboolean postmode, guint32 kacc)
1096 {
1097 struct deftransaction_data *data;
1098 struct WinGeometry *wg;
1099 GtkWidget *dialog, *content, *mainvbox;
1100 GtkWidget *bar;
1101 GtkWidget *group_grid, *hbox, *label, *widget;
1102 gint row;
1103
1104 DB( g_print("\n[ui-transaction] new\n") );
1105
1106 data = g_malloc0(sizeof(struct deftransaction_data));
1107
1108 /*
1109 dialog = gtk_dialog_new_with_buttons (_(CYA_OPERATION[data->type]),
1110 GTK_WINDOW (parent),
1111 0,
1112 NULL,
1113 NULL);
1114 */
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));
1118
1119
1120
1121
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) );
1125
1126 data->window = dialog;
1127 data->type = type;
1128 data->kacc = kacc;
1129
1130 // if you add/remove response_id also change into deftransaction_update_transfer
1131 if(type == TRANSACTION_EDIT_MODIFY)
1132 {
1133 gtk_dialog_add_buttons (GTK_DIALOG(dialog),
1134 _("_Cancel"), GTK_RESPONSE_REJECT,
1135 _("_OK"), GTK_RESPONSE_ACCEPT,
1136 NULL);
1137 }
1138 else
1139 {
1140 if(!postmode)
1141 {
1142 gtk_dialog_add_buttons (GTK_DIALOG(dialog),
1143 _("_Close"), GTK_RESPONSE_REJECT,
1144 _("_Add & keep"), HB_RESPONSE_ADDKEEP,
1145 _("_Add"), HB_RESPONSE_ADD,
1146 NULL);
1147 }
1148 else
1149 {
1150 gtk_dialog_add_buttons (GTK_DIALOG(dialog),
1151 _("_Close"), GTK_RESPONSE_REJECT,
1152 _("_Post"), HB_RESPONSE_ADD,
1153 NULL);
1154 }
1155 }
1156
1157 switch(type)
1158 {
1159 case TRANSACTION_EDIT_ADD:
1160 gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_HB_OPE_ADD);
1161 break;
1162 case TRANSACTION_EDIT_INHERIT:
1163 gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_HB_OPE_HERIT);
1164 break;
1165 case TRANSACTION_EDIT_MODIFY:
1166 gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_HB_OPE_EDIT);
1167 break;
1168 }
1169
1170 //gtk_window_set_decorated(GTK_WINDOW(dialog), TRUE);
1171
1172 //dialog contents
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);
1177
1178 //group main
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);
1183
1184 row=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"));
1193
1194 data->showtemplate = FALSE;
1195 if( data->type != TRANSACTION_EDIT_MODIFY && da_archive_length() > 0 && !postmode )
1196 {
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);
1201 }
1202
1203 row++;
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);
1209
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);
1215
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);
1219
1220
1221 row++;
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);
1228
1229 row++;
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);
1236
1237
1238 row++;
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);
1245
1246 gtk_widget_set_margin_top(label, SPACING_SMALL);
1247 gtk_widget_set_margin_top(widget, SPACING_SMALL);
1248
1249
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);
1253
1254 row++;
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);
1260
1261 gtk_widget_set_margin_bottom(label, SPACING_SMALL);
1262 gtk_widget_set_margin_bottom(widget, SPACING_SMALL);
1263
1264
1265 /*row++;
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"));
1273 */
1274
1275 row++;
1276 label = make_label_widget(_("_Payee:"));
1277 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1278
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);
1282
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);
1290
1291 gtk_widget_set_margin_bottom(label, SPACING_SMALL);
1292 gtk_widget_set_margin_bottom(hbox, SPACING_SMALL);
1293
1294 row++;
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"));
1302
1303 row++;
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);
1309
1310 row++;
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);
1317
1318 row++;
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);
1325
1326 widget = make_string(label);
1327 data->ST_tags = widget;
1328 gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
1329
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);
1333
1334 gtk_widget_show_all(mainvbox);
1335
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);
1342
1343
1344 //connect all our signals
1345 //g_signal_connect (dialog, "configure-event", G_CALLBACK (deftransaction_getgeometry), (gpointer)data);
1346
1347
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);
1350
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);
1354
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);
1357
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);
1361
1362 //setup, init and show window
1363 deftransaction_setup(data);
1364
1365 wg = &PREFS->txn_wg;
1366 gtk_window_set_default_size(GTK_WINDOW(dialog), wg->w, -1);
1367
1368 //gtk_widget_show_all (dialog);
1369 //gtk_widget_hide(data->IB_warnsign);
1370
1371 return dialog;
1372 }
This page took 0.094706 seconds and 4 git commands to generate.