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