X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fhomebank;a=blobdiff_plain;f=src%2Fui-archive.c;fp=src%2Fui-archive.c;h=7c8f81229a60fc3ab629f787b4a7f52d99795a1c;hp=2db2edc57a7d59d0a34d9a3e3f69af006d35f891;hb=59c5e08a64798d4303ae7eb3a2713bc93d98fa7b;hpb=8988b3bef0760b4cab8144715cc3d8f55688861c diff --git a/src/ui-archive.c b/src/ui-archive.c index 2db2edc..7c8f812 100644 --- a/src/ui-archive.c +++ b/src/ui-archive.c @@ -1,5 +1,5 @@ /* HomeBank -- Free, easy, personal accounting for everyone. - * Copyright (C) 1995-2014 Maxime DOYEN + * Copyright (C) 1995-2016 Maxime DOYEN * * This file is part of HomeBank. * @@ -24,6 +24,7 @@ #include "ui-account.h" #include "ui-category.h" #include "ui-payee.h" +#include "ui-split.h" #include "gtk-dateentry.h" @@ -40,19 +41,99 @@ /* our global datas */ extern struct HomeBank *GLOBALS; +extern struct Preferences *PREFS; +gchar *CYA_ARCHIVE_TYPE[] = { + N_("Scheduled"), + N_("Template"), + NULL +}; + gchar *CYA_UNIT[] = { N_("Day"), N_("Week"), N_("Month"), N_("Year"), NULL }; gchar *CYA_SCHED_WEEKEND[] = { N_("Possible"), N_("Before"), N_("After"), NULL }; +extern gchar *CYA_TXN_STATUS[]; static GtkWidget *ui_arc_listview_new(void); +static void ui_arc_listview_populate(GtkWidget *view, gint type) +{ +GtkTreeModel *model; +GtkTreeIter iter; +GList *list; +gint i; + + DB( g_print("ui_arc_listview_populate()\n") ); + + DB( g_print(" - type=%d\n", type) ); + + + //insert all glist item into treeview + model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); + + + gtk_list_store_clear (GTK_LIST_STORE(model)); + + i=0; + list = g_list_first(GLOBALS->arc_list); + while (list != NULL) + { + Archive *item = list->data; + + if( (type == ARC_TYPE_SCHEDULED) && !(item->flags & OF_AUTO) ) + goto next; + + if( (type == ARC_TYPE_TEMPLATE) && (item->flags & OF_AUTO) ) + goto next; + + gtk_list_store_append (GTK_LIST_STORE(model), &iter); + gtk_list_store_set (GTK_LIST_STORE(model), &iter, + LST_DEFARC_DATAS, item, //data struct + LST_DEFARC_OLDPOS, i, //oldpos + -1); + + //DB( g_print(" populate_treeview: %d %08x\n", i, list->data) ); +next: + i++; list = g_list_next(list); + } + +} + + +static void ui_arc_listview_select_by_pointer(GtkTreeView *treeview, gpointer user_data) +{ +GtkTreeModel *model; +GtkTreeIter iter; +GtkTreeSelection *selection; +gboolean valid; +Archive *arc = user_data; + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); + + valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter); + while (valid) + { + Archive *tmp_arc; + + gtk_tree_model_get (model, &iter, LST_DEFARC_DATAS, &tmp_arc, -1); + if( arc == tmp_arc ) + { + gtk_tree_selection_select_iter (selection, &iter); + break; + } + + valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); + } +} + + /* ** ** The function should return: @@ -62,12 +143,38 @@ static GtkWidget *ui_arc_listview_new(void); */ static gint ui_arc_listview_compare_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata) { +gint sortcol = GPOINTER_TO_INT(userdata); Archive *entry1, *entry2; +gint retval = 0; gtk_tree_model_get(model, a, LST_DEFARC_DATAS, &entry1, -1); gtk_tree_model_get(model, b, LST_DEFARC_DATAS, &entry2, -1); - return hb_string_utf8_compare(entry1->wording, entry2->wording); + switch (sortcol) + { + case LST_DEFARC_SORT_MEMO: + retval = (entry1->flags & GF_INCOME) - (entry2->flags & GF_INCOME); + if(!retval) + { + retval = hb_string_utf8_compare(entry1->wording, entry2->wording); + } + break; + case LST_DEFARC_SORT_PAYEE: + { + Payee *p1, *p2; + + p1 = da_pay_get(entry1->kpay); + p2 = da_pay_get(entry2->kpay); + if( p1 != NULL && p2 != NULL ) + { + retval = hb_string_utf8_compare(p1->name, p2->name); + } + } + break; + default: + g_return_val_if_reached(0); + } + return retval; } @@ -77,22 +184,21 @@ Archive *entry1, *entry2; static void ui_arc_listview_auto_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { Archive *item; -GdkPixbuf *pixbuf = NULL; +gchar *iconname = NULL; // get the transaction gtk_tree_model_get(model, iter, LST_DEFARC_DATAS, &item, -1); - if( item->flags & OF_AUTO ) - pixbuf = GLOBALS->lst_pixbuf[LST_PIXBUF_AUTO]; + iconname = ( item->flags & OF_AUTO ) ? ICONNAME_HB_OPE_AUTO : NULL; - g_object_set(renderer, "pixbuf", pixbuf, NULL); + g_object_set(renderer, "icon-name", iconname, NULL); } /* ** draw some text from the stored data structure */ -static void ui_arc_listview_text_cell_data_function (GtkTreeViewColumn *col, +static void ui_arc_listview_cell_data_function_memo (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, @@ -110,6 +216,28 @@ gchar *name; +static void ui_arc_listview_cell_data_function_payee (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) +{ +Archive *arc; +Payee *pay; + + gtk_tree_model_get(model, iter, + LST_DEFARC_DATAS, &arc, + -1); + + if(arc) + { + + pay = da_pay_get(arc->kpay); + + if(pay != NULL) + g_object_set(renderer, "text", pay->name, NULL); + } + else + g_object_set(renderer, "text", NULL, NULL); + +} + /* ** */ @@ -128,30 +256,64 @@ GtkTreeViewColumn *column; G_TYPE_BOOLEAN ); - //sortable - 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); - - //treeview view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); g_object_unref(store); - /* icon column */ + gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view), PREFS->grid_lines); + + /* column: Memo */ + renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, + "ellipsize", PANGO_ELLIPSIZE_END, + "ellipsize-set", TRUE, + NULL); + column = gtk_tree_view_column_new(); - renderer = gtk_cell_renderer_pixbuf_new (); - gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1); + gtk_tree_view_column_set_title(column, _("Memo")); gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ui_arc_listview_auto_cell_data_function, NULL, NULL); + 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); + gtk_tree_view_column_set_sort_column_id (column, LST_DEFARC_SORT_MEMO); + gtk_tree_view_column_set_alignment (column, 0.5); + gtk_tree_view_column_set_min_width(column, HB_MINWIDTH_LIST); + gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - /* text column */ - column = gtk_tree_view_column_new(); + /* column: Payee */ renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, + "ellipsize", PANGO_ELLIPSIZE_END, + "ellipsize-set", TRUE, + NULL); + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _("Payee")); gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ui_arc_listview_text_cell_data_function, GINT_TO_POINTER(1), NULL); + 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); + gtk_tree_view_column_set_resizable(column, TRUE); + //gtk_tree_view_column_add_attribute(column, renderer, "text", 1); + gtk_tree_view_column_set_sort_column_id (column, LST_DEFARC_SORT_PAYEE); + gtk_tree_view_column_set_alignment (column, 0.5); + gtk_tree_view_column_set_min_width(column, HB_MINWIDTH_LIST); gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE); + + /* column: Scheduled icon */ + column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_pixbuf_new (); + //gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1); + gtk_tree_view_column_pack_start(column, renderer, TRUE); + gtk_tree_view_column_set_cell_data_func(column, renderer, ui_arc_listview_auto_cell_data_function, NULL, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); + + + //sortable + 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); + 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); + + + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), LST_DEFARC_SORT_MEMO, GTK_SORT_ASCENDING); + + //gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE); //gtk_tree_view_set_reorderable (GTK_TREE_VIEW(view), TRUE); return(view); @@ -170,8 +332,8 @@ static void ui_arc_manage_add(GtkWidget *widget, gpointer user_data) struct ui_arc_manage_data *data; GtkTreeModel *model; GtkTreeIter iter; - Archive *item; +gint type; data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); DB( g_print("\n[ui_scheduled] add\n") ); @@ -179,9 +341,13 @@ Archive *item; model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_arc)); item = da_archive_malloc(); - item->wording = g_strdup_printf(_("(archive %d)"), g_list_length(GLOBALS->arc_list) + 1); + item->wording = g_strdup_printf(_("(template %d)"), g_list_length(GLOBALS->arc_list) + 1); item->unit = 2; + type = radio_get_active(GTK_CONTAINER(data->RA_type)) == 1 ? ARC_TYPE_TEMPLATE : ARC_TYPE_SCHEDULED; + if( type == ARC_TYPE_SCHEDULED ) + item->flags |= OF_AUTO; + GLOBALS->arc_list = g_list_append(GLOBALS->arc_list, item); gtk_list_store_append (GTK_LIST_STORE(model), &iter); @@ -196,30 +362,53 @@ Archive *item; } /* -** remove the selected account to our treeview and temp GList +** delete the selected account to our treeview and temp GList */ -static void ui_arc_manage_remove(GtkWidget *widget, gpointer user_data) +static void ui_arc_manage_delete(GtkWidget *widget, gpointer user_data) { struct ui_arc_manage_data *data; GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; Archive *item; +gint result; data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - DB( g_print("\n[ui_scheduled] remove (data=%p)\n", data) ); + DB( g_print("\n[ui_scheduled] delete (data=%p)\n", data) ); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_arc)); //if true there is a selected node if (gtk_tree_selection_get_selected(selection, &model, &iter)) { + gchar *title; + gchar *secondtext; + gtk_tree_model_get(model, &iter, LST_DEFARC_DATAS, &item, -1); - gtk_list_store_remove(GTK_LIST_STORE(model), &iter); - GLOBALS->arc_list = g_list_remove(GLOBALS->arc_list, item); + title = g_strdup_printf ( + _("Are you sure you want to permanently delete '%s'?"), item->wording); - data->change++; - //DB( g_print(" remove =%08x (pos=%d)\n", entry, g_list_index(data->tmp_list, entry) ) ); + secondtext = _("If you delete a scheduled/template, it will be permanently lost."); + + result = ui_dialog_msg_confirm_alert( + GTK_WINDOW(data->window), + title, + secondtext, + _("_Delete") + ); + + g_free(title); + + if( result == GTK_RESPONSE_OK ) + { + gtk_list_store_remove(GTK_LIST_STORE(model), &iter); + + GLOBALS->arc_list = g_list_remove(GLOBALS->arc_list, item); + + data->change++; + + } + //DB( g_print(" delete =%08x (pos=%d)\n", entry, g_list_index(data->tmp_list, entry) ) ); } } @@ -293,14 +482,20 @@ Archive *item; gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), item->amount); - g_signal_handler_block(data->CM_valid, data->handler_id[HID_ARC_VALID]); + + + radio_set_active(GTK_CONTAINER(data->RA_status), item->status ); + + + /*g_signal_handler_block(data->CM_valid, data->handler_id[HID_ARC_VALID]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_valid), (item->flags & OF_VALID) ? 1 : 0); g_signal_handler_unblock(data->CM_valid, data->handler_id[HID_ARC_VALID]); g_signal_handler_block(data->CM_remind, data->handler_id[HID_ARC_REMIND]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_remind), (item->flags & OF_REMIND) ? 1 : 0); g_signal_handler_unblock(data->CM_remind, data->handler_id[HID_ARC_REMIND]); - + */ + gtk_combo_box_set_active(GTK_COMBO_BOX(data->NU_mode), item->paymode); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_cheque), (item->flags & OF_CHEQ2) ? 1 : 0); @@ -322,7 +517,7 @@ Archive *item; gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_unit), item->unit); - gtk_dateentry_set_date(GTK_DATE_ENTRY(data->PO_next), item->nextdate); + gtk_date_entry_set_date(GTK_DATE_ENTRY(data->PO_next), item->nextdate); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_limit), (item->flags & OF_LIMIT) ? 1 : 0); @@ -342,11 +537,11 @@ Archive *item; */ static void ui_arc_manage_getlast(struct ui_arc_manage_data *data) { +Archive *item; gchar *txt; -gboolean bool; gdouble value; gint active; -Archive *item; + DB( g_print("\n[ui_scheduled] getlast\n") ); @@ -356,6 +551,8 @@ Archive *item; { DB( g_print(" -> %s\n", item->wording) ); + gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data->LV_arc)); + txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_word)); // ignore if entry is empty if (txt && *txt) @@ -364,45 +561,51 @@ Archive *item; item->wording = g_strdup(txt); } - gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data->LV_arc)); - + gtk_spin_button_update(GTK_SPIN_BUTTON(data->ST_amount)); value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)); item->amount = value; - item->flags = 0; + item->paymode = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode)); + item->kcat = ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data->PO_grp)); + item->kpay = ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data->PO_pay)); + item->kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc)); + item->kxferacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_accto)); - active = item->amount > 0 ? TRUE : FALSE; - //active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_amount)); - if(active == 1) item->flags |= OF_INCOME; + item->status = radio_get_active(GTK_CONTAINER(data->RA_status)); + + //#1615245: moved here, after get combo entry key + if( item->paymode != PAYMODE_INTXFER ) + { + //#677351: revert kxferacc to 0 + item->kxferacc = 0; + } - bool = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_cheque)); - if(bool) item->flags |= OF_CHEQ2; + /* flags */ + //item->flags = 0; + item->flags &= (OF_SPLIT); //(split is set in hb_archive) - bool = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_valid)); - if(bool) item->flags |= OF_VALID; + active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_cheque)); + if(active == 1) item->flags |= OF_CHEQ2; - bool = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_remind)); - if(bool == 1) item->flags |= OF_REMIND; + //active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_amount)); + active = item->amount > 0 ? TRUE : FALSE; + if(active == TRUE) item->flags |= OF_INCOME; - item->paymode = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode)); - item->kcat = ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data->PO_grp)); - item->kpay = ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data->PO_pay)); - item->kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc)); - item->kxferacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_accto)); - DB( g_print(" -> PO_acc %d\n", item->kacc) ); - DB( g_print(" -> PO_accto %d\n", item->kxferacc) ); + /* -- automated -- */ - bool = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_auto)); - if(bool) item->flags |= OF_AUTO; + active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_auto)); + if(active == 1) item->flags |= OF_AUTO; + gtk_spin_button_update(GTK_SPIN_BUTTON(data->NB_every)); item->every = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data->NB_every)); item->unit = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_unit)); - item->nextdate = gtk_dateentry_get_date(GTK_DATE_ENTRY(data->PO_next)); + item->nextdate = gtk_date_entry_get_date(GTK_DATE_ENTRY(data->PO_next)); - bool = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_limit)); - if(bool) item->flags |= OF_LIMIT; + active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_limit)); + if(active == 1) item->flags |= OF_LIMIT; + gtk_spin_button_update(GTK_SPIN_BUTTON(data->NB_limit)); item->limit = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data->NB_limit)); item->weekend = radio_get_active(GTK_CONTAINER(data->CY_weekend)); @@ -450,7 +653,7 @@ gboolean sensitive; data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - DB( g_print("\n[ui_scheduled] widget=%p, data=%p\n", widget, data) ); + //DB( g_print(" widget=%p, data=%p\n", widget, data) ); payment = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode)); @@ -474,6 +677,8 @@ gboolean sensitive; hb_widget_visible(data->LB_accto, sensitive); hb_widget_visible(data->PO_accto, sensitive); + DB( g_print(" visible: %d\n", sensitive) ); + } /* @@ -482,27 +687,94 @@ gboolean sensitive; static void ui_arc_manage_scheduled(GtkWidget *widget, gpointer user_data) { struct ui_arc_manage_data *data; -gboolean sensitive; +Archive *arcitem; +GtkTreeModel *model; +GtkTreeIter iter; +GtkTreePath *path; +gboolean selected, sensitive; DB( g_print("\n[ui_scheduled] scheduled\n") ); data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - //scheduled - sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_auto)) ? TRUE : FALSE; + sensitive = FALSE; + + + selected = gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_arc)), &model, &iter); + if(selected) + { + gtk_tree_model_get(model, &iter, LST_DEFARC_DATAS, &arcitem, -1); + + arcitem->flags &= ~(OF_AUTO); + sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_auto)) ? TRUE : FALSE; + if(sensitive) + arcitem->flags |= OF_AUTO; + } + + + + gtk_widget_set_sensitive(data->LB_next, sensitive); gtk_widget_set_sensitive(data->PO_next, sensitive); + + gtk_widget_set_sensitive(data->LB_every, sensitive); gtk_widget_set_sensitive(data->NB_every, sensitive); + + gtk_widget_set_sensitive(data->LB_weekend, sensitive); + gtk_widget_set_sensitive(data->CY_weekend, sensitive); + gtk_widget_set_sensitive(data->CY_unit, sensitive); gtk_widget_set_sensitive(data->CM_limit, sensitive); - gtk_widget_set_sensitive(data->CY_weekend, sensitive); + gtk_widget_set_sensitive(data->LB_posts, sensitive); + + sensitive = (sensitive == TRUE) ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_limit)) : sensitive; gtk_widget_set_sensitive(data->NB_limit, sensitive); - + if(selected) + { + /* redraw the row to display/hide the icon */ + path = gtk_tree_model_get_path(model, &iter); + gtk_tree_model_row_changed(model, path, &iter); + gtk_tree_path_free (path); + + // gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data->LV_arc)); + //gtk_widget_queue_draw (GTK_WIDGET(data->LV_arc)); + } + } +static void ui_arc_manage_update_post_split(GtkWidget *widget, gdouble amount) +{ + struct ui_arc_manage_data *data; + gboolean sensitive = TRUE; + + DB( g_print("(ui_arc_manage) update _post_split\n") ); + + data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); + + DB( g_print("- amount=%.2f\n", amount) ); + + data->lastarcitem->amount = amount; + gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), amount); + + data->lastarcitem->flags &= ~(OF_SPLIT); //First set flag that Splits are cleared + + if (da_splits_count(data->lastarcitem->splits) > 0) + { + /* disable category if split is set */ + data->lastarcitem->flags |= OF_SPLIT; //Then set flag that Splits are active + sensitive = FALSE; + ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), 0); + } + gtk_widget_set_sensitive(data->ST_amount, sensitive); + //# 1416624 empty category when split + if( (data->lastarcitem->flags & (OF_SPLIT)) ) + ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), 0); + gtk_widget_set_sensitive(data->PO_grp, sensitive); + +} /* ** update the widgets status and contents from action/selection value */ @@ -512,6 +784,7 @@ struct ui_arc_manage_data *data; GtkTreeModel *model; GtkTreeIter iter; gboolean selected, sensitive; +gboolean split_sensitive = TRUE; Archive *arcitem; @@ -527,21 +800,8 @@ Archive *arcitem; DB( g_print(" selected = %d\n", selected) ); sensitive = (selected == TRUE) ? TRUE : FALSE; - gtk_widget_set_sensitive(data->PO_pay, sensitive); - gtk_widget_set_sensitive(data->ST_word, sensitive); - gtk_widget_set_sensitive(data->ST_amount, sensitive); - gtk_widget_set_sensitive(data->BT_amount, sensitive); - //gtk_widget_set_sensitive(data->BT_split, sensitive); - - gtk_widget_set_sensitive(data->CM_valid, sensitive); - gtk_widget_set_sensitive(data->CM_remind, sensitive); - gtk_widget_set_sensitive(data->CM_cheque, sensitive); - - gtk_widget_set_sensitive(data->NU_mode, sensitive); - gtk_widget_set_sensitive(data->PO_grp, sensitive); - gtk_widget_set_sensitive(data->PO_acc, sensitive); - gtk_widget_set_sensitive(data->PO_accto, sensitive); + gtk_widget_set_sensitive(data->GR_txnleft, sensitive); gtk_widget_set_sensitive(data->CM_auto, sensitive); @@ -558,6 +818,17 @@ Archive *arcitem; } data->lastarcitem = arcitem; + if (da_splits_count(data->lastarcitem->splits) > 0) + { + + data->lastarcitem->flags |= OF_SPLIT; //Then set flag that Splits are active + split_sensitive = FALSE; + ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), 0); + } + + gtk_widget_set_sensitive(data->ST_amount, split_sensitive); + gtk_widget_set_sensitive(data->PO_grp, split_sensitive); + DB( g_print(" - call set\n") ); ui_arc_manage_set(widget, NULL); } @@ -566,6 +837,9 @@ Archive *arcitem; data->lastarcitem = NULL; } + //gtk_widget_set_sensitive(data->LB_schedinsert, sensitive); + + DB( g_print(" - call scheduled\n") ); ui_arc_manage_scheduled(widget, NULL); DB( g_print(" - call paymode\n") ); @@ -575,71 +849,55 @@ Archive *arcitem; } -static void ui_arc_manage_togglestatus(GtkWidget *widget, gpointer user_data) + +/* +** +*/ +static void ui_arc_manage_toggleamount(GtkWidget *widget, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data) { struct ui_arc_manage_data *data; +gdouble value; - DB( g_print("\n[ui_scheduled] togglestatus\n") ); - - data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); + DB( g_print("\n[ui_scheduled] toggleamount\n") ); - //valid & remind are exclusive - switch( GPOINTER_TO_INT(user_data) ) + if(icon_pos == GTK_ENTRY_ICON_PRIMARY) { - case HID_ARC_VALID: - if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_valid)) ) - { - g_signal_handler_block(data->CM_remind, data->handler_id[HID_ARC_REMIND]); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_remind), FALSE); - g_signal_handler_unblock(data->CM_remind, data->handler_id[HID_ARC_REMIND]); - } - break; - case HID_ARC_REMIND: - if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_remind)) ) - { - g_signal_handler_block(data->CM_valid, data->handler_id[HID_ARC_VALID]); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_valid), FALSE); - g_signal_handler_unblock(data->CM_valid, data->handler_id[HID_ARC_VALID]); - } - } + data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); + gtk_spin_button_update(GTK_SPIN_BUTTON(data->ST_amount)); + value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)); + value *= -1; + gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), value); + /* + value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)); + type = gtk_widget_get_sensitive(data->CY_amount); -} + gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), value * type); + */ + } +} -/* -** -*/ -static void ui_arc_manage_toggleamount(GtkWidget *widget, gpointer user_data) +static void defarchive_button_split_cb(GtkWidget *widget, gpointer user_data) { struct ui_arc_manage_data *data; -gdouble value; +gdouble amount; - DB( g_print("\n[ui_scheduled] toggleamount\n") ); + DB( g_print("\n[ui_scheduled] doing split\n") ); data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)); - value *= -1; - gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), value); - + amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)); - /* - value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)); - type = gtk_widget_get_sensitive(data->CY_amount); + ui_split_dialog(data->window, data->lastarcitem->splits, amount, &ui_arc_manage_update_post_split); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), value * type); - */ } -/* -** -*/ static void ui_arc_manage_selection(GtkTreeSelection *treeselection, gpointer user_data) { DB( g_print("\n[ui_scheduled] selection\n") ); @@ -648,9 +906,21 @@ static void ui_arc_manage_selection(GtkTreeSelection *treeselection, gpointer us ui_arc_manage_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection)), NULL); } -/* -** -*/ + +static void ui_arc_manage_populate_listview(struct ui_arc_manage_data *data) +{ +gint type; + + DB( g_print("\n[ui_scheduled] populate listview\n") ); + + type = radio_get_active(GTK_CONTAINER(data->RA_type)) == 1 ? ARC_TYPE_TEMPLATE : ARC_TYPE_SCHEDULED; + ui_arc_listview_populate(data->LV_arc, type); + gtk_tree_view_expand_all (GTK_TREE_VIEW(data->LV_arc)); +} + + + + static gboolean ui_arc_manage_cleanup(struct ui_arc_manage_data *data, gint result) { gboolean doupdate = FALSE; @@ -676,10 +946,6 @@ gboolean doupdate = FALSE; */ static void ui_arc_manage_setup(struct ui_arc_manage_data *data) { -GtkTreeModel *model; -GtkTreeIter iter; -GList *list; -gint i; DB( g_print("\n[ui_scheduled] setup\n") ); @@ -691,184 +957,152 @@ gint i; //hb-glist_populate_treeview(data->tmp_list, data->LV_arc, LST_DEFARC_DATAS, LST_DEFARC_OLDPOS); //insert all glist item into treeview - model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_arc)); - i=0; - list = g_list_first(GLOBALS->arc_list); - while (list != NULL) - { - Archive *item = list->data; - - gtk_list_store_append (GTK_LIST_STORE(model), &iter); - gtk_list_store_set (GTK_LIST_STORE(model), &iter, - LST_DEFARC_DATAS, item, //data struct - LST_DEFARC_OLDPOS, i, //oldpos - -1); - - //DB( g_print(" populate_treeview: %d %08x\n", i, list->data) ); - - i++; list = g_list_next(list); - } - + ui_arc_manage_populate_listview(data); + DB( g_print(" - populate boxentries\n") ); ui_pay_comboboxentry_populate(GTK_COMBO_BOX(data->PO_pay) , GLOBALS->h_pay); ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data->PO_grp) , GLOBALS->h_cat); ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data->PO_acc) , GLOBALS->h_acc, ACC_LST_INSERT_NORMAL); ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data->PO_accto), GLOBALS->h_acc, ACC_LST_INSERT_NORMAL); - - } static GtkWidget *ui_arc_manage_create_left_txn(struct ui_arc_manage_data *data) { -GtkWidget *table, *hbox, *label, *widget; +GtkWidget *group_grid, *hbox, *label, *widget, *image; gint row; - - table = gtk_table_new (2, 3, FALSE); - gtk_table_set_row_spacings (GTK_TABLE (table), HB_TABROW_SPACING); - gtk_table_set_col_spacings (GTK_TABLE (table), HB_TABCOL_SPACING); + + // group :: Transaction detail + group_grid = gtk_grid_new (); + data->GR_txnleft = group_grid; + gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL); + gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM); row = 0; - label = make_label(_("Transaction detail"), 0.0, 0.5); - gimp_label_set_attributes(GTK_LABEL(label), PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1); - gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 3, row, row+1); - - row++; - label = make_label(_("_Amount:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); - - hbox = gtk_hbox_new (FALSE, 0); - - widget = gtk_button_new_with_label("+/-"); - data->BT_amount = widget; - gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0); - gtk_widget_set_tooltip_text(widget, _("Toggle amount sign")); - - widget = make_amount(label); - data->ST_amount = widget; - gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0); - - gtk_table_attach (GTK_TABLE (table), hbox, 2, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label = make_label_widget(_("_Amount:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_grid_attach (GTK_GRID (group_grid), hbox, 1, row, 1, 1); + + widget = make_amount(label); + data->ST_amount = widget; + gtk_entry_set_icon_from_icon_name(GTK_ENTRY(widget), GTK_ENTRY_ICON_PRIMARY, ICONNAME_HB_TOGGLE_SIGN); + gtk_entry_set_icon_tooltip_text(GTK_ENTRY(widget), GTK_ENTRY_ICON_PRIMARY, _("Toggle amount sign")); + gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0); + + image = gtk_image_new_from_icon_name (ICONNAME_HB_BUTTON_SPLIT, GTK_ICON_SIZE_MENU); + widget = gtk_button_new(); + g_object_set (widget, "image", image, NULL); + data->BT_split = widget; + gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0); + gtk_widget_set_tooltip_text(widget, _("Transaction splits")); row++; - label = make_label(_("Pay_ment:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label = make_label_widget(_("Pay_ment:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); widget = make_paymode(label); data->NU_mode = widget; - gtk_table_attach (GTK_TABLE (table), widget, 2, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + gtk_widget_set_halign (widget, GTK_ALIGN_START); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); row++; widget = gtk_check_button_new_with_mnemonic(_("Of notebook _2")); data->CM_cheque = widget; - gtk_table_attach (GTK_TABLE (table), widget, 1, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1); /* info should be here some day */ row++; - label = make_label(_("A_ccount:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label = make_label_widget(_("A_ccount:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); widget = ui_acc_comboboxentry_new(label); data->PO_acc = widget; - gtk_table_attach (GTK_TABLE (table), widget, 2, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + gtk_widget_set_hexpand (widget, TRUE); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); row++; - label = make_label(_("_To account:"), 0.0, 0.5); + label = make_label_widget(_("_To account:")); data->LB_accto = label; - gtk_table_attach (GTK_TABLE (table), label, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); widget = ui_acc_comboboxentry_new(label); data->PO_accto = widget; - gtk_table_attach (GTK_TABLE (table), widget, 2, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - - return table; -} - - -static GtkWidget *ui_arc_manage_create_right_txn(struct ui_arc_manage_data *data) -{ -GtkWidget *table, *label, *widget; -gint row; - - table = gtk_table_new (2, 3, FALSE); - gtk_table_set_row_spacings (GTK_TABLE (table), HB_TABROW_SPACING); - gtk_table_set_col_spacings (GTK_TABLE (table), HB_TABCOL_SPACING); - - row = 0; - // keep this to avoid a shift - label = make_label(NULL, 0.0, 0.5); - gimp_label_set_attributes(GTK_LABEL(label), PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1); - gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 3, row, row+1); + gtk_widget_set_hexpand (widget, TRUE); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); row++; - label = make_label(_("_Payee:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label = make_label_widget(_("_Payee:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); widget = ui_pay_comboboxentry_new(label); data->PO_pay = widget; - gtk_table_attach (GTK_TABLE (table), widget, 2, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + gtk_widget_set_hexpand (widget, TRUE); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); row++; - label = make_label(_("_Category:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label = make_label_widget(_("_Category:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); widget = ui_cat_comboboxentry_new(label); data->PO_grp = widget; - gtk_table_attach (GTK_TABLE (table), widget, 2, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + gtk_widget_set_hexpand (widget, TRUE); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); row++; - label = make_label(_("_Memo:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label = make_label_widget(_("_Status:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); + widget = make_radio(CYA_TXN_STATUS, TRUE, GTK_ORIENTATION_HORIZONTAL); + data->RA_status = widget; + gtk_widget_set_halign (widget, GTK_ALIGN_START); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); + + row++; + label = make_label_widget(_("_Memo:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); widget = make_string(label); + gtk_widget_set_hexpand (widget, TRUE); data->ST_word = widget; - gtk_table_attach (GTK_TABLE (table), widget, 2, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); /* tags should be here some day */ - row++; - widget = gtk_check_button_new_with_mnemonic (_("_Reconciled")); - data->CM_valid = widget; - gtk_table_attach (GTK_TABLE (table), widget, 1, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - - row++; - widget = gtk_check_button_new_with_mnemonic (_("Re_mind")); - data->CM_remind = widget; - gtk_table_attach (GTK_TABLE (table), widget, 1, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - - return table; + return group_grid; } static GtkWidget *ui_arc_manage_create_scheduling(struct ui_arc_manage_data *data) { -GtkWidget *table, *hbox, *label, *widget; +GtkWidget *group_grid, *hbox, *label, *widget; gint row; - table = gtk_table_new (2, 3, FALSE); - gtk_table_set_row_spacings (GTK_TABLE (table), HB_TABROW_SPACING); - gtk_table_set_col_spacings (GTK_TABLE (table), HB_TABCOL_SPACING); + // group :: Scheduled insertion + group_grid = gtk_grid_new (); + gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL); + gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM); - row = 0; - label = make_label(_("Scheduled insertion"), 0.0, 0.5); - gimp_label_set_attributes(GTK_LABEL(label), PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1); - gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 3, row, row+1); + label = make_label_group(_("Scheduled insertion")); + data->LB_schedinsert = label; + gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1); - row++; + row = 1; widget = gtk_check_button_new_with_mnemonic(_("_Activate")); data->CM_auto = widget; - gtk_table_attach (GTK_TABLE (table), widget, 1, 3, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1); row++; - label = make_label(_("Next _date:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); - widget = gtk_dateentry_new(); + label = gtk_label_new_with_mnemonic (_("Next _date:")); + data->LB_next = label; + gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1); + widget = gtk_date_entry_new(); data->PO_next = widget; - gtk_table_attach (GTK_TABLE (table), widget, 2, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1); row++; - label = make_label(_("Ever_y:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label = make_label_widget(_("Ever_y:")); + data->LB_every = label; + gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1); - hbox = gtk_hbox_new(FALSE, HB_BOX_SPACING); - gtk_table_attach (GTK_TABLE (table), hbox, 2, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL); + gtk_grid_attach (GTK_GRID (group_grid), hbox, 2, row, 1, 1); widget = make_numeric(label, 1, 100); data->NB_every = widget; gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0); @@ -879,16 +1113,17 @@ gint row; gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0); row++; - label = make_label(_("Week end:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label = make_label_widget(_("Week end:")); + data->LB_weekend = label; + gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1); - widget = make_radio(NULL, CYA_SCHED_WEEKEND, GTK_ORIENTATION_HORIZONTAL); + widget = make_radio(CYA_SCHED_WEEKEND, FALSE, GTK_ORIENTATION_HORIZONTAL); data->CY_weekend = widget; - gtk_table_attach (GTK_TABLE (table), widget, 2, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1); row++; - hbox = gtk_hbox_new(FALSE, HB_BOX_SPACING); - gtk_table_attach (GTK_TABLE (table), hbox, 1, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL); + gtk_grid_attach (GTK_GRID (group_grid), hbox, 1, row, 3, 1); widget = gtk_check_button_new_with_mnemonic(_("_Stop after:")); data->CM_limit = widget; @@ -899,51 +1134,81 @@ gint row; gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0); label = gtk_label_new_with_mnemonic (_("posts")); + data->LB_posts = label; gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - return table; + return group_grid; +} + +static void ui_arc_manage_type_changed_cb (GtkToggleButton *button, gpointer user_data) +{ + ui_arc_manage_populate_listview(user_data); + //g_print(" toggle type=%d\n", gtk_toggle_button_get_active(button)); } -GtkWidget *ui_arc_manage_dialog (void) +GtkWidget *ui_arc_manage_dialog (Archive *ext_arc) { struct ui_arc_manage_data data; -GtkWidget *window, *content, *mainbox, *hbox, *vbox, *table; -GtkWidget *widget, *treeview, *scrollwin; -GtkWidget *alignment, *hpaned; -gint row; +GtkWidget *dialog, *content_area, *table, *bbox; +GtkWidget *content_grid, *group_grid, *hgrid, *treeview, *scrollwin; +GtkWidget *widget, *hpaned; +gint w, h, row; - window = gtk_dialog_new_with_buttons (_("Manage scheduled/template transactions"), + dialog = gtk_dialog_new_with_buttons (_("Manage scheduled/template transactions"), GTK_WINDOW(GLOBALS->mainwindow), 0, - GTK_STOCK_CLOSE, + _("_Close"), GTK_RESPONSE_ACCEPT, NULL); - //homebank_window_set_icon_from_file(GTK_WINDOW (window), "archive.svg"); - gtk_window_set_icon_name(GTK_WINDOW (window), HB_STOCK_ARCHIVE); + data.window = dialog; + + gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_HB_ARCHIVE); + + //set a nice dialog size + gtk_window_get_size(GTK_WINDOW(GLOBALS->mainwindow), &w, &h); + gtk_window_set_default_size (GTK_WINDOW(dialog), -1, h/PHI); - //store our window private data - g_object_set_data(G_OBJECT(window), "inst_data", (gpointer)&data); - DB( g_print("\n[ui_scheduled] window=%p, inst_data=%p\n", window, &data) ); + + //store our dialog private data + g_object_set_data(G_OBJECT(dialog), "inst_data", (gpointer)&data); + DB( g_print("\n[ui_scheduled] dialog=%p, inst_data=%p\n", dialog, &data) ); + + //dialog content + content_area = gtk_dialog_get_content_area(GTK_DIALOG (dialog)); // return a vbox + + //our table + table = gtk_grid_new (); + gtk_grid_set_row_spacing (GTK_GRID (table), SPACING_MEDIUM); + gtk_grid_set_column_spacing (GTK_GRID (table), SPACING_MEDIUM); + g_object_set(table, "margin", SPACING_MEDIUM, NULL); + gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0); + + row = 0; + bbox = make_radio(CYA_ARCHIVE_TYPE, TRUE, GTK_ORIENTATION_HORIZONTAL); + data.RA_type = bbox; + gtk_widget_set_halign (bbox, GTK_ALIGN_CENTER); + gtk_grid_attach (GTK_GRID (table), bbox, 0, row, 2, 1); - //window contents - content = gtk_dialog_get_content_area(GTK_DIALOG (window)); - mainbox = gtk_hbox_new (FALSE, HB_BOX_SPACING); - gtk_box_pack_start (GTK_BOX (content), mainbox, TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER(mainbox), HB_MAINBOX_SPACING); + widget = radio_get_nth_widget(GTK_CONTAINER(bbox), 1); + if(widget) + g_signal_connect (widget, "toggled", G_CALLBACK (ui_arc_manage_type_changed_cb), &data); - hpaned = gtk_hpaned_new(); - gtk_box_pack_start (GTK_BOX (mainbox), hpaned, TRUE, TRUE, 0); + row++; + hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL); + //gtk_container_set_border_width (GTK_CONTAINER(hpaned), SPACING_MEDIUM); + gtk_grid_attach (GTK_GRID (table), hpaned, 0, row, 2, 1); + /* left area */ - table = gtk_table_new (2, 2, FALSE); - gtk_table_set_row_spacings (GTK_TABLE (table), HB_TABROW_SPACING); - gtk_table_set_col_spacings (GTK_TABLE (table), HB_TABCOL_SPACING); - gtk_paned_pack1 (GTK_PANED(hpaned), table, FALSE, FALSE); + hgrid = gtk_grid_new (); + gtk_grid_set_row_spacing (GTK_GRID (hgrid), SPACING_SMALL); + gtk_grid_set_column_spacing (GTK_GRID (hgrid), SPACING_MEDIUM); + gtk_widget_set_margin_right(hgrid, SPACING_SMALL); + gtk_paned_pack1 (GTK_PANED(hpaned), hgrid, FALSE, FALSE); // listview - row = 0; scrollwin = gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); @@ -951,77 +1216,74 @@ gint row; data.LV_arc = treeview; gtk_widget_set_size_request(treeview, HB_MINWIDTH_LIST, -1); gtk_container_add(GTK_CONTAINER(scrollwin), treeview); - gtk_table_attach_defaults (GTK_TABLE (table), scrollwin, 0, 2, row, row+1); - - // tools buttons - row++; - widget = gtk_button_new_from_stock(GTK_STOCK_ADD); + gtk_widget_set_hexpand (scrollwin, TRUE); + gtk_widget_set_vexpand (scrollwin, TRUE); + gtk_grid_attach (GTK_GRID (hgrid), scrollwin, 0, 0, 2, 1); + + widget = gtk_button_new_with_mnemonic(_("_Add")); data.BT_add = widget; - gtk_table_attach (GTK_TABLE (table), widget, 0, 1, row, row+1, (GtkAttachOptions) (GTK_FILL|GTK_EXPAND), (GtkAttachOptions) (0), 0, 0); - widget = gtk_button_new_from_stock(GTK_STOCK_REMOVE); + gtk_grid_attach (GTK_GRID (hgrid), widget, 0, 1, 1, 1); + + widget = gtk_button_new_with_mnemonic(_("_Delete")); data.BT_rem = widget; - gtk_table_attach (GTK_TABLE (table), widget, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL|GTK_EXPAND), (GtkAttachOptions) (0), 0, 0); + gtk_grid_attach (GTK_GRID (hgrid), widget, 1, 1, 1, 1); + /* right area */ - vbox = gtk_vbox_new (FALSE, HB_BOX_SPACING); - //gtk_box_pack_start (GTK_BOX (mainbox), vbox, TRUE, TRUE, 0); - gtk_paned_pack2 (GTK_PANED(hpaned), vbox, FALSE, FALSE); + content_grid = gtk_grid_new(); + gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE); + gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL); + //gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM); + gtk_widget_set_margin_left(content_grid, SPACING_SMALL); + gtk_paned_pack2 (GTK_PANED(hpaned), content_grid, FALSE, FALSE); + + group_grid = ui_arc_manage_create_left_txn(&data); + //gtk_widget_set_hexpand (GTK_WIDGET(group_grid), FALSE); + gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, 0, 1, 1); - hbox = gtk_hbox_new (TRUE, HB_HSPACE_SPACING); - gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); - - - widget = ui_arc_manage_create_left_txn(&data); - // gtk_alignment_new(xalign, yalign, xscale, yscale) - alignment = gtk_alignment_new(0.0, 0.0, 1.0, 0.0); - gtk_container_add(GTK_CONTAINER(alignment), widget); - gtk_box_pack_start (GTK_BOX (hbox), alignment, TRUE, TRUE, 0); - - widget = ui_arc_manage_create_right_txn(&data); - // gtk_alignment_new(xalign, yalign, xscale, yscale) - alignment = gtk_alignment_new(0.0, 0.0, 1.0, 0.0); - gtk_container_add(GTK_CONTAINER(alignment), widget); - gtk_box_pack_start (GTK_BOX (hbox), alignment, TRUE, TRUE, 0); - /* sheduling */ - widget = ui_arc_manage_create_scheduling(&data); - // gtk_alignment_new(xalign, yalign, xscale, yscale) - alignment = gtk_alignment_new(0.0, 0.0, 0.20, 0.0); - gtk_container_add(GTK_CONTAINER(alignment), widget); - gtk_box_pack_start (GTK_BOX (vbox), alignment, TRUE, TRUE, 0); + group_grid = ui_arc_manage_create_scheduling(&data); + gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, 1, 1, 1); /* set default periodicity to month */ //todo: move elsewhere gtk_combo_box_set_active(GTK_COMBO_BOX(data.CY_unit), 2); - + gtk_widget_show_all(content_area); + gtk_widget_hide(data.CM_cheque); + gtk_widget_hide(data.PO_accto); //connect all our signals - g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window); + g_signal_connect (dialog, "destroy", G_CALLBACK (gtk_widget_destroyed), &dialog); g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data.LV_arc)), "changed", G_CALLBACK (ui_arc_manage_selection), NULL); - g_signal_connect (G_OBJECT (data.BT_amount), "clicked", G_CALLBACK (ui_arc_manage_toggleamount), NULL); + g_signal_connect (G_OBJECT (data.ST_amount), "icon-release", G_CALLBACK (ui_arc_manage_toggleamount), NULL); g_signal_connect (G_OBJECT (data.BT_add), "clicked", G_CALLBACK (ui_arc_manage_add), NULL); - g_signal_connect (G_OBJECT (data.BT_rem), "clicked", G_CALLBACK (ui_arc_manage_remove), NULL); + g_signal_connect (G_OBJECT (data.BT_rem), "clicked", G_CALLBACK (ui_arc_manage_delete), NULL); data.handler_id[HID_ARC_MEMO] = g_signal_connect (G_OBJECT (data.ST_word), "changed", G_CALLBACK (ui_arc_manage_rename), NULL); g_signal_connect (data.NU_mode, "changed", G_CALLBACK (ui_arc_manage_paymode), NULL); g_signal_connect (data.PO_acc, "changed", G_CALLBACK (ui_arc_manage_update_accto), NULL); - 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)); - 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)); + //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)); + //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)); g_signal_connect (data.CM_auto, "toggled", G_CALLBACK (ui_arc_manage_scheduled), NULL); g_signal_connect (data.CM_limit, "toggled", G_CALLBACK (ui_arc_manage_scheduled), NULL); - //setup, init and show window + g_signal_connect (G_OBJECT (data.BT_split), "clicked", G_CALLBACK (defarchive_button_split_cb), NULL); + + //setup, init and show dialog ui_arc_manage_setup(&data); ui_arc_manage_update(data.LV_arc, NULL); - gtk_widget_show_all (window); + gtk_widget_show (dialog); + + if(ext_arc != NULL) + ui_arc_listview_select_by_pointer(GTK_TREE_VIEW(data.LV_arc), ext_arc); //wait for the user - gint result = gtk_dialog_run (GTK_DIALOG (window)); + gint result = gtk_dialog_run (GTK_DIALOG (dialog)); switch (result) { @@ -1035,7 +1297,7 @@ gint row; // cleanup and destroy ui_arc_manage_cleanup(&data, result); - gtk_widget_destroy (window); + gtk_widget_destroy (dialog); return NULL; }