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