X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fhomebank;a=blobdiff_plain;f=src%2Fui-transaction.c;h=05784d2b64d92d647333f80cac9457902029209a;hp=950f40df7216a697387a7914c336084896558d15;hb=996fa4ab9f6b836001f8ad0eecbfd3821687fea7;hpb=27f6e3b112df235c8e9afc9911b1f6bce208a001 diff --git a/src/ui-transaction.c b/src/ui-transaction.c index 950f40d..05784d2 100644 --- a/src/ui-transaction.c +++ b/src/ui-transaction.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. * @@ -9,7 +9,7 @@ * (at your option) any later version. * * HomeBank is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty ofdeftransaction_amountchanged + * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * @@ -25,6 +25,7 @@ #include "ui-payee.h" #include "ui-category.h" #include "ui-account.h" +#include "ui-split.h" /****************************************************************************/ @@ -51,518 +52,184 @@ gchar *CYA_OPERATION[] = { N_("Modify transaction") }; -static void deftransaction_update(GtkWidget *widget, gpointer user_data); -#define GTK_RESPONSE_SPLIT_SUM 10880 -#define GTK_RESPONSE_SPLIT_REM 10888 - -/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ - -static void ui_txn_split_dialog_line_sensitive(guint line, gboolean sensitive, gpointer user_data) -{ -struct ui_txn_split_dialog_data *data = user_data; - - if( line > TXN_MAX_SPLIT ) - return; - - if( line == 0 ) // line 0 always active ! - sensitive = TRUE; - - - gtk_widget_set_sensitive(data->PO_cat[line], sensitive); - gtk_widget_set_sensitive(data->ST_amount[line], sensitive); - gtk_widget_set_sensitive(data->ST_memo[line], sensitive); - if(data->BT_rem[line]) - gtk_widget_set_sensitive(data->BT_rem[line], sensitive); - if(data->BT_add[line]) - gtk_widget_set_sensitive(data->BT_add[line], sensitive); - - if(sensitive == FALSE) - { - ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_cat[line]), 0); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount[line]), 0.0); - gtk_entry_set_text(GTK_ENTRY(data->ST_memo[line]), ""); - } - - if(sensitive == TRUE) - data->activeline = line; - -} - - -static void ui_txn_split_dialog_compute(GtkWidget *widget, gpointer user_data) -{ -struct ui_txn_split_dialog_data *data = user_data; -gint i, count, nbvalid; -//gint j; -gchar buf[48]; -gboolean sensitive, active; -//guint32 cat[TXN_MAX_SPLIT]; -gdouble amt[TXN_MAX_SPLIT]; -gboolean valid[TXN_MAX_SPLIT]; - - DB( g_print("\n(ui_txn_split_dialog_compute)\n") ); - - data->sumsplit = data->remsplit = 0.0; - nbvalid = 0; - for(i=0;iPO_cat[i]); - if(!active) break; - - //cat[i] = ui_cat_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_cat[i])); - amt[i] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount[i])); - data->sumsplit += amt[i]; - valid[i] = TRUE; - - if(!amt[i]) - valid[i] = FALSE; - - /* disable use same category several time - for(j=0;jnbsplit) ); - - if(data->nbsplit == i) - { - DB( g_print("- set last split %d\n", i) ); - - if(data->BT_add[i]) - gtk_widget_set_sensitive(data->BT_add[i], valid[i]); - - if(data->BT_rem[i]) - gtk_widget_set_sensitive(data->BT_rem[i], TRUE); - } - else - { - DB( g_print("- set off to %d\n", i) ); - - if(data->BT_add[i]) - gtk_widget_set_sensitive(data->BT_add[i], FALSE); - - if(data->BT_rem[i]) - gtk_widget_set_sensitive(data->BT_rem[i], FALSE); - } - } - - count = i; - DB( g_print("- count=%d, nbvalid=%d\n", count, nbvalid ) ); - - - if(data->splittype == TXN_SPLIT_AMOUNT) - { - data->remsplit = data->amount - data->sumsplit; - } - - //rules validation - sensitive = ((count == nbvalid) && (count > 1)) ? TRUE : FALSE; - if(data->splittype == TXN_SPLIT_NEW) - gtk_dialog_set_response_sensitive(GTK_DIALOG(data->dialog), GTK_RESPONSE_SPLIT_SUM, sensitive); - - if(data->splittype == TXN_SPLIT_AMOUNT) - { - sensitive = arrondi(data->remsplit, 2) != 0.0 ? FALSE : sensitive; - gtk_dialog_set_response_sensitive(GTK_DIALOG(data->dialog), GTK_RESPONSE_ACCEPT, sensitive); - - if(!data->remsplit) - g_sprintf(buf, "----"); - else - g_snprintf(buf, 48, "%.2f", data->remsplit); - - gtk_label_set_label(GTK_LABEL(data->LB_remain), buf); +gchar *CYA_TXN_STATUS[] = { + N_("None"), + N_("Cleared"), + N_("Reconciled"), + N_("Remind"), + NULL +}; - g_snprintf(buf, 48, "%.2f", data->amount); - gtk_label_set_label(GTK_LABEL(data->LB_txnamount), buf); - } - - g_snprintf(buf, 48, "%.2f", data->sumsplit); - gtk_label_set_text(GTK_LABEL(data->LB_sumsplit), buf); -} +/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ +static void deftransaction_template_popover_populate(struct deftransaction_data *data, GList *srclist); -static void ui_txn_split_dialog_inactiveline(GtkWidget *widget, gpointer user_data) +static void deftransaction_update(GtkWidget *widget, gpointer user_data) { -struct ui_txn_split_dialog_data *data; -gint line; - - DB( g_print("\n(ui_txn_split_dialog_inactiveline)\n") ); - - data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - - if(data->nbsplit <= 0) //1st split always active - return; - - line = data->nbsplit--; - - DB( g_print("- nbsplit:%d off:%d\n", data->nbsplit, line) ); - - ui_txn_split_dialog_line_sensitive(line, FALSE, data); - ui_txn_split_dialog_compute(widget, data); -} +struct deftransaction_data *data; +gboolean sensitive; + DB( g_print("\n[ui-transaction] update\n") ); -static void ui_txn_split_dialog_activeline(GtkWidget *widget, gpointer user_data) -{ -struct ui_txn_split_dialog_data *data; -gint line; - - DB( g_print("\n(ui_txn_split_dialog_activeline)\n") ); - data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - line = data->nbsplit; - if(line >= (TXN_MAX_SPLIT-1)) //bound - return; - - line = ++data->nbsplit; - - DB( g_print("- nbsplit:%d off:%d\n", data->nbsplit-1, line) ); - - - ui_txn_split_dialog_line_sensitive(line, TRUE, data); - - if(data->splittype == TXN_SPLIT_AMOUNT) + //# 1419476 empty category when no split either... + if( (data->ope->flags & (OF_SPLIT)) ) { - DB( g_print("- line %d :: affect remain\n", line) ); - g_signal_handler_block(data->ST_amount[line], data->handler_id[line]); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount[line]), data->remsplit); - g_signal_handler_unblock(data->ST_amount[line], data->handler_id[line]); + //# 1416624 empty category when split + ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), 0); } - - ui_txn_split_dialog_compute(widget, data); -} + /* disable amount+category if split is set */ + sensitive = (data->ope->flags & (OF_SPLIT)) ? FALSE : TRUE; + gtk_widget_set_sensitive(data->ST_amount, sensitive); + gtk_widget_set_sensitive(data->PO_grp, sensitive); +} -static void ui_txn_split_dialog_get(struct ui_txn_split_dialog_data *data) +static void deftransaction_update_warnsign(GtkWidget *widget, gpointer user_data) { -guint i; -Split *split; -guint32 kcat; -gchar *memo; +struct deftransaction_data *data; +gboolean warning = FALSE; gdouble amount; +gint amttype; +Category *cat; - DB( g_print("(ui_txn_split_dialog_get)\n") ); + DB( g_print("\n[ui-transaction] update warning sign\n") ); - da_transaction_splits_free(data->ope); + data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - for(i=0;iPO_grp)); + if(cat != NULL && cat->key > 0) { - kcat = ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data->PO_cat[i])); - memo = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_memo[i])); - amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount[i])); - - if(amount) + amount = hb_amount_round(gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)), 2); + if(amount != 0.0) { - split = da_split_new(kcat, amount, memo); - - DB( g_print("- get split %d : %d, %.2f, %s\n", i, split->kcat, split->amount, split->memo) ); - - da_transaction_splits_append (data->ope, split); + amttype = (amount > 0) ? 1 : -1; + warning = (category_type_get(cat) != amttype) ? TRUE : FALSE; } } -} - -static void ui_txn_split_dialog_set(struct ui_txn_split_dialog_data *data) -{ -guint count, i; -Split *split; -gchar *txt; - - DB( g_print("(ui_txn_split_dialog_set)\n") ); - - for(i=0;iPO_cat[i]), GLOBALS->h_cat); - //#1258821 - //if( data->splittype == TXN_SPLIT_AMOUNT ) - //{ - //if(data->amount > 0.0) - // gtk_spin_button_set_range(GTK_SPIN_BUTTON(data->ST_amount[i]), 0.0, G_MAXDOUBLE); - //else - // gtk_spin_button_set_range(GTK_SPIN_BUTTON(data->ST_amount[i]), -G_MAXDOUBLE, 0.0); - //} - } - - - count = da_transaction_splits_count(data->ope); - data->nbsplit = count > 1 ? count-1 : 0; - - DB( g_print("- count = %d\n", count) ); - - - for(i=0;iope->splits[i]; - - DB( g_print("- set split %d : %d, %.2f, %s\n", i, split->kcat, split->amount, split->memo) ); + if(warning) + gtk_widget_show_all(data->IB_warnsign); + else + gtk_widget_hide(data->IB_warnsign); - ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_cat[i]), split->kcat); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount[i]), split->amount); - txt = (split->memo != NULL) ? split->memo : ""; - gtk_entry_set_text(GTK_ENTRY(data->ST_memo[i]), txt); - ui_txn_split_dialog_line_sensitive(i, TRUE, data); - } - } - - -static GtkWidget *ui_txn_split_dialog (GtkWidget *parent, Transaction *ope, gdouble amount) +static void deftransaction_update_transfer(GtkWidget *widget, gpointer user_data) { -struct ui_txn_split_dialog_data data; -GtkWidget *dialog, *content, *mainvbox, *label; -GtkWidget *table, *widget; -gint row, i; - - - dialog = gtk_dialog_new_with_buttons (_("Transaction split"), - GTK_WINDOW(parent), - 0, - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL, - NULL); - - data.dialog = dialog; - data.ope = ope; - data.amount = amount; - data.splittype = amount ? TXN_SPLIT_AMOUNT : TXN_SPLIT_NEW; - - //homebank_window_set_icon_from_file(GTK_WINDOW (dialog), "curee.svg"); - //gtk_window_set_icon_name(GTK_WINDOW (dialog), HB_STOCK_CURRENCY); - - gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_REMOVE, GTK_RESPONSE_SPLIT_REM); - - /* sum button must appear only when new split add */ - //#1258821 - //if(data.splittype == TXN_SPLIT_NEW) - gtk_dialog_add_button(GTK_DIALOG(dialog), _("Sum"), GTK_RESPONSE_SPLIT_SUM); - - - if(data.splittype == TXN_SPLIT_AMOUNT) - gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT); - - //store our dialog private data - g_object_set_data(G_OBJECT(dialog), "inst_data", (gpointer)&data); - DB( g_print("(ui_txn_split_dialog) dialog=%p, inst_data=%p\n", dialog, &data) ); - - g_signal_connect (dialog, "destroy", - G_CALLBACK (gtk_widget_destroyed), &dialog); - - //dialog contents - content = gtk_dialog_get_content_area(GTK_DIALOG (dialog)); - mainvbox = gtk_vbox_new (FALSE, HB_BOX_SPACING); - gtk_box_pack_start (GTK_BOX (content), mainvbox, TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER(mainvbox), HB_MAINBOX_SPACING); +struct deftransaction_data *data; +gboolean sensitive; +guint kacc, kdst; + DB( g_print("\n[ui-transaction] update transfer\n") ); - table = gtk_table_new (TXN_MAX_SPLIT, 5, FALSE); - //gtk_container_set_border_width (GTK_CONTAINER (table), SP_BORDER); - gtk_table_set_row_spacings (GTK_TABLE (table), HB_TABROW_SPACING/2); - gtk_table_set_col_spacings (GTK_TABLE (table), HB_TABCOL_SPACING/2); - gtk_box_pack_start (GTK_BOX (mainvbox), table, TRUE, TRUE, 0); + data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - row = 0; - label = gtk_label_new(_("Category")); - gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_SMALL, -1); - gtk_table_attach (GTK_TABLE (table), label, 2, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + sensitive = TRUE; - label = gtk_label_new(_("Memo")); - gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_SMALL, -1); - gtk_table_attach (GTK_TABLE (table), label, 3, 4, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc)); - label = gtk_label_new(_("Amount")); - gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_SMALL, -1); - gtk_table_attach (GTK_TABLE (table), label, 4, 5, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + if(kacc == 0) { sensitive = FALSE; goto end; } - for(i=0;iNU_mode)) == PAYMODE_INTXFER ) { - row++; + Account *srcacc, *dstacc; - data.BT_rem[i] = NULL; - data.BT_add[i] = NULL; + kdst = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_accto)); - if(i > 0) - { - widget = gtk_button_new_with_label ("-"); - data.BT_rem[i] = widget; - gtk_table_attach (GTK_TABLE (table), widget, 0, 1, row, row+1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); + if(kdst == 0) { sensitive = FALSE; goto end; } + if(kdst == kacc) { + sensitive = FALSE; + goto end; } - if( (i < (TXN_MAX_SPLIT-1)) ) - { - widget = gtk_button_new_with_label ("+"); - data.BT_add[i] = widget; - gtk_table_attach (GTK_TABLE (table), widget, 1, 2, row, row+1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); + srcacc = da_acc_get(kacc); + dstacc = da_acc_get(kdst); + if(srcacc->kcur != dstacc->kcur) { + sensitive = FALSE; } - - widget = ui_cat_comboboxentry_new(NULL); - gtk_widget_set_size_request(widget, 180, -1); - data.PO_cat[i] = widget; - gtk_table_attach (GTK_TABLE (table), widget, 2, 3, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - - widget = make_string(NULL); - gtk_widget_set_size_request(widget, 180, -1); - data.ST_memo[i] = widget; - gtk_table_attach (GTK_TABLE (table), widget, 3, 4, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - - widget = make_amount(NULL); - gtk_widget_set_size_request(widget, 100, -1); - data.ST_amount[i] = widget; - gtk_table_attach (GTK_TABLE (table), widget, 4, 5, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - - //connect all our signals - g_signal_connect (data.PO_cat[i], "changed", G_CALLBACK (ui_txn_split_dialog_compute), &data); - data.handler_id[i] = g_signal_connect (G_OBJECT (data.ST_amount[i]), "value-changed", G_CALLBACK (ui_txn_split_dialog_compute), &data); - if(data.BT_rem[i]) - g_signal_connect (data.BT_rem[i], "clicked", G_CALLBACK (ui_txn_split_dialog_inactiveline), GINT_TO_POINTER(i)); - if(data.BT_add[i]) - g_signal_connect (data.BT_add[i], "clicked", G_CALLBACK (ui_txn_split_dialog_activeline), GINT_TO_POINTER(i)); - } - - row++; - label = gtk_label_new(_("Sum of splits:")); - gtk_misc_set_alignment (GTK_MISC(label), 1.0, 0.0); - gtk_table_attach (GTK_TABLE (table), label, 3, 4, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - label = gtk_label_new(NULL); - gtk_misc_set_alignment (GTK_MISC(label), 1.0, 0.0); - gtk_misc_set_padding(GTK_MISC(label), 20, 0); - data.LB_sumsplit = label; - gtk_table_attach (GTK_TABLE (table), label, 4, 5, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - - if( data.splittype == TXN_SPLIT_AMOUNT ) - { - row++; - label = gtk_label_new(_("Unassigned:")); - gtk_misc_set_alignment (GTK_MISC(label), 1.0, 0.0); - gtk_table_attach (GTK_TABLE (table), label, 3, 4, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - label = gtk_label_new(NULL); - gtk_misc_set_alignment (GTK_MISC(label), 1.0, 0.0); - gtk_misc_set_padding(GTK_MISC(label), 20, 0); - data.LB_remain = label; - gtk_table_attach (GTK_TABLE (table), label, 4, 5, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - - row++; - widget = gtk_hseparator_new(); - gtk_table_attach (GTK_TABLE (table), widget, 4, 5, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - - row++; - label = gtk_label_new(_("Transaction amount:")); - gtk_misc_set_alignment (GTK_MISC(label), 1.0, 0.0); - gtk_table_attach (GTK_TABLE (table), label, 3, 4, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - label = gtk_label_new(NULL); - gtk_misc_set_alignment (GTK_MISC(label), 1.0, 0.0); - gtk_misc_set_padding(GTK_MISC(label), 20, 0); - data.LB_txnamount = label; - gtk_table_attach (GTK_TABLE (table), label, 4, 5, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); } +end: + DB( g_print(" sensitive %d\n", sensitive) ); - //setup, init and show dialog - //ui_cur_manage_dialog_setup(&data); - + //#1437551 + //gtk_widget_set_sensitive(gtk_dialog_get_action_area(GTK_DIALOG (data->window)), sensitive); + gtk_dialog_set_response_sensitive(GTK_DIALOG (data->window), GTK_RESPONSE_ACCEPT, sensitive); + gtk_dialog_set_response_sensitive(GTK_DIALOG (data->window), GTK_RESPONSE_ADD, sensitive); + gtk_dialog_set_response_sensitive(GTK_DIALOG (data->window), GTK_RESPONSE_ADDKEEP, sensitive); - ui_txn_split_dialog_set(&data); - ui_txn_split_dialog_compute(NULL, &data); - +} - //ui_cur_manage_dialog_update(data.LV_cur, NULL); - gtk_window_set_default_size(GTK_WINDOW(dialog), 480, -1); +static void deftransaction_update_payee(GtkWidget *widget, gpointer user_data) +{ +struct deftransaction_data *data; +Category *cat; +gint paymode; +Payee *pay; - gtk_widget_show_all (dialog); + DB( g_print("\n[ui-transaction] update payee\n") ); - //wait for the user - gint result = gtk_dialog_run (GTK_DIALOG (dialog)); + data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - switch (result) - { - case GTK_RESPONSE_ACCEPT: - //do_application_specific_something (); - ui_txn_split_dialog_get(&data); - deftransaction_update(parent, NULL); - break; - case GTK_RESPONSE_SPLIT_REM: - da_transaction_splits_free(ope); - deftransaction_update(parent, NULL); - break; - case GTK_RESPONSE_SPLIT_SUM: // sum split and alter txn amount - ui_txn_split_dialog_get(&data); - deftransaction_set_amount_from_split(parent, data.sumsplit); - deftransaction_update(parent, NULL); - break; - default: - //do_nothing_since_dialog_was_cancelled (); - break; - } - - // debug - #if MYDEBUG == 1 + // only set for empty category + // 1635053 and also paymode unset + cat = ui_cat_comboboxentry_get(GTK_COMBO_BOX(data->PO_grp)); + paymode = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode)); + if( (cat == NULL || cat->key == 0) && (paymode == PAYMODE_NONE) ) { - guint i; - - for(i=0;iPO_pay)); + if( pay != NULL ) { - Split *split = data.ope->splits[i]; - if(data.ope->splits[i] == NULL) - break; - g_print(" split %d : %d, %.2f, %s\n", i, split->kcat, split->amount, split->memo); + g_signal_handlers_block_by_func (G_OBJECT (data->PO_grp), G_CALLBACK (deftransaction_update_warnsign), NULL); + ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), pay->kcat); + g_signal_handlers_unblock_by_func (G_OBJECT (data->PO_grp), G_CALLBACK (deftransaction_update_warnsign), NULL); + + gtk_combo_box_set_active(GTK_COMBO_BOX(data->NU_mode), pay->paymode); } } - #endif - - // cleanup and destroy - //GLOBALS->changes_count += data.change; - gtk_widget_destroy (dialog); - - return NULL; } -/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ -static void deftransaction_update(GtkWidget *widget, gpointer user_data) +static void deftransaction_update_accto(GtkWidget *widget, gpointer user_data) { struct deftransaction_data *data; -gboolean sensitive, bool; +guint kacc; - DB( g_print("(ui_transaction) update\n") ); + DB( g_print("\n[ui-transaction] update accto\n") ); data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - //valid & remind are exclusive - bool = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_valid)); - sensitive = bool ? FALSE : TRUE; - gtk_widget_set_sensitive(data->CM_remind, sensitive); - if(bool) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_remind), 0); + kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc)); - /* disable category if split is set */ - sensitive = (data->ope->flags & (OF_SPLIT)) ? FALSE : TRUE; - gtk_widget_set_sensitive(data->ST_amount, sensitive); - gtk_widget_set_sensitive(data->PO_grp, sensitive); + DB( g_print(" acc is %d\n", kacc) ); + + //g_signal_handlers_block_by_func (G_OBJECT (data->PO_accto), G_CALLBACK (deftransaction_update_transfer), NULL); + //ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_accto), 0); + //g_signal_handlers_unblock_by_func (G_OBJECT (data->PO_accto), G_CALLBACK (deftransaction_update_transfer), NULL); + ui_acc_comboboxentry_populate_except(GTK_COMBO_BOX(data->PO_accto), GLOBALS->h_acc, kacc, ACC_LST_INSERT_NORMAL); + + deftransaction_update_transfer(widget, user_data); } + + void deftransaction_set_amount_from_split(GtkWidget *widget, gdouble amount) { struct deftransaction_data *data; - DB( g_print("(ui_transaction) set_amount_from_split\n") ); + DB( g_print("\n[ui-transaction] set_amount_from_split\n") ); data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); @@ -570,7 +237,9 @@ struct deftransaction_data *data; data->ope->amount = amount; gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), amount); - + + deftransaction_update(widget, NULL); + } @@ -580,24 +249,23 @@ struct deftransaction_data *data; Transaction *entry; gchar *tagstr, *txt; - DB( g_print("(ui_transaction) set\n") ); + DB( g_print("\n[ui-transaction] set\n") ); data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); entry = data->ope; - DB( g_print(" -> ope=%p data=%p tags:%p\n", data->ope, data, entry->tags) ); + DB( g_print(" - ope=%p data=%p tags:%p\n", data->ope, data, entry->tags) ); //DB( g_print(" set date to %d\n", entry->date) ); //g_object_set(GTK_DATE_ENTRY(data->PO_date), "date", (guint32)entry->ope_Date); - gtk_dateentry_set_date(GTK_DATE_ENTRY(data->PO_date), (guint)entry->date); + gtk_date_entry_set_date(GTK_DATE_ENTRY(data->PO_date), (guint)entry->date); txt = (entry->wording != NULL) ? entry->wording : ""; gtk_entry_set_text(GTK_ENTRY(data->ST_word), txt); gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), entry->amount); //gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_amount), (entry->ope_Flags & OF_INCOME) ? 1 : 0); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_valid), (entry->flags & OF_VALID) ? 1 : 0); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_remind), (entry->flags & OF_REMIND) ? 1 : 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_cheque), (entry->flags & OF_CHEQ2) ? 1 : 0); txt = (entry->info != NULL) ? entry->info : ""; @@ -607,21 +275,26 @@ gchar *tagstr, *txt; tagstr = transaction_tags_tostring(entry); - DB( g_print(" -> tags: '%s'\n", txt) ); + DB( g_print(" - tags: '%s'\n", txt) ); txt = (tagstr != NULL) ? tagstr : ""; gtk_entry_set_text(GTK_ENTRY(data->ST_tags), txt); g_free(tagstr); + radio_set_active(GTK_CONTAINER(data->RA_status), entry->status ); + //as we trigger an event on this //let's place it at the end to avoid misvalue on the trigger function + g_signal_handlers_block_by_func (G_OBJECT (data->PO_acc), G_CALLBACK (deftransaction_update_accto), NULL); ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_acc), entry->kacc); ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_accto), entry->kxferacc); + + g_signal_handlers_unblock_by_func (G_OBJECT (data->PO_acc), G_CALLBACK (deftransaction_update_accto), NULL); gtk_combo_box_set_active(GTK_COMBO_BOX(data->NU_mode), entry->paymode); - DB( g_print(" -> acc is: %d\n", gtk_combo_box_get_active(GTK_COMBO_BOX(data->PO_acc)) ) ); + DB( g_print(" - acc is: %d\n", gtk_combo_box_get_active(GTK_COMBO_BOX(data->PO_acc)) ) ); } @@ -633,16 +306,16 @@ gchar *txt; gdouble value; gint active; - DB( g_print("(ui_transaction) get\n") ); + DB( g_print("\n[ui-transaction] get\n") ); data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); entry = data->ope; - DB( g_print(" -> ope = %p\n", entry) ); + DB( g_print(" - ope = %p\n", entry) ); //DB( g_print(" get date to %d\n", entry->ope_Date) ); - entry->date = gtk_dateentry_get_date(GTK_DATE_ENTRY(data->PO_date)); + entry->date = gtk_date_entry_get_date(GTK_DATE_ENTRY(data->PO_date)); //g_object_get(GTK_DATE_ENTRY(data->PO_date), "date", entry->ope_Date); //free any previous string @@ -658,13 +331,6 @@ gint active; entry->wording = g_strdup(txt); } - entry->paymode = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode)); - if( entry->paymode != PAYMODE_INTXFER ) - { - //#677351: revert kxferacc to 0 - entry->kxferacc = 0; - } - value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)); entry->amount = value; @@ -691,6 +357,7 @@ gint active; entry->info = g_strdup(txt); } + entry->paymode = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode)); entry->kcat = ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data->PO_grp)); entry->kpay = ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data->PO_pay)); entry->kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc)); @@ -698,9 +365,18 @@ gint active; /* tags */ txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_tags)); - DB( g_print(" -> tags: '%s'\n", txt) ); + DB( g_print(" - tags: '%s'\n", txt) ); transaction_tags_parse(entry, txt); + entry->status = radio_get_active(GTK_CONTAINER(data->RA_status)); + + //#1615245: moved here, after get combo entry key + if( entry->paymode != PAYMODE_INTXFER ) + { + //#677351: revert kxferacc to 0 + entry->kxferacc = 0; + } + /* flags */ //entry->flags = 0; entry->flags &= (OF_SPLIT); //(split is set in hb_transaction) @@ -711,12 +387,6 @@ gint active; if( data->type == TRANSACTION_EDIT_MODIFY) entry->flags |= OF_CHANGED; - active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_valid)); - if(active == 1) entry->flags |= OF_VALID; - - active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_remind)); - if(active == 1) entry->flags |= OF_REMIND; - active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_cheque)); if(active == 1) entry->flags |= OF_CHEQ2; @@ -735,7 +405,7 @@ struct deftransaction_data *data; gushort paymode; gdouble amount; - DB( g_print("(ui_transaction) amount focus-out-event %d\n", gtk_widget_is_focus(widget)) ); + DB( g_print("\n[ui-transaction] amount focus-out-event %d\n", gtk_widget_is_focus(widget)) ); data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); @@ -749,120 +419,74 @@ gdouble amount; gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), amount *= -1); } + deftransaction_update_warnsign(widget, NULL); + return FALSE; } -static void deftransaction_toggleamount(GtkWidget *widget, gpointer user_data) +static void deftransaction_toggleamount(GtkWidget *widget, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data) { struct deftransaction_data *data; guint count, i; Split *split; gdouble value; - DB( g_print("(ui_transaction) toggleamount\n") ); + DB( g_print("\n[ui-transaction] toggleamount\n") ); - data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); + if(icon_pos == GTK_ENTRY_ICON_PRIMARY) + { + 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); + 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); - if( data->ope->flags & OF_SPLIT ) - { - count = da_transaction_splits_count(data->ope); - DB( g_print("- count = %d\n", count) ); - for(i=0;iope->flags & OF_SPLIT ) { - split = data->ope->splits[i]; - split->amount *= -1; + count = da_splits_count(data->ope->splits); + DB( g_print("- count = %d\n", count) ); + for(i=0;iope->splits[i]; + split->amount *= -1; + } } + + deftransaction_update_warnsign(widget, NULL); } - + } static void deftransaction_button_split_cb(GtkWidget *widget, gpointer user_data) { struct deftransaction_data *data; +Transaction *ope; gdouble amount; +gint nbsplit; - DB( g_print("(ui_transaction) doing split\n") ); - - data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - - amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)); - - ui_txn_split_dialog(data->window, data->ope, amount); - -} - - -static void deftransaction_update_transfer(GtkWidget *widget, gpointer user_data) -{ -struct deftransaction_data *data; -gboolean sensitive; -guint kacc, kdst; - - DB( g_print("(ui_transaction) update transfer\n") ); + DB( g_print("\n[ui-transaction] doing split\n") ); data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - sensitive = TRUE; - - kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc)); - - if(kacc == 0) { sensitive = FALSE; goto end; } + ope = data->ope; - /* coherent seizure - * - target account selected - * - source != target - * - same currency - */ - if( gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode)) == PAYMODE_INTXFER ) - { - kdst = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_accto)); - - if(kdst == 0) { sensitive = FALSE; goto end; } - if(kdst == kacc) { - sensitive = FALSE; - goto end; - } - - /* - srcacc = da_acc_get(kacc); - dstacc = da_acc_get(kdst); - if(srcacc->kcur != dstacc->kcur) { - sensitive = FALSE; - }*/ - } - -end: - DB( g_print(" sensitive %d\n", sensitive) ); + amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)); + ui_split_dialog(data->window, ope->splits, amount, &deftransaction_set_amount_from_split); - gtk_widget_set_sensitive(gtk_dialog_get_action_area(GTK_DIALOG (data->window)), sensitive); + //eval split to garantee disabled items + ope->flags &= ~(OF_SPLIT); + nbsplit = da_splits_count(ope->splits); + if(nbsplit > 0) + data->ope->flags |= (OF_SPLIT); + deftransaction_update(data->window, NULL); } -static void deftransaction_update_accto(GtkWidget *widget, gpointer user_data) -{ -struct deftransaction_data *data; -guint kacc; - - DB( g_print("(ui_transaction) update accto\n") ); - - data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - - kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc)); - - DB( g_print(" acc is %d\n", kacc) ); - - - ui_acc_comboboxentry_populate_except(GTK_COMBO_BOX(data->PO_accto), GLOBALS->h_acc, kacc, ACC_LST_INSERT_NORMAL); - - deftransaction_update_transfer(widget, user_data); -} /* @@ -875,7 +499,7 @@ gint payment; gint page; gboolean sensitive; - DB( g_print("(ui_transaction) paymode change\n") ); + DB( g_print("\n[ui-transaction] paymode change\n") ); data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); @@ -887,9 +511,9 @@ gboolean sensitive; { gboolean expense = (gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)) > 0 ? FALSE : TRUE); - DB( g_print(" -> payment: %d\n", PAYMODE_CHECK) ); - DB( g_print(" -> expense: %d\n", expense) ); - DB( g_print(" -> acc is: %d\n", ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc)) ) ); + DB( g_print(" - payment: %d\n", PAYMODE_CHECK) ); + DB( g_print(" - expense: %d\n", expense) ); + DB( g_print(" - acc is: %d\n", ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc)) ) ); if(payment == PAYMODE_CHECK) { @@ -900,18 +524,21 @@ gboolean sensitive; guint cheque; gchar *cheque_str; - DB( g_print(" -> should fill cheque number for account %d\n", active) ); + DB( g_print(" - should fill cheque number for account %d\n", active) ); - if( active != -1 ) + //#1410166 + if( active > 0 ) { acc = da_acc_get( active ); - cheque = ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_cheque))==TRUE ? acc->cheque2 : acc->cheque1 ); - cheque_str = g_strdup_printf("%d", cheque + 1); - gtk_entry_set_text(GTK_ENTRY(data->ST_info), cheque_str); - g_free(cheque_str); + if(acc != NULL) + { + cheque = ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_cheque))==TRUE ? acc->cheque2 : acc->cheque1 ); + cheque_str = g_strdup_printf("%d", cheque + 1); + gtk_entry_set_text(GTK_ENTRY(data->ST_info), cheque_str); + g_free(cheque_str); + } } } - } } @@ -928,13 +555,27 @@ gboolean sensitive; if(payment == PAYMODE_INTXFER) { page = 2; - // for internal transfer add, amount must be expense by default + // for internal transfer add, amount must be expense by default + gdouble amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)); if( data->type == TRANSACTION_EDIT_ADD ) { - gdouble amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)); if(amount > 0) gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), amount *= -1); } + //else //#1460370 + //if( data->type == TRANSACTION_EDIT_MODIFY ) + // { + if(amount > 0) + { + gtk_label_set_text_with_mnemonic (GTK_LABEL(data->LB_accto), _("From acc_ount:")); + } + else + { + gtk_label_set_text_with_mnemonic (GTK_LABEL(data->LB_accto), _("To acc_ount:")); + } + //} + + } deftransaction_update_accto(widget, user_data); @@ -947,71 +588,131 @@ gboolean sensitive; } -static void deftransaction_fillfrom(GtkWidget *widget, gpointer user_data) +/* +** called from outside +*/ +gint deftransaction_external_edit(GtkWindow *parent, Transaction *old_txn, Transaction *new_txn) { -struct deftransaction_data *data; -Transaction *entry; -Archive *arc; -gint n_arc; +GtkWidget *dialog; +gboolean result; - DB( g_print("(ui_transaction) fill from\n") ); - - data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - entry = data->ope; + dialog = create_deftransaction_window(GTK_WINDOW(parent), TRANSACTION_EDIT_MODIFY, FALSE); + deftransaction_set_transaction(dialog, new_txn); - n_arc = gtk_combo_box_get_active(GTK_COMBO_BOX(data->PO_arc)); + result = gtk_dialog_run (GTK_DIALOG (dialog)); + if(result == GTK_RESPONSE_ACCEPT) + { + deftransaction_get(dialog, NULL); - DB( g_print(" fill from %d\n", n_arc) ); + account_balances_sub(old_txn); + account_balances_add(new_txn); - if(n_arc > 0) - { - arc = g_list_nth_data(GLOBALS->arc_list, n_arc-1); - - //fill it - entry->amount = arc->amount; - //#1258344 keep the current account if tpl is empty - if(arc->kacc) - entry->kacc = arc->kacc; - entry->kxferacc = arc->kxferacc; - entry->paymode = arc->paymode; - entry->flags = arc->flags; - entry->kpay = arc->kpay; - entry->kcat = arc->kcat; - entry->wording = g_strdup(arc->wording); - entry->info = NULL; + if( new_txn->paymode == PAYMODE_INTXFER ) + { + //nota: if kxfer is 0, the user may have just changed the paymode to xfer + DB( g_print(" - kxfer = %d\n", new_txn->kxfer) ); - DB( g_print(" calls\n") ); + if(new_txn->kxfer > 0) //1) search a strong linked child + { + Transaction *ltxn; - deftransaction_set(widget, NULL); - deftransaction_paymode(widget, NULL); - deftransaction_update(widget, NULL); + DB( g_print(" - old_txn: kacc=%d kxferacc=%d\n", old_txn->kacc, old_txn->kxferacc) ); + + //#1584342 was faultly old_txn + ltxn = transaction_xfer_child_strong_get(new_txn); + if(ltxn != NULL) //should never be the case + { + DB( g_print(" - strong link found, do sync\n") ); + transaction_xfer_sync_child(new_txn, ltxn); + } + else + { + DB( g_print(" - no, somethin' went wrong here...\n") ); + } + } + else + { + //2) any standard transaction that match ? + transaction_xfer_search_or_add_child(GTK_WINDOW(dialog), new_txn, FALSE); + } + } - gtk_combo_box_set_active(GTK_COMBO_BOX(data->PO_arc), 0); + //#1250061 : manage ability to break an internal xfer + if(old_txn->paymode == PAYMODE_INTXFER && new_txn->paymode != PAYMODE_INTXFER) + { + GtkWidget *p_dialog; + gboolean break_result; + + DB( g_print(" - should break internal xfer\n") ); + + p_dialog = gtk_message_dialog_new + ( + GTK_WINDOW(parent), + GTK_DIALOG_MODAL, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_YES_NO, + _("Do you want to break the internal transfer ?\n\n" + "Proceeding will delete the target transaction.") + ); + + break_result = gtk_dialog_run( GTK_DIALOG( p_dialog ) ); + gtk_widget_destroy( p_dialog ); + + if(break_result == GTK_RESPONSE_YES) + { + transaction_xfer_remove_child(old_txn); + } + else //force paymode to internal xfer + { + new_txn->paymode = PAYMODE_INTXFER; + } + } } + + //1638035: manage account change + if( old_txn->kacc != new_txn->kacc ) + { + //locked from ui, but test anyway: forbid change for internal transfer + if( new_txn->paymode == PAYMODE_INTXFER ) + { + new_txn->kacc = old_txn->kacc; + } + else + { + //todo: maybe we should restrict this also to same currency account + account_balances_sub(new_txn); + transaction_acc_move(new_txn, old_txn->kacc, new_txn->kacc); + account_balances_add(new_txn); + } + } + + + deftransaction_dispose(dialog, NULL); + gtk_widget_destroy (dialog); + + return result; } -/* -** called from outside -*/ void deftransaction_set_transaction(GtkWidget *widget, Transaction *ope) { struct deftransaction_data *data; - DB( g_print("(ui_transaction) set out transaction\n") ); + DB( g_print("\n[ui-transaction] set transaction (from out)\n") ); data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); data->ope = ope; - DB( g_print(" -> ope=%p data=%p\n", data->ope, data) ); + DB( g_print(" - ope=%p data=%p\n", data->ope, data) ); - DB( g_print(" -> call init\n") ); + DB( g_print(" - call init\n") ); deftransaction_set(widget, NULL); deftransaction_paymode(widget, NULL); deftransaction_update(widget, NULL); + deftransaction_update_warnsign(widget, NULL); } @@ -1020,7 +721,7 @@ void deftransaction_dispose(GtkWidget *widget, gpointer user_data) { struct deftransaction_data *data; - DB( g_print("(ui_transaction) dispose\n") ); + DB( g_print("\n[ui-transaction] dispose\n") ); data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); @@ -1031,279 +732,531 @@ struct deftransaction_data *data; static void deftransaction_setup(struct deftransaction_data *data) { - DB( g_print("(ui_transaction) setup\n") ); - - gtk_window_set_title (GTK_WINDOW (data->window), _(CYA_OPERATION[data->type])); + DB( g_print("\n[ui-transaction] setup\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); - if( (data->type != TRANSACTION_EDIT_MODIFY) && (da_archive_length() > 0)) - make_poparchive_populate(GTK_COMBO_BOX(data->PO_arc), GLOBALS->arc_list); + if( data->showtemplate ) + { + deftransaction_template_popover_populate (data, GLOBALS->arc_list); + gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(data->modelfilter)); + } +} + +static GtkWidget * +create_popover (GtkWidget *parent, + GtkWidget *child, + GtkPositionType pos) +{ + GtkWidget *popover; + + popover = gtk_popover_new (parent); + gtk_popover_set_position (GTK_POPOVER (popover), pos); + gtk_container_add (GTK_CONTAINER (popover), child); + gtk_container_set_border_width (GTK_CONTAINER (popover), SPACING_SMALL); + gtk_widget_show (child); + +/* gtk_widget_set_margin_start (popover, SPACING_MEDIUM); + gtk_widget_set_margin_end (popover, SPACING_MEDIUM); + gtk_widget_set_margin_top (popover, SPACING_MEDIUM); + gtk_widget_set_margin_bottom (popover, SPACING_MEDIUM);*/ + + return popover; +} + + +static void deftransaction_template_popover_onRowActivated(GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *col, + gpointer userdata) +{ +struct deftransaction_data *data; +GtkTreeModel *model; +GtkTreeIter iter; + + data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(treeview), GTK_TYPE_WINDOW)), "inst_data"); + model = gtk_tree_view_get_model(treeview); + + if (gtk_tree_model_get_iter(model, &iter, path)) + { + Archive *arc; + Transaction *txn; + + gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, LST_DSPTPL_DATAS, &arc, -1); + + txn = data->ope; + da_transaction_init_from_template(txn, arc); + if( da_splits_clone(arc->splits, txn->splits) > 0) + txn->flags |= OF_SPLIT; //Flag that Splits are active + + DB( g_print(" calls\n") ); + + deftransaction_set(GTK_WIDGET(treeview), NULL); + deftransaction_paymode(GTK_WIDGET(treeview), NULL); + deftransaction_update(GTK_WIDGET(treeview), NULL); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data->MB_template), FALSE); + } +} + + + +static void deftransaction_template_popover_populate(struct deftransaction_data *data, GList *srclist) +{ +GtkTreeModel *model; +GtkTreeIter iter; +GList *list; + + //insert all glist item into treeview + model = data->model; + gtk_list_store_clear(GTK_LIST_STORE(model)); + + list = g_list_first(srclist); + while (list != NULL) + { + Archive *entry = list->data; + + gtk_list_store_append (GTK_LIST_STORE(model), &iter); + gtk_list_store_set (GTK_LIST_STORE(model), &iter, + LST_DSPTPL_DATAS, entry, + LST_DSPTPL_NAME, entry->wording, + -1); + + //DB( g_print(" populate_treeview: %d %08x\n", i, list->data) ); + + list = g_list_next(list); + } +} + + +static void +deftransaction_template_popover_refilter (GtkWidget *widget, gpointer user_data) +{ +struct deftransaction_data *data = user_data; + + DB( g_print(" text changed\n") ); + + gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(data->modelfilter)); +} + + +static gboolean deftransaction_template_popover_func_visible (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) +{ +struct deftransaction_data *data = user_data; +Archive *entry; +gchar *str; +gboolean visible = TRUE; +gboolean showsched; + + showsched = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data->CM_showsched)); + + gchar *needle = g_ascii_strdown(gtk_entry_get_text(GTK_ENTRY(data->ST_search)), -1); + + gtk_tree_model_get (model, iter, + LST_DSPTPL_DATAS, &entry, + LST_DSPTPL_NAME, &str, -1); + + if( entry ) + { + if( (entry->flags & OF_AUTO) && !showsched) + { + visible = FALSE; + } + else + { + gchar *haystack = g_ascii_strdown(str, -1); + + if (str && g_strrstr (haystack, needle) == NULL ) + { + visible = FALSE; + } + + DB( g_print("filter: '%s' '%s' %d\n", str, needle, visible) ); + + g_free(haystack); + } + } + g_free(needle); + g_free (str); + + return visible; +} + + +static GtkWidget *deftransaction_template_popover_create(struct deftransaction_data *data) +{ +GtkListStore *store; +GtkCellRenderer *renderer; +GtkTreeViewColumn *column; +GtkWidget *box, *widget, *scrollwin, *treeview; + + box = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_SMALL); + + widget = make_search(NULL); + data->ST_search = widget; + gtk_box_pack_start (GTK_BOX(box), widget, FALSE, FALSE, 0); + + + scrollwin = gtk_scrolled_window_new(NULL,NULL); + gtk_box_pack_start (GTK_BOX(box), scrollwin, TRUE, TRUE, 0); + 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_AUTOMATIC, GTK_POLICY_AUTOMATIC); + + store = gtk_list_store_new(NUM_LST_DSPTPL, + G_TYPE_POINTER, + G_TYPE_STRING); + + data->model = GTK_TREE_MODEL(store); + + data->modelfilter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(GTK_TREE_MODEL(data->model), NULL)); + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(data->modelfilter), deftransaction_template_popover_func_visible, data, NULL); + + + treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(data->modelfilter)); + data->LV_arc = treeview; + gtk_container_add(GTK_CONTAINER(scrollwin), treeview); + + gtk_widget_grab_focus(treeview); + + /* column for bug numbers */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes (NULL, + renderer, + "text", + LST_DSPTPL_NAME, + NULL); + //gtk_tree_view_column_set_resizable (column, TRUE); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(treeview), FALSE); + + widget = gtk_check_button_new_with_mnemonic(_("Show _scheduled")); + data->CM_showsched = widget; + gtk_box_pack_start (GTK_BOX(box), widget, FALSE, FALSE, 0); + + gtk_widget_show_all (box); + + //signals + g_signal_connect (data->CM_showsched, "toggled", G_CALLBACK (deftransaction_template_popover_refilter), data); + g_signal_connect (data->ST_search, "search-changed", G_CALLBACK (deftransaction_template_popover_refilter), data); + return box; } static GtkWidget *deftransaction_make_block1(struct deftransaction_data *data) { -GtkWidget *table, *hbox, *label, *widget, *image; +GtkWidget *group_grid, *hbox, *label, *widget, *image; gint row; - table = gtk_table_new (7, 2, FALSE); - gtk_table_set_row_spacings (GTK_TABLE (table), HB_TABROW_SPACING); - gtk_table_set_col_spacings (GTK_TABLE (table), HB_TABCOL_SPACING); + 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(_("_Date:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); - widget = gtk_dateentry_new(); + label = make_label_widget(_("_Date:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); + widget = gtk_date_entry_new(); data->PO_date = widget; - gtk_table_attach (GTK_TABLE (table), widget, 1, 2, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); + gtk_widget_set_halign (widget, GTK_ALIGN_START); gtk_widget_set_tooltip_text(widget, _("Date accepted here are:\nday,\nday/month or month/day,\nand complete date into your locale")); row++; - label = make_label(_("_Amount:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); - - hbox = gtk_hbox_new (FALSE, 0); - gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, row, row+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 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")); + 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 ("btn-split", GTK_ICON_SIZE_BUTTON); + image = gtk_image_new_from_icon_name (ICONNAME_HB_BUTTON_SPLIT, GTK_ICON_SIZE_BUTTON); 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, _("Category split")); + gtk_widget_set_tooltip_text(widget, _("Transaction splits")); row++; - label = make_label(_("Pa_yment:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label = make_label_widget(_("Pa_yment:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); widget = make_paymode(label); data->NU_mode = widget; - gtk_table_attach_defaults (GTK_TABLE (table), widget, 1, 2, row, row+1); + 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_defaults (GTK_TABLE (table), widget, 0, 2, row, row+1); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1); row++; - label = make_label(_("_Info:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label = make_label_widget(_("_Info:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); widget = make_string(label); data->ST_info = widget; - gtk_table_attach_defaults (GTK_TABLE (table), widget, 1, 2, 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(_("Acc_ount:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, 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, 1, 2, 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 acc_ount:"), 0.0, 0.5); + label = make_label_widget(_("To acc_ount:")); data->LB_accto = label; - gtk_table_attach (GTK_TABLE (table), label, 0, 1, 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_defaults (GTK_TABLE (table), widget, 1, 2, row, row+1); - - - return table; -} - + gtk_widget_set_hexpand (widget, TRUE); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); -static GtkWidget *deftransaction_make_block2(struct deftransaction_data *data) -{ -GtkWidget *table, *label, *widget; -gint row; - - table = gtk_table_new (6, 2, 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; - label = make_label(_("_Payee:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + row++; + 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_defaults (GTK_TABLE (table), widget, 1, 2, row, row+1); - gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available for Payee")); + gtk_widget_set_hexpand (widget, TRUE); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); + gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available")); row++; - label = make_label(_("_Category:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, 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_defaults (GTK_TABLE (table), widget, 1, 2, row, row+1); + gtk_widget_set_hexpand (widget, TRUE); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); + gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available")); - gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available for Category")); + row++; + 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(_("M_emo:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label = make_label_widget(_("M_emo:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); widget = make_memo_entry(label); data->ST_word = widget; - gtk_table_attach (GTK_TABLE (table), widget, 1, 2, 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(_("Ta_gs:"), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label = make_label_widget(_("Ta_gs:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); widget = make_string(label); data->ST_tags = widget; - gtk_table_attach_defaults (GTK_TABLE (table), widget, 1, 2, row, row+1); + gtk_widget_set_hexpand (widget, TRUE); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); - row++; - widget = gtk_check_button_new_with_mnemonic (_("_Reconciled")); - data->CM_valid = widget; - gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 2, row, row+1); + return group_grid; +} - row++; - widget = gtk_check_button_new_with_mnemonic (_("Re_mind")); - data->CM_remind = widget; - gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 2, row, row+1); - return table; +static gboolean +deftransaction_getgeometry(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) +{ +struct WinGeometry *wg; + + DB( g_print("\n[ui-transaction] get geometry\n") ); + + //store size + wg = &PREFS->txn_wg; + gtk_window_get_size(GTK_WINDOW(widget), &wg->w, NULL); + + DB( g_print(" window: w=%d\n", wg->w) ); + + return FALSE; } -GtkWidget *create_deftransaction_window (GtkWindow *parent, gint type) +GtkWidget *create_deftransaction_window (GtkWindow *parent, gint type, gboolean postmode) { struct deftransaction_data *data; -GtkWidget *window, *content, *hbox, *mainbox, *table; -GtkWidget *alignment; +struct WinGeometry *wg; +GtkWidget *dialog, *content_area, *content_grid, *group_grid; +GtkWidget *label, *bar; +gint crow; - DB( g_print("(ui_transaction) new\n") ); + DB( g_print("\n[ui-transaction] new\n") ); data = g_malloc0(sizeof(struct deftransaction_data)); - if(!data) return NULL; - - window = gtk_dialog_new_with_buttons (NULL, + /* + dialog = gtk_dialog_new_with_buttons (_(CYA_OPERATION[data->type]), GTK_WINDOW (parent), 0, NULL, NULL); + */ + dialog = gtk_dialog_new(); + gtk_window_set_title (GTK_WINDOW(dialog), _(CYA_OPERATION[type])); + gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(parent)); + + + //store our window private data - g_object_set_data(G_OBJECT(window), "inst_data", (gpointer)data); - DB( g_print(" -> window=%p, inst_data=%p\n", window, data) ); + g_object_set_data(G_OBJECT(dialog), "inst_data", (gpointer)data); + DB( g_print(" - window=%p, inst_data=%p\n", dialog, data) ); - data->window = window; + data->window = dialog; data->type = type; - + // if you add/remove response_id also change into deftransaction_update_transfer if(type == TRANSACTION_EDIT_MODIFY) { - gtk_dialog_add_buttons (GTK_DIALOG(window), - GTK_STOCK_CANCEL, - GTK_RESPONSE_REJECT, - GTK_STOCK_OK, - GTK_RESPONSE_ACCEPT, - NULL); + gtk_dialog_add_buttons (GTK_DIALOG(dialog), + _("_Cancel"), GTK_RESPONSE_REJECT, + _("_OK"), GTK_RESPONSE_ACCEPT, + NULL); } else { - gtk_dialog_add_buttons (GTK_DIALOG(window), - GTK_STOCK_CLOSE, - GTK_RESPONSE_REJECT, - GTK_STOCK_ADD, - GTK_RESPONSE_ADD, - NULL); + if(!postmode) + { + gtk_dialog_add_buttons (GTK_DIALOG(dialog), + _("_Close"), GTK_RESPONSE_REJECT, + _("_Add & keep"), GTK_RESPONSE_ADDKEEP, + _("_Add"), GTK_RESPONSE_ADD, + NULL); + } + else + { + gtk_dialog_add_buttons (GTK_DIALOG(dialog), + _("_Close"), GTK_RESPONSE_REJECT, + _("_Post"), GTK_RESPONSE_ADD, + NULL); + } } switch(type) { case TRANSACTION_EDIT_ADD: - //homebank_window_set_icon_from_file(GTK_WINDOW (window), "ope_add.svg"); - gtk_window_set_icon_name(GTK_WINDOW (window), HB_STOCK_OPE_ADD); + gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_HB_OPE_ADD); break; case TRANSACTION_EDIT_INHERIT: - //homebank_window_set_icon_from_file(GTK_WINDOW (window), "ope_herit.svg"); - gtk_window_set_icon_name(GTK_WINDOW (window), HB_STOCK_OPE_HERIT); + gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_HB_OPE_HERIT); break; case TRANSACTION_EDIT_MODIFY: - //homebank_window_set_icon_from_file(GTK_WINDOW (window), "ope_edit.svg"); - gtk_window_set_icon_name(GTK_WINDOW (window), HB_STOCK_OPE_EDIT); + gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_HB_OPE_EDIT); break; } + //gtk_window_set_decorated(GTK_WINDOW(dialog), TRUE); //window contents - content = gtk_dialog_get_content_area(GTK_DIALOG (window)); - mainbox = gtk_vbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (content), mainbox, TRUE, TRUE, HB_MAINBOX_SPACING); - gtk_container_set_border_width (GTK_CONTAINER(mainbox), HB_MAINBOX_SPACING); - - // parameters HB_BOX_SPACING - hbox = gtk_hbox_new (TRUE, HB_HSPACE_SPACING); - gtk_box_pack_start (GTK_BOX (mainbox), hbox, FALSE, FALSE, 0); - - // block 1 - table = deftransaction_make_block1(data); - // gtk_alignment_new(xalign, yalign, xscale, yscale) - alignment = gtk_alignment_new(0.5, 0.0, 1.0, 0.0); - gtk_container_add(GTK_CONTAINER(alignment), table); - gtk_box_pack_start (GTK_BOX (hbox), alignment, TRUE, TRUE, 0); - - - // block 2 - table = deftransaction_make_block2(data); - // gtk_alignment_new(xalign, yalign, xscale, yscale) - alignment = gtk_alignment_new(0.5, 0.0, 1.0, 0.0); - gtk_container_add(GTK_CONTAINER(alignment), table); - gtk_box_pack_start (GTK_BOX (hbox), alignment, TRUE, TRUE, 0); - - //fill from - if( data->type != TRANSACTION_EDIT_MODIFY && da_archive_length() > 0) + content_area = gtk_dialog_get_content_area(GTK_DIALOG (dialog)); + + content_grid = gtk_grid_new(); + gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE); + gtk_grid_set_column_spacing (GTK_GRID (content_grid), SPACING_LARGE); + //gtk_grid_set_column_homogeneous(GTK_GRID (content_grid), TRUE); + gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL); + gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM); + gtk_container_add (GTK_CONTAINER (content_area), content_grid); + gtk_widget_show_all(content_grid); + + crow = 0; + + data->showtemplate = FALSE; + if( data->type != TRANSACTION_EDIT_MODIFY && da_archive_length() > 0 && !postmode ) { - GtkWidget *expander, *widget, *label; + GtkWidget *box, *menubutton, *image; - expander = gtk_expander_new (_("Fill in with a template")); - gtk_box_pack_start (GTK_BOX (mainbox), expander, FALSE, FALSE, 0); + data->showtemplate = TRUE; - hbox = gtk_hbox_new (FALSE, HB_BOX_SPACING); - gtk_container_add (GTK_CONTAINER (expander), hbox); + menubutton = gtk_menu_button_new (); + data->MB_template = menubutton; + box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL); + label = gtk_label_new_with_mnemonic (_("Use a _template")); + gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 0); + image = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON); + gtk_box_pack_start (GTK_BOX(box), image, FALSE, FALSE, 0); + gtk_container_add(GTK_CONTAINER(menubutton), box); + + gtk_menu_button_set_direction (GTK_MENU_BUTTON(menubutton), GTK_ARROW_DOWN ); + gtk_widget_set_halign (menubutton, GTK_ALIGN_END); + gtk_grid_attach (GTK_GRID (content_grid), menubutton, 0, crow, 1, 1); + gtk_widget_show_all(menubutton); - label = make_label(_("_Template:"), 0, 0.5); - widget = make_poparchive(label); - data->PO_arc = widget; - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0); - g_signal_connect (data->PO_arc, "changed", G_CALLBACK (deftransaction_fillfrom), NULL); + GtkWidget *template = deftransaction_template_popover_create(data); + GtkWidget *popover = create_popover (menubutton, template, GTK_POS_BOTTOM); + gtk_widget_set_size_request (popover, HB_MINWIDTH_LIST, HB_MINHEIGHT_LIST); + gtk_widget_set_vexpand (popover, TRUE); + gtk_widget_set_hexpand (popover, TRUE); + + /*gtk_widget_set_margin_start (popover, 10); + gtk_widget_set_margin_end (popover, 10); + gtk_widget_set_margin_bottom (popover, 10);*/ + + gtk_menu_button_set_popover(GTK_MENU_BUTTON(menubutton), popover); + + g_signal_connect (GTK_TREE_VIEW(data->LV_arc), "row-activated", G_CALLBACK (deftransaction_template_popover_onRowActivated), NULL); + } + crow++; + group_grid = deftransaction_make_block1(data); + //gtk_widget_set_hexpand (GTK_WIDGET(group_grid), TRUE); + gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow, 1, 1); + gtk_widget_show_all(group_grid); + + /*crow++; + group_grid = deftransaction_make_block2(data); + gtk_widget_set_hexpand (GTK_WIDGET(group_grid), TRUE); + gtk_grid_attach (GTK_GRID (content_grid), group_grid, 1, crow, 1, 1); + gtk_widget_show_all(group_grid);*/ + + crow++; + bar = gtk_info_bar_new (); + data->IB_warnsign = bar; + gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_WARNING); + label = gtk_label_new (_("Warning: amount and category sign don't match")); + gtk_box_pack_start (GTK_BOX (gtk_info_bar_get_content_area (GTK_INFO_BAR (bar))), label, TRUE, TRUE, 0); + gtk_grid_attach (GTK_GRID (content_grid), bar, 0, crow, 1, 1); + //connect all our signals - g_signal_connect (G_OBJECT (data->ST_amount), "focus-out-event", G_CALLBACK (deftransaction_amount_focusout), data); - g_signal_connect (G_OBJECT (data->BT_amount), "clicked", G_CALLBACK (deftransaction_toggleamount), NULL); + g_signal_connect (dialog, "configure-event", G_CALLBACK (deftransaction_getgeometry), (gpointer)data); + + + g_signal_connect (G_OBJECT (data->ST_amount), "focus-out-event", G_CALLBACK (deftransaction_amount_focusout), NULL); + g_signal_connect (G_OBJECT (data->ST_amount), "icon-release", G_CALLBACK (deftransaction_toggleamount), NULL); g_signal_connect (G_OBJECT (data->BT_split), "clicked", G_CALLBACK (deftransaction_button_split_cb), NULL); - g_signal_connect (data->NU_mode, "changed", G_CALLBACK (deftransaction_paymode), NULL); + g_signal_connect (data->NU_mode , "changed", G_CALLBACK (deftransaction_paymode), NULL); g_signal_connect (data->CM_cheque, "toggled", G_CALLBACK (deftransaction_paymode), NULL); - g_signal_connect (data->CM_valid, "toggled", G_CALLBACK (deftransaction_update), NULL); - g_signal_connect (data->PO_acc, "changed", G_CALLBACK (deftransaction_update_accto), NULL); + + g_signal_connect (data->PO_pay , "changed", G_CALLBACK (deftransaction_update_payee), NULL); + g_signal_connect (data->PO_acc , "changed", G_CALLBACK (deftransaction_update_accto), NULL); g_signal_connect (data->PO_accto, "changed", G_CALLBACK (deftransaction_update_transfer), NULL); + g_signal_connect (data->PO_grp , "changed", G_CALLBACK (deftransaction_update_warnsign), NULL); + //setup, init and show window deftransaction_setup(data); - gtk_window_set_default_size(GTK_WINDOW(window), 640, -1); + wg = &PREFS->txn_wg; + gtk_window_set_default_size(GTK_WINDOW(dialog), wg->w, -1); - gtk_widget_show_all (window); + //gtk_widget_show_all (dialog); + //gtk_widget_hide(data->IB_warnsign); - return window; + return dialog; }