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