]> Dogcows Code - chaz/homebank/blob - src/ui-filter.c
import homebank-5.1.7
[chaz/homebank] / src / ui-filter.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
21 #include "homebank.h"
22
23 #include "ui-filter.h"
24 #include "ui-account.h"
25 #include "ui-payee.h"
26 #include "ui-category.h"
27 #include "gtk-dateentry.h"
28
29
30 /****************************************************************************/
31 /* Debug macros */
32 /****************************************************************************/
33 #define MYDEBUG 0
34
35 #if MYDEBUG
36 #define DB(x) (x);
37 #else
38 #define DB(x);
39 #endif
40
41 /* our global datas */
42 extern struct HomeBank *GLOBALS;
43
44
45 extern char *paymode_label_names[];
46
47
48 gchar *CYA_FLT_TYPE[] = {
49 N_("Expense"),
50 N_("Income"),
51 "",
52 N_("Any Type"),
53 NULL
54 };
55
56 gchar *CYA_FLT_STATUS[] = {
57 N_("Uncategorized"),
58 N_("Unreconciled"),
59 N_("Uncleared"),
60 N_("Reconciled"),
61 N_("Cleared"),
62 "",
63 N_("Any Status"),
64 NULL
65 };
66
67 gchar *CYA_FLT_RANGE[] = {
68 N_("This month"),
69 N_("Last month"),
70 N_("This quarter"),
71 N_("Last quarter"),
72 N_("This year"),
73 N_("Last year"),
74 "",
75 N_("Last 30 days"),
76 N_("Last 60 days"),
77 N_("Last 90 days"),
78 N_("Last 12 months"),
79 "",
80 N_("Other..."),
81 "",
82 N_("All date"),
83 NULL
84 };
85
86
87 gchar *CYA_SELECT[] =
88 {
89 "----",
90 N_("All month"),
91 N_("January"),
92 N_("February"),
93 N_("March"),
94 N_("April"),
95 N_("May"),
96 N_("June"),
97 N_("July"),
98 N_("August"),
99 N_("September"),
100 N_("October"),
101 N_("November"),
102 N_("December"),
103 NULL
104 };
105
106
107 /* = = = = = = = = = = = = = = = = = = = = */
108
109
110 static void ui_flt_panel_category_get(struct ui_flt_manage_data *data)
111 {
112 gint i;
113
114 DB( g_print("(ui_flt_panel_category) get\n") );
115
116 if(data->filter !=NULL)
117 {
118 GtkTreeModel *model;
119 //GtkTreeSelection *selection;
120 GtkTreeIter iter, child;
121 gint n_child;
122 gboolean valid;
123 gboolean toggled;
124
125
126 // category
127 DB( g_print(" category\n") );
128
129 model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_cat));
130 //selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_cat));
131 i=0; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
132 while (valid)
133 {
134 Category *catitem;
135
136 gtk_tree_model_get (model, &iter,
137 LST_DEFCAT_TOGGLE, &toggled,
138 LST_DEFCAT_DATAS, &catitem,
139 -1);
140
141 //data->filter->cat[i] = gtk_tree_selection_iter_is_selected(selection, &iter);
142 //data->filter->cat[i] = toggled;
143 catitem->filter = toggled;
144
145 n_child = gtk_tree_model_iter_n_children (GTK_TREE_MODEL(model), &iter);
146 gtk_tree_model_iter_children (GTK_TREE_MODEL(model), &child, &iter);
147 while(n_child > 0)
148 {
149 i++;
150
151 gtk_tree_model_get (model, &child,
152 LST_DEFCAT_TOGGLE, &toggled,
153 LST_DEFCAT_DATAS, &catitem,
154 -1);
155
156
157 //data->filter->cat[i] = toggled;
158 //data->filter->cat[i] = gtk_tree_selection_iter_is_selected(selection, &child);
159 catitem->filter = toggled;
160
161 n_child--;
162 gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &child);
163 }
164
165 /* Make iter point to the next row in the list store */
166 i++; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
167 }
168
169 }
170 }
171
172
173 static void ui_flt_panel_category_set(struct ui_flt_manage_data *data)
174 {
175
176 DB( g_print("(ui_flt_panel_category) set\n") );
177
178 if(data->filter != NULL)
179 {
180 GtkTreeModel *model;
181 //GtkTreeSelection *selection;
182 GtkTreeIter iter, child;
183
184 gint n_child;
185 gboolean valid;
186 gint i;
187
188
189 // category
190 DB( g_print(" category\n") );
191
192 model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_cat));
193 //selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_cat));
194 i=0; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
195 while (valid)
196 {
197 Category *catitem;
198
199 gtk_tree_model_get (model, &iter,
200 LST_DEFCAT_DATAS, &catitem,
201 -1);
202
203 if(catitem->filter == TRUE)
204 gtk_tree_store_set (GTK_TREE_STORE (model), &iter, LST_DEFCAT_TOGGLE, TRUE, -1);
205
206 n_child = gtk_tree_model_iter_n_children (GTK_TREE_MODEL(model), &iter);
207 gtk_tree_model_iter_children (GTK_TREE_MODEL(model), &child, &iter);
208 while(n_child > 0)
209 {
210 i++;
211
212 gtk_tree_model_get (model, &child,
213 LST_DEFCAT_DATAS, &catitem,
214 -1);
215
216 if(catitem->filter == TRUE)
217 gtk_tree_store_set (GTK_TREE_STORE (model), &child, LST_DEFCAT_TOGGLE, TRUE, -1);
218
219 n_child--;
220 gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &child);
221 }
222
223 /* Make iter point to the next row in the list store */
224 i++; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
225 }
226
227
228 }
229 }
230
231
232
233 static void ui_flt_manage_cat_select(GtkWidget *widget, gpointer user_data)
234 {
235 struct ui_flt_manage_data *data;
236 gint select = GPOINTER_TO_INT(user_data);
237 GtkTreeModel *model;
238 GtkTreeIter iter, child;
239 gboolean valid;
240 gint n_child;
241 gboolean toggle;
242
243 DB( g_print("(ui_flt_manage) pay select\n") );
244
245 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
246
247 model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_cat));
248 valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
249 while (valid)
250 {
251 switch(select)
252 {
253 case BUTTON_ALL:
254 gtk_tree_store_set (GTK_TREE_STORE (model), &iter, LST_DEFCAT_TOGGLE, TRUE, -1);
255 break;
256 case BUTTON_NONE:
257 gtk_tree_store_set (GTK_TREE_STORE (model), &iter, LST_DEFCAT_TOGGLE, FALSE, -1);
258 break;
259 case BUTTON_INVERT:
260 gtk_tree_model_get (model, &iter, LST_DEFCAT_TOGGLE, &toggle, -1);
261 toggle ^= 1;
262 gtk_tree_store_set (GTK_TREE_STORE (model), &iter, LST_DEFCAT_TOGGLE, toggle, -1);
263 break;
264 }
265
266 n_child = gtk_tree_model_iter_n_children (GTK_TREE_MODEL(model), &iter);
267 gtk_tree_model_iter_children (GTK_TREE_MODEL(model), &child, &iter);
268 while(n_child > 0)
269 {
270
271 switch(select)
272 {
273 case BUTTON_ALL:
274 gtk_tree_store_set (GTK_TREE_STORE (model), &child, LST_DEFCAT_TOGGLE, TRUE, -1);
275 break;
276 case BUTTON_NONE:
277 gtk_tree_store_set (GTK_TREE_STORE (model), &child, LST_DEFCAT_TOGGLE, FALSE, -1);
278 break;
279 case BUTTON_INVERT:
280 gtk_tree_model_get (model, &child, LST_DEFCAT_TOGGLE, &toggle, -1);
281 toggle ^= 1;
282 gtk_tree_store_set (GTK_TREE_STORE (model), &child, LST_DEFCAT_TOGGLE, toggle, -1);
283 break;
284 }
285
286 n_child--;
287 gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &child);
288 }
289
290 valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
291 }
292
293 }
294
295
296
297 static gboolean
298 ui_flt_panel_category_activate_link (GtkWidget *label,
299 const gchar *uri,
300 gpointer data)
301 {
302 DB( g_print(" comboboxlink '%s' \n", uri) );
303
304 if (g_strcmp0 (uri, "all") == 0)
305 {
306 ui_flt_manage_cat_select(label, GINT_TO_POINTER(BUTTON_ALL) );
307 }
308 else
309 if (g_strcmp0 (uri, "non") == 0)
310 {
311 ui_flt_manage_cat_select(label, GINT_TO_POINTER(BUTTON_NONE) );
312 }
313 else
314 if (g_strcmp0 (uri, "inv") == 0)
315 {
316 ui_flt_manage_cat_select(label, GINT_TO_POINTER(BUTTON_INVERT) );
317 }
318
319 return TRUE;
320 }
321
322
323 static GtkWidget *
324 ui_flt_panel_category_new (struct ui_flt_manage_data *data)
325 {
326 GtkWidget *scrollwin, *hbox, *vbox, *label;
327
328 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
329
330 label = make_label (_("Categories"), 0, 0);
331 gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_LARGE, -1);
332 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
333
334 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_MEDIUM);
335 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
336
337 label = make_label (_("Select:"), 0, 0.5);
338 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
339
340 label = make_clicklabel("all", _("All"));
341 data->BT_cat[BUTTON_ALL] = label;
342 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
343 g_signal_connect (label, "activate-link", G_CALLBACK (ui_flt_panel_category_activate_link), NULL);
344
345 label = make_clicklabel("non", _("None"));
346 data->BT_cat[BUTTON_NONE] = label;
347 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
348 g_signal_connect (label, "activate-link", G_CALLBACK (ui_flt_panel_category_activate_link), NULL);
349
350 label = make_clicklabel("inv", _("Invert"));
351 data->BT_cat[BUTTON_INVERT] = label;
352 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
353 g_signal_connect (label, "activate-link", G_CALLBACK (ui_flt_panel_category_activate_link), NULL);
354
355
356 scrollwin = gtk_scrolled_window_new(NULL,NULL);
357 gtk_box_pack_start (GTK_BOX (vbox), scrollwin, TRUE, TRUE, 0);
358
359 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
360 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN);
361 //gtk_container_set_border_width (GTK_CONTAINER(scrollwin), SPACING_SMALL);
362
363 data->LV_cat = (GtkWidget *)ui_cat_listview_new(TRUE, FALSE);
364 gtk_container_add(GTK_CONTAINER(scrollwin), data->LV_cat);
365
366
367 return(vbox);
368 }
369
370
371 /* = = = = = = = = = = = = = = = = */
372
373
374 static void ui_flt_manage_pay_select(GtkWidget *widget, gpointer user_data)
375 {
376 struct ui_flt_manage_data *data;
377 gint select = GPOINTER_TO_INT(user_data);
378 GtkTreeModel *model;
379 GtkTreeIter iter;
380 gboolean valid;
381 gboolean toggle;
382
383 DB( g_print("(ui_flt_manage) pay select\n") );
384
385 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
386
387 model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_pay));
388 valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
389 while (valid)
390 {
391 switch(select)
392 {
393 case BUTTON_ALL:
394 gtk_list_store_set (GTK_LIST_STORE (model), &iter, LST_DEFPAY_TOGGLE, TRUE, -1);
395 break;
396 case BUTTON_NONE:
397 gtk_list_store_set (GTK_LIST_STORE (model), &iter, LST_DEFPAY_TOGGLE, FALSE, -1);
398 break;
399 case BUTTON_INVERT:
400 gtk_tree_model_get (model, &iter, LST_DEFPAY_TOGGLE, &toggle, -1);
401 toggle ^= 1;
402 gtk_list_store_set (GTK_LIST_STORE (model), &iter, LST_DEFPAY_TOGGLE, toggle, -1);
403 break;
404 }
405 valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
406 }
407 }
408
409
410
411 static gboolean
412 ui_flt_panel_payee_activate_link (GtkWidget *label,
413 const gchar *uri,
414 gpointer data)
415 {
416 DB( g_print(" comboboxlink '%s' \n", uri) );
417
418 if (g_strcmp0 (uri, "all") == 0)
419 {
420 ui_flt_manage_pay_select(label, GINT_TO_POINTER(BUTTON_ALL) );
421 }
422 else
423 if (g_strcmp0 (uri, "non") == 0)
424 {
425 ui_flt_manage_pay_select(label, GINT_TO_POINTER(BUTTON_NONE) );
426 }
427 else
428 if (g_strcmp0 (uri, "inv") == 0)
429 {
430 ui_flt_manage_pay_select(label, GINT_TO_POINTER(BUTTON_INVERT) );
431 }
432
433 return TRUE;
434 }
435
436
437 static GtkWidget *
438 ui_flt_panel_payee_new (struct ui_flt_manage_data *data)
439 {
440 GtkWidget *scrollwin, *hbox, *vbox, *label;
441
442 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
443
444 label = make_label (_("Payees"), 0, 0);
445 gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_LARGE, -1);
446 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
447
448 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_MEDIUM);
449 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
450
451 label = make_label (_("Select:"), 0, 0.5);
452 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
453
454 label = make_clicklabel("all", _("All"));
455 data->BT_pay[BUTTON_ALL] = label;
456 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
457 g_signal_connect (label, "activate-link", G_CALLBACK (ui_flt_panel_payee_activate_link), NULL);
458
459 label = make_clicklabel("non", _("None"));
460 data->BT_pay[BUTTON_NONE] = label;
461 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
462 g_signal_connect (label, "activate-link", G_CALLBACK (ui_flt_panel_payee_activate_link), NULL);
463
464 label = make_clicklabel("inv", _("Invert"));
465 data->BT_pay[BUTTON_INVERT] = label;
466 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
467 g_signal_connect (label, "activate-link", G_CALLBACK (ui_flt_panel_payee_activate_link), NULL);
468
469 scrollwin = gtk_scrolled_window_new(NULL,NULL);
470 gtk_box_pack_start (GTK_BOX (vbox), scrollwin, TRUE, TRUE, 0);
471
472 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
473 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN);
474 //gtk_container_set_border_width (GTK_CONTAINER(scrollwin), SPACING_SMALL);
475
476 data->LV_pay = (GtkWidget *)ui_pay_listview_new(TRUE, FALSE);
477 gtk_container_add(GTK_CONTAINER(scrollwin), data->LV_pay);
478
479 return(vbox);
480 }
481
482
483
484
485
486
487
488 /* = = = = = = = = = = = = = = = = */
489
490 static void ui_flt_manage_acc_select(GtkWidget *widget, gpointer user_data)
491 {
492 struct ui_flt_manage_data *data;
493 gint select = GPOINTER_TO_INT(user_data);
494 GtkTreeModel *model;
495 GtkTreeIter iter;
496 gboolean valid;
497 gboolean toggle;
498
499 DB( g_print("(ui_flt_manage) acc select\n") );
500
501 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
502
503 model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_acc));
504 valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
505 while (valid)
506 {
507 switch(select)
508 {
509 case BUTTON_ALL:
510 gtk_list_store_set (GTK_LIST_STORE (model), &iter, LST_DEFACC_TOGGLE, TRUE, -1);
511 break;
512 case BUTTON_NONE:
513 gtk_list_store_set (GTK_LIST_STORE (model), &iter, LST_DEFACC_TOGGLE, FALSE, -1);
514 break;
515 case BUTTON_INVERT:
516 gtk_tree_model_get (model, &iter, LST_DEFACC_TOGGLE, &toggle, -1);
517 toggle ^= 1;
518 gtk_list_store_set (GTK_LIST_STORE (model), &iter, LST_DEFACC_TOGGLE, toggle, -1);
519 break;
520 }
521 valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
522 }
523 }
524
525
526 static gboolean
527 ui_flt_panel_account_activate_link (GtkWidget *label,
528 const gchar *uri,
529 gpointer data)
530 {
531 DB( g_print(" comboboxlink '%s' \n", uri) );
532
533 if (g_strcmp0 (uri, "all") == 0)
534 {
535 ui_flt_manage_acc_select(label, GINT_TO_POINTER(BUTTON_ALL) );
536 }
537 else
538 if (g_strcmp0 (uri, "non") == 0)
539 {
540 ui_flt_manage_acc_select(label, GINT_TO_POINTER(BUTTON_NONE) );
541 }
542 else
543 if (g_strcmp0 (uri, "inv") == 0)
544 {
545 ui_flt_manage_acc_select(label, GINT_TO_POINTER(BUTTON_INVERT) );
546 }
547
548 return TRUE;
549 }
550
551 static GtkWidget *
552 ui_flt_panel_account_new (struct ui_flt_manage_data *data)
553 {
554 GtkWidget *scrollwin, *hbox, *vbox, *label;
555
556 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
557
558 label = make_label (_("Accounts"), 0, 0);
559 gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_LARGE, -1);
560 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
561
562 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_MEDIUM);
563 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
564
565 label = make_label (_("Select:"), 0, 0.5);
566 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
567
568 label = make_clicklabel("all", _("All"));
569 data->BT_acc[BUTTON_ALL] = label;
570 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
571 g_signal_connect (label, "activate-link", G_CALLBACK (ui_flt_panel_account_activate_link), NULL);
572
573 label = make_clicklabel("non", _("None"));
574 data->BT_acc[BUTTON_NONE] = label;
575 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
576 g_signal_connect (label, "activate-link", G_CALLBACK (ui_flt_panel_account_activate_link), NULL);
577
578 label = make_clicklabel("inv", _("Invert"));
579 data->BT_acc[BUTTON_INVERT] = label;
580 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
581 g_signal_connect (label, "activate-link", G_CALLBACK (ui_flt_panel_account_activate_link), NULL);
582
583 scrollwin = gtk_scrolled_window_new(NULL,NULL);
584 gtk_box_pack_start (GTK_BOX (vbox), scrollwin, TRUE, TRUE, 0);
585
586 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
587 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN);
588 //gtk_container_set_border_width (GTK_CONTAINER(scrollwin), SPACING_SMALL);
589
590 data->LV_acc = (GtkWidget *)ui_acc_listview_new(TRUE);
591 gtk_container_add(GTK_CONTAINER(scrollwin), data->LV_acc);
592
593 return(vbox);
594 }
595
596 /* = = = = = = = = = = = = = = = = */
597
598
599
600
601
602
603
604 /*
605 **
606 */
607 static void ui_flt_manage_option_update(GtkWidget *widget, gpointer user_data)
608 {
609 struct ui_flt_manage_data *data;
610 gint active, i;
611 gboolean sensitive;
612
613 DB( g_print("(ui_flt_manage) update\n") );
614
615 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
616
617 // status
618 active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_option[FILTER_STATUS]));
619 sensitive = active == 0 ? FALSE : TRUE;
620 gtk_widget_set_sensitive(data->CM_reconciled, sensitive);
621 gtk_widget_set_sensitive(data->CM_cleared, sensitive);
622
623 // date
624 active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_option[FILTER_DATE]));
625 sensitive = active == 0 ? FALSE : TRUE;
626 gtk_widget_set_sensitive(data->PO_mindate, sensitive);
627 gtk_widget_set_sensitive(data->PO_maxdate, sensitive);
628 gtk_widget_set_sensitive(data->CY_month, sensitive);
629 gtk_widget_set_sensitive(data->NB_year, sensitive);
630
631 // amount
632 active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_option[FILTER_AMOUNT]));
633 sensitive = active == 0 ? FALSE : TRUE;
634 gtk_widget_set_sensitive(data->ST_minamount, sensitive);
635 gtk_widget_set_sensitive(data->ST_maxamount, sensitive);
636
637 // text
638 active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_option[FILTER_TEXT]));
639 sensitive = active == 0 ? FALSE : TRUE;
640 gtk_widget_set_sensitive(data->CM_exact, sensitive);
641 gtk_widget_set_sensitive(data->ST_memo, sensitive);
642 gtk_widget_set_sensitive(data->ST_info, sensitive);
643 gtk_widget_set_sensitive(data->ST_tag, sensitive);
644
645 //paymode
646 active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_option[FILTER_PAYMODE]));
647 sensitive = active == 0 ? FALSE : TRUE;
648 for(i=0;i<NUM_PAYMODE_MAX;i++)
649 {
650 gtk_widget_set_sensitive(data->CM_paymode[i], sensitive);
651 }
652
653 //account
654 if(data->show_account == TRUE)
655 {
656 active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_option[FILTER_ACCOUNT]));
657 sensitive = active == 0 ? FALSE : TRUE;
658 gtk_widget_set_sensitive(data->LV_acc, sensitive);
659 for(i=0;i<MAX_BUTTON;i++)
660 {
661 gtk_widget_set_sensitive(data->BT_acc[i], sensitive);
662 }
663
664
665 }
666
667 //payee
668 active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_option[FILTER_PAYEE]));
669 sensitive = active == 0 ? FALSE : TRUE;
670 gtk_widget_set_sensitive(data->LV_pay, sensitive);
671 for(i=0;i<MAX_BUTTON;i++)
672 {
673 gtk_widget_set_sensitive(data->BT_pay[i], sensitive);
674 }
675
676 //category
677 active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_option[FILTER_CATEGORY]));
678 sensitive = active == 0 ? FALSE : TRUE;
679 gtk_widget_set_sensitive(data->LV_cat, sensitive);
680 for(i=0;i<MAX_BUTTON;i++)
681 {
682 gtk_widget_set_sensitive(data->BT_cat[i], sensitive);
683 }
684
685
686
687 }
688
689
690 /*
691 **
692 */
693 static void ui_flt_manage_get(struct ui_flt_manage_data *data)
694 {
695 gint i;
696 gchar *txt;
697
698 DB( g_print("(ui_flt_manage) get\n") );
699
700 if(data->filter !=NULL)
701 {
702 GtkTreeModel *model;
703 //GtkTreeSelection *selection;
704 GtkTreeIter iter;
705
706 gboolean valid;
707 gboolean toggled;
708
709 for(i=0;i<FILTER_MAX;i++)
710 {
711 if(data->show_account == FALSE && i == FILTER_ACCOUNT)
712 continue;
713
714 data->filter->option[i] = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_option[i]));
715 }
716
717 //date
718 DB( g_print(" date\n") );
719 data->filter->mindate = gtk_date_entry_get_date(GTK_DATE_ENTRY(data->PO_mindate));
720 data->filter->maxdate = gtk_date_entry_get_date(GTK_DATE_ENTRY(data->PO_maxdate));
721
722 //status
723 DB( g_print(" status\n") );
724 data->filter->reconciled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_reconciled));
725 data->filter->cleared = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_cleared));
726
727 data->filter->forceadd = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_forceadd));
728 data->filter->forcechg = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_forcechg));
729 data->filter->forceremind = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_forceremind));
730
731 //paymode
732 DB( g_print(" paymode\n") );
733 for(i=0;i<NUM_PAYMODE_MAX;i++)
734 data->filter->paymode[i] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_paymode[i]));
735
736 //amount
737 data->filter->minamount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_minamount));
738 data->filter->maxamount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_maxamount));
739
740 //text:memo
741 data->filter->exact = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_exact));
742 //free any previous string
743 if( data->filter->memo )
744 {
745 g_free(data->filter->memo);
746 data->filter->memo = NULL;
747 }
748 txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_memo));
749
750 if (txt && *txt) // ignore if entry is empty
751 {
752 data->filter->memo = g_strdup(txt);
753 }
754
755 //text:info
756 //free any previous string
757 if( data->filter->info )
758 {
759 g_free(data->filter->info);
760 data->filter->info = NULL;
761 }
762 txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_info));
763 // ignore if entry is empty
764 if (txt && *txt)
765 {
766 data->filter->info = g_strdup(txt);
767 }
768
769 //text:tag
770 //free any previous string
771 if( data->filter->tag )
772 {
773 g_free(data->filter->tag);
774 data->filter->tag = NULL;
775 }
776 txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_tag));
777 // ignore if entry is empty
778 if (txt && *txt)
779 {
780 data->filter->tag = g_strdup(txt);
781 }
782
783
784 // account
785 if(data->show_account == TRUE)
786 {
787 DB( g_print(" account\n") );
788
789 model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_acc));
790 //selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_acc));
791 i=0; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
792 while (valid)
793 {
794 Account *accitem;
795
796 gtk_tree_model_get (model, &iter,
797 LST_DEFACC_TOGGLE, &toggled,
798 LST_DEFACC_DATAS, &accitem,
799 -1);
800
801 //data->filter->acc[i] = gtk_tree_selection_iter_is_selected(selection, &iter);
802 accitem->filter = toggled;
803
804 /* Make iter point to the next row in the list store */
805 i++; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
806 }
807 }
808
809 // payee
810 DB( g_print(" payee\n") );
811
812 model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_pay));
813 //selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_pay));
814 i=0; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
815 while (valid)
816 {
817 Payee *payitem;
818
819 gtk_tree_model_get (model, &iter,
820 LST_DEFPAY_TOGGLE, &toggled,
821 LST_DEFPAY_DATAS, &payitem,
822 -1);
823
824 //data->filter->pay[i] = gtk_tree_selection_iter_is_selected(selection, &iter);
825 payitem->filter = toggled;
826
827 /* Make iter point to the next row in the list store */
828 i++; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
829 }
830
831 // category
832 DB( g_print(" category\n") );
833
834 ui_flt_panel_category_get(data);
835
836 // active tab
837 g_strlcpy(data->filter->last_tab, gtk_stack_get_visible_child_name(GTK_STACK(data->stack)), 8);
838 DB( g_print(" page is '%s'\n", data->filter->last_tab) );
839
840
841 }
842 }
843
844
845 /*
846 **
847 */
848 static void ui_flt_manage_set(struct ui_flt_manage_data *data)
849 {
850
851 DB( g_print("(ui_flt_manage) set\n") );
852
853 if(data->filter != NULL)
854 {
855 GtkTreeModel *model;
856 //GtkTreeSelection *selection;
857 GtkTreeIter iter;
858 GDate *date;
859
860 gboolean valid;
861 gint i;
862
863 DB( g_print(" options\n") );
864
865 for(i=0;i<FILTER_MAX;i++)
866 {
867 if(data->show_account == FALSE && i == FILTER_ACCOUNT)
868 continue;
869
870 gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_option[i]), data->filter->option[i]);
871 }
872
873 //DB( g_print(" setdate %d to %x\n", data->filter->mindate, data->PO_mindate) );
874 //DB( g_print(" setdate %d to %x\n", 0, data->PO_mindate) );
875 //date
876 DB( g_print(" date\n") );
877 gtk_date_entry_set_date(GTK_DATE_ENTRY(data->PO_mindate), data->filter->mindate);
878 gtk_date_entry_set_date(GTK_DATE_ENTRY(data->PO_maxdate), data->filter->maxdate);
879 date = g_date_new_julian(data->filter->maxdate);
880 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NB_year), g_date_get_year(date));
881 g_date_free(date);
882
883 //status
884 DB( g_print(" status\n") );
885 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_reconciled), data->filter->reconciled);
886
887
888 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_forceadd), data->filter->forceadd);
889 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_forcechg), data->filter->forcechg);
890 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_forceremind), data->filter->forceremind);
891
892 //paymode
893 DB( g_print(" paymode\n") );
894
895 for(i=0;i<NUM_PAYMODE_MAX;i++)
896 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_paymode[i]), data->filter->paymode[i]);
897
898 //amount
899 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_minamount), data->filter->minamount);
900 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_maxamount), data->filter->maxamount);
901
902 //text
903 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_exact), data->filter->exact);
904 gtk_entry_set_text(GTK_ENTRY(data->ST_info), (data->filter->info != NULL) ? data->filter->info : "");
905 gtk_entry_set_text(GTK_ENTRY(data->ST_memo), (data->filter->memo != NULL) ? data->filter->memo : "");
906 gtk_entry_set_text(GTK_ENTRY(data->ST_tag), (data->filter->tag != NULL) ? data->filter->tag : "");
907
908 //account
909 if(data->show_account == TRUE)
910 {
911 DB( g_print(" account\n") );
912
913 model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_acc));
914 //selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_acc));
915 i=0; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
916 while (valid)
917 {
918 Account *accitem;
919
920 gtk_tree_model_get (model, &iter,
921 LST_DEFACC_DATAS, &accitem,
922 -1);
923
924 if(accitem->filter == TRUE)
925 //gtk_tree_selection_select_iter(selection, &iter);
926 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
927 LST_DEFACC_TOGGLE, TRUE, -1);
928
929 /* Make iter point to the next row in the list store */
930 i++; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
931 }
932 }
933
934 // payee
935 DB( g_print(" payee\n") );
936
937 model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_pay));
938 //selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_pay));
939 i=0; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
940 while (valid)
941 {
942 Payee *payitem;
943
944 gtk_tree_model_get (model, &iter,
945 LST_DEFPAY_DATAS, &payitem,
946 -1);
947
948 if(payitem->filter == TRUE)
949 gtk_list_store_set (GTK_LIST_STORE (model), &iter, LST_DEFPAY_TOGGLE, TRUE, -1);
950
951 /* Make iter point to the next row in the list store */
952 i++; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
953 }
954
955 // category
956 DB( g_print(" category\n") );
957
958 ui_flt_panel_category_set(data);
959
960 }
961 }
962
963
964 /*
965 **
966 */
967 static void ui_flt_manage_clear(GtkWidget *widget, gpointer user_data)
968 {
969 struct ui_flt_manage_data *data;
970
971 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
972
973 DB( g_print("(ui_flt_manage) clear\n") );
974
975 filter_default_all_set(data->filter);
976
977 ui_flt_manage_set(data);
978
979 }
980
981
982 /*
983 **
984 */
985 static void ui_flt_manage_setup(struct ui_flt_manage_data *data)
986 {
987
988 DB( g_print("(ui_flt_manage) setup\n") );
989
990 if(data->show_account == TRUE && data->LV_acc != NULL)
991 {
992 //gtk_tree_selection_set_mode(GTK_TREE_SELECTION(gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_acc))), GTK_SELECTION_MULTIPLE);
993
994 ui_acc_listview_populate(data->LV_acc, ACC_LST_INSERT_REPORT);
995 //populate_view_acc(data->LV_acc, GLOBALS->acc_list, FALSE);
996 }
997
998 if(data->LV_pay)
999 {
1000 //gtk_tree_selection_set_mode(GTK_TREE_SELECTION(gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_pay))), GTK_SELECTION_MULTIPLE);
1001
1002 ui_pay_listview_populate(data->LV_pay);
1003 //populate_view_pay(data->LV_pay, GLOBALS->pay_list, FALSE);
1004 }
1005
1006 if(data->LV_cat)
1007 {
1008 //gtk_tree_selection_set_mode(GTK_TREE_SELECTION(gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_cat))), GTK_SELECTION_MULTIPLE);
1009
1010 //populate_view_cat(data->LV_cat, GLOBALS->cat_list, FALSE);
1011 ui_cat_listview_populate(data->LV_cat, CAT_TYPE_ALL);
1012 gtk_tree_view_expand_all (GTK_TREE_VIEW(data->LV_cat));
1013 }
1014 }
1015
1016
1017
1018
1019
1020
1021 static GtkWidget *ui_flt_manage_page_category (struct ui_flt_manage_data *data)
1022 {
1023 GtkWidget *container, *panel, *hbox, *label;
1024
1025 container = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
1026 gtk_container_set_border_width (GTK_CONTAINER (container), SPACING_MEDIUM);
1027
1028 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL);
1029 gtk_box_pack_start (GTK_BOX (container), hbox, FALSE, FALSE, 0);
1030
1031 label = make_label_widget(_("_Option:"));
1032 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
1033 data->CY_option[FILTER_CATEGORY] = make_nainex(label);
1034 gtk_box_pack_start (GTK_BOX (hbox), data->CY_option[FILTER_CATEGORY], TRUE, TRUE, 0);
1035
1036 panel = ui_flt_panel_category_new(data);
1037 gtk_box_pack_start (GTK_BOX (container), panel, TRUE, TRUE, 0);
1038
1039 return(container);
1040 }
1041
1042
1043 static GtkWidget *ui_flt_manage_page_payee (struct ui_flt_manage_data *data)
1044 {
1045 GtkWidget *container, *panel, *hbox, *label;
1046
1047 container = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
1048 gtk_container_set_border_width (GTK_CONTAINER (container), SPACING_MEDIUM);
1049
1050 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL);
1051 gtk_box_pack_start (GTK_BOX (container), hbox, FALSE, FALSE, 0);
1052
1053 label = make_label_widget(_("_Option:"));
1054 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
1055 data->CY_option[FILTER_PAYEE] = make_nainex(label);
1056 gtk_box_pack_start (GTK_BOX (hbox), data->CY_option[FILTER_PAYEE], TRUE, TRUE, 0);
1057
1058 panel = ui_flt_panel_payee_new(data);
1059 gtk_box_pack_start (GTK_BOX (container), panel, TRUE, TRUE, 0);
1060
1061 return(container);
1062 }
1063
1064 /*
1065 ** account filter
1066 */
1067 static GtkWidget *ui_flt_manage_page_account (struct ui_flt_manage_data *data)
1068 {
1069 GtkWidget *container, *panel, *hbox, *label;
1070
1071 container = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
1072 gtk_container_set_border_width (GTK_CONTAINER (container), SPACING_MEDIUM);
1073
1074 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL);
1075 gtk_box_pack_start (GTK_BOX (container), hbox, FALSE, FALSE, 0);
1076
1077 label = make_label_widget(_("_Option:"));
1078 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
1079 data->CY_option[FILTER_ACCOUNT] = make_nainex(label);
1080 gtk_box_pack_start (GTK_BOX (hbox), data->CY_option[FILTER_ACCOUNT], TRUE, TRUE, 0);
1081
1082 panel = ui_flt_panel_account_new(data);
1083 gtk_box_pack_start (GTK_BOX (container), panel, TRUE, TRUE, 0);
1084
1085 return(container);
1086 }
1087
1088
1089 static void get_period_minmax(guint month, guint year, guint32 *mindate, guint32 *maxdate)
1090 {
1091 GDate *date;
1092
1093 date = g_date_new();
1094 if(month)
1095 {
1096 // mindate is month 1, year :: maxdate is last day of month, year
1097 g_date_set_dmy(date, 1, month, year);
1098 *mindate = g_date_get_julian(date);
1099 g_date_add_days(date, g_date_get_days_in_month(month, year));
1100 *maxdate = g_date_get_julian(date)-1;
1101 }
1102 else
1103 {
1104 g_date_set_dmy(date, 1, 1, year);
1105 *mindate = g_date_get_julian(date);
1106 g_date_set_dmy(date, 31, 12, year);
1107 *maxdate = g_date_get_julian(date);
1108 }
1109 g_date_free(date);
1110 }
1111
1112
1113
1114 static void ui_flt_manage_period_change(GtkWidget *widget, gpointer user_data)
1115 {
1116 struct ui_flt_manage_data *data;
1117 gint month, year;
1118
1119 DB( g_print("(ui_flt_manage) period change\n") );
1120
1121 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
1122
1123
1124 month = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_month));
1125 year = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_year));
1126
1127 DB( g_print(" month=%d, year=%d\n", month, year) );
1128
1129
1130 if(month != 0)
1131 get_period_minmax(month-1, year, &data->filter->mindate, &data->filter->maxdate);
1132 else
1133 get_period_minmax(0, year, &data->filter->mindate, &data->filter->maxdate);
1134
1135 gtk_date_entry_set_date(GTK_DATE_ENTRY(data->PO_mindate), data->filter->mindate);
1136 gtk_date_entry_set_date(GTK_DATE_ENTRY(data->PO_maxdate), data->filter->maxdate);
1137 }
1138
1139
1140 static GtkWidget *ui_flt_manage_part_date(struct ui_flt_manage_data *data)
1141 {
1142 GtkWidget *table, *label;
1143 gint row;
1144
1145 table = gtk_grid_new ();
1146 gtk_grid_set_row_spacing (GTK_GRID (table), SPACING_SMALL);
1147 gtk_grid_set_column_spacing (GTK_GRID (table), SPACING_MEDIUM);
1148 gtk_container_set_border_width(GTK_CONTAINER(table), SPACING_MEDIUM);
1149
1150 row = 0;
1151 label = make_label_widget(_("_Option:"));
1152 //----------------------------------------- l, r, t, b
1153 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
1154 data->CY_option[FILTER_DATE] = make_nainex(label);
1155 gtk_grid_attach (GTK_GRID (table), data->CY_option[FILTER_DATE], 2, row, 1, 1);
1156
1157 row++;
1158 label = make_label (_("Dates"), 0, 0);
1159 gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_LARGE, -1);
1160 gtk_grid_attach (GTK_GRID (table), label, 0, row, 3, 1);
1161
1162 row++;
1163 label = make_label_widget(_("_From:"));
1164 gtk_grid_attach (GTK_GRID (table), label, 0, row, 1, 1);
1165 data->PO_mindate = gtk_date_entry_new();
1166 gtk_grid_attach (GTK_GRID (table), data->PO_mindate, 1, row, 2, 1);
1167
1168 row++;
1169 label = make_label_widget(_("_To:"));
1170 gtk_grid_attach (GTK_GRID (table), label, 0, row, 1, 1);
1171 data->PO_maxdate = gtk_date_entry_new();
1172 gtk_grid_attach (GTK_GRID (table), data->PO_maxdate, 1, row, 2, 1);
1173
1174 row++;
1175 label = make_label_widget(_("_Month:"));
1176 gtk_grid_attach (GTK_GRID (table), label, 0, row, 1, 1);
1177 data->CY_month = make_cycle(label, CYA_SELECT);
1178 gtk_grid_attach (GTK_GRID (table), data->CY_month, 1, row, 2, 1);
1179
1180 row++;
1181 label = make_label_widget(_("_Year:"));
1182 gtk_grid_attach (GTK_GRID (table), label, 0, row, 1, 1);
1183 data->NB_year = make_year(label);
1184 gtk_grid_attach (GTK_GRID (table), data->NB_year, 1, row, 2, 1);
1185
1186 return table;
1187 }
1188
1189
1190 static GtkWidget *ui_flt_manage_part_text(struct ui_flt_manage_data *data)
1191 {
1192 GtkWidget *table, *label;
1193 gint row;
1194
1195 table = gtk_grid_new ();
1196 gtk_grid_set_row_spacing (GTK_GRID (table), SPACING_SMALL);
1197 gtk_grid_set_column_spacing (GTK_GRID (table), SPACING_MEDIUM);
1198 gtk_container_set_border_width(GTK_CONTAINER(table), SPACING_MEDIUM);
1199
1200 row = 0;
1201 label = make_label_widget(_("_Option:"));
1202 //----------------------------------------- l, r, t, b
1203 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
1204 data->CY_option[FILTER_TEXT] = make_nainex(label);
1205 gtk_grid_attach (GTK_GRID (table), data->CY_option[FILTER_TEXT], 2, row, 1, 1);
1206
1207 row++;
1208 label = make_label (_("Texts"), 0, 0);
1209 gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_LARGE, -1);
1210 gtk_grid_attach (GTK_GRID (table), label, 0, row, 3, 1);
1211
1212 row++;
1213 label = make_label_widget(_("_Memo:"));
1214 gtk_grid_attach (GTK_GRID (table), label, 0, row, 1, 1);
1215 data->ST_memo = make_string(label);
1216 gtk_widget_set_hexpand (data->ST_memo, TRUE);
1217 gtk_grid_attach (GTK_GRID (table), data->ST_memo, 1, row, 2, 1);
1218
1219 row++;
1220 label = make_label_widget(_("_Info:"));
1221 //----------------------------------------- l, r, t, b
1222 gtk_grid_attach (GTK_GRID (table), label, 0, row, 1, 1);
1223 data->ST_info = make_string(label);
1224 gtk_widget_set_hexpand (data->ST_info, TRUE);
1225 gtk_grid_attach (GTK_GRID (table), data->ST_info, 1, row, 2, 1);
1226
1227 row++;
1228 label = make_label_widget(_("_Tag:"));
1229 //----------------------------------------- l, r, t, b
1230 gtk_grid_attach (GTK_GRID (table), label, 0, row, 1, 1);
1231 data->ST_tag = make_string(label);
1232 gtk_widget_set_hexpand (data->ST_tag, TRUE);
1233 gtk_grid_attach (GTK_GRID (table), data->ST_tag, 1, row, 2, 1);
1234
1235 row++;
1236 data->CM_exact = gtk_check_button_new_with_mnemonic (_("Case _sensitive"));
1237 gtk_grid_attach (GTK_GRID (table), data->CM_exact, 1, row, 2, 1);
1238
1239
1240 return table;
1241 }
1242
1243 static GtkWidget *ui_flt_manage_part_amount(struct ui_flt_manage_data *data)
1244 {
1245 GtkWidget *table, *label;
1246 gint row;
1247
1248 table = gtk_grid_new ();
1249 gtk_grid_set_row_spacing (GTK_GRID (table), SPACING_SMALL);
1250 gtk_grid_set_column_spacing (GTK_GRID (table), SPACING_MEDIUM);
1251 gtk_container_set_border_width(GTK_CONTAINER(table), SPACING_MEDIUM);
1252
1253 row = 0;
1254 label = make_label_widget(_("_Option:"));
1255 //----------------------------------------- l, r, t, b
1256 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
1257 data->CY_option[FILTER_AMOUNT] = make_nainex(label);
1258 gtk_grid_attach (GTK_GRID (table), data->CY_option[FILTER_AMOUNT], 2, row, 1, 1);
1259
1260 row++;
1261 label = make_label (_("Amounts"), 0, 0);
1262 gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_LARGE, -1);
1263 gtk_grid_attach (GTK_GRID (table), label, 0, row, 3, 1);
1264
1265 row++;
1266 label = make_label_widget(_("_From:"));
1267 //----------------------------------------- l, r, t, b
1268 gtk_grid_attach (GTK_GRID (table), label, 0, row, 1, 1);
1269 data->ST_minamount = make_amount(label);
1270 gtk_grid_attach (GTK_GRID (table), data->ST_minamount, 1, row, 2, 1);
1271
1272 row++;
1273 label = make_label_widget(_("_To:"));
1274 gtk_grid_attach (GTK_GRID (table), label, 0, row, 1, 1);
1275 data->ST_maxamount = make_amount(label);
1276 gtk_grid_attach (GTK_GRID (table), data->ST_maxamount, 1, row, 2, 1);
1277
1278 return table;
1279 }
1280
1281
1282 static GtkWidget *ui_flt_manage_part_status(struct ui_flt_manage_data *data)
1283 {
1284 GtkWidget *table, *label, *vbox, *widget;
1285 gint row;
1286
1287 table = gtk_grid_new ();
1288 gtk_grid_set_row_spacing (GTK_GRID (table), SPACING_SMALL);
1289 gtk_grid_set_column_spacing (GTK_GRID (table), SPACING_MEDIUM);
1290 gtk_container_set_border_width(GTK_CONTAINER(table), SPACING_MEDIUM);
1291
1292 row = 0;
1293 label = make_label_widget(_("_Option:"));
1294 //----------------------------------------- l, r, t, b
1295 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
1296 data->CY_option[FILTER_STATUS] = make_nainex(label);
1297 gtk_grid_attach (GTK_GRID (table), data->CY_option[FILTER_STATUS], 2, row, 1, 1);
1298
1299 row++;
1300 label = make_label (_("Statuses"), 0, 0);
1301 gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_LARGE, -1);
1302 gtk_grid_attach (GTK_GRID (table), label, 0, row, 3, 1);
1303
1304
1305 row++;
1306 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1307 gtk_grid_attach (GTK_GRID (table), vbox, 2, row, 1, 1);
1308
1309 widget = gtk_check_button_new_with_mnemonic (_("reconciled"));
1310 data->CM_reconciled = widget;
1311 gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 0);
1312
1313 widget = gtk_check_button_new_with_mnemonic (_("cleared"));
1314 data->CM_cleared = widget;
1315 gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 0);
1316
1317 row++;
1318 label = make_label_widget(_("Force:"));
1319 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
1320
1321 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1322 gtk_grid_attach (GTK_GRID (table), vbox, 2, row, 1, 1);
1323
1324 widget = gtk_check_button_new_with_mnemonic (_("display 'Added'"));
1325 data->CM_forceadd = widget;
1326 gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 0);
1327
1328 widget = gtk_check_button_new_with_mnemonic (_("display 'Edited'"));
1329 data->CM_forcechg = widget;
1330 gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 0);
1331
1332 widget = gtk_check_button_new_with_mnemonic (_("display 'Remind'"));
1333 data->CM_forceremind = widget;
1334 gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 0);
1335
1336 return table;
1337 }
1338
1339
1340 static GtkWidget *ui_flt_manage_part_paymode(struct ui_flt_manage_data *data)
1341 {
1342 GtkWidget *table, *label, *table1, *image;
1343 gint i, row;
1344
1345 table = gtk_grid_new ();
1346 gtk_grid_set_row_spacing (GTK_GRID (table), SPACING_SMALL);
1347 gtk_grid_set_column_spacing (GTK_GRID (table), SPACING_MEDIUM);
1348 gtk_container_set_border_width(GTK_CONTAINER(table), SPACING_MEDIUM);
1349
1350 row = 0;
1351 label = make_label_widget(_("_Option:"));
1352 //----------------------------------------- l, r, t, b
1353 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
1354 data->CY_option[FILTER_PAYMODE] = make_nainex(label);
1355 gtk_grid_attach (GTK_GRID (table), data->CY_option[FILTER_PAYMODE], 2, row, 1, 1);
1356
1357 row++;
1358 label = make_label (_("Payments"), 0, 0);
1359 gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_LARGE, -1);
1360 gtk_grid_attach (GTK_GRID (table), label, 0, row, 3, 1);
1361
1362 row++;
1363 table1 = gtk_grid_new ();
1364 gtk_grid_set_row_spacing (GTK_GRID (table1), SPACING_SMALL);
1365 gtk_grid_set_column_spacing (GTK_GRID (table1), SPACING_SMALL);
1366 gtk_grid_attach (GTK_GRID (table), table1, 1, row, 2, 1);
1367
1368 for(i=0;i<NUM_PAYMODE_MAX;i++)
1369 {
1370 row = i;
1371
1372 image = gtk_image_new_from_icon_name( get_paymode_icon_name(i), GTK_ICON_SIZE_MENU);
1373 gtk_grid_attach (GTK_GRID (table1), image, 0, row, 1, 1);
1374
1375 data->CM_paymode[i] = gtk_check_button_new();
1376 gtk_grid_attach (GTK_GRID (table1), data->CM_paymode[i], 1, row, 1, 1);
1377
1378 label = make_label(_(paymode_label_names[i]), 0.0, 0.5);
1379 gtk_grid_attach (GTK_GRID (table1), label, 2, row, 1, 1);
1380 }
1381
1382 return table;
1383 }
1384
1385
1386 /*
1387 **
1388 */
1389 gint ui_flt_manage_dialog_new(GtkWidget *widget, Filter *filter, gboolean show_account)
1390 {
1391 struct ui_flt_manage_data data;
1392 GtkWidget *parentwindow, *window, *content, *mainbox, *box, *sidebar, *stack, *page;
1393 gint w, h;
1394
1395 //data = g_malloc0(sizeof(struct ui_flt_manage_data));
1396 //if(!data) return NULL;
1397 memset(&data, 0, sizeof(data));
1398
1399 data.filter = filter;
1400
1401 parentwindow = gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW);
1402
1403 window = gtk_dialog_new_with_buttons (_("Edit filter"),
1404 GTK_WINDOW (parentwindow),
1405 0,
1406 _("_Reset"),
1407 55,
1408 _("_Cancel"),
1409 GTK_RESPONSE_REJECT,
1410 _("_OK"),
1411 GTK_RESPONSE_ACCEPT,
1412 NULL);
1413
1414 gtk_window_set_icon_name(GTK_WINDOW (window), ICONNAME_HB_FILTER);
1415
1416 //set a nice dialog size
1417 gtk_window_get_size(GTK_WINDOW(parentwindow), &w, &h);
1418 gtk_window_set_default_size (GTK_WINDOW(window), -1, 0.8*h);
1419
1420
1421 //store our window private data
1422 g_object_set_data(G_OBJECT(window), "inst_data", (gpointer)&data);
1423 DB( g_print("(ui_flt_manage) window=%p, inst_data=%p\n", window, &data) );
1424
1425 g_signal_connect (window, "destroy",
1426 G_CALLBACK (gtk_widget_destroyed), &window);
1427
1428 content = gtk_dialog_get_content_area(GTK_DIALOG (window));
1429 mainbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
1430 gtk_box_pack_start (GTK_BOX (content), mainbox, TRUE, TRUE, 0);
1431 //gtk_container_set_border_width (GTK_CONTAINER(mainbox), SPACING_MEDIUM);
1432
1433 box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1434 gtk_box_pack_start (GTK_BOX (mainbox), box, TRUE, TRUE, 0);
1435
1436 sidebar = gtk_stack_sidebar_new ();
1437 gtk_box_pack_start (GTK_BOX (box), sidebar, FALSE, FALSE, 0);
1438
1439
1440 stack = gtk_stack_new ();
1441 gtk_stack_set_transition_type (GTK_STACK (stack), GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN);
1442 gtk_stack_sidebar_set_stack (GTK_STACK_SIDEBAR (sidebar), GTK_STACK (stack));
1443 data.stack = stack;
1444 gtk_box_pack_start (GTK_BOX (box), stack, TRUE, TRUE, 0);
1445
1446
1447 //common (date + status + amount)
1448 /* label = gtk_label_new(_("General"));
1449 page = ui_flt_manage_page_general(&data);
1450 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, label);
1451 */
1452
1453 page = ui_flt_manage_part_date(&data);
1454 //gtk_widget_show(GTK_WIDGET(page));
1455 gtk_stack_add_titled (GTK_STACK (stack), page, "dat", _("Dates"));
1456
1457 page = ui_flt_manage_part_status(&data);
1458 //gtk_widget_show(GTK_WIDGET(page));
1459 gtk_stack_add_titled (GTK_STACK (stack), page, "sta", _("Statuses"));
1460
1461 page = ui_flt_manage_part_paymode(&data);
1462 //gtk_widget_show(GTK_WIDGET(page));
1463 gtk_stack_add_titled (GTK_STACK (stack), page, "pmt", _("Payments"));
1464
1465 page = ui_flt_manage_part_amount(&data);
1466 //gtk_widget_show(GTK_WIDGET(page));
1467 gtk_stack_add_titled (GTK_STACK (stack), page, "amt", _("Amounts"));
1468
1469 page = ui_flt_manage_part_text(&data);
1470 //gtk_widget_show(GTK_WIDGET(page));
1471 gtk_stack_add_titled (GTK_STACK (stack), page, "txt", _("Texts"));
1472
1473 page = ui_flt_manage_page_category(&data);
1474 //gtk_widget_show(GTK_WIDGET(page));
1475 gtk_stack_add_titled (GTK_STACK (stack), page, "cat", _("Categories"));
1476
1477 page = ui_flt_manage_page_payee(&data);
1478 //gtk_widget_show(GTK_WIDGET(page));
1479 gtk_stack_add_titled (GTK_STACK (stack), page, "pay", _("Payees"));
1480
1481 data.show_account = show_account;
1482 if(show_account == TRUE)
1483 {
1484 page = ui_flt_manage_page_account(&data);
1485 //gtk_widget_show(GTK_WIDGET(page));
1486 gtk_stack_add_titled (GTK_STACK (stack), page, "acc", _("Accounts"));
1487 }
1488
1489 //setup, init and show window
1490 ui_flt_manage_setup(&data);
1491 ui_flt_manage_set(&data);
1492
1493 ui_flt_manage_option_update(window, NULL);
1494
1495
1496 /* signal connect */
1497 g_signal_connect (data.CY_option[FILTER_STATUS] , "changed", G_CALLBACK (ui_flt_manage_option_update), NULL);
1498 g_signal_connect (data.CY_option[FILTER_DATE] , "changed", G_CALLBACK (ui_flt_manage_option_update), NULL);
1499 g_signal_connect (data.CY_option[FILTER_AMOUNT] , "changed", G_CALLBACK (ui_flt_manage_option_update), NULL);
1500 g_signal_connect (data.CY_option[FILTER_PAYMODE] , "changed", G_CALLBACK (ui_flt_manage_option_update), NULL);
1501
1502 g_signal_connect (data.CY_option[FILTER_PAYEE] , "changed", G_CALLBACK (ui_flt_manage_option_update), NULL);
1503 g_signal_connect (data.CY_option[FILTER_CATEGORY], "changed", G_CALLBACK (ui_flt_manage_option_update), NULL);
1504 g_signal_connect (data.CY_option[FILTER_TEXT] , "changed", G_CALLBACK (ui_flt_manage_option_update), NULL);
1505
1506 if(show_account == TRUE)
1507 {
1508 g_signal_connect (data.CY_option[FILTER_ACCOUNT] , "changed", G_CALLBACK (ui_flt_manage_option_update), NULL);
1509
1510 }
1511
1512 g_signal_connect (data.CY_month, "changed", G_CALLBACK (ui_flt_manage_period_change), NULL);
1513 g_signal_connect (data.NB_year, "value-changed", G_CALLBACK (ui_flt_manage_period_change), NULL);
1514
1515
1516 gtk_widget_show_all (window);
1517
1518
1519 if( *data.filter->last_tab != '\0' )
1520 gtk_stack_set_visible_child_name (GTK_STACK(data.stack), data.filter->last_tab);
1521 DB( g_print(" set page '%s'\n", data.filter->last_tab) );
1522
1523
1524 //wait for the user
1525 gint retval; // = 55;
1526
1527 //while( result == 55 )
1528 //{
1529 retval = gtk_dialog_run (GTK_DIALOG (window));
1530
1531 switch (retval)
1532 {
1533 case GTK_RESPONSE_ACCEPT:
1534 //do_application_specific_something ();
1535 ui_flt_manage_get(&data);
1536 break;
1537 case 55:
1538 ui_flt_manage_clear(window, NULL);
1539 ui_flt_manage_get(&data);
1540 break;
1541 default:
1542 //do_nothing_since_dialog_was_cancelled ();
1543 break;
1544 }
1545 //}
1546
1547 // cleanup and destroy
1548 //ui_flt_manage_cleanup(&data, result);
1549
1550
1551 DB( g_print(" free\n") );
1552 //g_free(data);
1553
1554 DB( g_print(" destroy\n") );
1555 gtk_widget_destroy (window);
1556
1557 DB( g_print(" all ok\n") );
1558
1559 return retval;
1560 }
This page took 0.10106 seconds and 4 git commands to generate.