1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2014 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"
28 #include "gtk-dateentry.h"
30 /****************************************************************************/
32 /****************************************************************************/
41 /* our global datas */
42 extern struct HomeBank
*GLOBALS
;
46 gchar
*CYA_UNIT
[] = { N_("Day"), N_("Week"), N_("Month"), N_("Year"), NULL
};
48 gchar
*CYA_SCHED_WEEKEND
[] = { N_("Possible"), N_("Before"), N_("After"), NULL
};
51 static GtkWidget
*ui_arc_listview_new(void);
58 ** The function should return:
59 ** a negative integer if the first value comes before the second,
60 ** 0 if they are equal,
61 ** or a positive integer if the first value comes after the second.
63 static gint
ui_arc_listview_compare_func (GtkTreeModel
*model
, GtkTreeIter
*a
, GtkTreeIter
*b
, gpointer userdata
)
65 Archive
*entry1
, *entry2
;
67 gtk_tree_model_get(model
, a
, LST_DEFARC_DATAS
, &entry1
, -1);
68 gtk_tree_model_get(model
, b
, LST_DEFARC_DATAS
, &entry2
, -1);
70 return hb_string_utf8_compare(entry1
->wording
, entry2
->wording
);
77 static void ui_arc_listview_auto_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
80 GdkPixbuf
*pixbuf
= NULL
;
82 // get the transaction
83 gtk_tree_model_get(model
, iter
, LST_DEFARC_DATAS
, &item
, -1);
85 if( item
->flags
& OF_AUTO
)
86 pixbuf
= GLOBALS
->lst_pixbuf
[LST_PIXBUF_AUTO
];
88 g_object_set(renderer
, "pixbuf", pixbuf
, NULL
);
93 ** draw some text from the stored data structure
95 static void ui_arc_listview_text_cell_data_function (GtkTreeViewColumn
*col
,
96 GtkCellRenderer
*renderer
,
104 gtk_tree_model_get(model
, iter
, LST_DEFARC_DATAS
, &item
, -1);
106 name
= item
->wording
;
108 g_object_set(renderer
, "text", name
, NULL
);
116 static GtkWidget
*ui_arc_listview_new(void)
120 GtkCellRenderer
*renderer
;
121 GtkTreeViewColumn
*column
;
124 store
= gtk_list_store_new (
132 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store
), LST_DEFARC_DATAS
, ui_arc_listview_compare_func
, GINT_TO_POINTER(LST_DEFARC_DATAS
), NULL
);
136 view
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
137 g_object_unref(store
);
140 column
= gtk_tree_view_column_new();
141 renderer
= gtk_cell_renderer_pixbuf_new ();
142 gtk_cell_renderer_set_fixed_size(renderer
, GLOBALS
->lst_pixbuf_maxwidth
, -1);
143 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
144 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_arc_listview_auto_cell_data_function
, NULL
, NULL
);
145 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
148 column
= gtk_tree_view_column_new();
149 renderer
= gtk_cell_renderer_text_new ();
150 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
151 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_arc_listview_text_cell_data_function
, GINT_TO_POINTER(1), NULL
);
152 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
154 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view
), FALSE
);
155 //gtk_tree_view_set_reorderable (GTK_TREE_VIEW(view), TRUE);
161 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
166 ** add an empty new account to our temp GList and treeview
168 static void ui_arc_manage_add(GtkWidget
*widget
, gpointer user_data
)
170 struct ui_arc_manage_data
*data
;
176 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
177 DB( g_print("\n[ui_scheduled] add\n") );
179 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_arc
));
181 item
= da_archive_malloc();
182 item
->wording
= g_strdup_printf(_("(archive %d)"), g_list_length(GLOBALS
->arc_list
) + 1);
185 GLOBALS
->arc_list
= g_list_append(GLOBALS
->arc_list
, item
);
187 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
188 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
189 LST_DEFARC_DATAS
, item
,
190 LST_DEFARC_OLDPOS
, 0,
193 gtk_tree_selection_select_iter (gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_arc
)), &iter
);
199 ** remove the selected account to our treeview and temp GList
201 static void ui_arc_manage_remove(GtkWidget
*widget
, gpointer user_data
)
203 struct ui_arc_manage_data
*data
;
204 GtkTreeSelection
*selection
;
209 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
210 DB( g_print("\n[ui_scheduled] remove (data=%p)\n", data
) );
212 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_arc
));
213 //if true there is a selected node
214 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
216 gtk_tree_model_get(model
, &iter
, LST_DEFARC_DATAS
, &item
, -1);
217 gtk_list_store_remove(GTK_LIST_STORE(model
), &iter
);
219 GLOBALS
->arc_list
= g_list_remove(GLOBALS
->arc_list
, item
);
222 //DB( g_print(" remove =%08x (pos=%d)\n", entry, g_list_index(data->tmp_list, entry) ) );
228 ** update the archive name everytime it changes
230 static void ui_arc_manage_rename(GtkWidget
*widget
, gpointer user_data
)
232 struct ui_arc_manage_data
*data
;
233 GtkTreeSelection
*selection
;
239 DB( g_print("\n[ui_scheduled] rename\n") );
241 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
243 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_arc
));
244 //if true there is a selected node
245 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
247 gtk_tree_model_get(model
, &iter
, LST_DEFARC_DATAS
, &item
, -1);
249 DB( g_print(" -> %s\n", item
->wording
) );
251 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_word
));
252 // ignore if entry is empty
255 g_free(item
->wording
);
256 item
->wording
= g_strdup(txt
);
259 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_arc
));
269 ** set widgets contents from the selected account
271 static void ui_arc_manage_set(GtkWidget
*widget
, gpointer user_data
)
273 struct ui_arc_manage_data
*data
;
274 GtkTreeSelection
*selection
;
280 DB( g_print("\n[ui_scheduled] set\n") );
282 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
284 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_arc
));
285 //if true there is a selected node
286 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
288 gtk_tree_model_get(model
, &iter
, LST_DEFARC_DATAS
, &item
, -1);
290 g_signal_handler_block(data
->ST_word
, data
->handler_id
[HID_ARC_MEMO
]);
291 gtk_entry_set_text(GTK_ENTRY(data
->ST_word
), item
->wording
);
292 g_signal_handler_unblock(data
->ST_word
, data
->handler_id
[HID_ARC_MEMO
]);
294 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), item
->amount
);
296 g_signal_handler_block(data
->CM_valid
, data
->handler_id
[HID_ARC_VALID
]);
297 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_valid
), (item
->flags
& OF_VALID
) ? 1 : 0);
298 g_signal_handler_unblock(data
->CM_valid
, data
->handler_id
[HID_ARC_VALID
]);
300 g_signal_handler_block(data
->CM_remind
, data
->handler_id
[HID_ARC_REMIND
]);
301 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_remind
), (item
->flags
& OF_REMIND
) ? 1 : 0);
302 g_signal_handler_unblock(data
->CM_remind
, data
->handler_id
[HID_ARC_REMIND
]);
304 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->NU_mode
), item
->paymode
);
306 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_cheque
), (item
->flags
& OF_CHEQ2
) ? 1 : 0);
308 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_grp
), item
->kcat
);
310 DB( g_print(" -> set payee %d\n", item
->kpay
) );
311 ui_pay_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_pay
), item
->kpay
);
313 DB( g_print(" -> PO_acc %d\n", item
->kacc
) );
314 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_acc
), item
->kacc
);
316 DB( g_print(" -> PO_accto %d\n", item
->kxferacc
) );
317 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_accto
), item
->kxferacc
);
319 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_auto
), (item
->flags
& OF_AUTO
) ? 1 : 0);
321 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->NB_every
), item
->every
);
323 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_unit
), item
->unit
);
325 gtk_dateentry_set_date(GTK_DATE_ENTRY(data
->PO_next
), item
->nextdate
);
327 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_limit
), (item
->flags
& OF_LIMIT
) ? 1 : 0);
330 DB( g_print("nb_limit = %d %g\n", item
->limit
, (gdouble
)item
->limit
) );
332 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->NB_limit
), (gdouble
)item
->limit
);
334 radio_set_active(GTK_CONTAINER(data
->CY_weekend
), item
->weekend
);
341 ** get widgets contents to the selected account
343 static void ui_arc_manage_getlast(struct ui_arc_manage_data
*data
)
351 DB( g_print("\n[ui_scheduled] getlast\n") );
353 item
= data
->lastarcitem
;
357 DB( g_print(" -> %s\n", item
->wording
) );
359 txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_word
));
360 // ignore if entry is empty
363 g_free(item
->wording
);
364 item
->wording
= g_strdup(txt
);
367 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_arc
));
369 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
370 item
->amount
= value
;
374 active
= item
->amount
> 0 ? TRUE
: FALSE
;
375 //active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_amount));
376 if(active
== 1) item
->flags
|= OF_INCOME
;
378 bool = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_cheque
));
379 if(bool) item
->flags
|= OF_CHEQ2
;
381 bool = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_valid
));
382 if(bool) item
->flags
|= OF_VALID
;
384 bool = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_remind
));
385 if(bool == 1) item
->flags
|= OF_REMIND
;
387 item
->paymode
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
388 item
->kcat
= ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data
->PO_grp
));
389 item
->kpay
= ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data
->PO_pay
));
390 item
->kacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
391 item
->kxferacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_accto
));
393 DB( g_print(" -> PO_acc %d\n", item
->kacc
) );
394 DB( g_print(" -> PO_accto %d\n", item
->kxferacc
) );
396 bool = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_auto
));
397 if(bool) item
->flags
|= OF_AUTO
;
399 item
->every
= gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data
->NB_every
));
400 item
->unit
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_unit
));
401 item
->nextdate
= gtk_dateentry_get_date(GTK_DATE_ENTRY(data
->PO_next
));
403 bool = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_limit
));
404 if(bool) item
->flags
|= OF_LIMIT
;
406 item
->limit
= gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data
->NB_limit
));
408 item
->weekend
= radio_get_active(GTK_CONTAINER(data
->CY_weekend
));
415 static void ui_arc_manage_update_accto(GtkWidget
*widget
, gpointer user_data
)
417 struct ui_arc_manage_data
*data
;
420 DB( g_print("\n\n[ui_scheduled] update accto\n") );
422 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
424 kacc
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
425 kdst
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_accto
));
427 DB( g_print(" ksrc=%d, kdst=%d\n", kacc
, kdst
) );
429 ui_acc_comboboxentry_populate_except(GTK_COMBO_BOX(data
->PO_accto
), GLOBALS
->h_acc
, kacc
, ACC_LST_INSERT_NORMAL
);
431 if( (kacc
== 0) || (kacc
== kdst
) )
433 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_accto
), 0);
442 static void ui_arc_manage_paymode(GtkWidget
*widget
, gpointer user_data
)
444 struct ui_arc_manage_data
*data
;
449 DB( g_print("\n[ui_scheduled] paymode\n") );
451 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
453 DB( g_print("\n[ui_scheduled] widget=%p, data=%p\n", widget
, data
) );
456 payment
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->NU_mode
));
459 if(payment
== PAYMODE_CHECK
)
462 sensitive
= page
== 1 ? TRUE
: FALSE
;
463 hb_widget_visible(data
->CM_cheque
, sensitive
);
465 if(payment
== PAYMODE_INTXFER
)
468 ui_arc_manage_update_accto(widget
, user_data
);
471 DB( g_print(" payment: %d, page: %d\n", payment
, page
) );
473 sensitive
= page
== 2 ? TRUE
: FALSE
;
474 hb_widget_visible(data
->LB_accto
, sensitive
);
475 hb_widget_visible(data
->PO_accto
, sensitive
);
482 static void ui_arc_manage_scheduled(GtkWidget
*widget
, gpointer user_data
)
484 struct ui_arc_manage_data
*data
;
487 DB( g_print("\n[ui_scheduled] scheduled\n") );
489 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
492 sensitive
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_auto
)) ? TRUE
: FALSE
;
493 gtk_widget_set_sensitive(data
->PO_next
, sensitive
);
494 gtk_widget_set_sensitive(data
->NB_every
, sensitive
);
495 gtk_widget_set_sensitive(data
->CY_unit
, sensitive
);
496 gtk_widget_set_sensitive(data
->CM_limit
, sensitive
);
497 gtk_widget_set_sensitive(data
->CY_weekend
, sensitive
);
499 sensitive
= (sensitive
== TRUE
) ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_limit
)) : sensitive
;
500 gtk_widget_set_sensitive(data
->NB_limit
, sensitive
);
507 ** update the widgets status and contents from action/selection value
509 static void ui_arc_manage_update(GtkWidget
*widget
, gpointer user_data
)
511 struct ui_arc_manage_data
*data
;
514 gboolean selected
, sensitive
;
518 DB( g_print("\n[ui_scheduled] update\n") );
520 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
521 //window = gtk_widget_get_ancestor(GTK_WIDGET(treeview), GTK_TYPE_WINDOW);
522 //DB( g_print("\n[ui_scheduled] widget=%08lx, window=%08lx, inst_data=%08lx\n", treeview, window, data) );
524 //if true there is a selected node
525 selected
= gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_arc
)), &model
, &iter
);
527 DB( g_print(" selected = %d\n", selected
) );
529 sensitive
= (selected
== TRUE
) ? TRUE
: FALSE
;
530 gtk_widget_set_sensitive(data
->PO_pay
, sensitive
);
531 gtk_widget_set_sensitive(data
->ST_word
, sensitive
);
532 gtk_widget_set_sensitive(data
->ST_amount
, sensitive
);
533 gtk_widget_set_sensitive(data
->BT_amount
, sensitive
);
534 //gtk_widget_set_sensitive(data->BT_split, sensitive);
536 gtk_widget_set_sensitive(data
->CM_valid
, sensitive
);
537 gtk_widget_set_sensitive(data
->CM_remind
, sensitive
);
539 gtk_widget_set_sensitive(data
->CM_cheque
, sensitive
);
541 gtk_widget_set_sensitive(data
->NU_mode
, sensitive
);
542 gtk_widget_set_sensitive(data
->PO_grp
, sensitive
);
543 gtk_widget_set_sensitive(data
->PO_acc
, sensitive
);
544 gtk_widget_set_sensitive(data
->PO_accto
, sensitive
);
546 gtk_widget_set_sensitive(data
->CM_auto
, sensitive
);
548 gtk_widget_set_sensitive(data
->BT_rem
, sensitive
);
552 gtk_tree_model_get(model
, &iter
, LST_DEFARC_DATAS
, &arcitem
, -1);
554 if(data
->lastarcitem
!= NULL
&& arcitem
!= data
->lastarcitem
)
556 DB( g_print(" -> should do a get for last selected (%s)\n", data
->lastarcitem
->wording
) );
557 ui_arc_manage_getlast(data
);
559 data
->lastarcitem
= arcitem
;
561 DB( g_print(" - call set\n") );
562 ui_arc_manage_set(widget
, NULL
);
566 data
->lastarcitem
= NULL
;
569 DB( g_print(" - call scheduled\n") );
570 ui_arc_manage_scheduled(widget
, NULL
);
571 DB( g_print(" - call paymode\n") );
572 ui_arc_manage_paymode(widget
,NULL
);
578 static void ui_arc_manage_togglestatus(GtkWidget
*widget
, gpointer user_data
)
580 struct ui_arc_manage_data
*data
;
582 DB( g_print("\n[ui_scheduled] togglestatus\n") );
584 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
586 //valid & remind are exclusive
587 switch( GPOINTER_TO_INT(user_data
) )
590 if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_valid
)) )
592 g_signal_handler_block(data
->CM_remind
, data
->handler_id
[HID_ARC_REMIND
]);
593 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_remind
), FALSE
);
594 g_signal_handler_unblock(data
->CM_remind
, data
->handler_id
[HID_ARC_REMIND
]);
599 if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_remind
)) )
601 g_signal_handler_block(data
->CM_valid
, data
->handler_id
[HID_ARC_VALID
]);
602 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_valid
), FALSE
);
603 g_signal_handler_unblock(data
->CM_valid
, data
->handler_id
[HID_ARC_VALID
]);
617 static void ui_arc_manage_toggleamount(GtkWidget
*widget
, gpointer user_data
)
619 struct ui_arc_manage_data
*data
;
622 DB( g_print("\n[ui_scheduled] toggleamount\n") );
624 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
626 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_amount
));
628 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data
->ST_amount
), value
);
632 value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
633 type = gtk_widget_get_sensitive(data->CY_amount);
635 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), value * type);
643 static void ui_arc_manage_selection(GtkTreeSelection
*treeselection
, gpointer user_data
)
645 DB( g_print("\n[ui_scheduled] selection\n") );
647 DB( g_print(" - call update\n") );
648 ui_arc_manage_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), NULL
);
654 static gboolean
ui_arc_manage_cleanup(struct ui_arc_manage_data
*data
, gint result
)
656 gboolean doupdate
= FALSE
;
658 DB( g_print("\n[ui_scheduled] cleanup\n") );
661 if(data
->lastarcitem
!= NULL
)
663 DB( g_print(" -> should do a get for last selected (%s)\n", data
->lastarcitem
->wording
) );
664 ui_arc_manage_getlast(data
);
667 GLOBALS
->arc_list
= da_archive_sort(GLOBALS
->arc_list
);
669 GLOBALS
->changes_count
+= data
->change
;
677 static void ui_arc_manage_setup(struct ui_arc_manage_data
*data
)
684 DB( g_print("\n[ui_scheduled] setup\n") );
687 data
->tmp_list
= NULL
; //hb-glist_clone_list(GLOBALS->arc_list, sizeof(struct _Archive));
689 data
->lastarcitem
= NULL
;
691 //hb-glist_populate_treeview(data->tmp_list, data->LV_arc, LST_DEFARC_DATAS, LST_DEFARC_OLDPOS);
693 //insert all glist item into treeview
694 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_arc
));
696 list
= g_list_first(GLOBALS
->arc_list
);
699 Archive
*item
= list
->data
;
701 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
702 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
703 LST_DEFARC_DATAS
, item
, //data struct
704 LST_DEFARC_OLDPOS
, i
, //oldpos
707 //DB( g_print(" populate_treeview: %d %08x\n", i, list->data) );
709 i
++; list
= g_list_next(list
);
712 DB( g_print(" - populate boxentries\n") );
714 ui_pay_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_pay
) , GLOBALS
->h_pay
);
715 ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_grp
) , GLOBALS
->h_cat
);
716 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_acc
) , GLOBALS
->h_acc
, ACC_LST_INSERT_NORMAL
);
717 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_accto
), GLOBALS
->h_acc
, ACC_LST_INSERT_NORMAL
);
723 static GtkWidget
*ui_arc_manage_create_left_txn(struct ui_arc_manage_data
*data
)
725 GtkWidget
*table
, *hbox
, *label
, *widget
;
728 table
= gtk_table_new (2, 3, FALSE
);
729 gtk_table_set_row_spacings (GTK_TABLE (table
), HB_TABROW_SPACING
);
730 gtk_table_set_col_spacings (GTK_TABLE (table
), HB_TABCOL_SPACING
);
733 label
= make_label(_("Transaction detail"), 0.0, 0.5);
734 gimp_label_set_attributes(GTK_LABEL(label
), PANGO_ATTR_WEIGHT
, PANGO_WEIGHT_BOLD
, -1);
735 gtk_table_attach_defaults (GTK_TABLE (table
), label
, 0, 3, row
, row
+1);
738 label
= make_label(_("_Amount:"), 0.0, 0.5);
739 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
741 hbox
= gtk_hbox_new (FALSE
, 0);
743 widget
= gtk_button_new_with_label("+/-");
744 data
->BT_amount
= widget
;
745 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
746 gtk_widget_set_tooltip_text(widget
, _("Toggle amount sign"));
748 widget
= make_amount(label
);
749 data
->ST_amount
= widget
;
750 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
752 gtk_table_attach (GTK_TABLE (table
), hbox
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
755 label
= make_label(_("Pay_ment:"), 0.0, 0.5);
756 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
757 widget
= make_paymode(label
);
758 data
->NU_mode
= widget
;
759 gtk_table_attach (GTK_TABLE (table
), widget
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
762 widget
= gtk_check_button_new_with_mnemonic(_("Of notebook _2"));
763 data
->CM_cheque
= widget
;
764 gtk_table_attach (GTK_TABLE (table
), widget
, 1, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
766 /* info should be here some day */
769 label
= make_label(_("A_ccount:"), 0.0, 0.5);
770 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
771 widget
= ui_acc_comboboxentry_new(label
);
772 data
->PO_acc
= widget
;
773 gtk_table_attach (GTK_TABLE (table
), widget
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
776 label
= make_label(_("_To account:"), 0.0, 0.5);
777 data
->LB_accto
= label
;
778 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
779 widget
= ui_acc_comboboxentry_new(label
);
780 data
->PO_accto
= widget
;
781 gtk_table_attach (GTK_TABLE (table
), widget
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
787 static GtkWidget
*ui_arc_manage_create_right_txn(struct ui_arc_manage_data
*data
)
789 GtkWidget
*table
, *label
, *widget
;
792 table
= gtk_table_new (2, 3, FALSE
);
793 gtk_table_set_row_spacings (GTK_TABLE (table
), HB_TABROW_SPACING
);
794 gtk_table_set_col_spacings (GTK_TABLE (table
), HB_TABCOL_SPACING
);
797 // keep this to avoid a shift
798 label
= make_label(NULL
, 0.0, 0.5);
799 gimp_label_set_attributes(GTK_LABEL(label
), PANGO_ATTR_WEIGHT
, PANGO_WEIGHT_BOLD
, -1);
800 gtk_table_attach_defaults (GTK_TABLE (table
), label
, 0, 3, row
, row
+1);
803 label
= make_label(_("_Payee:"), 0.0, 0.5);
804 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
805 widget
= ui_pay_comboboxentry_new(label
);
806 data
->PO_pay
= widget
;
807 gtk_table_attach (GTK_TABLE (table
), widget
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
810 label
= make_label(_("_Category:"), 0.0, 0.5);
811 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
812 widget
= ui_cat_comboboxentry_new(label
);
813 data
->PO_grp
= widget
;
814 gtk_table_attach (GTK_TABLE (table
), widget
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
817 label
= make_label(_("_Memo:"), 0.0, 0.5);
818 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
819 widget
= make_string(label
);
820 data
->ST_word
= widget
;
821 gtk_table_attach (GTK_TABLE (table
), widget
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
823 /* tags should be here some day */
826 widget
= gtk_check_button_new_with_mnemonic (_("_Reconciled"));
827 data
->CM_valid
= widget
;
828 gtk_table_attach (GTK_TABLE (table
), widget
, 1, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
831 widget
= gtk_check_button_new_with_mnemonic (_("Re_mind"));
832 data
->CM_remind
= widget
;
833 gtk_table_attach (GTK_TABLE (table
), widget
, 1, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
840 static GtkWidget
*ui_arc_manage_create_scheduling(struct ui_arc_manage_data
*data
)
842 GtkWidget
*table
, *hbox
, *label
, *widget
;
845 table
= gtk_table_new (2, 3, FALSE
);
846 gtk_table_set_row_spacings (GTK_TABLE (table
), HB_TABROW_SPACING
);
847 gtk_table_set_col_spacings (GTK_TABLE (table
), HB_TABCOL_SPACING
);
850 label
= make_label(_("Scheduled insertion"), 0.0, 0.5);
851 gimp_label_set_attributes(GTK_LABEL(label
), PANGO_ATTR_WEIGHT
, PANGO_WEIGHT_BOLD
, -1);
852 gtk_table_attach_defaults (GTK_TABLE (table
), label
, 0, 3, row
, row
+1);
855 widget
= gtk_check_button_new_with_mnemonic(_("_Activate"));
856 data
->CM_auto
= widget
;
857 gtk_table_attach (GTK_TABLE (table
), widget
, 1, 3, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
860 label
= make_label(_("Next _date:"), 0.0, 0.5);
861 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
862 widget
= gtk_dateentry_new();
863 data
->PO_next
= widget
;
864 gtk_table_attach (GTK_TABLE (table
), widget
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
867 label
= make_label(_("Ever_y:"), 0.0, 0.5);
868 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
870 hbox
= gtk_hbox_new(FALSE
, HB_BOX_SPACING
);
871 gtk_table_attach (GTK_TABLE (table
), hbox
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
872 widget
= make_numeric(label
, 1, 100);
873 data
->NB_every
= widget
;
874 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
875 //label = gtk_label_new_with_mnemonic (_("_Unit:"));
876 //gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
877 widget
= make_cycle(label
, CYA_UNIT
);
878 data
->CY_unit
= widget
;
879 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
882 label
= make_label(_("Week end:"), 0.0, 0.5);
883 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
885 widget
= make_radio(NULL
, CYA_SCHED_WEEKEND
, GTK_ORIENTATION_HORIZONTAL
);
886 data
->CY_weekend
= widget
;
887 gtk_table_attach (GTK_TABLE (table
), widget
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
890 hbox
= gtk_hbox_new(FALSE
, HB_BOX_SPACING
);
891 gtk_table_attach (GTK_TABLE (table
), hbox
, 1, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
893 widget
= gtk_check_button_new_with_mnemonic(_("_Stop after:"));
894 data
->CM_limit
= widget
;
895 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
897 widget
= make_numeric(label
, 1, 366);
898 data
->NB_limit
= widget
;
899 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
901 label
= gtk_label_new_with_mnemonic (_("posts"));
902 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, 0);
908 GtkWidget
*ui_arc_manage_dialog (void)
910 struct ui_arc_manage_data data
;
911 GtkWidget
*window
, *content
, *mainbox
, *hbox
, *vbox
, *table
;
912 GtkWidget
*widget
, *treeview
, *scrollwin
;
913 GtkWidget
*alignment
, *hpaned
;
916 window
= gtk_dialog_new_with_buttons (_("Manage scheduled/template transactions"),
917 GTK_WINDOW(GLOBALS
->mainwindow
),
923 //homebank_window_set_icon_from_file(GTK_WINDOW (window), "archive.svg");
924 gtk_window_set_icon_name(GTK_WINDOW (window
), HB_STOCK_ARCHIVE
);
926 //store our window private data
927 g_object_set_data(G_OBJECT(window
), "inst_data", (gpointer
)&data
);
928 DB( g_print("\n[ui_scheduled] window=%p, inst_data=%p\n", window
, &data
) );
931 content
= gtk_dialog_get_content_area(GTK_DIALOG (window
));
932 mainbox
= gtk_hbox_new (FALSE
, HB_BOX_SPACING
);
933 gtk_box_pack_start (GTK_BOX (content
), mainbox
, TRUE
, TRUE
, 0);
934 gtk_container_set_border_width (GTK_CONTAINER(mainbox
), HB_MAINBOX_SPACING
);
936 hpaned
= gtk_hpaned_new();
937 gtk_box_pack_start (GTK_BOX (mainbox
), hpaned
, TRUE
, TRUE
, 0);
940 table
= gtk_table_new (2, 2, FALSE
);
941 gtk_table_set_row_spacings (GTK_TABLE (table
), HB_TABROW_SPACING
);
942 gtk_table_set_col_spacings (GTK_TABLE (table
), HB_TABCOL_SPACING
);
943 gtk_paned_pack1 (GTK_PANED(hpaned
), table
, FALSE
, FALSE
);
947 scrollwin
= gtk_scrolled_window_new(NULL
,NULL
);
948 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin
), GTK_SHADOW_ETCHED_IN
);
949 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin
), GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
950 treeview
= (GtkWidget
*)ui_arc_listview_new();
951 data
.LV_arc
= treeview
;
952 gtk_widget_set_size_request(treeview
, HB_MINWIDTH_LIST
, -1);
953 gtk_container_add(GTK_CONTAINER(scrollwin
), treeview
);
954 gtk_table_attach_defaults (GTK_TABLE (table
), scrollwin
, 0, 2, row
, row
+1);
958 widget
= gtk_button_new_from_stock(GTK_STOCK_ADD
);
959 data
.BT_add
= widget
;
960 gtk_table_attach (GTK_TABLE (table
), widget
, 0, 1, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
|GTK_EXPAND
), (GtkAttachOptions
) (0), 0, 0);
961 widget
= gtk_button_new_from_stock(GTK_STOCK_REMOVE
);
962 data
.BT_rem
= widget
;
963 gtk_table_attach (GTK_TABLE (table
), widget
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
|GTK_EXPAND
), (GtkAttachOptions
) (0), 0, 0);
966 vbox
= gtk_vbox_new (FALSE
, HB_BOX_SPACING
);
967 //gtk_box_pack_start (GTK_BOX (mainbox), vbox, TRUE, TRUE, 0);
968 gtk_paned_pack2 (GTK_PANED(hpaned
), vbox
, FALSE
, FALSE
);
970 hbox
= gtk_hbox_new (TRUE
, HB_HSPACE_SPACING
);
971 gtk_box_pack_start (GTK_BOX (vbox
), hbox
, TRUE
, TRUE
, 0);
974 widget
= ui_arc_manage_create_left_txn(&data
);
975 // gtk_alignment_new(xalign, yalign, xscale, yscale)
976 alignment
= gtk_alignment_new(0.0, 0.0, 1.0, 0.0);
977 gtk_container_add(GTK_CONTAINER(alignment
), widget
);
978 gtk_box_pack_start (GTK_BOX (hbox
), alignment
, TRUE
, TRUE
, 0);
980 widget
= ui_arc_manage_create_right_txn(&data
);
981 // gtk_alignment_new(xalign, yalign, xscale, yscale)
982 alignment
= gtk_alignment_new(0.0, 0.0, 1.0, 0.0);
983 gtk_container_add(GTK_CONTAINER(alignment
), widget
);
984 gtk_box_pack_start (GTK_BOX (hbox
), alignment
, TRUE
, TRUE
, 0);
987 widget
= ui_arc_manage_create_scheduling(&data
);
988 // gtk_alignment_new(xalign, yalign, xscale, yscale)
989 alignment
= gtk_alignment_new(0.0, 0.0, 0.20, 0.0);
990 gtk_container_add(GTK_CONTAINER(alignment
), widget
);
991 gtk_box_pack_start (GTK_BOX (vbox
), alignment
, TRUE
, TRUE
, 0);
993 /* set default periodicity to month */
994 //todo: move elsewhere
995 gtk_combo_box_set_active(GTK_COMBO_BOX(data
.CY_unit
), 2);
999 //connect all our signals
1000 g_signal_connect (window
, "destroy", G_CALLBACK (gtk_widget_destroyed
), &window
);
1002 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data
.LV_arc
)), "changed", G_CALLBACK (ui_arc_manage_selection
), NULL
);
1003 g_signal_connect (G_OBJECT (data
.BT_amount
), "clicked", G_CALLBACK (ui_arc_manage_toggleamount
), NULL
);
1005 g_signal_connect (G_OBJECT (data
.BT_add
), "clicked", G_CALLBACK (ui_arc_manage_add
), NULL
);
1006 g_signal_connect (G_OBJECT (data
.BT_rem
), "clicked", G_CALLBACK (ui_arc_manage_remove
), NULL
);
1008 data
.handler_id
[HID_ARC_MEMO
] = g_signal_connect (G_OBJECT (data
.ST_word
), "changed", G_CALLBACK (ui_arc_manage_rename
), NULL
);
1009 g_signal_connect (data
.NU_mode
, "changed", G_CALLBACK (ui_arc_manage_paymode
), NULL
);
1010 g_signal_connect (data
.PO_acc
, "changed", G_CALLBACK (ui_arc_manage_update_accto
), NULL
);
1011 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
));
1012 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
));
1014 g_signal_connect (data
.CM_auto
, "toggled", G_CALLBACK (ui_arc_manage_scheduled
), NULL
);
1015 g_signal_connect (data
.CM_limit
, "toggled", G_CALLBACK (ui_arc_manage_scheduled
), NULL
);
1017 //setup, init and show window
1018 ui_arc_manage_setup(&data
);
1019 ui_arc_manage_update(data
.LV_arc
, NULL
);
1021 gtk_widget_show_all (window
);
1024 gint result
= gtk_dialog_run (GTK_DIALOG (window
));
1028 case GTK_RESPONSE_ACCEPT
:
1029 //do_application_specific_something ();
1032 //do_nothing_since_dialog_was_cancelled ();
1036 // cleanup and destroy
1037 ui_arc_manage_cleanup(&data
, result
);
1038 gtk_widget_destroy (window
);