1 /* HomeBank -- Free, easy, personal ruleing for everyone.
2 * Copyright (C) 1995-2016 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
;
38 gchar
*CYA_ASG_FIELD
[] = {
44 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
47 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
51 ui_asg_listview_toggled_cb (GtkCellRendererToggle
*cell
,
55 GtkTreeModel
*model
= (GtkTreeModel
*)data
;
57 GtkTreePath
*path
= gtk_tree_path_new_from_string (path_str
);
60 /* get toggled iter */
61 gtk_tree_model_get_iter (model
, &iter
, path
);
62 gtk_tree_model_get (model
, &iter
, LST_DEFASG_TOGGLE
, &fixed
, -1);
64 /* do something with the value */
68 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, LST_DEFASG_TOGGLE
, fixed
, -1);
71 gtk_tree_path_free (path
);
75 ui_asg_listview_compare_func (GtkTreeModel
*model
, GtkTreeIter
*a
, GtkTreeIter
*b
, gpointer userdata
)
77 Assign
*entry1
, *entry2
;
79 gtk_tree_model_get(model
, a
, LST_DEFASG_DATAS
, &entry1
, -1);
80 gtk_tree_model_get(model
, b
, LST_DEFASG_DATAS
, &entry2
, -1);
82 return hb_string_utf8_compare(entry1
->text
, entry2
->text
);
86 ui_asg_listview_name_cell_data_function (GtkTreeViewColumn
*col
,
87 GtkCellRenderer
*renderer
,
98 gtk_tree_model_get(model
, iter
, LST_DEFASG_DATAS
, &entry
, -1);
99 if(entry
->text
== NULL
)
100 name
= _("(none)"); // can never occurs also
105 string
= g_strdup_printf ("[%d] %s", entry
->key
, name
);
106 g_object_set(renderer
, "text", string
, NULL
);
109 g_object_set(renderer
, "text", name
, NULL
);
116 /* = = = = = = = = = = = = = = = = */
121 * Add a single element (useful for dynamics add)
127 ui_asg_listview_add(GtkTreeView
*treeview
, Assign
*item
)
129 if( item
->text
!= NULL
)
134 model
= gtk_tree_view_get_model(treeview
);
136 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
137 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
138 LST_DEFASG_TOGGLE
, FALSE
,
139 LST_DEFASG_DATAS
, item
,
142 gtk_tree_selection_select_iter (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview
)), &iter
);
148 ui_asg_listview_get_selected_key(GtkTreeView
*treeview
)
150 GtkTreeSelection
*selection
;
154 selection
= gtk_tree_view_get_selection(treeview
);
155 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
159 gtk_tree_model_get(model
, &iter
, LST_DEFASG_DATAS
, &item
, -1);
168 ui_asg_listview_remove_selected(GtkTreeView
*treeview
)
170 GtkTreeSelection
*selection
;
174 selection
= gtk_tree_view_get_selection(treeview
);
175 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
177 gtk_list_store_remove(GTK_LIST_STORE(model
), &iter
);
182 static gint ui_asg_glist_compare_func(Assign *a, Assign *b)
184 return 0; //((gint)a->pos - b->pos);
188 void ui_asg_listview_populate(GtkWidget
*view
)
194 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(view
));
196 gtk_list_store_clear (GTK_LIST_STORE(model
));
198 g_object_ref(model
); /* Make sure the model stays with us after the tree view unrefs it */
199 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), NULL
); /* Detach model from view */
202 //g_hash_table_foreach(GLOBALS->h_rul, (GHFunc)ui_asg_listview_populate_ghfunc, model);
203 lrul
= list
= g_hash_table_get_values(GLOBALS
->h_rul
);
205 //list = g_list_sort(list, (GCompareFunc)ui_asg_glist_compare_func);
208 Assign
*item
= list
->data
;
210 DB( g_print(" populate: %d\n", item
->key
) );
212 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
213 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
214 LST_DEFASG_TOGGLE
, FALSE
,
215 LST_DEFASG_DATAS
, item
,
218 list
= g_list_next(list
);
222 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), model
); /* Re-attach model to view */
223 g_object_unref(model
);
228 ui_asg_listview_new(gboolean withtoggle
)
232 GtkCellRenderer
*renderer
;
233 GtkTreeViewColumn
*column
;
236 store
= gtk_list_store_new(NUM_LST_DEFASG
,
242 treeview
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
243 g_object_unref(store
);
246 if( withtoggle
== TRUE
)
248 renderer
= gtk_cell_renderer_toggle_new ();
249 column
= gtk_tree_view_column_new_with_attributes (_("Visible"),
251 "active", LST_DEFASG_TOGGLE
,
253 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
255 g_signal_connect (renderer
, "toggled",
256 G_CALLBACK (ui_asg_listview_toggled_cb
), store
);
261 renderer
= gtk_cell_renderer_text_new ();
262 g_object_set(renderer
,
263 "ellipsize", PANGO_ELLIPSIZE_END
,
264 "ellipsize-set", TRUE
,
267 column
= gtk_tree_view_column_new();
268 gtk_tree_view_column_set_title(column
, _("Text"));
269 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
270 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_asg_listview_name_cell_data_function
, GINT_TO_POINTER(LST_DEFASG_DATAS
), NULL
);
271 gtk_tree_view_column_set_alignment (column
, 0.5);
272 gtk_tree_view_column_set_resizable(column
, TRUE
);
273 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview
), column
);
276 //gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(treeview), FALSE);
277 gtk_tree_view_set_reorderable (GTK_TREE_VIEW(treeview
), TRUE
);
279 gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store
), ui_asg_listview_compare_func
, NULL
, NULL
);
280 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store
), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID
, GTK_SORT_ASCENDING
);
285 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
288 assign_rename(Assign
*item
, gchar
*newname
)
292 existitem
= da_asg_get_by_name(newname
);
293 if( existitem
== NULL
)
296 item
->text
= g_strdup(newname
);
305 static void ui_asg_manage_getlast(struct ui_asg_manage_data
*data
)
310 DB( g_print("\n(ui_asg_manage_getlast)\n") );
312 DB( g_print(" -> for assign id=%d\n", data
->lastkey
) );
314 item
= da_asg_get(data
->lastkey
);
319 item
->field
= radio_get_active(GTK_CONTAINER(data
->CY_field
));
321 /*txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_text));
324 bool = assign_rename(item, txt);
327 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data->LV_rul));
331 gtk_entry_set_text(GTK_ENTRY(data->ST_text), item->text);
337 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_exact
));
338 if(active
== 1) item
->flags
|= ASGF_EXACT
;
340 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_re
));
341 if(active
== 1) item
->flags
|= ASGF_REGEX
;
343 active
= radio_get_active (GTK_CONTAINER(data
->RA_pay
));
344 if(active
== 1) item
->flags
|= ASGF_DOPAY
;
346 if(active
== 2) item
->flags
|= ASGF_OVWPAY
;
348 active
= radio_get_active (GTK_CONTAINER(data
->RA_cat
));
349 if(active
== 1) item
->flags
|= ASGF_DOCAT
;
351 if(active
== 2) item
->flags
|= ASGF_OVWCAT
;
353 active
= radio_get_active (GTK_CONTAINER(data
->RA_mod
));
354 if(active
== 1) item
->flags
|= ASGF_DOMOD
;
356 if(active
== 2) item
->flags
|= ASGF_OVWMOD
;
358 item
->kcat
= ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data
->PO_cat
));
359 item
->kpay
= ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data
->PO_pay
));
360 item
->paymode
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mod
));
369 ** set widgets contents from the selected assign
371 static void ui_asg_manage_set(GtkWidget
*widget
, gpointer user_data
)
373 struct ui_asg_manage_data
*data
;
374 GtkTreeSelection
*selection
;
380 DB( g_print("\n(ui_asg_manage_set)\n") );
382 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
384 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_rul
));
385 //if true there is a selected node
386 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
388 gtk_tree_model_get(model
, &iter
, LST_DEFASG_DATAS
, &item
, -1);
390 DB( g_print(" -> set rul id=%d\n", item
->key
) );
392 radio_set_active(GTK_CONTAINER(data
->CY_field
), item
->field
);
394 gtk_entry_set_text(GTK_ENTRY(data
->ST_text
), item
->text
);
396 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_exact
), (item
->flags
& ASGF_EXACT
) ? 1 : 0);
397 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_re
), (item
->flags
& ASGF_REGEX
) ? 1 : 0);
400 if(item
->flags
& ASGF_DOPAY
) active
= 1;
401 else if(item
->flags
& ASGF_OVWPAY
) active
= 2;
402 radio_set_active(GTK_CONTAINER(data
->RA_pay
), active
);
403 ui_pay_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_pay
), item
->kpay
);
406 if(item
->flags
& ASGF_DOCAT
) active
= 1;
407 else if(item
->flags
& ASGF_OVWCAT
) active
= 2;
408 radio_set_active(GTK_CONTAINER(data
->RA_cat
), active
);
409 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_cat
), item
->kcat
);
412 if(item
->flags
& ASGF_DOMOD
) active
= 1;
413 else if(item
->flags
& ASGF_OVWMOD
) active
= 2;
414 radio_set_active(GTK_CONTAINER(data
->RA_mod
), active
);
415 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->NU_mod
), item
->paymode
);
422 static gboolean ui_asg_manage_focus_out(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
424 ui_asg_manage_get(widget, user_data);
429 static void ui_asg_manage_update_assignments(GtkWidget
*widget
, gpointer user_data
)
431 struct ui_asg_manage_data
*data
;
434 DB( g_print("\n(ui_asg_manage_update_assignments)\n") );
436 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
438 sensitive
= (radio_get_active (GTK_CONTAINER(data
->RA_pay
)) > 0) ? TRUE
: FALSE
;
439 gtk_widget_set_sensitive(data
->LB_pay
, sensitive
);
440 gtk_widget_set_sensitive(data
->PO_pay
, sensitive
);
442 sensitive
= (radio_get_active (GTK_CONTAINER(data
->RA_cat
)) > 0) ? TRUE
: FALSE
;
443 gtk_widget_set_sensitive(data
->LB_cat
, sensitive
);
444 gtk_widget_set_sensitive(data
->PO_cat
, sensitive
);
446 sensitive
= (radio_get_active (GTK_CONTAINER(data
->RA_mod
)) > 0) ? TRUE
: FALSE
;
447 gtk_widget_set_sensitive(data
->LB_mod
, sensitive
);
448 gtk_widget_set_sensitive(data
->NU_mod
, sensitive
);
453 ** update the widgets status and contents from action/selection value
455 static void ui_asg_manage_update(GtkWidget
*widget
, gpointer user_data
)
457 struct ui_asg_manage_data
*data
;
460 gboolean selected
, sensitive
;
464 DB( g_print("\n(ui_asg_manage_update)\n") );
466 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
467 //window = gtk_widget_get_ancestor(GTK_WIDGET(treeview), GTK_TYPE_WINDOW);
468 //DB( g_print("(defpayee) widget=%08lx, window=%08lx, inst_data=%08lx\n", treeview, window, data) );
470 //if true there is a selected node
471 selected
= gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_rul
)), &model
, &iter
);
472 key
= ui_asg_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_rul
));
474 DB( g_print(" -> selected = %d action = %d key = %d\n", selected
, data
->action
, key
) );
477 sensitive
= (selected
== TRUE
) ? TRUE
: FALSE
;
478 gtk_widget_set_sensitive(data
->GR_condition
, sensitive
);
479 gtk_widget_set_sensitive(data
->GR_pay
, sensitive
);
480 gtk_widget_set_sensitive(data
->GR_cat
, sensitive
);
481 gtk_widget_set_sensitive(data
->GR_mod
, sensitive
);
483 //sensitive = (data->action == 0) ? TRUE : FALSE;
484 //gtk_widget_set_sensitive(data->LV_rul, sensitive);
485 //gtk_widget_set_sensitive(data->BT_add, sensitive);
487 sensitive
= (selected
== TRUE
&& data
->action
== 0) ? TRUE
: FALSE
;
488 //gtk_widget_set_sensitive(data->BT_mod, sensitive);
489 gtk_widget_set_sensitive(data
->BT_rem
, sensitive
);
493 if(key
!= data
->lastkey
)
495 DB( g_print(" -> should first do a get for assign %d\n", data
->lastkey
) );
496 ui_asg_manage_getlast(data
);
499 ui_asg_manage_set(widget
, NULL
);
500 ui_asg_manage_update_assignments(widget
, NULL
);
509 ** add an empty new assign to our temp GList and treeview
511 static void ui_asg_manage_add(GtkWidget
*widget
, gpointer user_data
)
513 struct ui_asg_manage_data
*data
;
516 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
517 DB( g_print("\n(ui_asg_manage_add) (data=%x)\n", (guint
)data
) );
519 item
= da_asg_malloc();
520 item
->text
= g_strdup_printf( _("(assignment %d)"), da_asg_length()+1);
523 ui_asg_listview_add(GTK_TREE_VIEW(data
->LV_rul
), item
);
529 ** delete the selected assign to our treeview and temp GList
531 static void ui_asg_manage_delete(GtkWidget
*widget
, gpointer user_data
)
533 struct ui_asg_manage_data
*data
;
537 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
538 DB( g_print("\n(ui_asg_manage_remove) (data=%x)\n", (guint
)data
) );
540 key
= ui_asg_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_rul
));
543 Assign
*item
= da_asg_get(key
);
547 title
= g_strdup_printf (
548 _("Are you sure you want to permanently delete '%s'?"), item
->text
);
550 secondtext
= _("If you delete an assignment, it will be permanently lost.");
552 result
= ui_dialog_msg_confirm_alert(
553 GTK_WINDOW(data
->window
),
561 if( result
== GTK_RESPONSE_OK
)
564 ui_asg_listview_remove_selected(GTK_TREE_VIEW(data
->LV_rul
));
571 ** rename the selected assign to our treeview and temp GList
573 static void ui_asg_manage_rename(GtkWidget
*widget
, gpointer user_data
)
575 struct ui_asg_manage_data
*data
;
580 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
581 DB( g_print("\n(ui_asg_manage_rename) (data=%x)\n", (guint
)data
) );
585 key
= ui_asg_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_rul
));
588 Assign
*item
= da_asg_get(key
);
590 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_text
));
591 if( txt
== NULL
|| *txt
== '\0' )
597 if( strcmp(txt
, item
->text
) )
599 if( assign_rename(item
, txt
) == TRUE
)
601 //todo: review this count
603 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_rul
));
611 gtk_style_context_remove_class (gtk_widget_get_style_context (GTK_WIDGET(data
->ST_text
)), GTK_STYLE_CLASS_ERROR
);
614 gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET(data
->ST_text
)), GTK_STYLE_CLASS_ERROR
);
621 static void ui_asg_manage_selection(GtkTreeSelection
*treeselection
, gpointer user_data
)
623 ui_asg_manage_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), NULL
);
626 //gint ui_asg_manage_list_sort(struct _Assign *a, struct _Assign *b) { return( a->rul_Id - b->rul_Id); }
631 static gboolean
ui_asg_manage_cleanup(struct ui_asg_manage_data
*data
, gint result
)
634 gboolean doupdate
= FALSE
;
636 DB( g_print("\n(ui_asg_manage_cleanup) %x\n", (guint
)data
) );
638 key
= ui_asg_listview_get_selected_key(GTK_TREE_VIEW(data
->LV_rul
));
642 DB( g_print(" -> should first do a get for assign %d\n", data
->lastkey
) );
643 ui_asg_manage_getlast(data
);
646 // test for change & store new position
648 model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_rul));
649 i=1; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
654 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
655 LST_DEFASG_DATAS, &item,
658 DB( g_print(" -> check rul %d, pos is %d, %s\n", i, item->pos, item->text) );
665 // Make iter point to the next row in the list store
666 i++; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
670 GLOBALS
->changes_count
+= data
->change
;
678 static void ui_asg_manage_setup(struct ui_asg_manage_data
*data
)
681 DB( g_print("\n(ui_asg_manage_setup)\n") );
684 data
->tmp_list
= NULL
; //hb-glist_clone_list(GLOBALS->rul_list, sizeof(struct _Assign));
689 ui_asg_listview_populate(data
->LV_rul
);
691 ui_pay_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_pay
), GLOBALS
->h_pay
);
692 ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_cat
), GLOBALS
->h_cat
);
695 static gchar
*CYA_ASG_ACTION
[] = {
707 GtkWidget
*ui_asg_manage_dialog (void)
709 struct ui_asg_manage_data data
;
710 GtkWidget
*window
, *content
, *mainbox
;
711 GtkWidget
*content_grid
, *group_grid
;
712 GtkWidget
*table
, *label
, *entry1
;
713 GtkWidget
*scrollwin
;
714 GtkWidget
*widget
, *hpaned
;
715 gint w
, h
, crow
, row
;
717 window
= gtk_dialog_new_with_buttons (_("Manage Assignments"),
718 GTK_WINDOW(GLOBALS
->mainwindow
),
724 data
.window
= window
;
726 //set the window icon
727 gtk_window_set_icon_name(GTK_WINDOW (window
), ICONNAME_HB_ASSIGN
);
729 //set a nice dialog size
730 gtk_window_get_size(GTK_WINDOW(GLOBALS
->mainwindow
), &w
, &h
);
731 gtk_window_set_default_size (GTK_WINDOW(window
), -1, h
/PHI
);
733 //store our window private data
734 g_object_set_data(G_OBJECT(window
), "inst_data", (gpointer
)&data
);
735 DB( g_print("(ui_asg_manage_) window=%x, inst_data=%x\n", (guint
)window
, (guint
)&data
) );
738 content
= gtk_dialog_get_content_area(GTK_DIALOG (window
)); // return a vbox
741 mainbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
742 gtk_box_pack_start (GTK_BOX (content
), mainbox
, TRUE
, TRUE
, 0);
743 gtk_container_set_border_width (GTK_CONTAINER(mainbox
), SPACING_MEDIUM
);
745 hpaned
= gtk_paned_new(GTK_ORIENTATION_HORIZONTAL
);
746 gtk_box_pack_start (GTK_BOX (mainbox
), hpaned
, TRUE
, TRUE
, 0);
749 table
= gtk_grid_new ();
750 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_SMALL
);
751 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
752 //gtk_box_pack_start (GTK_BOX (mainbox), table, FALSE, FALSE, 0);
753 gtk_widget_set_margin_right(table
, SPACING_SMALL
);
754 gtk_paned_pack1 (GTK_PANED(hpaned
), table
, FALSE
, FALSE
);
757 scrollwin
= gtk_scrolled_window_new(NULL
,NULL
);
758 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin
), GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
759 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
760 data
.LV_rul
= ui_asg_listview_new(FALSE
);
761 gtk_widget_set_size_request(data
.LV_rul
, HB_MINWIDTH_LIST
, -1);
762 gtk_container_add(GTK_CONTAINER(scrollwin
), data
.LV_rul
);
763 gtk_widget_set_vexpand (scrollwin
, TRUE
);
764 gtk_widget_set_hexpand (scrollwin
, TRUE
);
765 gtk_grid_attach (GTK_GRID(table
), scrollwin
, 0, row
, 2, 1);
768 widget
= gtk_button_new_with_mnemonic(_("_Add"));
769 data
.BT_add
= widget
;
770 gtk_grid_attach (GTK_GRID(table
), widget
, 0, row
, 1, 1);
772 widget
= gtk_button_new_with_mnemonic(_("_Delete"));
773 data
.BT_rem
= widget
;
774 gtk_grid_attach (GTK_GRID(table
), widget
, 1, row
, 1, 1);
778 content_grid
= gtk_grid_new();
779 gtk_grid_set_row_spacing (GTK_GRID (content_grid
), SPACING_LARGE
);
780 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid
), GTK_ORIENTATION_VERTICAL
);
781 //gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM);
782 gtk_widget_set_margin_left(content_grid
, SPACING_SMALL
);
783 gtk_paned_pack2 (GTK_PANED(hpaned
), content_grid
, FALSE
, FALSE
);
785 // group :: Condition
787 group_grid
= gtk_grid_new ();
788 data
.GR_condition
= group_grid
;
789 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
790 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
791 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
, 1, 1);
794 label
= make_label_group(_("Condition"));
795 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 3, 1);
798 label
= make_label_widget(_("Search _in:"));
799 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
800 widget
= make_radio(CYA_ASG_FIELD
, FALSE
, GTK_ORIENTATION_HORIZONTAL
);
801 data
.CY_field
= widget
;
802 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 2, 1);
805 //label = make_label_widget(_("Con_tains:"));
806 label
= make_label_widget(_("Fi_nd:"));
807 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
808 entry1
= make_string(label
);
809 data
.ST_text
= entry1
;
810 gtk_widget_set_hexpand(entry1
, TRUE
);
811 gtk_grid_attach (GTK_GRID (group_grid
), entry1
, 2, row
, 2, 1);
814 widget
= gtk_check_button_new_with_mnemonic (_("Match _case"));
815 data
.CM_exact
= widget
;
816 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 2, 1);
819 widget
= gtk_check_button_new_with_mnemonic (_("Use _regular expressions"));
821 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 2, 1);
825 // group :: Assign payee
827 group_grid
= gtk_grid_new ();
828 data
.GR_pay
= group_grid
;
829 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
830 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
831 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
, 1, 1);
834 label
= make_label_group(_("Assign payee"));
835 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 3, 1);
838 widget
= make_radio(CYA_ASG_ACTION
, FALSE
, GTK_ORIENTATION_HORIZONTAL
);
839 data
.RA_pay
= widget
;
840 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
843 label
= make_label_widget (_("_Payee:"));
845 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
847 widget
= ui_pay_comboboxentry_new(label
);
848 data
.PO_pay
= widget
;
849 gtk_widget_set_hexpand(widget
, TRUE
);
850 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
853 //gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available for Payee"));
856 group_grid
= gtk_grid_new ();
857 data
.GR_cat
= group_grid
;
858 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
859 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
860 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
, 1, 1);
863 label
= make_label_group(_("Assign category"));
864 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 3, 1);
867 widget
= make_radio(CYA_ASG_ACTION
, FALSE
, GTK_ORIENTATION_HORIZONTAL
);
868 data
.RA_cat
= widget
;
869 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
872 label
= make_label_widget (_("_Category:"));
874 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
876 widget
= ui_cat_comboboxentry_new(label
);
877 data
.PO_cat
= widget
;
878 gtk_widget_set_hexpand(widget
, TRUE
);
879 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
881 //gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available for Category"));
884 group_grid
= gtk_grid_new ();
885 data
.GR_mod
= group_grid
;
886 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
887 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
888 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, crow
, 1, 1);
891 label
= make_label_group(_("Assign payment"));
892 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 3, 1);
895 widget
= make_radio(CYA_ASG_ACTION
, FALSE
, GTK_ORIENTATION_HORIZONTAL
);
896 data
.RA_mod
= widget
;
897 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
900 label
= make_label_widget (_("Pay_ment:"));
902 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
904 widget
= make_paymode_nointxfer (label
);
905 data
.NU_mod
= widget
;
906 gtk_widget_set_hexpand(widget
, TRUE
);
907 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
910 //gtk_widget_set_tooltip_text(widget, _("Internal transfer unsupported\nin auto assignments"));
913 //connect all our signals
914 g_signal_connect (window
, "destroy", G_CALLBACK (gtk_widget_destroyed
), &window
);
916 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data
.LV_rul
)), "changed", G_CALLBACK (ui_asg_manage_selection
), NULL
);
918 g_signal_connect (G_OBJECT (data
.ST_text
), "changed", G_CALLBACK (ui_asg_manage_rename
), NULL
);
920 widget
= radio_get_nth_widget(GTK_CONTAINER(data
.RA_pay
), 0);
922 g_signal_connect (widget
, "toggled", G_CALLBACK (ui_asg_manage_update_assignments
), NULL
);
924 widget
= radio_get_nth_widget(GTK_CONTAINER(data
.RA_cat
), 0);
926 g_signal_connect (widget
, "toggled", G_CALLBACK (ui_asg_manage_update_assignments
), NULL
);
928 widget
= radio_get_nth_widget(GTK_CONTAINER(data
.RA_mod
), 0);
930 g_signal_connect (widget
, "toggled", G_CALLBACK (ui_asg_manage_update_assignments
), NULL
);
932 g_signal_connect (G_OBJECT (data
.BT_add
), "clicked", G_CALLBACK (ui_asg_manage_add
), NULL
);
933 g_signal_connect (G_OBJECT (data
.BT_rem
), "clicked", G_CALLBACK (ui_asg_manage_delete
), NULL
);
935 //setup, init and show window
936 ui_asg_manage_setup(&data
);
937 ui_asg_manage_update(data
.LV_rul
, NULL
);
939 // gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
941 gtk_widget_show_all (window
);
944 gint result
= gtk_dialog_run (GTK_DIALOG (window
));
946 // cleanup and destroy
947 ui_asg_manage_cleanup(&data
, result
);
948 gtk_widget_destroy (window
);