1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 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/>.
23 #include "ui-archive.h"
24 #include "ui-account.h"
25 #include "ui-category.h"
30 #include "gtk-dateentry.h"
32 /****************************************************************************/
34 /****************************************************************************/
43 /* our global datas */
44 extern struct HomeBank
*GLOBALS
;
45 extern struct Preferences
*PREFS
;
48 extern gchar
*RA_ARC_TYPE
[];
49 extern gchar
*CYA_ARC_UNIT
[];
50 extern gchar
*RA_ARC_WEEKEND
[];
51 extern gchar
*CYA_TXN_STATUS
[];
55 static GtkWidget
*ui_arc_listview_new(void);
58 static void ui_arc_listview_populate(GtkWidget
*view
, gint type
)
65 DB( g_print("ui_arc_listview_populate()\n") );
67 DB( g_print(" - type=%d\n", type
) );
70 //insert all glist item into treeview
71 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(view
));
74 gtk_list_store_clear (GTK_LIST_STORE(model
));
77 list
= g_list_first(GLOBALS
->arc_list
);
80 Archive
*item
= list
->data
;
82 if( (type
== ARC_TYPE_SCHEDULED
) && !(item
->flags
& OF_AUTO
) )
85 if( (type
== ARC_TYPE_TEMPLATE
) && (item
->flags
& OF_AUTO
) )
88 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
89 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
90 LST_DEFARC_DATAS
, item
, //data struct
91 LST_DEFARC_OLDPOS
, i
, //oldpos
94 //DB( g_print(" populate_treeview: %d %08x\n", i, list->data) );
96 i
++; list
= g_list_next(list
);
102 static void ui_arc_listview_select_by_pointer(GtkTreeView
*treeview
, gpointer user_data
)
106 GtkTreeSelection
*selection
;
108 Archive
*arc
= user_data
;
110 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(treeview
));
111 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview
));
113 valid
= gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model
), &iter
);
118 gtk_tree_model_get (model
, &iter
, LST_DEFARC_DATAS
, &tmp_arc
, -1);
121 gtk_tree_selection_select_iter (selection
, &iter
);
125 valid
= gtk_tree_model_iter_next(GTK_TREE_MODEL(model
), &iter
);
132 ** The function should return:
133 ** a negative integer if the first value comes before the second,
134 ** 0 if they are equal,
135 ** or a positive integer if the first value comes after the second.
137 static gint
ui_arc_listview_compare_func (GtkTreeModel
*model
, GtkTreeIter
*a
, GtkTreeIter
*b
, gpointer userdata
)
139 gint sortcol
= GPOINTER_TO_INT(userdata
);
140 Archive
*entry1
, *entry2
;
143 gtk_tree_model_get(model
, a
, LST_DEFARC_DATAS
, &entry1
, -1);
144 gtk_tree_model_get(model
, b
, LST_DEFARC_DATAS
, &entry2
, -1);
148 case LST_DEFARC_SORT_MEMO
:
149 retval
= (entry1
->flags
& GF_INCOME
) - (entry2
->flags
& GF_INCOME
);
152 retval
= hb_string_utf8_compare(entry1
->memo
, entry2
->memo
);
155 case LST_DEFARC_SORT_PAYEE
:
159 p1
= da_pay_get(entry1
->kpay
);
160 p2
= da_pay_get(entry2
->kpay
);
161 if( p1
!= NULL
&& p2
!= NULL
)
163 retval
= hb_string_utf8_compare(p1
->name
, p2
->name
);
168 g_return_val_if_reached(0);
177 static void ui_arc_listview_auto_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
180 gchar
*iconname
= NULL
;
182 // get the transaction
183 gtk_tree_model_get(model
, iter
, LST_DEFARC_DATAS
, &item
, -1);
185 iconname
= ( item
->flags
& OF_AUTO
) ? ICONNAME_HB_OPE_AUTO
: NULL
;
187 g_object_set(renderer
, "icon-name", iconname
, NULL
);
192 ** draw some text from the stored data structure
194 static void ui_arc_listview_cell_data_function_memo (GtkTreeViewColumn
*col
,
195 GtkCellRenderer
*renderer
,
206 gtk_tree_model_get(model
, iter
, LST_DEFARC_DATAS
, &item
, -1);
211 string
= g_strdup_printf ("[%d] %s", item
->key
, name
);
212 g_object_set(renderer
, "text", string
, NULL
);
215 g_object_set(renderer
, "text", name
, NULL
);
221 static void ui_arc_listview_cell_data_function_payee (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
226 gtk_tree_model_get(model
, iter
,
227 LST_DEFARC_DATAS
, &arc
,
233 pay
= da_pay_get(arc
->kpay
);
236 g_object_set(renderer
, "text", pay
->name
, NULL
);
239 g_object_set(renderer
, "text", NULL
, NULL
);
246 static GtkWidget
*ui_arc_listview_new(void)
250 GtkCellRenderer
*renderer
;
251 GtkTreeViewColumn
*column
;
254 store
= gtk_list_store_new (
262 view
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
263 g_object_unref(store
);
265 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view
), PREFS
->grid_lines
);
268 renderer
= gtk_cell_renderer_text_new ();
269 g_object_set(renderer
,
270 "ellipsize", PANGO_ELLIPSIZE_END
,
271 "ellipsize-set", TRUE
,
274 column
= gtk_tree_view_column_new();
275 gtk_tree_view_column_set_title(column
, _("Memo"));
276 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
277 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_arc_listview_cell_data_function_memo
, GINT_TO_POINTER(LST_DEFARC_SORT_MEMO
), NULL
);
278 gtk_tree_view_column_set_sort_column_id (column
, LST_DEFARC_SORT_MEMO
);
279 gtk_tree_view_column_set_alignment (column
, 0.5);
280 gtk_tree_view_column_set_min_width(column
, HB_MINWIDTH_LIST
);
281 gtk_tree_view_column_set_resizable(column
, TRUE
);
282 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
285 renderer
= gtk_cell_renderer_text_new ();
286 g_object_set(renderer
,
287 "ellipsize", PANGO_ELLIPSIZE_END
,
288 "ellipsize-set", TRUE
,
290 column
= gtk_tree_view_column_new();
291 gtk_tree_view_column_set_title(column
, _("Payee"));
292 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
293 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_arc_listview_cell_data_function_payee
, GINT_TO_POINTER(LST_DEFARC_SORT_PAYEE
), NULL
);
294 gtk_tree_view_column_set_resizable(column
, TRUE
);
295 //gtk_tree_view_column_add_attribute(column, renderer, "text", 1);
296 gtk_tree_view_column_set_sort_column_id (column
, LST_DEFARC_SORT_PAYEE
);
297 gtk_tree_view_column_set_alignment (column
, 0.5);
298 gtk_tree_view_column_set_min_width(column
, HB_MINWIDTH_LIST
);
299 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
302 /* column: Scheduled icon */
303 column
= gtk_tree_view_column_new();
304 renderer
= gtk_cell_renderer_pixbuf_new ();
305 //gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1);
306 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
307 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_arc_listview_auto_cell_data_function
, NULL
, NULL
);
308 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
312 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store
), LST_DEFARC_SORT_MEMO
, ui_arc_listview_compare_func
, GINT_TO_POINTER(LST_DEFARC_SORT_MEMO
), NULL
);
313 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store
), LST_DEFARC_SORT_PAYEE
, ui_arc_listview_compare_func
, GINT_TO_POINTER(LST_DEFARC_SORT_PAYEE
), NULL
);
316 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store
), LST_DEFARC_SORT_MEMO
, GTK_SORT_ASCENDING
);
318 //gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE);
319 //gtk_tree_view_set_reorderable (GTK_TREE_VIEW(view), TRUE);
325 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
330 ** add an empty new account to our temp GList and treeview
332 static void ui_arc_manage_add(GtkWidget
*widget
, gpointer user_data
)
334 struct ui_arc_manage_data
*data
;
340 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
341 DB( g_print("\n[ui_scheduled] add\n") );
343 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_arc
));
345 item
= da_archive_malloc();
346 item
->memo
= g_strdup_printf(_("(template %d)"), g_list_length(GLOBALS
->arc_list
) + 1);
349 type
= hbtk_radio_button_get_active(GTK_CONTAINER(data
->RA_type
)) == 1 ? ARC_TYPE_TEMPLATE
: ARC_TYPE_SCHEDULED
;
350 if( type
== ARC_TYPE_SCHEDULED
)
351 item
->flags
|= OF_AUTO
;
353 //GLOBALS->arc_list = g_list_append(GLOBALS->arc_list, item);
354 da_archive_append_new(item
);
356 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
357 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
358 LST_DEFARC_DATAS
, item
,
359 LST_DEFARC_OLDPOS
, 0,
362 gtk_tree_selection_select_iter (gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_arc
)), &iter
);
368 ** delete the selected account to our treeview and temp GList
370 static void ui_arc_manage_delete(GtkWidget
*widget
, gpointer user_data
)
372 struct ui_arc_manage_data
*data
;
373 GtkTreeSelection
*selection
;
379 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
380 DB( g_print("\n[ui_scheduled] delete (data=%p)\n", data
) );
382 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_arc
));
383 //if true there is a selected node
384 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
389 gtk_tree_model_get(model
, &iter
, LST_DEFARC_DATAS
, &item
, -1);
391 title
= g_strdup_printf (
392 _("Are you sure you want to permanently delete '%s'?"), item
->memo
);
394 secondtext
= _("If you delete a scheduled/template, it will be permanently lost.");
396 result
= ui_dialog_msg_confirm_alert(
397 GTK_WINDOW(data
->window
),
405 if( result
== GTK_RESPONSE_OK
)
407 gtk_list_store_remove(GTK_LIST_STORE(model
), &iter
);
409 GLOBALS
->arc_list
= g_list_remove(GLOBALS
->arc_list
, item
);
414 //DB( g_print(" delete =%08x (pos=%d)\n", entry, g_list_index(data->tmp_list, entry) ) );
420 ** update the archive name everytime it changes
422 static void ui_arc_manage_rename(GtkWidget
*widget
, gpointer user_data
)
424 struct ui_arc_manage_data
*data
;
425 GtkTreeSelection
*selection
;
431 DB( g_print("\n[ui_scheduled] rename\n") );
433 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
435 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_arc
));
436 //if true there is a selected node
437 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
439 gtk_tree_model_get(model
, &iter
, LST_DEFARC_DATAS
, &item
, -1);
441 DB( g_print(" -> %s\n", item
->memo
) );
443 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_word
));
444 // ignore if entry is empty
448 item
->memo
= g_strdup(txt
);
451 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_arc
));
461 ** set widgets contents from the selected account
463 static void ui_arc_manage_set(GtkWidget
*widget
, gpointer user_data
)
465 struct ui_arc_manage_data
*data
;
466 GtkTreeSelection
*selection
;
472 DB( g_print("\n[ui_scheduled] set\n") );
474 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
476 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_arc
));
477 //if true there is a selected node
478 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
480 gtk_tree_model_get(model
, &iter
, LST_DEFARC_DATAS
, &item
, -1);
482 g_signal_handler_block(data
->ST_word
, data
->handler_id
[HID_ARC_MEMO
]);
483 gtk_entry_set_text(GTK_ENTRY(data
->ST_word
), item
->memo
);
484 g_signal_handler_unblock(data
->ST_word
, data
->handler_id
[HID_ARC_MEMO
]);
486 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), item
->amount
);
488 hbtk_radio_button_set_active(GTK_CONTAINER(data
->RA_status
), item
->status
);
491 /*g_signal_handler_block(data->CM_valid, data->handler_id[HID_ARC_VALID]);
492 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_valid), (item->flags & OF_VALID) ? 1 : 0);
493 g_signal_handler_unblock(data->CM_valid, data->handler_id[HID_ARC_VALID]);
495 g_signal_handler_block(data->CM_remind, data->handler_id[HID_ARC_REMIND]);
496 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_remind), (item->flags & OF_REMIND) ? 1 : 0);
497 g_signal_handler_unblock(data->CM_remind, data->handler_id[HID_ARC_REMIND]);
500 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->NU_mode
), item
->paymode
);
502 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_cheque
), (item
->flags
& OF_CHEQ2
) ? 1 : 0);
504 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_grp
), item
->kcat
);
506 DB( g_print(" -> set payee %d\n", item
->kpay
) );
507 ui_pay_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_pay
), item
->kpay
);
509 DB( g_print(" -> PO_acc %d\n", item
->kacc
) );
510 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_acc
), item
->kacc
);
512 DB( g_print(" -> PO_accto %d\n", item
->kxferacc
) );
513 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_accto
), item
->kxferacc
);
515 tagstr
= tags_tostring(item
->tags
);
516 txt
= (tagstr
!= NULL
) ? tagstr
: "";
517 DB( g_print(" - tags: '%s'\n", txt
) );
518 gtk_entry_set_text(GTK_ENTRY(data
->ST_tags
), txt
);
521 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_auto
), (item
->flags
& OF_AUTO
) ? 1 : 0);
522 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->NB_every
), item
->every
);
523 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_unit
), item
->unit
);
524 gtk_date_entry_set_date(GTK_DATE_ENTRY(data
->PO_next
), item
->nextdate
);
525 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_limit
), (item
->flags
& OF_LIMIT
) ? 1 : 0);
526 DB( g_print("nb_limit = %d %g\n", item
->limit
, (gdouble
)item
->limit
) );
527 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->NB_limit
), (gdouble
)item
->limit
);
528 hbtk_radio_button_set_active(GTK_CONTAINER(data
->CY_weekend
), item
->weekend
);
534 ** get widgets contents to the selected account
536 static void ui_arc_manage_getlast(struct ui_arc_manage_data
*data
)
544 DB( g_print("\n[ui_scheduled] getlast\n") );
546 item
= data
->lastarcitem
;
550 DB( g_print(" -> %s\n", item
->memo
) );
552 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_arc
));
554 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_word
));
555 // ignore if entry is empty
559 item
->memo
= g_strdup(txt
);
562 gtk_spin_button_update(GTK_SPIN_BUTTON(data
->ST_amount
));
563 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
564 item
->amount
= value
;
566 item
->paymode
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
567 item
->kcat
= ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data
->PO_grp
));
568 item
->kpay
= ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data
->PO_pay
));
569 item
->kacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
570 item
->kxferacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_accto
));
572 item
->status
= hbtk_radio_button_get_active(GTK_CONTAINER(data
->RA_status
));
575 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_tags
));
576 DB( g_print(" - tags: '%s'\n", txt
) );
578 item
->tags
= tags_parse(txt
);
580 //#1615245: moved here, after get combo entry key
581 if( item
->paymode
!= PAYMODE_INTXFER
)
583 //#677351: revert kxferacc to 0
589 item
->flags
&= (OF_SPLIT
); //(split is set in hb_archive)
591 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_cheque
));
592 if(active
== 1) item
->flags
|= OF_CHEQ2
;
594 //active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_amount));
595 active
= item
->amount
> 0 ? TRUE
: FALSE
;
596 if(active
== TRUE
) item
->flags
|= OF_INCOME
;
599 /* -- automated -- */
601 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_auto
));
602 if(active
== 1) item
->flags
|= OF_AUTO
;
604 gtk_spin_button_update(GTK_SPIN_BUTTON(data
->NB_every
));
605 item
->every
= gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data
->NB_every
));
606 item
->unit
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_unit
));
607 item
->nextdate
= gtk_date_entry_get_date(GTK_DATE_ENTRY(data
->PO_next
));
609 active
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_limit
));
610 if(active
== 1) item
->flags
|= OF_LIMIT
;
612 gtk_spin_button_update(GTK_SPIN_BUTTON(data
->NB_limit
));
613 item
->limit
= gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data
->NB_limit
));
615 item
->weekend
= hbtk_radio_button_get_active(GTK_CONTAINER(data
->CY_weekend
));
622 static void ui_arc_manage_update_accto(GtkWidget
*widget
, gpointer user_data
)
624 struct ui_arc_manage_data
*data
;
627 DB( g_print("\n\n[ui_scheduled] update accto\n") );
629 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
631 kacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
632 kdst
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_accto
));
634 DB( g_print(" ksrc=%d, kdst=%d\n", kacc
, kdst
) );
636 ui_acc_comboboxentry_populate_except(GTK_COMBO_BOX(data
->PO_accto
), GLOBALS
->h_acc
, kacc
, ACC_LST_INSERT_NORMAL
);
638 if( (kacc
== 0) || (kacc
== kdst
) )
640 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_accto
), 0);
649 static void ui_arc_manage_paymode(GtkWidget
*widget
, gpointer user_data
)
651 struct ui_arc_manage_data
*data
;
656 DB( g_print("\n[ui_scheduled] paymode\n") );
658 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
660 //DB( g_print(" widget=%p, data=%p\n", widget, data) );
663 payment
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
666 if(payment
== PAYMODE_CHECK
)
669 sensitive
= page
== 1 ? TRUE
: FALSE
;
670 hb_widget_visible(data
->CM_cheque
, sensitive
);
672 if(payment
== PAYMODE_INTXFER
)
675 ui_arc_manage_update_accto(widget
, user_data
);
678 DB( g_print(" payment: %d, page: %d\n", payment
, page
) );
680 sensitive
= page
== 2 ? TRUE
: FALSE
;
681 hb_widget_visible(data
->LB_accto
, sensitive
);
682 hb_widget_visible(data
->PO_accto
, sensitive
);
684 DB( g_print(" visible: %d\n", sensitive
) );
691 static void ui_arc_manage_scheduled(GtkWidget
*widget
, gpointer user_data
)
693 struct ui_arc_manage_data
*data
;
698 gboolean selected
, sensitive
;
700 DB( g_print("\n[ui_scheduled] scheduled\n") );
702 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
707 selected
= gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_arc
)), &model
, &iter
);
710 gtk_tree_model_get(model
, &iter
, LST_DEFARC_DATAS
, &arcitem
, -1);
712 arcitem
->flags
&= ~(OF_AUTO
);
713 sensitive
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_auto
)) ? TRUE
: FALSE
;
715 arcitem
->flags
|= OF_AUTO
;
720 gtk_widget_set_sensitive(data
->LB_next
, sensitive
);
721 gtk_widget_set_sensitive(data
->PO_next
, sensitive
);
723 gtk_widget_set_sensitive(data
->LB_every
, sensitive
);
724 gtk_widget_set_sensitive(data
->NB_every
, sensitive
);
726 gtk_widget_set_sensitive(data
->LB_weekend
, sensitive
);
727 gtk_widget_set_sensitive(data
->CY_weekend
, sensitive
);
729 gtk_widget_set_sensitive(data
->CY_unit
, sensitive
);
730 gtk_widget_set_sensitive(data
->CM_limit
, sensitive
);
732 gtk_widget_set_sensitive(data
->LB_posts
, sensitive
);
735 sensitive
= (sensitive
== TRUE
) ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_limit
)) : sensitive
;
736 gtk_widget_set_sensitive(data
->NB_limit
, sensitive
);
740 /* redraw the row to display/hide the icon */
741 path
= gtk_tree_model_get_path(model
, &iter
);
742 gtk_tree_model_row_changed(model
, path
, &iter
);
743 gtk_tree_path_free (path
);
745 // gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data->LV_arc));
746 //gtk_widget_queue_draw (GTK_WIDGET(data->LV_arc));
751 static void ui_arc_manage_update_post_split(GtkWidget
*widget
, gdouble amount
)
753 struct ui_arc_manage_data
*data
;
754 gboolean sensitive
= TRUE
;
756 DB( g_print("(ui_arc_manage) update _post_split\n") );
758 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
760 DB( g_print("- amount=%.2f\n", amount
) );
762 data
->lastarcitem
->amount
= amount
;
763 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), amount
);
765 data
->lastarcitem
->flags
&= ~(OF_SPLIT
); //First set flag that Splits are cleared
767 if (da_splits_length(data
->lastarcitem
->splits
) > 0)
769 /* disable category if split is set */
770 data
->lastarcitem
->flags
|= OF_SPLIT
; //Then set flag that Splits are active
772 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_grp
), 0);
774 gtk_widget_set_sensitive(data
->ST_amount
, sensitive
);
776 //# 1416624 empty category when split
777 if( (data
->lastarcitem
->flags
& (OF_SPLIT
)) )
778 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_grp
), 0);
779 gtk_widget_set_sensitive(data
->PO_grp
, sensitive
);
785 ** update the widgets status and contents from action/selection value
787 static void ui_arc_manage_update(GtkWidget
*widget
, gpointer user_data
)
789 struct ui_arc_manage_data
*data
;
792 gboolean selected
, sensitive
;
793 gboolean split_sensitive
= TRUE
;
797 DB( g_print("\n[ui_scheduled] update\n") );
799 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
800 //window = gtk_widget_get_ancestor(GTK_WIDGET(treeview), GTK_TYPE_WINDOW);
801 //DB( g_print("\n[ui_scheduled] widget=%08lx, window=%08lx, inst_data=%08lx\n", treeview, window, data) );
803 //if true there is a selected node
804 selected
= gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_arc
)), &model
, &iter
);
806 DB( g_print(" selected = %d\n", selected
) );
808 sensitive
= (selected
== TRUE
) ? TRUE
: FALSE
;
810 gtk_widget_set_sensitive(data
->GR_txnleft
, sensitive
);
811 gtk_widget_set_sensitive(data
->LB_schedinsert
, sensitive
);
813 gtk_widget_set_sensitive(data
->CM_auto
, sensitive
);
815 gtk_widget_set_sensitive(data
->BT_rem
, sensitive
);
819 gtk_tree_model_get(model
, &iter
, LST_DEFARC_DATAS
, &arcitem
, -1);
821 if(data
->lastarcitem
!= NULL
&& arcitem
!= data
->lastarcitem
)
823 DB( g_print(" -> should do a get for last selected (%s)\n", data
->lastarcitem
->memo
) );
824 ui_arc_manage_getlast(data
);
826 data
->lastarcitem
= arcitem
;
828 if (da_splits_length(data
->lastarcitem
->splits
) > 0)
831 data
->lastarcitem
->flags
|= OF_SPLIT
; //Then set flag that Splits are active
832 split_sensitive
= FALSE
;
833 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_grp
), 0);
836 gtk_widget_set_sensitive(data
->ST_amount
, split_sensitive
);
837 gtk_widget_set_sensitive(data
->PO_grp
, split_sensitive
);
839 DB( g_print(" - call set\n") );
840 ui_arc_manage_set(widget
, NULL
);
844 data
->lastarcitem
= NULL
;
847 //gtk_widget_set_sensitive(data->LB_schedinsert, sensitive);
850 DB( g_print(" - call scheduled\n") );
851 ui_arc_manage_scheduled(widget
, NULL
);
852 DB( g_print(" - call paymode\n") );
853 ui_arc_manage_paymode(widget
,NULL
);
863 static void ui_arc_manage_toggleamount(GtkWidget
*widget
, GtkEntryIconPosition icon_pos
, GdkEvent
*event
, gpointer user_data
)
865 struct ui_arc_manage_data
*data
;
868 DB( g_print("\n[ui_scheduled] toggleamount\n") );
870 if(icon_pos
== GTK_ENTRY_ICON_PRIMARY
)
873 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
875 gtk_spin_button_update(GTK_SPIN_BUTTON(data
->ST_amount
));
877 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
879 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), value
);
882 value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
883 type = gtk_widget_get_sensitive(data->CY_amount);
885 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), value * type);
892 static void defarchive_button_split_cb(GtkWidget
*widget
, gpointer user_data
)
894 struct ui_arc_manage_data
*data
;
897 DB( g_print("\n[ui_scheduled] doing split\n") );
899 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
901 amount
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
903 ui_split_dialog(data
->window
, &data
->lastarcitem
->splits
, amount
, &ui_arc_manage_update_post_split
);
908 static void ui_arc_manage_selection(GtkTreeSelection
*treeselection
, gpointer user_data
)
910 DB( g_print("\n[ui_scheduled] selection\n") );
912 DB( g_print(" - call update\n") );
913 ui_arc_manage_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), NULL
);
917 static void ui_arc_manage_populate_listview(struct ui_arc_manage_data
*data
)
921 DB( g_print("\n[ui_scheduled] populate listview\n") );
923 type
= hbtk_radio_button_get_active(GTK_CONTAINER(data
->RA_type
)) == 1 ? ARC_TYPE_TEMPLATE
: ARC_TYPE_SCHEDULED
;
924 ui_arc_listview_populate(data
->LV_arc
, type
);
925 gtk_tree_view_expand_all (GTK_TREE_VIEW(data
->LV_arc
));
931 static gboolean
ui_arc_manage_cleanup(struct ui_arc_manage_data
*data
, gint result
)
933 gboolean doupdate
= FALSE
;
935 DB( g_print("\n[ui_scheduled] cleanup\n") );
938 if(data
->lastarcitem
!= NULL
)
940 DB( g_print(" -> should do a get for last selected (%s)\n", data
->lastarcitem
->memo
) );
941 ui_arc_manage_getlast(data
);
944 GLOBALS
->arc_list
= da_archive_sort(GLOBALS
->arc_list
);
946 GLOBALS
->changes_count
+= data
->change
;
954 static void ui_arc_manage_setup(struct ui_arc_manage_data
*data
)
957 DB( g_print("\n[ui_scheduled] setup\n") );
960 data
->tmp_list
= NULL
; //hb-glist_clone_list(GLOBALS->arc_list, sizeof(struct _Archive));
962 data
->lastarcitem
= NULL
;
964 //hb-glist_populate_treeview(data->tmp_list, data->LV_arc, LST_DEFARC_DATAS, LST_DEFARC_OLDPOS);
966 //insert all glist item into treeview
967 ui_arc_manage_populate_listview(data
);
969 DB( g_print(" - populate boxentries\n") );
971 ui_pay_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_pay
) , GLOBALS
->h_pay
);
972 ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_grp
) , GLOBALS
->h_cat
);
973 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_acc
) , GLOBALS
->h_acc
, ACC_LST_INSERT_NORMAL
);
974 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_accto
), GLOBALS
->h_acc
, ACC_LST_INSERT_NORMAL
);
976 ////5.2.7 done in popover
977 //ui_tag_combobox_populate(GTK_COMBO_BOX_TEXT(data->CY_tags));
981 static GtkWidget
*ui_arc_manage_create_left_txn(struct ui_arc_manage_data
*data
)
983 GtkWidget
*group_grid
, *hbox
, *label
, *widget
;
986 // group :: Transaction detail
987 group_grid
= gtk_grid_new ();
988 data
->GR_txnleft
= group_grid
;
989 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
990 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
993 label
= make_label_widget(_("_Amount:"));
994 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
995 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 0);
996 gtk_grid_attach (GTK_GRID (group_grid
), hbox
, 1, row
, 1, 1);
998 widget
= make_amount(label
);
999 data
->ST_amount
= widget
;
1000 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(widget
), GTK_ENTRY_ICON_PRIMARY
, ICONNAME_HB_TOGGLE_SIGN
);
1001 gtk_entry_set_icon_tooltip_text(GTK_ENTRY(widget
), GTK_ENTRY_ICON_PRIMARY
, _("Toggle amount sign"));
1002 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1004 widget
= make_image_button(ICONNAME_HB_BUTTON_SPLIT
, _("Transaction splits"));
1005 data
->BT_split
= widget
;
1006 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1009 label
= make_label_widget(_("A_ccount:"));
1010 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1011 widget
= ui_acc_comboboxentry_new(label
);
1012 data
->PO_acc
= widget
;
1013 gtk_widget_set_hexpand (widget
, TRUE
);
1014 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1017 label
= make_label_widget(_("_To account:"));
1018 data
->LB_accto
= label
;
1019 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1020 widget
= ui_acc_comboboxentry_new(label
);
1021 data
->PO_accto
= widget
;
1022 gtk_widget_set_hexpand (widget
, TRUE
);
1023 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1027 label
= make_label_widget(_("Pay_ment:"));
1028 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1029 widget
= make_paymode(label
);
1030 data
->NU_mode
= widget
;
1031 gtk_widget_set_halign (widget
, GTK_ALIGN_START
);
1032 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1034 gtk_widget_set_margin_top(label
, SPACING_SMALL
);
1035 gtk_widget_set_margin_top(widget
, SPACING_SMALL
);
1037 gtk_widget_set_margin_bottom(label
, SPACING_SMALL
);
1038 gtk_widget_set_margin_bottom(widget
, SPACING_SMALL
);
1041 widget
= gtk_check_button_new_with_mnemonic(_("Of notebook _2"));
1042 data
->CM_cheque
= widget
;
1043 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1045 /* info should be here some day */
1050 label
= make_label_widget(_("_Payee:"));
1051 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1052 widget
= ui_pay_comboboxentry_new(label
);
1053 data
->PO_pay
= widget
;
1054 gtk_widget_set_hexpand (widget
, TRUE
);
1055 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1058 label
= make_label_widget(_("_Category:"));
1059 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1060 widget
= ui_cat_comboboxentry_new(label
);
1061 data
->PO_grp
= widget
;
1062 gtk_widget_set_hexpand (widget
, TRUE
);
1063 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1065 gtk_widget_set_margin_bottom(label
, SPACING_SMALL
);
1066 gtk_widget_set_margin_bottom(widget
, SPACING_SMALL
);
1069 label
= make_label_widget(_("_Status:"));
1070 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1071 widget
= hbtk_radio_button_new(CYA_TXN_STATUS
, TRUE
);
1072 data
->RA_status
= widget
;
1073 gtk_widget_set_halign (widget
, GTK_ALIGN_START
);
1074 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1077 label
= make_label_widget(_("_Memo:"));
1078 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1079 widget
= make_string(label
);
1080 gtk_widget_set_hexpand (widget
, TRUE
);
1081 data
->ST_word
= widget
;
1082 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1085 label
= make_label_widget(_("Ta_gs:"));
1086 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1087 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 0);
1088 gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET(hbox
)), GTK_STYLE_CLASS_LINKED
);
1089 gtk_grid_attach (GTK_GRID (group_grid
), hbox
, 1, row
, 1, 1);
1091 widget
= make_string(label
);
1092 data
->ST_tags
= widget
;
1093 //gtk_widget_set_hexpand (widget, TRUE);
1094 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1096 widget
= ui_tag_popover_list(data
->ST_tags
);
1097 data
->CY_tags
= widget
;
1098 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1104 static GtkWidget
*ui_arc_manage_create_scheduling(struct ui_arc_manage_data
*data
)
1106 GtkWidget
*group_grid
, *hbox
, *label
, *widget
;
1109 // group :: Scheduled insertion
1110 group_grid
= gtk_grid_new ();
1111 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1112 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1114 label
= make_label_group(_("Scheduled insertion"));
1115 data
->LB_schedinsert
= label
;
1116 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, 0, 3, 1);
1119 widget
= gtk_check_button_new_with_mnemonic(_("_Activate"));
1120 data
->CM_auto
= widget
;
1121 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
1124 label
= gtk_label_new_with_mnemonic (_("Next _date:"));
1125 data
->LB_next
= label
;
1126 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
1127 widget
= gtk_date_entry_new();
1128 data
->PO_next
= widget
;
1129 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1132 label
= make_label_widget(_("Ever_y:"));
1133 data
->LB_every
= label
;
1134 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
1136 hbox
= gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1137 gtk_grid_attach (GTK_GRID (group_grid
), hbox
, 2, row
, 1, 1);
1138 widget
= make_numeric(label
, 1, 100);
1139 data
->NB_every
= widget
;
1140 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1141 //label = gtk_label_new_with_mnemonic (_("_Unit:"));
1142 //gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1143 widget
= make_cycle(label
, CYA_ARC_UNIT
);
1144 data
->CY_unit
= widget
;
1145 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1148 label
= make_label_widget(_("Week end:"));
1149 data
->LB_weekend
= label
;
1150 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
1152 widget
= hbtk_radio_button_new(RA_ARC_WEEKEND
, FALSE
);
1153 data
->CY_weekend
= widget
;
1154 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1157 hbox
= gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1158 gtk_grid_attach (GTK_GRID (group_grid
), hbox
, 1, row
, 3, 1);
1160 widget
= gtk_check_button_new_with_mnemonic(_("_Stop after:"));
1161 data
->CM_limit
= widget
;
1162 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1164 widget
= make_numeric(label
, 1, 366);
1165 data
->NB_limit
= widget
;
1166 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1168 label
= gtk_label_new_with_mnemonic (_("posts"));
1169 data
->LB_posts
= label
;
1170 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, 0);
1175 static void ui_arc_manage_type_changed_cb (GtkToggleButton
*button
, gpointer user_data
)
1177 ui_arc_manage_populate_listview(user_data
);
1178 //g_print(" toggle type=%d\n", gtk_toggle_button_get_active(button));
1182 GtkWidget
*ui_arc_manage_dialog (Archive
*ext_arc
)
1184 struct ui_arc_manage_data data
;
1185 GtkWidget
*dialog
, *content_area
, *table
, *bbox
;
1186 GtkWidget
*content_grid
, *group_grid
, *hgrid
, *treeview
, *scrollwin
;
1187 GtkWidget
*widget
, *hpaned
;
1190 dialog
= gtk_dialog_new_with_buttons (_("Manage scheduled/template transactions"),
1191 GTK_WINDOW(GLOBALS
->mainwindow
),
1194 GTK_RESPONSE_ACCEPT
,
1197 data
.window
= dialog
;
1199 gtk_window_set_icon_name(GTK_WINDOW (dialog
), ICONNAME_HB_ARCHIVE
);
1201 //set a nice dialog size
1202 gtk_window_get_size(GTK_WINDOW(GLOBALS
->mainwindow
), &w
, &h
);
1203 gtk_window_set_default_size (GTK_WINDOW(dialog
), -1, h
/PHI
);
1206 //store our dialog private data
1207 g_object_set_data(G_OBJECT(dialog
), "inst_data", (gpointer
)&data
);
1208 DB( g_print("\n[ui_scheduled] dialog=%p, inst_data=%p\n", dialog
, &data
) );
1211 content_area
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
)); // return a vbox
1214 table
= gtk_grid_new ();
1215 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
1216 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
1217 g_object_set(table
, "margin", SPACING_MEDIUM
, NULL
);
1218 gtk_box_pack_start (GTK_BOX (content_area
), table
, TRUE
, TRUE
, 0);
1221 bbox
= hbtk_radio_button_new(RA_ARC_TYPE
, TRUE
);
1222 data
.RA_type
= bbox
;
1223 gtk_widget_set_halign (bbox
, GTK_ALIGN_CENTER
);
1224 gtk_grid_attach (GTK_GRID (table
), bbox
, 0, row
, 2, 1);
1226 hbtk_radio_button_connect (GTK_CONTAINER(bbox
), "toggled", G_CALLBACK (ui_arc_manage_type_changed_cb
), &data
);
1230 hpaned
= gtk_paned_new(GTK_ORIENTATION_HORIZONTAL
);
1231 //gtk_container_set_border_width (GTK_CONTAINER(hpaned), SPACING_MEDIUM);
1232 gtk_grid_attach (GTK_GRID (table
), hpaned
, 0, row
, 2, 1);
1236 hgrid
= gtk_grid_new ();
1237 gtk_grid_set_row_spacing (GTK_GRID (hgrid
), SPACING_SMALL
);
1238 gtk_grid_set_column_spacing (GTK_GRID (hgrid
), SPACING_SMALL
);
1239 gtk_widget_set_margin_right(hgrid
, SPACING_SMALL
);
1240 gtk_paned_pack1 (GTK_PANED(hpaned
), hgrid
, FALSE
, FALSE
);
1243 scrollwin
= gtk_scrolled_window_new(NULL
,NULL
);
1244 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
1245 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin
), GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
1246 treeview
= (GtkWidget
*)ui_arc_listview_new();
1247 data
.LV_arc
= treeview
;
1248 gtk_widget_set_size_request(treeview
, HB_MINWIDTH_LIST
, -1);
1249 gtk_container_add(GTK_CONTAINER(scrollwin
), treeview
);
1250 gtk_widget_set_hexpand (scrollwin
, TRUE
);
1251 gtk_widget_set_vexpand (scrollwin
, TRUE
);
1252 gtk_grid_attach (GTK_GRID (hgrid
), scrollwin
, 0, 0, 2, 1);
1254 widget
= gtk_button_new_with_mnemonic(_("_Add"));
1255 data
.BT_add
= widget
;
1256 gtk_grid_attach (GTK_GRID (hgrid
), widget
, 0, 1, 1, 1);
1258 widget
= gtk_button_new_with_mnemonic(_("_Delete"));
1259 data
.BT_rem
= widget
;
1260 gtk_grid_attach (GTK_GRID (hgrid
), widget
, 1, 1, 1, 1);
1264 content_grid
= gtk_grid_new();
1265 gtk_grid_set_row_spacing (GTK_GRID (content_grid
), SPACING_LARGE
);
1266 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid
), GTK_ORIENTATION_VERTICAL
);
1267 //gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM);
1268 gtk_widget_set_margin_left(content_grid
, SPACING_SMALL
);
1269 gtk_paned_pack2 (GTK_PANED(hpaned
), content_grid
, FALSE
, FALSE
);
1271 group_grid
= ui_arc_manage_create_left_txn(&data
);
1272 //gtk_widget_set_hexpand (GTK_WIDGET(group_grid), FALSE);
1273 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, 0, 1, 1);
1276 group_grid
= ui_arc_manage_create_scheduling(&data
);
1277 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, 1, 1, 1);
1279 /* set default periodicity to month */
1280 //todo: move elsewhere
1281 gtk_combo_box_set_active(GTK_COMBO_BOX(data
.CY_unit
), 2);
1283 gtk_widget_show_all(content_area
);
1284 gtk_widget_hide(data
.CM_cheque
);
1285 gtk_widget_hide(data
.PO_accto
);
1287 //connect all our signals
1288 g_signal_connect (dialog
, "destroy", G_CALLBACK (gtk_widget_destroyed
), &dialog
);
1291 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data
.LV_arc
)), "changed", G_CALLBACK (ui_arc_manage_selection
), NULL
);
1292 g_signal_connect (G_OBJECT (data
.ST_amount
), "icon-release", G_CALLBACK (ui_arc_manage_toggleamount
), NULL
);
1294 g_signal_connect (G_OBJECT (data
.BT_add
), "clicked", G_CALLBACK (ui_arc_manage_add
), NULL
);
1295 g_signal_connect (G_OBJECT (data
.BT_rem
), "clicked", G_CALLBACK (ui_arc_manage_delete
), NULL
);
1297 data
.handler_id
[HID_ARC_MEMO
] = g_signal_connect (G_OBJECT (data
.ST_word
), "changed", G_CALLBACK (ui_arc_manage_rename
), NULL
);
1298 g_signal_connect (data
.NU_mode
, "changed", G_CALLBACK (ui_arc_manage_paymode
), NULL
);
1299 g_signal_connect (data
.PO_acc
, "changed", G_CALLBACK (ui_arc_manage_update_accto
), NULL
);
1300 //data.handler_id[HID_ARC_VALID] = g_signal_connect (data.CM_valid , "toggled", G_CALLBACK (ui_arc_manage_togglestatus), GINT_TO_POINTER(HID_ARC_VALID));
1301 //data.handler_id[HID_ARC_REMIND] = g_signal_connect (data.CM_remind, "toggled", G_CALLBACK (ui_arc_manage_togglestatus), GINT_TO_POINTER(HID_ARC_REMIND));
1303 g_signal_connect (data
.CM_auto
, "toggled", G_CALLBACK (ui_arc_manage_scheduled
), NULL
);
1304 g_signal_connect (data
.CM_limit
, "toggled", G_CALLBACK (ui_arc_manage_scheduled
), NULL
);
1306 g_signal_connect (G_OBJECT (data
.BT_split
), "clicked", G_CALLBACK (defarchive_button_split_cb
), NULL
);
1308 //setup, init and show dialog
1309 ui_arc_manage_setup(&data
);
1310 ui_arc_manage_update(data
.LV_arc
, NULL
);
1312 gtk_widget_show (dialog
);
1315 ui_arc_listview_select_by_pointer(GTK_TREE_VIEW(data
.LV_arc
), ext_arc
);
1318 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
1322 case GTK_RESPONSE_ACCEPT
:
1323 //do_application_specific_something ();
1326 //do_nothing_since_dialog_was_cancelled ();
1330 // cleanup and destroy
1331 ui_arc_manage_cleanup(&data
, result
);
1332 gtk_widget_destroy (dialog
);