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_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_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_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_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_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
);
784 //1336928 combobox tags
785 static void ui_arc_manage_update_tags(GtkWidget
*widget
, gpointer user_data
)
787 struct ui_arc_manage_data
*data
;
790 DB( g_print("\n[ui_scheduled] update tags\n") );
792 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
794 newtag
= gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(data
->CY_tags
));
795 ui_gtk_entry_tag_name_append(GTK_ENTRY(data
->ST_tags
), newtag
);
798 //revert back to ----
799 g_signal_handlers_block_by_func (G_OBJECT (data
->CY_tags
), G_CALLBACK (ui_arc_manage_update_tags
), NULL
);
800 hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(data
->CY_tags
), 0);
801 g_signal_handlers_unblock_by_func (G_OBJECT (data
->CY_tags
), G_CALLBACK (ui_arc_manage_update_tags
), NULL
);
806 ** update the widgets status and contents from action/selection value
808 static void ui_arc_manage_update(GtkWidget
*widget
, gpointer user_data
)
810 struct ui_arc_manage_data
*data
;
813 gboolean selected
, sensitive
;
814 gboolean split_sensitive
= TRUE
;
818 DB( g_print("\n[ui_scheduled] update\n") );
820 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
821 //window = gtk_widget_get_ancestor(GTK_WIDGET(treeview), GTK_TYPE_WINDOW);
822 //DB( g_print("\n[ui_scheduled] widget=%08lx, window=%08lx, inst_data=%08lx\n", treeview, window, data) );
824 //if true there is a selected node
825 selected
= gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_arc
)), &model
, &iter
);
827 DB( g_print(" selected = %d\n", selected
) );
829 sensitive
= (selected
== TRUE
) ? TRUE
: FALSE
;
831 gtk_widget_set_sensitive(data
->GR_txnleft
, sensitive
);
832 gtk_widget_set_sensitive(data
->LB_schedinsert
, sensitive
);
834 gtk_widget_set_sensitive(data
->CM_auto
, sensitive
);
836 gtk_widget_set_sensitive(data
->BT_rem
, sensitive
);
840 gtk_tree_model_get(model
, &iter
, LST_DEFARC_DATAS
, &arcitem
, -1);
842 if(data
->lastarcitem
!= NULL
&& arcitem
!= data
->lastarcitem
)
844 DB( g_print(" -> should do a get for last selected (%s)\n", data
->lastarcitem
->memo
) );
845 ui_arc_manage_getlast(data
);
847 data
->lastarcitem
= arcitem
;
849 if (da_splits_length(data
->lastarcitem
->splits
) > 0)
852 data
->lastarcitem
->flags
|= OF_SPLIT
; //Then set flag that Splits are active
853 split_sensitive
= FALSE
;
854 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_grp
), 0);
857 gtk_widget_set_sensitive(data
->ST_amount
, split_sensitive
);
858 gtk_widget_set_sensitive(data
->PO_grp
, split_sensitive
);
860 DB( g_print(" - call set\n") );
861 ui_arc_manage_set(widget
, NULL
);
865 data
->lastarcitem
= NULL
;
868 //gtk_widget_set_sensitive(data->LB_schedinsert, sensitive);
871 DB( g_print(" - call scheduled\n") );
872 ui_arc_manage_scheduled(widget
, NULL
);
873 DB( g_print(" - call paymode\n") );
874 ui_arc_manage_paymode(widget
,NULL
);
884 static void ui_arc_manage_toggleamount(GtkWidget
*widget
, GtkEntryIconPosition icon_pos
, GdkEvent
*event
, gpointer user_data
)
886 struct ui_arc_manage_data
*data
;
889 DB( g_print("\n[ui_scheduled] toggleamount\n") );
891 if(icon_pos
== GTK_ENTRY_ICON_PRIMARY
)
894 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
896 gtk_spin_button_update(GTK_SPIN_BUTTON(data
->ST_amount
));
898 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
900 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), value
);
903 value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
904 type = gtk_widget_get_sensitive(data->CY_amount);
906 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), value * type);
913 static void defarchive_button_split_cb(GtkWidget
*widget
, gpointer user_data
)
915 struct ui_arc_manage_data
*data
;
918 DB( g_print("\n[ui_scheduled] doing split\n") );
920 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
922 amount
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
924 ui_split_dialog(data
->window
, &data
->lastarcitem
->splits
, amount
, &ui_arc_manage_update_post_split
);
929 static void ui_arc_manage_selection(GtkTreeSelection
*treeselection
, gpointer user_data
)
931 DB( g_print("\n[ui_scheduled] selection\n") );
933 DB( g_print(" - call update\n") );
934 ui_arc_manage_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), NULL
);
938 static void ui_arc_manage_populate_listview(struct ui_arc_manage_data
*data
)
942 DB( g_print("\n[ui_scheduled] populate listview\n") );
944 type
= hbtk_radio_get_active(GTK_CONTAINER(data
->RA_type
)) == 1 ? ARC_TYPE_TEMPLATE
: ARC_TYPE_SCHEDULED
;
945 ui_arc_listview_populate(data
->LV_arc
, type
);
946 gtk_tree_view_expand_all (GTK_TREE_VIEW(data
->LV_arc
));
952 static gboolean
ui_arc_manage_cleanup(struct ui_arc_manage_data
*data
, gint result
)
954 gboolean doupdate
= FALSE
;
956 DB( g_print("\n[ui_scheduled] cleanup\n") );
959 if(data
->lastarcitem
!= NULL
)
961 DB( g_print(" -> should do a get for last selected (%s)\n", data
->lastarcitem
->memo
) );
962 ui_arc_manage_getlast(data
);
965 GLOBALS
->arc_list
= da_archive_sort(GLOBALS
->arc_list
);
967 GLOBALS
->changes_count
+= data
->change
;
975 static void ui_arc_manage_setup(struct ui_arc_manage_data
*data
)
978 DB( g_print("\n[ui_scheduled] setup\n") );
981 data
->tmp_list
= NULL
; //hb-glist_clone_list(GLOBALS->arc_list, sizeof(struct _Archive));
983 data
->lastarcitem
= NULL
;
985 //hb-glist_populate_treeview(data->tmp_list, data->LV_arc, LST_DEFARC_DATAS, LST_DEFARC_OLDPOS);
987 //insert all glist item into treeview
988 ui_arc_manage_populate_listview(data
);
990 DB( g_print(" - populate boxentries\n") );
992 ui_pay_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_pay
) , GLOBALS
->h_pay
);
993 ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_grp
) , GLOBALS
->h_cat
);
994 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_acc
) , GLOBALS
->h_acc
, ACC_LST_INSERT_NORMAL
);
995 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_accto
), GLOBALS
->h_acc
, ACC_LST_INSERT_NORMAL
);
997 ui_tag_combobox_populate(GTK_COMBO_BOX_TEXT(data
->CY_tags
));
1001 static GtkWidget
*ui_arc_manage_create_left_txn(struct ui_arc_manage_data
*data
)
1003 GtkWidget
*group_grid
, *hbox
, *label
, *widget
;
1006 // group :: Transaction detail
1007 group_grid
= gtk_grid_new ();
1008 data
->GR_txnleft
= group_grid
;
1009 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1010 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1013 label
= make_label_widget(_("_Amount:"));
1014 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1015 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 0);
1016 gtk_grid_attach (GTK_GRID (group_grid
), hbox
, 1, row
, 1, 1);
1018 widget
= make_amount(label
);
1019 data
->ST_amount
= widget
;
1020 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(widget
), GTK_ENTRY_ICON_PRIMARY
, ICONNAME_HB_TOGGLE_SIGN
);
1021 gtk_entry_set_icon_tooltip_text(GTK_ENTRY(widget
), GTK_ENTRY_ICON_PRIMARY
, _("Toggle amount sign"));
1022 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1024 widget
= make_image_button(ICONNAME_HB_BUTTON_SPLIT
, _("Transaction splits"));
1025 data
->BT_split
= widget
;
1026 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1029 label
= make_label_widget(_("A_ccount:"));
1030 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1031 widget
= ui_acc_comboboxentry_new(label
);
1032 data
->PO_acc
= widget
;
1033 gtk_widget_set_hexpand (widget
, TRUE
);
1034 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1037 label
= make_label_widget(_("_To account:"));
1038 data
->LB_accto
= label
;
1039 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1040 widget
= ui_acc_comboboxentry_new(label
);
1041 data
->PO_accto
= widget
;
1042 gtk_widget_set_hexpand (widget
, TRUE
);
1043 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1047 label
= make_label_widget(_("Pay_ment:"));
1048 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1049 widget
= make_paymode(label
);
1050 data
->NU_mode
= widget
;
1051 gtk_widget_set_halign (widget
, GTK_ALIGN_START
);
1052 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1054 gtk_widget_set_margin_top(label
, SPACING_SMALL
);
1055 gtk_widget_set_margin_top(widget
, SPACING_SMALL
);
1057 gtk_widget_set_margin_bottom(label
, SPACING_SMALL
);
1058 gtk_widget_set_margin_bottom(widget
, SPACING_SMALL
);
1061 widget
= gtk_check_button_new_with_mnemonic(_("Of notebook _2"));
1062 data
->CM_cheque
= widget
;
1063 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1065 /* info should be here some day */
1070 label
= make_label_widget(_("_Payee:"));
1071 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1072 widget
= ui_pay_comboboxentry_new(label
);
1073 data
->PO_pay
= widget
;
1074 gtk_widget_set_hexpand (widget
, TRUE
);
1075 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1078 label
= make_label_widget(_("_Category:"));
1079 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1080 widget
= ui_cat_comboboxentry_new(label
);
1081 data
->PO_grp
= widget
;
1082 gtk_widget_set_hexpand (widget
, TRUE
);
1083 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1085 gtk_widget_set_margin_bottom(label
, SPACING_SMALL
);
1086 gtk_widget_set_margin_bottom(widget
, SPACING_SMALL
);
1089 label
= make_label_widget(_("_Status:"));
1090 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1091 widget
= hbtk_radio_new(CYA_TXN_STATUS
, TRUE
);
1092 data
->RA_status
= widget
;
1093 gtk_widget_set_halign (widget
, GTK_ALIGN_START
);
1094 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1097 label
= make_label_widget(_("_Memo:"));
1098 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1099 widget
= make_string(label
);
1100 gtk_widget_set_hexpand (widget
, TRUE
);
1101 data
->ST_word
= widget
;
1102 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 1, 1);
1105 label
= make_label_widget(_("Ta_gs:"));
1106 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 1, 1);
1107 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 0);
1108 gtk_grid_attach (GTK_GRID (group_grid
), hbox
, 1, row
, 1, 1);
1110 widget
= make_string(label
);
1111 data
->ST_tags
= widget
;
1112 //gtk_widget_set_hexpand (widget, TRUE);
1113 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1115 widget
= ui_tag_combobox_new(NULL
);
1116 data
->CY_tags
= widget
;
1117 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1123 static GtkWidget
*ui_arc_manage_create_scheduling(struct ui_arc_manage_data
*data
)
1125 GtkWidget
*group_grid
, *hbox
, *label
, *widget
;
1128 // group :: Scheduled insertion
1129 group_grid
= gtk_grid_new ();
1130 gtk_grid_set_row_spacing (GTK_GRID (group_grid
), SPACING_SMALL
);
1131 gtk_grid_set_column_spacing (GTK_GRID (group_grid
), SPACING_MEDIUM
);
1133 label
= make_label_group(_("Scheduled insertion"));
1134 data
->LB_schedinsert
= label
;
1135 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, 0, 3, 1);
1138 widget
= gtk_check_button_new_with_mnemonic(_("_Activate"));
1139 data
->CM_auto
= widget
;
1140 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 1, row
, 2, 1);
1143 label
= gtk_label_new_with_mnemonic (_("Next _date:"));
1144 data
->LB_next
= label
;
1145 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
1146 widget
= gtk_date_entry_new();
1147 data
->PO_next
= widget
;
1148 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1151 label
= make_label_widget(_("Ever_y:"));
1152 data
->LB_every
= label
;
1153 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
1155 hbox
= gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1156 gtk_grid_attach (GTK_GRID (group_grid
), hbox
, 2, row
, 1, 1);
1157 widget
= make_numeric(label
, 1, 100);
1158 data
->NB_every
= widget
;
1159 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1160 //label = gtk_label_new_with_mnemonic (_("_Unit:"));
1161 //gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1162 widget
= make_cycle(label
, CYA_ARC_UNIT
);
1163 data
->CY_unit
= widget
;
1164 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1167 label
= make_label_widget(_("Week end:"));
1168 data
->LB_weekend
= label
;
1169 gtk_grid_attach (GTK_GRID (group_grid
), label
, 1, row
, 1, 1);
1171 widget
= hbtk_radio_new(RA_ARC_WEEKEND
, FALSE
);
1172 data
->CY_weekend
= widget
;
1173 gtk_grid_attach (GTK_GRID (group_grid
), widget
, 2, row
, 1, 1);
1176 hbox
= gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1177 gtk_grid_attach (GTK_GRID (group_grid
), hbox
, 1, row
, 3, 1);
1179 widget
= gtk_check_button_new_with_mnemonic(_("_Stop after:"));
1180 data
->CM_limit
= widget
;
1181 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
1183 widget
= make_numeric(label
, 1, 366);
1184 data
->NB_limit
= widget
;
1185 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1187 label
= gtk_label_new_with_mnemonic (_("posts"));
1188 data
->LB_posts
= label
;
1189 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, 0);
1194 static void ui_arc_manage_type_changed_cb (GtkToggleButton
*button
, gpointer user_data
)
1196 ui_arc_manage_populate_listview(user_data
);
1197 //g_print(" toggle type=%d\n", gtk_toggle_button_get_active(button));
1201 GtkWidget
*ui_arc_manage_dialog (Archive
*ext_arc
)
1203 struct ui_arc_manage_data data
;
1204 GtkWidget
*dialog
, *content_area
, *table
, *bbox
;
1205 GtkWidget
*content_grid
, *group_grid
, *hgrid
, *treeview
, *scrollwin
;
1206 GtkWidget
*widget
, *hpaned
;
1209 dialog
= gtk_dialog_new_with_buttons (_("Manage scheduled/template transactions"),
1210 GTK_WINDOW(GLOBALS
->mainwindow
),
1213 GTK_RESPONSE_ACCEPT
,
1216 data
.window
= dialog
;
1218 gtk_window_set_icon_name(GTK_WINDOW (dialog
), ICONNAME_HB_ARCHIVE
);
1220 //set a nice dialog size
1221 gtk_window_get_size(GTK_WINDOW(GLOBALS
->mainwindow
), &w
, &h
);
1222 gtk_window_set_default_size (GTK_WINDOW(dialog
), -1, h
/PHI
);
1225 //store our dialog private data
1226 g_object_set_data(G_OBJECT(dialog
), "inst_data", (gpointer
)&data
);
1227 DB( g_print("\n[ui_scheduled] dialog=%p, inst_data=%p\n", dialog
, &data
) );
1230 content_area
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
)); // return a vbox
1233 table
= gtk_grid_new ();
1234 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
1235 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
1236 g_object_set(table
, "margin", SPACING_MEDIUM
, NULL
);
1237 gtk_box_pack_start (GTK_BOX (content_area
), table
, TRUE
, TRUE
, 0);
1240 bbox
= hbtk_radio_new(RA_ARC_TYPE
, TRUE
);
1241 data
.RA_type
= bbox
;
1242 gtk_widget_set_halign (bbox
, GTK_ALIGN_CENTER
);
1243 gtk_grid_attach (GTK_GRID (table
), bbox
, 0, row
, 2, 1);
1245 hbtk_radio_connect (GTK_CONTAINER(bbox
), "toggled", G_CALLBACK (ui_arc_manage_type_changed_cb
), &data
);
1249 hpaned
= gtk_paned_new(GTK_ORIENTATION_HORIZONTAL
);
1250 //gtk_container_set_border_width (GTK_CONTAINER(hpaned), SPACING_MEDIUM);
1251 gtk_grid_attach (GTK_GRID (table
), hpaned
, 0, row
, 2, 1);
1255 hgrid
= gtk_grid_new ();
1256 gtk_grid_set_row_spacing (GTK_GRID (hgrid
), SPACING_SMALL
);
1257 gtk_grid_set_column_spacing (GTK_GRID (hgrid
), SPACING_MEDIUM
);
1258 gtk_widget_set_margin_right(hgrid
, SPACING_SMALL
);
1259 gtk_paned_pack1 (GTK_PANED(hpaned
), hgrid
, FALSE
, FALSE
);
1262 scrollwin
= gtk_scrolled_window_new(NULL
,NULL
);
1263 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
1264 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin
), GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
1265 treeview
= (GtkWidget
*)ui_arc_listview_new();
1266 data
.LV_arc
= treeview
;
1267 gtk_widget_set_size_request(treeview
, HB_MINWIDTH_LIST
, -1);
1268 gtk_container_add(GTK_CONTAINER(scrollwin
), treeview
);
1269 gtk_widget_set_hexpand (scrollwin
, TRUE
);
1270 gtk_widget_set_vexpand (scrollwin
, TRUE
);
1271 gtk_grid_attach (GTK_GRID (hgrid
), scrollwin
, 0, 0, 2, 1);
1273 widget
= gtk_button_new_with_mnemonic(_("_Add"));
1274 data
.BT_add
= widget
;
1275 gtk_grid_attach (GTK_GRID (hgrid
), widget
, 0, 1, 1, 1);
1277 widget
= gtk_button_new_with_mnemonic(_("_Delete"));
1278 data
.BT_rem
= widget
;
1279 gtk_grid_attach (GTK_GRID (hgrid
), widget
, 1, 1, 1, 1);
1283 content_grid
= gtk_grid_new();
1284 gtk_grid_set_row_spacing (GTK_GRID (content_grid
), SPACING_LARGE
);
1285 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid
), GTK_ORIENTATION_VERTICAL
);
1286 //gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM);
1287 gtk_widget_set_margin_left(content_grid
, SPACING_SMALL
);
1288 gtk_paned_pack2 (GTK_PANED(hpaned
), content_grid
, FALSE
, FALSE
);
1290 group_grid
= ui_arc_manage_create_left_txn(&data
);
1291 //gtk_widget_set_hexpand (GTK_WIDGET(group_grid), FALSE);
1292 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, 0, 1, 1);
1295 group_grid
= ui_arc_manage_create_scheduling(&data
);
1296 gtk_grid_attach (GTK_GRID (content_grid
), group_grid
, 0, 1, 1, 1);
1298 /* set default periodicity to month */
1299 //todo: move elsewhere
1300 gtk_combo_box_set_active(GTK_COMBO_BOX(data
.CY_unit
), 2);
1302 gtk_widget_show_all(content_area
);
1303 gtk_widget_hide(data
.CM_cheque
);
1304 gtk_widget_hide(data
.PO_accto
);
1306 //connect all our signals
1307 g_signal_connect (dialog
, "destroy", G_CALLBACK (gtk_widget_destroyed
), &dialog
);
1310 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data
.LV_arc
)), "changed", G_CALLBACK (ui_arc_manage_selection
), NULL
);
1311 g_signal_connect (G_OBJECT (data
.ST_amount
), "icon-release", G_CALLBACK (ui_arc_manage_toggleamount
), NULL
);
1313 g_signal_connect (G_OBJECT (data
.BT_add
), "clicked", G_CALLBACK (ui_arc_manage_add
), NULL
);
1314 g_signal_connect (G_OBJECT (data
.BT_rem
), "clicked", G_CALLBACK (ui_arc_manage_delete
), NULL
);
1316 data
.handler_id
[HID_ARC_MEMO
] = g_signal_connect (G_OBJECT (data
.ST_word
), "changed", G_CALLBACK (ui_arc_manage_rename
), NULL
);
1317 g_signal_connect (data
.NU_mode
, "changed", G_CALLBACK (ui_arc_manage_paymode
), NULL
);
1318 g_signal_connect (data
.PO_acc
, "changed", G_CALLBACK (ui_arc_manage_update_accto
), NULL
);
1319 //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));
1320 //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));
1322 g_signal_connect (data
.CY_tags
, "changed", G_CALLBACK (ui_arc_manage_update_tags
), NULL
);
1324 g_signal_connect (data
.CM_auto
, "toggled", G_CALLBACK (ui_arc_manage_scheduled
), NULL
);
1325 g_signal_connect (data
.CM_limit
, "toggled", G_CALLBACK (ui_arc_manage_scheduled
), NULL
);
1327 g_signal_connect (G_OBJECT (data
.BT_split
), "clicked", G_CALLBACK (defarchive_button_split_cb
), NULL
);
1329 //setup, init and show dialog
1330 ui_arc_manage_setup(&data
);
1331 ui_arc_manage_update(data
.LV_arc
, NULL
);
1333 gtk_widget_show (dialog
);
1336 ui_arc_listview_select_by_pointer(GTK_TREE_VIEW(data
.LV_arc
), ext_arc
);
1339 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
1343 case GTK_RESPONSE_ACCEPT
:
1344 //do_application_specific_something ();
1347 //do_nothing_since_dialog_was_cancelled ();
1351 // cleanup and destroy
1352 ui_arc_manage_cleanup(&data
, result
);
1353 gtk_widget_destroy (dialog
);