]> Dogcows Code - chaz/homebank/blob - src/ui-transaction.c
import homebank-5.1.7
[chaz/homebank] / src / ui-transaction.c
1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2018 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
30
31 /****************************************************************************/
32 /* Debug macros */
33 /****************************************************************************/
34 #define MYDEBUG 0
35
36 #if MYDEBUG
37 #define DB(x) (x);
38 #else
39 #define DB(x);
40 #endif
41
42 /* our global datas */
43 extern struct HomeBank *GLOBALS;
44 extern struct Preferences *PREFS;
45
46
47 extern gchar *CYA_TYPE[];
48
49 gchar *CYA_OPERATION[] = {
50 N_("Add transaction"),
51 N_("Inherit transaction"),
52 N_("Modify transaction")
53 };
54
55
56 gchar *CYA_TXN_STATUS[] = {
57 N_("None"),
58 N_("Cleared"),
59 N_("Reconciled"),
60 N_("Remind"),
61 NULL
62 };
63
64
65 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
66
67 static void deftransaction_template_popover_populate(struct deftransaction_data *data, GList *srclist);
68
69 static void deftransaction_update(GtkWidget *widget, gpointer user_data)
70 {
71 struct deftransaction_data *data;
72 gboolean sensitive;
73
74 DB( g_print("\n[ui-transaction] update\n") );
75
76 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
77
78 //# 1419476 empty category when no split either...
79 if( (data->ope->flags & (OF_SPLIT)) )
80 {
81 //# 1416624 empty category when split
82 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), 0);
83 }
84
85 /* disable amount+category if split is set */
86 sensitive = (data->ope->flags & (OF_SPLIT)) ? FALSE : TRUE;
87 gtk_widget_set_sensitive(data->ST_amount, sensitive);
88 gtk_widget_set_sensitive(data->PO_grp, sensitive);
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 amttype;
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 cat = ui_cat_comboboxentry_get(GTK_COMBO_BOX(data->PO_grp));
104 if(cat != NULL && cat->key > 0)
105 {
106 amount = hb_amount_round(gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)), 2);
107 if(amount != 0.0)
108 {
109 amttype = (amount > 0) ? 1 : -1;
110 warning = (category_type_get(cat) != amttype) ? TRUE : FALSE;
111 }
112 }
113
114 if(warning)
115 gtk_widget_show_all(data->IB_warnsign);
116 else
117 gtk_widget_hide(data->IB_warnsign);
118
119 }
120
121
122 static void deftransaction_update_transfer(GtkWidget *widget, gpointer user_data)
123 {
124 struct deftransaction_data *data;
125 gboolean sensitive;
126 guint kacc, kdst;
127
128 DB( g_print("\n[ui-transaction] update transfer\n") );
129
130 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
131
132 sensitive = TRUE;
133
134 kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc));
135
136 if(kacc == 0) { sensitive = FALSE; goto end; }
137
138 /* coherent seizure
139 * - target account selected
140 * - source != target
141 * - same currency
142 */
143 if( gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode)) == PAYMODE_INTXFER )
144 {
145 Account *srcacc, *dstacc;
146
147 kdst = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_accto));
148
149 if(kdst == 0) { sensitive = FALSE; goto end; }
150 if(kdst == kacc) {
151 sensitive = FALSE;
152 goto end;
153 }
154
155 srcacc = da_acc_get(kacc);
156 dstacc = da_acc_get(kdst);
157 if( srcacc && dstacc )
158 {
159 if(srcacc->kcur != dstacc->kcur)
160 {
161 sensitive = FALSE;
162 }
163 }
164 }
165
166 end:
167 DB( g_print(" sensitive %d\n", sensitive) );
168
169 //#1437551
170 //gtk_widget_set_sensitive(gtk_dialog_get_action_area(GTK_DIALOG (data->window)), sensitive);
171 gtk_dialog_set_response_sensitive(GTK_DIALOG (data->window), GTK_RESPONSE_ACCEPT, sensitive);
172 gtk_dialog_set_response_sensitive(GTK_DIALOG (data->window), GTK_RESPONSE_ADD, sensitive);
173 gtk_dialog_set_response_sensitive(GTK_DIALOG (data->window), GTK_RESPONSE_ADDKEEP, sensitive);
174
175 }
176
177
178 static void deftransaction_update_payee(GtkWidget *widget, gpointer user_data)
179 {
180 struct deftransaction_data *data;
181 Category *cat;
182 gint paymode;
183 Payee *pay;
184
185 DB( g_print("\n[ui-transaction] update payee\n") );
186
187 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
188
189 // only set for empty category
190 // 1635053 and also paymode unset
191 cat = ui_cat_comboboxentry_get(GTK_COMBO_BOX(data->PO_grp));
192 paymode = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode));
193 if( (cat == NULL || cat->key == 0) && (paymode == PAYMODE_NONE) )
194 {
195 pay = ui_pay_comboboxentry_get(GTK_COMBO_BOX(data->PO_pay));
196 if( pay != NULL )
197 {
198 g_signal_handlers_block_by_func (G_OBJECT (data->PO_grp), G_CALLBACK (deftransaction_update_warnsign), NULL);
199 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), pay->kcat);
200 g_signal_handlers_unblock_by_func (G_OBJECT (data->PO_grp), G_CALLBACK (deftransaction_update_warnsign), NULL);
201
202 gtk_combo_box_set_active(GTK_COMBO_BOX(data->NU_mode), pay->paymode);
203 }
204 }
205 }
206
207 static void deftransaction_set_cheque(GtkWidget *widget, gpointer user_data)
208 {
209 struct deftransaction_data *data;
210 gdouble amount;
211 gint kacc;
212 Account *acc;
213 guint cheque;
214 gchar *cheque_str;
215
216 DB( g_print("\n[ui-transaction] set_cheque\n") );
217
218 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
219
220 amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
221 if( amount < 0 )
222 {
223 kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc));
224 //#1410166
225 if( kacc > 0 )
226 {
227 acc = da_acc_get( kacc );
228 if(acc != NULL)
229 {
230 DB( g_print(" - should fill for acc %d '%s'\n", kacc, acc->name) );
231
232 cheque = ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_cheque))==TRUE ? acc->cheque2 : acc->cheque1 );
233 cheque_str = g_strdup_printf("%d", cheque + 1);
234 gtk_entry_set_text(GTK_ENTRY(data->ST_info), cheque_str);
235 g_free(cheque_str);
236 }
237 }
238 }
239 else
240 if( amount > 0 )
241 {
242 gtk_entry_set_text(GTK_ENTRY(data->ST_info), "");
243 }
244
245 }
246
247
248
249 //#1676162 update the nb digits of amount
250 static void deftransaction_set_amount_nbdigits(GtkWidget *widget, guint32 kacc)
251 {
252 struct deftransaction_data *data;
253
254 DB( g_print("\n[ui-transaction] set_amount_nbdigits\n") );
255
256 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
257
258 Account *srcacc = da_acc_get(kacc);
259 if(srcacc != NULL)
260 {
261 Currency *cur = da_cur_get(srcacc->kcur);
262
263 DB( g_print("- acc is %d '%s', curr=%d\n", srcacc->key, srcacc->name, srcacc->kcur) );
264
265 if(cur != NULL)
266 {
267 DB( g_print("- set digits to '%s' %d\n", cur->name, cur->frac_digits) );
268 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(data->ST_amount), cur->frac_digits);
269 }
270 else
271 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(data->ST_amount), 2);
272
273 }
274 }
275
276
277 static void deftransaction_update_accto(GtkWidget *widget, gpointer user_data)
278 {
279 struct deftransaction_data *data;
280 guint kacc;
281
282 DB( g_print("\n[ui-transaction] update accto\n") );
283
284 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
285
286 kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc));
287
288 DB( g_print(" acc is %d\n", kacc) );
289
290 deftransaction_set_amount_nbdigits(widget, kacc);
291 //g_signal_handlers_block_by_func (G_OBJECT (data->PO_accto), G_CALLBACK (deftransaction_update_transfer), NULL);
292 //ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_accto), 0);
293 //g_signal_handlers_unblock_by_func (G_OBJECT (data->PO_accto), G_CALLBACK (deftransaction_update_transfer), NULL);
294
295 ui_acc_comboboxentry_populate_except(GTK_COMBO_BOX(data->PO_accto), GLOBALS->h_acc, kacc, ACC_LST_INSERT_NORMAL);
296
297 deftransaction_update_transfer(widget, user_data);
298 }
299
300
301
302 void deftransaction_set_amount_from_split(GtkWidget *widget, gdouble amount)
303 {
304 struct deftransaction_data *data;
305
306 DB( g_print("\n[ui-transaction] set_amount_from_split\n") );
307
308 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
309
310 DB( g_print("- amount=%.2f\n", amount) );
311
312 data->ope->amount = amount;
313 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), amount);
314
315 deftransaction_update(widget, NULL);
316
317 }
318
319
320 static void deftransaction_set(GtkWidget *widget, gpointer user_data)
321 {
322 struct deftransaction_data *data;
323 Transaction *entry;
324 gchar *tagstr, *txt;
325
326 DB( g_print("\n[ui-transaction] set\n") );
327
328 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
329
330 entry = data->ope;
331
332 DB( g_print(" - ope=%p data=%p tags:%p\n", data->ope, data, entry->tags) );
333
334 //DB( g_print(" set date to %d\n", entry->date) );
335 //g_object_set(GTK_DATE_ENTRY(data->PO_date), "date", (guint32)entry->ope_Date);
336 gtk_date_entry_set_date(GTK_DATE_ENTRY(data->PO_date), (guint)entry->date);
337
338 txt = (entry->memo != NULL) ? entry->memo : "";
339 gtk_entry_set_text(GTK_ENTRY(data->ST_word), txt);
340 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), entry->amount);
341 //gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_amount), (entry->ope_Flags & OF_INCOME) ? 1 : 0);
342
343 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_cheque), (entry->flags & OF_CHEQ2) ? 1 : 0);
344
345 txt = (entry->info != NULL) ? entry->info : "";
346 gtk_entry_set_text(GTK_ENTRY(data->ST_info), txt);
347 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), entry->kcat);
348 ui_pay_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_pay), entry->kpay);
349
350 tagstr = transaction_tags_tostring(entry);
351
352 DB( g_print(" - tags: '%s'\n", txt) );
353
354 txt = (tagstr != NULL) ? tagstr : "";
355 gtk_entry_set_text(GTK_ENTRY(data->ST_tags), txt);
356 g_free(tagstr);
357
358 radio_set_active(GTK_CONTAINER(data->RA_status), entry->status );
359
360 //as we trigger an event on this
361 //let's place it at the end to avoid missvalue on the trigger function
362 g_signal_handlers_block_by_func (G_OBJECT (data->PO_acc), G_CALLBACK (deftransaction_update_accto), NULL);
363
364 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_acc), entry->kacc);
365 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_accto), entry->kxferacc);
366
367 g_signal_handlers_unblock_by_func (G_OBJECT (data->PO_acc), G_CALLBACK (deftransaction_update_accto), NULL);
368
369 gtk_combo_box_set_active(GTK_COMBO_BOX(data->NU_mode), entry->paymode);
370
371 DB( g_print(" - acc is: %d\n", gtk_combo_box_get_active(GTK_COMBO_BOX(data->PO_acc)) ) );
372 }
373
374
375 void deftransaction_get(GtkWidget *widget, gpointer user_data)
376 {
377 struct deftransaction_data *data;
378 Transaction *entry;
379 gchar *txt;
380 gdouble value;
381 gint active;
382
383 DB( g_print("\n[ui-transaction] get\n") );
384
385 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
386
387 entry = data->ope;
388
389 DB( g_print(" - ope = %p\n", entry) );
390
391 //DB( g_print(" get date to %d\n", entry->ope_Date) );
392 entry->date = gtk_date_entry_get_date(GTK_DATE_ENTRY(data->PO_date));
393 //g_object_get(GTK_DATE_ENTRY(data->PO_date), "date", entry->ope_Date);
394
395 //free any previous string
396 if( entry->memo )
397 {
398 g_free(entry->memo);
399 entry->memo = NULL;
400 }
401 txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_word));
402 // ignore if entry is empty
403 if (txt && *txt)
404 {
405 entry->memo = g_strdup(txt);
406
407 //#1716182 add into memo autocomplete
408 if( da_transaction_insert_memo(entry) )
409 {
410 GtkEntryCompletion *completion;
411 GtkTreeModel *model;
412 GtkTreeIter iter;
413
414 completion = gtk_entry_get_completion (GTK_ENTRY(data->ST_word));
415 model = gtk_entry_completion_get_model (completion);
416 gtk_list_store_insert_with_values(GTK_LIST_STORE(model), &iter, -1,
417 0, txt,
418 -1);
419 }
420
421 }
422
423 value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
424 entry->amount = value;
425
426 /* for internal transfer add, amount must be expense */
427 // #617936
428 /*
429 if( entry->paymode == PAYMODE_INTXFER && data->type == OPERATION_EDIT_ADD )
430 {
431 if( entry->amount > 0 )
432 entry->amount *= -1;
433 }
434 */
435
436 //free any previous string
437 if( entry->info )
438 {
439 g_free(entry->info);
440 entry->info = NULL;
441 }
442 txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_info));
443 // ignore if entry is empty
444 if (txt && *txt)
445 {
446 entry->info = g_strdup(txt);
447 }
448
449 entry->paymode = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode));
450 entry->kcat = ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data->PO_grp));
451 entry->kpay = ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data->PO_pay));
452 entry->kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc));
453 entry->kxferacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_accto));
454
455 /* tags */
456 txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_tags));
457 DB( g_print(" - tags: '%s'\n", txt) );
458 transaction_tags_parse(entry, txt);
459
460 entry->status = radio_get_active(GTK_CONTAINER(data->RA_status));
461
462 //#1615245: moved here, after get combo entry key
463 if( entry->paymode != PAYMODE_INTXFER )
464 {
465 //#677351: revert kxferacc to 0
466 entry->kxferacc = 0;
467 }
468
469 /* flags */
470 //entry->flags = 0;
471 entry->flags &= (OF_SPLIT); //(split is set in hb_transaction)
472
473 if( data->type == TRANSACTION_EDIT_ADD || data->type == TRANSACTION_EDIT_INHERIT)
474 entry->flags |= OF_ADDED;
475
476 if( data->type == TRANSACTION_EDIT_MODIFY)
477 entry->flags |= OF_CHANGED;
478
479 active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_cheque));
480 if(active == 1) entry->flags |= OF_CHEQ2;
481
482 //active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_amount));
483 active = entry->amount > 0 ? TRUE : FALSE;
484 if(active == TRUE) entry->flags |= OF_INCOME;
485
486 }
487
488
489 static gboolean deftransaction_amount_focusout(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
490 {
491 struct deftransaction_data *data;
492 gushort paymode;
493 gdouble amount;
494
495 DB( g_print("\n[ui-transaction] amount focus-out-event %d\n", gtk_widget_is_focus(widget)) );
496
497 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
498
499 //#1681532 not reproduced, so prevent
500 if( GTK_IS_COMBO_BOX(data->NU_mode) )
501 {
502 paymode = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode));
503 amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
504
505 // for internal transfer add, amount must be expense by default
506 if( paymode == PAYMODE_INTXFER && data->type == TRANSACTION_EDIT_ADD )
507 {
508 if(amount > 0)
509 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), amount *= -1);
510 }
511
512 if( paymode == PAYMODE_CHECK )
513 {
514 deftransaction_set_cheque(widget, NULL);
515 }
516
517 deftransaction_update_warnsign(widget, NULL);
518 }
519 return FALSE;
520 }
521
522
523 static void deftransaction_toggleamount(GtkWidget *widget, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data)
524 {
525 struct deftransaction_data *data;
526 guint count, i;
527 Split *split;
528 gdouble value;
529
530 DB( g_print("\n[ui-transaction] toggleamount\n") );
531
532 if(icon_pos == GTK_ENTRY_ICON_PRIMARY)
533 {
534 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
535
536 gtk_spin_button_update(GTK_SPIN_BUTTON(data->ST_amount));
537
538 value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
539 value *= -1;
540 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), value);
541
542 if( data->ope->flags & OF_SPLIT )
543 {
544 count = da_splits_count(data->ope->splits);
545 DB( g_print("- count = %d\n", count) );
546 for(i=0;i<count;i++)
547 {
548 split = data->ope->splits[i];
549 split->amount *= -1;
550 }
551 }
552
553 deftransaction_update_warnsign(widget, NULL);
554 }
555
556 }
557
558
559 static void deftransaction_button_split_cb(GtkWidget *widget, gpointer user_data)
560 {
561 struct deftransaction_data *data;
562 Transaction *ope;
563 gdouble amount;
564 gint nbsplit;
565
566 DB( g_print("\n[ui-transaction] doing split\n") );
567
568 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
569
570 ope = data->ope;
571
572 amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
573 ui_split_dialog(data->window, ope->splits, amount, &deftransaction_set_amount_from_split);
574
575 //eval split to garantee disabled items
576 ope->flags &= ~(OF_SPLIT);
577 nbsplit = da_splits_count(ope->splits);
578 if(nbsplit > 0)
579 data->ope->flags |= (OF_SPLIT);
580
581 deftransaction_update(data->window, NULL);
582 }
583
584
585
586
587 /*
588 **
589 */
590 static void deftransaction_paymode(GtkWidget *widget, gpointer user_data)
591 {
592 struct deftransaction_data *data;
593 gint payment;
594 gint page;
595 gboolean sensitive;
596
597 DB( g_print("\n[ui-transaction] paymode change\n") );
598
599 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
600
601 payment = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode));
602 page = 0;
603
604 /* todo: prefill the cheque number ? */
605 if( data->type != TRANSACTION_EDIT_MODIFY )
606 {
607 if(payment == PAYMODE_CHECK)
608 {
609 deftransaction_set_cheque(widget, user_data);
610 }
611 }
612
613
614 if(payment == PAYMODE_CHECK)
615 page = 1;
616
617 sensitive = (payment == PAYMODE_INTXFER) ? FALSE : TRUE;
618 gtk_widget_set_sensitive(data->BT_split, sensitive);
619
620 sensitive = page == 1 ? TRUE : FALSE;
621 hb_widget_visible(data->CM_cheque, sensitive);
622
623 if(payment == PAYMODE_INTXFER)
624 {
625 page = 2;
626 // for internal transfer add, amount must be expense by default
627 gdouble amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
628 if( data->type == TRANSACTION_EDIT_ADD )
629 {
630 if(amount > 0)
631 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), amount *= -1);
632 }
633 //else //#1460370
634 //if( data->type == TRANSACTION_EDIT_MODIFY )
635 // {
636 if(amount > 0)
637 {
638 gtk_label_set_text_with_mnemonic (GTK_LABEL(data->LB_accto), _("From acc_ount:"));
639 }
640 else
641 {
642 gtk_label_set_text_with_mnemonic (GTK_LABEL(data->LB_accto), _("To acc_ount:"));
643 }
644 //}
645
646
647 }
648
649 deftransaction_update_accto(widget, user_data);
650 DB( g_print(" payment: %d, page: %d\n", payment, page) );
651
652 sensitive = page == 2 ? TRUE : FALSE;
653 hb_widget_visible(data->LB_accto, sensitive);
654 hb_widget_visible(data->PO_accto, sensitive);
655
656 }
657
658
659 /*
660 ** called from outside
661 */
662 gint deftransaction_external_edit(GtkWindow *parent, Transaction *old_txn, Transaction *new_txn)
663 {
664 GtkWidget *dialog;
665 gboolean result;
666
667 DB( g_print("\n[ui-transaction] external edit (from out)\n") );
668
669
670 dialog = create_deftransaction_window(GTK_WINDOW(parent), TRANSACTION_EDIT_MODIFY, FALSE);
671 deftransaction_set_transaction(dialog, new_txn);
672
673 result = gtk_dialog_run (GTK_DIALOG (dialog));
674 if(result == GTK_RESPONSE_ACCEPT)
675 {
676 deftransaction_get(dialog, NULL);
677
678 account_balances_sub(old_txn);
679 account_balances_add(new_txn);
680
681 /* ok different case here
682
683 * new is intxfer
684 a) old was not
685 transaction_xfer_search_or_add_child
686 b) old was
687 sync (acc chnage is inside now)
688
689 * new is not intxfer
690 a) old was
691 manage break intxfer
692
693 * always manage account change
694
695 */
696
697 if( new_txn->paymode == PAYMODE_INTXFER )
698 {
699 if( old_txn->paymode != PAYMODE_INTXFER )
700 {
701 // this call can popup a user dialog to choose
702 transaction_xfer_search_or_add_child(GTK_WINDOW(dialog), new_txn, FALSE);
703 }
704 else
705 {
706 Transaction *child;
707
708 //use old in case of dst_acc change
709 child = transaction_xfer_child_strong_get(old_txn);
710 //#1584342 was faultly old_txn
711 transaction_xfer_child_sync(new_txn, child);
712 }
713 }
714 else
715 {
716 //#1250061 : manage ability to break an internal xfer
717 if(old_txn->paymode == PAYMODE_INTXFER)
718 {
719 GtkWidget *p_dialog;
720 gboolean break_result;
721
722 DB( g_print(" - should break internal xfer\n") );
723
724 p_dialog = gtk_message_dialog_new
725 (
726 GTK_WINDOW(parent),
727 GTK_DIALOG_MODAL,
728 GTK_MESSAGE_WARNING,
729 GTK_BUTTONS_YES_NO,
730 _("Do you want to break the internal transfer ?\n\n"
731 "Proceeding will delete the target transaction.")
732 );
733
734 break_result = gtk_dialog_run( GTK_DIALOG( p_dialog ) );
735 gtk_widget_destroy( p_dialog );
736
737 if(break_result == GTK_RESPONSE_YES)
738 {
739 //we must use old_txn to ensure get the child
740 //#1663789 but we must clean new as well
741 transaction_xfer_remove_child(old_txn);
742 new_txn->kxfer = 0;
743 new_txn->kxferacc = 0;
744 }
745 else //force paymode to internal xfer
746 {
747 new_txn->paymode = PAYMODE_INTXFER;
748 }
749 }
750 }
751
752 //1638035: manage account change
753 if( old_txn->kacc != new_txn->kacc )
754 {
755 //todo: maybe we should restrict this also to same currency account
756 //=> no pb for normal, and intxfer is restricted by ui (in theory)
757 transaction_acc_move(new_txn, old_txn->kacc, new_txn->kacc);
758 }
759 }
760
761 deftransaction_dispose(dialog, NULL);
762 gtk_widget_destroy (dialog);
763
764 return result;
765 }
766
767
768 void deftransaction_set_transaction(GtkWidget *widget, Transaction *ope)
769 {
770 struct deftransaction_data *data;
771
772 DB( g_print("\n[ui-transaction] set transaction (from out)\n") );
773
774 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
775
776 data->ope = ope;
777
778 DB( g_print(" - ope=%p data=%p\n", data->ope, data) );
779
780 DB( g_print(" - call init\n") );
781
782 deftransaction_set(widget, NULL);
783 deftransaction_paymode(widget, NULL);
784 deftransaction_update(widget, NULL);
785 deftransaction_update_warnsign(widget, NULL);
786
787 }
788
789
790 void deftransaction_dispose(GtkWidget *widget, gpointer user_data)
791 {
792 struct deftransaction_data *data;
793
794 DB( g_print("\n[ui-transaction] dispose\n") );
795
796 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
797
798 g_free(data);
799 }
800
801
802 static void deftransaction_setup(struct deftransaction_data *data)
803 {
804
805 DB( g_print("\n[ui-transaction] setup\n") );
806
807 ui_pay_comboboxentry_populate(GTK_COMBO_BOX(data->PO_pay), GLOBALS->h_pay);
808 ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data->PO_grp), GLOBALS->h_cat);
809 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data->PO_acc), GLOBALS->h_acc, ACC_LST_INSERT_NORMAL);
810 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data->PO_accto), GLOBALS->h_acc, ACC_LST_INSERT_NORMAL);
811
812 if( data->showtemplate )
813 {
814 deftransaction_template_popover_populate (data, GLOBALS->arc_list);
815 gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(data->modelfilter));
816 }
817 }
818
819 static GtkWidget *
820 create_popover (GtkWidget *parent,
821 GtkWidget *child,
822 GtkPositionType pos)
823 {
824 GtkWidget *popover;
825
826 popover = gtk_popover_new (parent);
827 gtk_popover_set_position (GTK_POPOVER (popover), pos);
828 gtk_container_add (GTK_CONTAINER (popover), child);
829 gtk_container_set_border_width (GTK_CONTAINER (popover), SPACING_SMALL);
830 gtk_widget_show (child);
831
832 /* gtk_widget_set_margin_start (popover, SPACING_MEDIUM);
833 gtk_widget_set_margin_end (popover, SPACING_MEDIUM);
834 gtk_widget_set_margin_top (popover, SPACING_MEDIUM);
835 gtk_widget_set_margin_bottom (popover, SPACING_MEDIUM);*/
836
837 return popover;
838 }
839
840
841 static void deftransaction_template_popover_onRowActivated(GtkTreeView *treeview,
842 GtkTreePath *path,
843 GtkTreeViewColumn *col,
844 gpointer userdata)
845 {
846 struct deftransaction_data *data;
847 GtkTreeModel *model;
848 GtkTreeIter iter;
849
850 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(treeview), GTK_TYPE_WINDOW)), "inst_data");
851 model = gtk_tree_view_get_model(treeview);
852
853 if (gtk_tree_model_get_iter(model, &iter, path))
854 {
855 Archive *arc;
856 Transaction *txn;
857
858 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, LST_DSPTPL_DATAS, &arc, -1);
859
860 txn = data->ope;
861 da_transaction_init_from_template(txn, arc);
862 if( da_splits_clone(arc->splits, txn->splits) > 0)
863 txn->flags |= OF_SPLIT; //Flag that Splits are active
864
865 DB( g_print(" calls\n") );
866
867 deftransaction_set(GTK_WIDGET(treeview), NULL);
868 deftransaction_paymode(GTK_WIDGET(treeview), NULL);
869 deftransaction_update(GTK_WIDGET(treeview), NULL);
870
871 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data->MB_template), FALSE);
872 }
873 }
874
875
876
877 static void deftransaction_template_popover_populate(struct deftransaction_data *data, GList *srclist)
878 {
879 GtkTreeModel *model;
880 GtkTreeIter iter;
881 GList *list;
882
883 //insert all glist item into treeview
884 model = data->model;
885 gtk_list_store_clear(GTK_LIST_STORE(model));
886
887 list = g_list_first(srclist);
888 while (list != NULL)
889 {
890 Archive *entry = list->data;
891
892 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
893 gtk_list_store_set (GTK_LIST_STORE(model), &iter,
894 LST_DSPTPL_DATAS, entry,
895 LST_DSPTPL_NAME, entry->memo,
896 -1);
897
898 //DB( g_print(" populate_treeview: %d %08x\n", i, list->data) );
899
900 list = g_list_next(list);
901 }
902 }
903
904
905 static void
906 deftransaction_template_popover_refilter (GtkWidget *widget, gpointer user_data)
907 {
908 struct deftransaction_data *data = user_data;
909
910 DB( g_print(" text changed\n") );
911
912 gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(data->modelfilter));
913 }
914
915
916 static gboolean deftransaction_template_popover_func_visible (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
917 {
918 struct deftransaction_data *data = user_data;
919 Archive *entry;
920 gchar *str;
921 gboolean visible = TRUE;
922 gboolean showsched;
923
924 showsched = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data->CM_showsched));
925
926 gchar *needle = g_ascii_strdown(gtk_entry_get_text(GTK_ENTRY(data->ST_search)), -1);
927
928 gtk_tree_model_get (model, iter,
929 LST_DSPTPL_DATAS, &entry,
930 LST_DSPTPL_NAME, &str, -1);
931
932 if( entry )
933 {
934 if( (entry->flags & OF_AUTO) && !showsched)
935 {
936 visible = FALSE;
937 }
938 else
939 {
940 gchar *haystack = g_ascii_strdown(str, -1);
941
942 if (str && g_strrstr (haystack, needle) == NULL )
943 {
944 visible = FALSE;
945 }
946
947 DB( g_print("filter: '%s' '%s' %d\n", str, needle, visible) );
948
949 g_free(haystack);
950 }
951 }
952 g_free(needle);
953 g_free (str);
954
955 return visible;
956 }
957
958
959 static GtkWidget *deftransaction_template_popover_create(struct deftransaction_data *data)
960 {
961 GtkListStore *store;
962 GtkCellRenderer *renderer;
963 GtkTreeViewColumn *column;
964 GtkWidget *box, *widget, *scrollwin, *treeview;
965
966 box = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
967
968 widget = make_search(NULL);
969 data->ST_search = widget;
970 gtk_box_pack_start (GTK_BOX(box), widget, FALSE, FALSE, 0);
971
972
973 scrollwin = gtk_scrolled_window_new(NULL,NULL);
974 gtk_box_pack_start (GTK_BOX(box), scrollwin, TRUE, TRUE, 0);
975 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN);
976 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
977
978 store = gtk_list_store_new(NUM_LST_DSPTPL,
979 G_TYPE_POINTER,
980 G_TYPE_STRING);
981
982 data->model = GTK_TREE_MODEL(store);
983
984 data->modelfilter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(GTK_TREE_MODEL(data->model), NULL));
985 gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(data->modelfilter), deftransaction_template_popover_func_visible, data, NULL);
986
987
988 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(data->modelfilter));
989 data->LV_arc = treeview;
990 gtk_container_add(GTK_CONTAINER(scrollwin), treeview);
991
992 gtk_widget_grab_focus(treeview);
993
994 /* column for bug numbers */
995 renderer = gtk_cell_renderer_text_new ();
996 column = gtk_tree_view_column_new_with_attributes (NULL,
997 renderer,
998 "text",
999 LST_DSPTPL_NAME,
1000 NULL);
1001 //gtk_tree_view_column_set_resizable (column, TRUE);
1002 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column);
1003 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(treeview), FALSE);
1004
1005 widget = gtk_check_button_new_with_mnemonic(_("Show _scheduled"));
1006 data->CM_showsched = widget;
1007 gtk_box_pack_start (GTK_BOX(box), widget, FALSE, FALSE, 0);
1008
1009 gtk_widget_show_all (box);
1010
1011 //signals
1012 g_signal_connect (data->CM_showsched, "toggled", G_CALLBACK (deftransaction_template_popover_refilter), data);
1013 g_signal_connect (data->ST_search, "search-changed", G_CALLBACK (deftransaction_template_popover_refilter), data);
1014
1015 return box;
1016 }
1017
1018
1019 static GtkWidget *deftransaction_make_block1(struct deftransaction_data *data)
1020 {
1021 GtkWidget *group_grid, *hbox, *label, *widget, *image;
1022 gint row;
1023
1024 group_grid = gtk_grid_new ();
1025 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1026 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1027
1028 row = 0;
1029 label = make_label_widget(_("_Date:"));
1030 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1031 widget = gtk_date_entry_new();
1032 data->PO_date = widget;
1033 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 3, 1);
1034 gtk_widget_set_halign (widget, GTK_ALIGN_START);
1035 gtk_widget_set_tooltip_text(widget, _("Date accepted here are:\nday,\nday/month or month/day,\nand complete date into your locale"));
1036
1037 row++;
1038 label = make_label_widget(_("_Amount:"));
1039 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1040 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1041 gtk_grid_attach (GTK_GRID (group_grid), hbox, 1, row, 1, 1);
1042
1043 widget = make_amount(label);
1044 data->ST_amount = widget;
1045 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(widget), GTK_ENTRY_ICON_PRIMARY, ICONNAME_HB_TOGGLE_SIGN);
1046 gtk_entry_set_icon_tooltip_text(GTK_ENTRY(widget), GTK_ENTRY_ICON_PRIMARY, _("Toggle amount sign"));
1047 gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
1048
1049 image = gtk_image_new_from_icon_name (ICONNAME_HB_BUTTON_SPLIT, GTK_ICON_SIZE_BUTTON);
1050 widget = gtk_button_new();
1051 g_object_set (widget, "image", image, NULL);
1052 data->BT_split = widget;
1053 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1054 gtk_widget_set_tooltip_text(widget, _("Transaction splits"));
1055
1056 row++;
1057 label = make_label_widget(_("Pa_yment:"));
1058 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1059 widget = make_paymode(label);
1060 data->NU_mode = widget;
1061 gtk_widget_set_halign (widget, GTK_ALIGN_START);
1062 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 3, 1);
1063
1064 row++;
1065 widget = gtk_check_button_new_with_mnemonic(_("Of notebook _2"));
1066 data->CM_cheque = widget;
1067 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 4, 1);
1068
1069 row++;
1070 label = make_label_widget(_("_Info:"));
1071 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1072 widget = make_string(label);
1073 data->ST_info = widget;
1074 gtk_widget_set_hexpand (widget, TRUE);
1075 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 3, 1);
1076
1077 row++;
1078 label = make_label_widget(_("A_ccount:"));
1079 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1080 widget = ui_acc_comboboxentry_new(label);
1081 data->PO_acc = widget;
1082 gtk_widget_set_hexpand (widget, TRUE);
1083 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 3, 1);
1084
1085 row++;
1086 label = make_label_widget(_("To acc_ount:"));
1087 data->LB_accto = label;
1088 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1089 widget = ui_acc_comboboxentry_new(label);
1090 data->PO_accto = widget;
1091 gtk_widget_set_hexpand (widget, TRUE);
1092 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 3, 1);
1093
1094 row++;
1095 label = make_label_widget(_("_Payee:"));
1096 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1097 widget = ui_pay_comboboxentry_new(label);
1098 data->PO_pay = widget;
1099 gtk_widget_set_hexpand (widget, TRUE);
1100 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 3, 1);
1101 gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available"));
1102
1103 row++;
1104 label = make_label_widget(_("_Category:"));
1105 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1106 widget = ui_cat_comboboxentry_new(label);
1107 data->PO_grp = widget;
1108 gtk_widget_set_hexpand (widget, TRUE);
1109 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 3, 1);
1110 gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available"));
1111
1112 row++;
1113 label = make_label_widget(_("_Status:"));
1114 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1115 widget = make_radio(CYA_TXN_STATUS, TRUE, GTK_ORIENTATION_HORIZONTAL);
1116 data->RA_status = widget;
1117 gtk_widget_set_halign (widget, GTK_ALIGN_START);
1118 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 3, 1);
1119
1120 row++;
1121 label = make_label_widget(_("M_emo:"));
1122 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1123 widget = make_memo_entry(label);
1124 data->ST_word = widget;
1125 gtk_widget_set_hexpand (widget, TRUE);
1126 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 3, 1);
1127
1128 row++;
1129 label = make_label_widget(_("Ta_gs:"));
1130 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1131 widget = make_string(label);
1132 data->ST_tags = widget;
1133 gtk_widget_set_hexpand (widget, TRUE);
1134 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 3, 1);
1135
1136 return group_grid;
1137 }
1138
1139
1140 static gboolean
1141 deftransaction_getgeometry(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data)
1142 {
1143 struct WinGeometry *wg;
1144
1145 DB( g_print("\n[ui-transaction] get geometry\n") );
1146
1147 //store size
1148 wg = &PREFS->txn_wg;
1149 gtk_window_get_size(GTK_WINDOW(widget), &wg->w, NULL);
1150
1151 DB( g_print(" window: w=%d\n", wg->w) );
1152
1153 return FALSE;
1154 }
1155
1156
1157 GtkWidget *create_deftransaction_window (GtkWindow *parent, gint type, gboolean postmode)
1158 {
1159 struct deftransaction_data *data;
1160 struct WinGeometry *wg;
1161 GtkWidget *dialog, *content_area, *content_grid, *group_grid;
1162 GtkWidget *label, *bar;
1163 gint crow;
1164
1165 DB( g_print("\n[ui-transaction] new\n") );
1166
1167 data = g_malloc0(sizeof(struct deftransaction_data));
1168
1169 /*
1170 dialog = gtk_dialog_new_with_buttons (_(CYA_OPERATION[data->type]),
1171 GTK_WINDOW (parent),
1172 0,
1173 NULL,
1174 NULL);
1175 */
1176 dialog = gtk_dialog_new();
1177 gtk_window_set_title (GTK_WINDOW(dialog), _(CYA_OPERATION[type]));
1178 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(parent));
1179
1180
1181
1182
1183 //store our window private data
1184 g_object_set_data(G_OBJECT(dialog), "inst_data", (gpointer)data);
1185 DB( g_print(" - window=%p, inst_data=%p\n", dialog, data) );
1186
1187 data->window = dialog;
1188 data->type = type;
1189
1190 // if you add/remove response_id also change into deftransaction_update_transfer
1191 if(type == TRANSACTION_EDIT_MODIFY)
1192 {
1193 gtk_dialog_add_buttons (GTK_DIALOG(dialog),
1194 _("_Cancel"), GTK_RESPONSE_REJECT,
1195 _("_OK"), GTK_RESPONSE_ACCEPT,
1196 NULL);
1197 }
1198 else
1199 {
1200 if(!postmode)
1201 {
1202 gtk_dialog_add_buttons (GTK_DIALOG(dialog),
1203 _("_Close"), GTK_RESPONSE_REJECT,
1204 _("_Add & keep"), GTK_RESPONSE_ADDKEEP,
1205 _("_Add"), GTK_RESPONSE_ADD,
1206 NULL);
1207 }
1208 else
1209 {
1210 gtk_dialog_add_buttons (GTK_DIALOG(dialog),
1211 _("_Close"), GTK_RESPONSE_REJECT,
1212 _("_Post"), GTK_RESPONSE_ADD,
1213 NULL);
1214 }
1215 }
1216
1217 switch(type)
1218 {
1219 case TRANSACTION_EDIT_ADD:
1220 gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_HB_OPE_ADD);
1221 break;
1222 case TRANSACTION_EDIT_INHERIT:
1223 gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_HB_OPE_HERIT);
1224 break;
1225 case TRANSACTION_EDIT_MODIFY:
1226 gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_HB_OPE_EDIT);
1227 break;
1228 }
1229
1230 //gtk_window_set_decorated(GTK_WINDOW(dialog), TRUE);
1231
1232 //window contents
1233 content_area = gtk_dialog_get_content_area(GTK_DIALOG (dialog));
1234
1235 content_grid = gtk_grid_new();
1236 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
1237 gtk_grid_set_column_spacing (GTK_GRID (content_grid), SPACING_LARGE);
1238 //gtk_grid_set_column_homogeneous(GTK_GRID (content_grid), TRUE);
1239 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
1240 gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM);
1241 gtk_container_add (GTK_CONTAINER (content_area), content_grid);
1242 gtk_widget_show_all(content_grid);
1243
1244 crow = 0;
1245
1246 data->showtemplate = FALSE;
1247 if( data->type != TRANSACTION_EDIT_MODIFY && da_archive_length() > 0 && !postmode )
1248 {
1249 GtkWidget *box, *menubutton, *image;
1250
1251 data->showtemplate = TRUE;
1252
1253 menubutton = gtk_menu_button_new ();
1254 data->MB_template = menubutton;
1255 box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL);
1256 label = gtk_label_new_with_mnemonic (_("Use a _template"));
1257 gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 0);
1258 image = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON);
1259 gtk_box_pack_start (GTK_BOX(box), image, FALSE, FALSE, 0);
1260 gtk_container_add(GTK_CONTAINER(menubutton), box);
1261
1262 gtk_menu_button_set_direction (GTK_MENU_BUTTON(menubutton), GTK_ARROW_DOWN );
1263 gtk_widget_set_halign (menubutton, GTK_ALIGN_END);
1264 gtk_widget_set_hexpand (menubutton, TRUE);
1265 gtk_grid_attach (GTK_GRID (content_grid), menubutton, 1, crow, 1, 1);
1266 gtk_widget_show_all(menubutton);
1267
1268
1269 GtkWidget *template = deftransaction_template_popover_create(data);
1270 GtkWidget *popover = create_popover (menubutton, template, GTK_POS_BOTTOM);
1271 gtk_widget_set_size_request (popover, 2*HB_MINWIDTH_LIST, HB_MINHEIGHT_LIST);
1272 //gtk_widget_set_vexpand (popover, TRUE);
1273 //gtk_widget_set_hexpand (popover, TRUE);
1274
1275 /*gtk_widget_set_margin_start (popover, 10);
1276 gtk_widget_set_margin_end (popover, 10);
1277 gtk_widget_set_margin_bottom (popover, 10);*/
1278
1279 gtk_menu_button_set_popover(GTK_MENU_BUTTON(menubutton), popover);
1280
1281 g_signal_connect (GTK_TREE_VIEW(data->LV_arc), "row-activated", G_CALLBACK (deftransaction_template_popover_onRowActivated), NULL);
1282
1283 }
1284
1285 crow++;
1286 group_grid = deftransaction_make_block1(data);
1287 //gtk_widget_set_hexpand (GTK_WIDGET(group_grid), TRUE);
1288 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow, 2, 1);
1289 gtk_widget_show_all(group_grid);
1290
1291 /*crow++;
1292 group_grid = deftransaction_make_block2(data);
1293 gtk_widget_set_hexpand (GTK_WIDGET(group_grid), TRUE);
1294 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 1, crow, 2, 1);
1295 gtk_widget_show_all(group_grid);*/
1296
1297 crow++;
1298 bar = gtk_info_bar_new ();
1299 data->IB_warnsign = bar;
1300 gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_WARNING);
1301 label = gtk_label_new (_("Warning: amount and category sign don't match"));
1302 gtk_box_pack_start (GTK_BOX (gtk_info_bar_get_content_area (GTK_INFO_BAR (bar))), label, TRUE, TRUE, 0);
1303 gtk_grid_attach (GTK_GRID (content_grid), bar, 0, crow, 2, 1);
1304
1305
1306 //connect all our signals
1307 g_signal_connect (dialog, "configure-event", G_CALLBACK (deftransaction_getgeometry), (gpointer)data);
1308
1309
1310 g_signal_connect (G_OBJECT (data->ST_amount), "focus-out-event", G_CALLBACK (deftransaction_amount_focusout), NULL);
1311 g_signal_connect (G_OBJECT (data->ST_amount), "icon-release", G_CALLBACK (deftransaction_toggleamount), NULL);
1312 g_signal_connect (G_OBJECT (data->BT_split), "clicked", G_CALLBACK (deftransaction_button_split_cb), NULL);
1313
1314 g_signal_connect (data->NU_mode , "changed", G_CALLBACK (deftransaction_paymode), NULL);
1315 g_signal_connect (data->CM_cheque, "toggled", G_CALLBACK (deftransaction_paymode), NULL);
1316
1317 g_signal_connect (data->PO_pay , "changed", G_CALLBACK (deftransaction_update_payee), NULL);
1318 g_signal_connect (data->PO_acc , "changed", G_CALLBACK (deftransaction_update_accto), NULL);
1319 g_signal_connect (data->PO_accto, "changed", G_CALLBACK (deftransaction_update_transfer), NULL);
1320 g_signal_connect (data->PO_grp , "changed", G_CALLBACK (deftransaction_update_warnsign), NULL);
1321
1322
1323 //setup, init and show window
1324 deftransaction_setup(data);
1325
1326 wg = &PREFS->txn_wg;
1327 gtk_window_set_default_size(GTK_WINDOW(dialog), wg->w, -1);
1328
1329 //gtk_widget_show_all (dialog);
1330 //gtk_widget_hide(data->IB_warnsign);
1331
1332 return dialog;
1333 }
This page took 0.089164 seconds and 4 git commands to generate.