1 /* HomeBank -- Free, easy, personal ruleing for everyone.
2 * Copyright (C) 1995-2018 Maxime DOYEN
4 * This file is part of HomeBank.
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.
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.
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/>.
22 #include "ui-assign.h"
24 #include "ui-category.h"
35 /* our global datas */
36 extern struct HomeBank
*GLOBALS
;
37 extern struct Preferences
*PREFS
;
39 gchar
*CYA_ASG_FIELD
[] = {
45 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
48 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
52 ui_asg_listview_toggled_cb (GtkCellRendererToggle
*cell
,
56 GtkTreeModel
*model
= (GtkTreeModel
*)data
;
58 GtkTreePath
*path
= gtk_tree_path_new_from_string (path_str
);
61 /* get toggled iter */
62 gtk_tree_model_get_iter (model
, &iter
, path
);
63 gtk_tree_model_get (model
, &iter
, LST_DEFASG_TOGGLE
, &fixed
, -1);
65 /* do something with the value */
69 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, LST_DEFASG_TOGGLE
, fixed
, -1);
72 gtk_tree_path_free (path
);
76 ui_asg_listview_compare_func (GtkTreeModel
*model
, GtkTreeIter
*a
, GtkTreeIter
*b
, gpointer userdata
)
78 Assign
*entry1
, *entry2
;
80 gtk_tree_model_get(model
, a
, LST_DEFASG_DATAS
, &entry1
, -1);
81 gtk_tree_model_get(model
, b
, LST_DEFASG_DATAS
, &entry2
, -1);
83 return hb_string_utf8_compare(entry1
->text
, entry2
->text
);
87 ui_asg_listview_name_cell_data_function (GtkTreeViewColumn
*col
,
88 GtkCellRenderer
*renderer
,
99 gtk_tree_model_get(model
, iter
, LST_DEFASG_DATAS
, &entry
, -1);
100 if(entry
->text
== NULL
)
101 name
= _("(none)"); // can never occurs also
106 string
= g_strdup_printf ("[%d] %s", entry
->key
, name
);
107 g_object_set(renderer
, "text", string
, NULL
);
110 g_object_set(renderer
, "text", name
, NULL
);
117 /* = = = = = = = = = = = = = = = = */
122 * Add a single element (useful for dynamics add)
128 ui_asg_listview_add(GtkTreeView
*treeview
, Assign
*item
)
130 if( item
->text
!= NULL
)
135 model
= gtk_tree_view_get_model(treeview
);
137 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
138 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
139 LST_DEFASG_TOGGLE
, FALSE
,
140 LST_DEFASG_DATAS
, item
,
143 gtk_tree_selection_select_iter (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview
)), &iter
);
149 ui_asg_listview_get_selected_key(GtkTreeView
*treeview
)
151 GtkTreeSelection
*selection
;
155 selection
= gtk_tree_view_get_selection(treeview
);
156 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
160 gtk_tree_model_get(model
, &iter
, LST_DEFASG_DATAS
, &item
, -1);
169 ui_asg_listview_remove_selected(GtkTreeView
*treeview
)
171 GtkTreeSelection
*selection
;
175 selection
= gtk_tree_view_get_selection(treeview
);
176 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
178 gtk_list_store_remove(GTK_LIST_STORE(model
), &iter
);
183 static gint ui_asg_glist_compare_func(Assign *a, Assign *b)
185 return 0; //((gint)a->pos - b->pos);
189 void ui_asg_listview_populate(GtkWidget
*view
)
195 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(view
));
197 gtk_list_store_clear (GTK_LIST_STORE(model
));
199 g_object_ref(model
); /* Make sure the model stays with us after the tree view unrefs it */
200 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), NULL
); /* Detach model from view */
203 //g_hash_table_foreach(GLOBALS->h_rul, (GHFunc)ui_asg_listview_populate_ghfunc, model);
204 lrul
= list
= g_hash_table_get_values(GLOBALS
->h_rul
);
206 //list = g_list_sort(list, (GCompareFunc)ui_asg_glist_compare_func);
209 Assign
*item
= list
->data
;
211 DB( g_print(" populate: %d\n", item
->key
) );
213 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
214 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
215 LST_DEFASG_TOGGLE
, FALSE
,
216 LST_DEFASG_DATAS
, item
,
219 list
= g_list_next(list
);
223 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), model
); /* Re-attach model to view */
224 g_object_unref(model
);
229 ui_asg_listview_new(gboolean withtoggle
)
233 GtkCellRenderer
*renderer
;
234 GtkTreeViewColumn
*column
;
237 store
= gtk_list_store_new(NUM_LST_DEFASG
,
243 treeview
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
244 g_object_unref(store
);
246 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (treeview
), PREFS
->grid_lines
);
249 if( withtoggle
== TRUE
)
251 renderer
= gtk_cell_renderer_toggle_new ();
252 column
= gtk_tree_view_column_new_with_attributes (_("Visible"),
254 "active", LST_DEFASG_TOGGLE
,
256 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
258 g_signal_connect (renderer
, "toggled",
259 G_CALLBACK (ui_asg_listview_toggled_cb
), store
);
264 renderer
= gtk_cell_renderer_text_new ();
265 g_object_set(renderer
,
266 "ellipsize", PANGO_ELLIPSIZE_END
,
267 "ellipsize-set", TRUE
,
270 column
= gtk_tree_view_column_new();
271 gtk_tree_view_column_set_title(column
, _("Text"));
272 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
273 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_asg_listview_name_cell_data_function
, GINT_TO_POINTER(LST_DEFASG_DATAS
), NULL
);
274 gtk_tree_view_column_set_alignment (column
, 0.5);
275 gtk_tree_view_column_set_resizable(column
, TRUE
);
276 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
279 //gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(treeview), FALSE);
280 gtk_tree_view_set_reorderable (GTK_TREE_VIEW(treeview
), TRUE
);
282 gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store
), ui_asg_listview_compare_func
, NULL
, NULL
);
283 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store
), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID
, GTK_SORT_ASCENDING
);
288 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
291 assign_rename(Assign
*item
, gchar
*newname
)
295 existitem
= da_asg_get_by_name(newname
);
296 if( existitem
== NULL
)
299 item
->text
= g_strdup(newname
);
308 static void ui_asg_manage_getlast(struct ui_asg_manage_data
*data
)
313 DB( g_print("\n(ui_asg_manage_getlast)\n") );
315 DB( g_print(" -> for assign id=%d\n", data
->lastkey
) );
317 item
= da_asg_get(data
->lastkey
);
322 item
->field
= radio_get_active(GTK_CONTAINER(data
->CY_field
));
324 /*txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_text));
327 bool = assign_rename(item, txt);
330 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data->LV_rul));
334 gtk_entry_set_text(GTK_ENTRY(data->ST_text), item->text);
340 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_exact
));
341 if(active
== 1) item
->flags
|= ASGF_EXACT
;
343 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_re
));
344 if(active
== 1) item
->flags
|= ASGF_REGEX
;
346 active
= radio_get_active (GTK_CONTAINER(data
->RA_pay
));
347 if(active
== 1) item
->flags
|= ASGF_DOPAY
;
349 if(active
== 2) item
->flags
|= ASGF_OVWPAY
;
351 active
= radio_get_active (GTK_CONTAINER(data
->RA_cat
));
352 if(active
== 1) item
->flags
|= ASGF_DOCAT
;
354 if(active
== 2) item
->flags
|= ASGF_OVWCAT
;
356 active
= radio_get_active (GTK_CONTAINER(data
->RA_mod
));
357 if(active
== 1) item
->flags
|= ASGF_DOMOD
;
359 if(active
== 2) item
->flags
|= ASGF_OVWMOD
;
361 item
->kcat
= ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data
->PO_cat
));
362 item
->kpay
= ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data
->PO_pay
));
363 item
->paymode
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mod
));
372 ** set widgets contents from the selected assign
374 static void ui_asg_manage_set(GtkWidget
*widget
, gpointer user_data
)
376 struct ui_asg_manage_data
*data
;
377 GtkTreeSelection
*selection
;
383 DB( g_print("\n(ui_asg_manage_set)\n") );
385 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
387 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_rul
));
388 //if true there is a selected node
389 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
391 gtk_tree_model_get(model
, &iter
, LST_DEFASG_DATAS
, &item
, -1);
393 DB( g_print(" -> set rul id=%d\n", item
->key
) );
395 radio_set_active(GTK_CONTAINER(data
->CY_field
), item
->field
);
397 gtk_entry_set_text(GTK_ENTRY(data
->ST_text
), item
->text
);
399 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_exact
), (item
->flags
& ASGF_EXACT
) ? 1 : 0);
400 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_re
), (item
->flags
& ASGF_REGEX
) ? 1 : 0);
403 if(item
->flags
& ASGF_DOPAY
) active
= 1;
404 else if(item
->flags
& ASGF_OVWPAY
) active
= 2;
405 radio_set_active(GTK_CONTAINER(data
->RA_pay
), active
);
406 ui_pay_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_pay
), item
->kpay
);
409 if(item
->flags
& ASGF_DOCAT
) active
= 1;
410 else if(item
->flags
& ASGF_OVWCAT
) active
= 2;
411 radio_set_active(GTK_CONTAINER(data
->RA_cat
), active
);
412 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_cat
), item
->kcat
);
415 if(item
->flags
& ASGF_DOMOD
) active
= 1;
416 else if(item
->flags
& ASGF_OVWMOD
) active
= 2;
417 radio_set_active(GTK_CONTAINER(data
->RA_mod
), active
);
418 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->NU_mod
), item
->paymode
);
425 static gboolean ui_asg_manage_focus_out(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
427 ui_asg_manage_get(widget, user_data);
432 static void ui_asg_manage_update_assignments(GtkWidget
*widget
, gpointer user_data
)
434 struct ui_asg_manage_data
*data
;
437 DB( g_print("\n(ui_asg_manage_update_assignments)\n") );
439 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
441 sensitive
= (radio_get_active (GTK_CONTAINER(data
->RA_pay
)) > 0) ? TRUE
: FALSE
;
442 gtk_widget_set_sensitive(data
->LB_pay
, sensitive
);
443 gtk_widget_set_sensitive(data
->PO_pay
, sensitive
);
445 sensitive
= (radio_get_active (GTK_CONTAINER(data
->RA_cat
)) > 0) ? TRUE
: FALSE
;
446 gtk_widget_set_sensitive(data
->LB_cat
, sensitive
);
447 gtk_widget_set_sensitive(data
->PO_cat
, sensitive
);
449 sensitive
= (radio_get_active (GTK_CONTAINER(data
->RA_mod
)) > 0) ? TRUE
: FALSE
;
450 gtk_widget_set_sensitive(data
->LB_mod
, sensitive
);
451 gtk_widget_set_sensitive(data
->NU_mod
, sensitive
);
456 ** update the widgets status and contents from action/selection value
458 static void ui_asg_manage_update(GtkWidget
*widget
, gpointer user_data
)
460 struct ui_asg_manage_data
*data
;
463 gboolean selected
, sensitive
;
467 DB( g_print("\n(ui_asg_manage_update)\n") );
469 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
470 //window = gtk_widget_get_ancestor(GTK_WIDGET(treeview), GTK_TYPE_WINDOW);
471 //DB( g_print("(defpayee) widget=%08lx, window=%08lx, inst_data=%08lx\n", treeview, window, data) );
473 //if true there is a selected node
474 selected
= gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_rul
)), &model
, &iter
);
475 key
= ui_asg_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_rul
));
477 DB( g_print(" -> selected = %d action = %d key = %d\n", selected
, data
->action
, key
) );
480 sensitive
= (selected
== TRUE
) ? TRUE
: FALSE
;
481 gtk_widget_set_sensitive(data
->GR_condition
, sensitive
);
482 gtk_widget_set_sensitive(data
->GR_pay
, sensitive
);
483 gtk_widget_set_sensitive(data
->GR_cat
, sensitive
);
484 gtk_widget_set_sensitive(data
->GR_mod
, sensitive
);
486 //sensitive = (data->action == 0) ? TRUE : FALSE;
487 //gtk_widget_set_sensitive(data->LV_rul, sensitive);
488 //gtk_widget_set_sensitive(data->BT_add, sensitive);
490 sensitive
= (selected
== TRUE
&& data
->action
== 0) ? TRUE
: FALSE
;
491 //gtk_widget_set_sensitive(data->BT_mod, sensitive);
492 gtk_widget_set_sensitive(data
->BT_rem
, sensitive
);
496 if(key
!= data
->lastkey
)
498 DB( g_print(" -> should first do a get for assign %d\n", data
->lastkey
) );
499 ui_asg_manage_getlast(data
);
502 ui_asg_manage_set(widget
, NULL
);
503 ui_asg_manage_update_assignments(widget
, NULL
);
512 ** add an empty new assign to our temp GList and treeview
514 static void ui_asg_manage_add(GtkWidget
*widget
, gpointer user_data
)
516 struct ui_asg_manage_data
*data
;
519 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
520 DB( g_print("\n(ui_asg_manage_add) (data=%x)\n", (guint
)data
) );
522 item
= da_asg_malloc();
523 item
->text
= g_strdup_printf( _("(assignment %d)"), da_asg_length()+1);
526 ui_asg_listview_add(GTK_TREE_VIEW(data
->LV_rul
), item
);
532 ** delete the selected assign to our treeview and temp GList
534 static void ui_asg_manage_delete(GtkWidget
*widget
, gpointer user_data
)
536 struct ui_asg_manage_data
*data
;
540 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
541 DB( g_print("\n(ui_asg_manage_remove) (data=%x)\n", (guint
)data
) );
543 key
= ui_asg_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_rul
));
546 Assign
*item
= da_asg_get(key
);
550 title
= g_strdup_printf (
551 _("Are you sure you want to permanently delete '%s'?"), item
->text
);
553 secondtext
= _("If you delete an assignment, it will be permanently lost.");
555 result
= ui_dialog_msg_confirm_alert(
556 GTK_WINDOW(data
->window
),
564 if( result
== GTK_RESPONSE_OK
)
567 ui_asg_listview_remove_selected(GTK_TREE_VIEW(data
->LV_rul
));
574 ** rename the selected assign to our treeview and temp GList
576 static void ui_asg_manage_rename(GtkWidget
*widget
, gpointer user_data
)
578 struct ui_asg_manage_data
*data
;
583 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
584 DB( g_print("\n(ui_asg_manage_rename) (data=%x)\n", (guint
)data
) );
588 key
= ui_asg_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_rul
));
591 Assign
*item
= da_asg_get(key
);
593 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_text
));
594 if( txt
== NULL
|| *txt
== '\0' )
600 if( strcmp(txt
, item
->text
) )
602 if( assign_rename(item
, txt
) == TRUE
)
604 //todo: review this count
606 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_rul
));
614 gtk_style_context_remove_class (gtk_widget_get_style_context (GTK_WIDGET(data
->ST_text
)), GTK_STYLE_CLASS_ERROR
);
617 gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET(data
->ST_text
)), GTK_STYLE_CLASS_ERROR
);
624 static void ui_asg_manage_selection(GtkTreeSelection
*treeselection
, gpointer user_data
)
626 ui_asg_manage_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), NULL
);
629 //gint ui_asg_manage_list_sort(struct _Assign *a, struct _Assign *b) { return( a->rul_Id - b->rul_Id); }
634 static gboolean
ui_asg_manage_cleanup(struct ui_asg_manage_data
*data
, gint result
)
637 gboolean doupdate
= FALSE
;
639 DB( g_print("\n(ui_asg_manage_cleanup) %x\n", (guint
)data
) );
641 key
= ui_asg_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_rul
));
645 DB( g_print(" -> should first do a get for assign %d\n", data
->lastkey
) );
646 ui_asg_manage_getlast(data
);
649 // test for change & store new position
651 model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_rul));
652 i=1; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
657 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
658 LST_DEFASG_DATAS, &item,
661 DB( g_print(" -> check rul %d, pos is %d, %s\n", i, item->pos, item->text) );
668 // Make iter point to the next row in the list store
669 i++; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
673 GLOBALS
->changes_count
+= data
->change
;
681 static void ui_asg_manage_setup(struct ui_asg_manage_data
*data
)
684 DB( g_print("\n(ui_asg_manage_setup)\n") );
687 data
->tmp_list
= NULL
; //hb-glist_clone_list(GLOBALS->rul_list, sizeof(struct _Assign));
692 ui_asg_listview_populate(data
->LV_rul
);
694 ui_pay_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_pay
), GLOBALS
->h_pay
);
695 ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_cat
), GLOBALS
->h_cat
);
698 static gchar
*CYA_ASG_ACTION
[] = {
710 GtkWidget
*ui_asg_manage_dialog (void)
712 struct ui_asg_manage_data data
;
713 GtkWidget
*window
, *content
, *mainbox
;
714 GtkWidget
*content_grid
, *group_grid
;
715 GtkWidget
*table
, *label
, *entry1
;
716 GtkWidget
*scrollwin
;
717 GtkWidget
*widget
, *hpaned
;
718 gint w
, h
, crow
, row
;
720 window
= gtk_dialog_new_with_buttons (_("Manage Assignments"),
721 GTK_WINDOW(GLOBALS
->mainwindow
),
727 data
.window
= window
;
729 //set the window icon
730 gtk_window_set_icon_name(GTK_WINDOW (window
), ICONNAME_HB_ASSIGN
);
732 //set a nice dialog size
733 gtk_window_get_size(GTK_WINDOW(GLOBALS
->mainwindow
), &w
, &h
);
734 gtk_window_set_default_size (GTK_WINDOW(window
), -1, h
/PHI
);
736 //store our window private data
737 g_object_set_data(G_OBJECT(window
), "inst_data", (gpointer
)&data
);
738 DB( g_print("(ui_asg_manage_) window=%x, inst_data=%x\n", (guint
)window
, (guint
)&data
) );
741 content
= gtk_dialog_get_content_area(GTK_DIALOG (window
)); // return a vbox
744 mainbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
745 gtk_box_pack_start (GTK_BOX (content
), mainbox
, TRUE
, TRUE
, 0);
746 gtk_container_set_border_width (GTK_CONTAINER(mainbox
), SPACING_MEDIUM
);
748 hpaned
= gtk_paned_new(GTK_ORIENTATION_HORIZONTAL
);
749 gtk_box_pack_start (GTK_BOX (mainbox
), hpaned
, TRUE
, TRUE
, 0);
752 table
= gtk_grid_new ();
753 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_SMALL
);
754 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
755 //gtk_box_pack_start (GTK_BOX (mainbox), table, FALSE, FALSE, 0);
756 gtk_widget_set_margin_right(table
, SPACING_SMALL
);
757 gtk_paned_pack1 (GTK_PANED(hpaned
), table
, FALSE
, FALSE
);
760 scrollwin
= gtk_scrolled_window_new(NULL
,NULL
);
761 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin
), GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
762 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
763 data
.LV_rul
= ui_asg_listview_new(FALSE
);
764 gtk_widget_set_size_request(data
.LV_rul
, HB_MINWIDTH_LIST
, -1);
765 gtk_container_add(GTK_CONTAINER(scrollwin
), data
.LV_rul
);
766 gtk_widget_set_vexpand (scrollwin
, TRUE
);
767 gtk_widget_set_hexpand (scrollwin
, TRUE
);
768 gtk_grid_attach (GTK_GRID(table
), scrollwin
, 0, row
, 2, 1);
771 widget
= gtk_button_new_with_mnemonic(_("_Add"));
772 data
.BT_add
= widget
;
773 gtk_grid_attach (GTK_GRID(table
), widget
, 0, row
, 1, 1);
775 widget
= gtk_button_new_with_mnemonic(_("_Delete"));
776 data
.BT_rem
= widget
;
777 gtk_grid_attach (GTK_GRID(table
), widget
, 1, row
, 1, 1);
781 content_grid
= gtk_grid_new();
782 gtk_grid_set_row_spacing (GTK_GRID (content_grid
), SPACING_LARGE
);
783 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid
), GTK_ORIENTATION_VERTICAL
);
784 //gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM);
785 gtk_widget_set_margin_left(content_grid
, SPACING_SMALL
);
786 gtk_paned_pack2 (GTK_PANED(hpaned
), content_grid
, FALSE
, FALSE
);
788 // group :: Condition
790 group_grid
= gtk_grid_new ();
791 data
.GR_condition
= group_grid
;
792 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
793 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
794 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
, 1, 1);
797 label
= make_label_group(_("Condition"));
798 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 3, 1);
801 label
= make_label_widget(_("Search _in:"));
802 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
803 widget
= make_radio(CYA_ASG_FIELD
, FALSE
, GTK_ORIENTATION_HORIZONTAL
);
804 data
.CY_field
= widget
;
805 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 2, 1);
808 //label = make_label_widget(_("Con_tains:"));
809 label
= make_label_widget(_("Fi_nd:"));
810 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
811 entry1
= make_string(label
);
812 data
.ST_text
= entry1
;
813 gtk_widget_set_hexpand(entry1
, TRUE
);
814 gtk_grid_attach (GTK_GRID (group_grid
), entry1
, 2, row
, 2, 1);
817 widget
= gtk_check_button_new_with_mnemonic (_("Match _case"));
818 data
.CM_exact
= widget
;
819 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 2, 1);
822 widget
= gtk_check_button_new_with_mnemonic (_("Use _regular expressions"));
824 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 2, 1);
828 // group :: Assign payee
830 group_grid
= gtk_grid_new ();
831 data
.GR_pay
= group_grid
;
832 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
833 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
834 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
, 1, 1);
837 label
= make_label_group(_("Assign payee"));
838 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 3, 1);
841 widget
= make_radio(CYA_ASG_ACTION
, FALSE
, GTK_ORIENTATION_HORIZONTAL
);
842 data
.RA_pay
= widget
;
843 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
846 label
= make_label_widget (_("_Payee:"));
848 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
850 widget
= ui_pay_comboboxentry_new(label
);
851 data
.PO_pay
= widget
;
852 gtk_widget_set_hexpand(widget
, TRUE
);
853 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
856 //gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available for Payee"));
859 group_grid
= gtk_grid_new ();
860 data
.GR_cat
= group_grid
;
861 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
862 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
863 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
, 1, 1);
866 label
= make_label_group(_("Assign category"));
867 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 3, 1);
870 widget
= make_radio(CYA_ASG_ACTION
, FALSE
, GTK_ORIENTATION_HORIZONTAL
);
871 data
.RA_cat
= widget
;
872 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
875 label
= make_label_widget (_("_Category:"));
877 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
879 widget
= ui_cat_comboboxentry_new(label
);
880 data
.PO_cat
= widget
;
881 gtk_widget_set_hexpand(widget
, TRUE
);
882 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
884 //gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available for Category"));
887 group_grid
= gtk_grid_new ();
888 data
.GR_mod
= group_grid
;
889 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
890 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
891 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
, 1, 1);
894 label
= make_label_group(_("Assign payment"));
895 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 3, 1);
898 widget
= make_radio(CYA_ASG_ACTION
, FALSE
, GTK_ORIENTATION_HORIZONTAL
);
899 data
.RA_mod
= widget
;
900 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
903 label
= make_label_widget (_("Pay_ment:"));
905 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
907 widget
= make_paymode_nointxfer (label
);
908 data
.NU_mod
= widget
;
909 gtk_widget_set_hexpand(widget
, TRUE
);
910 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
913 //gtk_widget_set_tooltip_text(widget, _("Internal transfer unsupported\nin auto assignments"));
916 //connect all our signals
917 g_signal_connect (window
, "destroy", G_CALLBACK (gtk_widget_destroyed
), &window
);
919 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data
.LV_rul
)), "changed", G_CALLBACK (ui_asg_manage_selection
), NULL
);
921 g_signal_connect (G_OBJECT (data
.ST_text
), "changed", G_CALLBACK (ui_asg_manage_rename
), NULL
);
923 widget
= radio_get_nth_widget(GTK_CONTAINER(data
.RA_pay
), 0);
925 g_signal_connect (widget
, "toggled", G_CALLBACK (ui_asg_manage_update_assignments
), NULL
);
927 widget
= radio_get_nth_widget(GTK_CONTAINER(data
.RA_cat
), 0);
929 g_signal_connect (widget
, "toggled", G_CALLBACK (ui_asg_manage_update_assignments
), NULL
);
931 widget
= radio_get_nth_widget(GTK_CONTAINER(data
.RA_mod
), 0);
933 g_signal_connect (widget
, "toggled", G_CALLBACK (ui_asg_manage_update_assignments
), NULL
);
935 g_signal_connect (G_OBJECT (data
.BT_add
), "clicked", G_CALLBACK (ui_asg_manage_add
), NULL
);
936 g_signal_connect (G_OBJECT (data
.BT_rem
), "clicked", G_CALLBACK (ui_asg_manage_delete
), NULL
);
938 //setup, init and show window
939 ui_asg_manage_setup(&data
);
940 ui_asg_manage_update(data
.LV_rul
, NULL
);
942 // gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
944 gtk_widget_show_all (window
);
947 gint result
= gtk_dialog_run (GTK_DIALOG (window
));
949 // cleanup and destroy
950 ui_asg_manage_cleanup(&data
, result
);
951 gtk_widget_destroy (window
);