]> Dogcows Code - chaz/homebank/blobdiff - src/ui-transaction.c
import homebank-5.2.6
[chaz/homebank] / src / ui-transaction.c
index 05784d2b64d92d647333f80cac9457902029209a..b82ea3be0241bfeb40f386a2d82f949bf0326335 100644 (file)
@@ -1,5 +1,5 @@
 /*  HomeBank -- Free, easy, personal accounting for everyone.
- *  Copyright (C) 1995-2016 Maxime DOYEN
+ *  Copyright (C) 1995-2019 Maxime DOYEN
  *
  *  This file is part of HomeBank.
  *
@@ -26,6 +26,7 @@
 #include "ui-category.h"
 #include "ui-account.h"
 #include "ui-split.h"
+#include "ui-tag.h"
 
 
 /****************************************************************************/
@@ -44,8 +45,6 @@ extern struct HomeBank *GLOBALS;
 extern struct Preferences *PREFS;
 
 
-extern gchar *CYA_TYPE[];
-
 gchar *CYA_OPERATION[] = {
        N_("Add transaction"),
        N_("Inherit transaction"),
@@ -79,15 +78,37 @@ gboolean sensitive;
        if( (data->ope->flags & (OF_SPLIT)) )
        {
                //# 1416624 empty category when split
-               ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), 0);
+               ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_cat), 0);
        }
 
        /* 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);
+       gtk_widget_set_sensitive(data->PO_cat, sensitive);
+}
+
+
+//1336928 combobox tags
+static void deftransaction_update_tags(GtkWidget *widget, gpointer user_data)
+{
+struct deftransaction_data *data;
+gchar *newtag;
+       
+       DB( g_print("\n[ui-transaction] update tags\n") );
+
+       data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
+
+       newtag = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(data->CY_tags));
+       ui_gtk_entry_tag_name_append(GTK_ENTRY(data->ST_tags), newtag);
+       g_free(newtag);
+       
+       //revert back to ----
+       g_signal_handlers_block_by_func (G_OBJECT (data->CY_tags), G_CALLBACK (deftransaction_update_tags), NULL);
+       hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(data->CY_tags), 0);
+       g_signal_handlers_unblock_by_func (G_OBJECT (data->CY_tags), G_CALLBACK (deftransaction_update_tags), NULL);
 }
 
+
 static void deftransaction_update_warnsign(GtkWidget *widget, gpointer user_data)
 {
 struct deftransaction_data *data;
@@ -100,7 +121,7 @@ Category *cat;
 
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
 
-       cat = ui_cat_comboboxentry_get(GTK_COMBO_BOX(data->PO_grp));
+       cat = ui_cat_comboboxentry_get(GTK_COMBO_BOX(data->PO_cat));
        if(cat != NULL && cat->key > 0)
        {
                amount = hb_amount_round(gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount)), 2);
@@ -112,7 +133,11 @@ Category *cat;
        }
 
        if(warning)
+       {
                gtk_widget_show_all(data->IB_warnsign);
+               //#GTK+710888: hack waiting a GTK fix 
+               gtk_widget_queue_resize (data->IB_warnsign);
+       }
        else
                gtk_widget_hide(data->IB_warnsign);
 
@@ -154,8 +179,12 @@ guint kacc, kdst;
 
                srcacc = da_acc_get(kacc);
                dstacc = da_acc_get(kdst);
-               if(srcacc->kcur != dstacc->kcur) {
-                       sensitive = FALSE;
+               if( srcacc && dstacc )
+               {
+                       if(srcacc->kcur != dstacc->kcur)
+                       {
+                               sensitive = FALSE;
+                       }
                }
        }
 
@@ -165,8 +194,8 @@ end:
        //#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);
+       gtk_dialog_set_response_sensitive(GTK_DIALOG (data->window), HB_RESPONSE_ADD, sensitive);
+       gtk_dialog_set_response_sensitive(GTK_DIALOG (data->window), HB_RESPONSE_ADDKEEP, sensitive);
 
 }
 
@@ -182,25 +211,99 @@ Payee *pay;
 
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
 
-       // 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) )
+       pay = ui_pay_comboboxentry_get(GTK_COMBO_BOX(data->PO_pay));
+       if( pay != NULL )
        {
-               pay = ui_pay_comboboxentry_get(GTK_COMBO_BOX(data->PO_pay));
-               if( pay != NULL )
+               // only set for empty category
+               // #1635053 and also paymode unset
+               // #1817278 and independently
+               cat = ui_cat_comboboxentry_get(GTK_COMBO_BOX(data->PO_cat));
+               if( (cat == NULL || cat->key == 0) )
                {
-                       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);
+                       g_signal_handlers_block_by_func (G_OBJECT (data->PO_cat), G_CALLBACK (deftransaction_update_warnsign), NULL);
+                       ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_cat), pay->kcat);
+                       g_signal_handlers_unblock_by_func (G_OBJECT (data->PO_cat), G_CALLBACK (deftransaction_update_warnsign), NULL);
+               }
 
+               paymode = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode));
+               if( (paymode == PAYMODE_NONE) )
+               {
                        gtk_combo_box_set_active(GTK_COMBO_BOX(data->NU_mode), pay->paymode);
                }
        }
 }
 
 
+static void deftransaction_set_cheque(GtkWidget *widget, gpointer user_data)
+{
+struct deftransaction_data *data;
+gdouble amount;
+gint kacc;
+Account *acc;
+guint cheque;
+gchar *cheque_str;
+
+       DB( g_print("\n[ui-transaction] set_cheque\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));
+       if( amount < 0 )
+       {
+               kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc));
+               //#1410166
+               if( kacc > 0 )
+               {
+                       acc = da_acc_get( kacc );
+                       if(acc != NULL)
+                       {
+                               DB( g_print(" - should fill for acc %d '%s'\n", kacc, acc->name) );
+
+                               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);
+                       }
+               }
+       }
+       else
+       if( amount > 0 )
+       {
+               gtk_entry_set_text(GTK_ENTRY(data->ST_info), "");
+       }
+       
+}
+
+
+
+//#1676162 update the nb digits of amount
+static void deftransaction_set_amount_nbdigits(GtkWidget *widget, guint32 kacc)
+{
+struct deftransaction_data *data;
+
+       DB( g_print("\n[ui-transaction] set_amount_nbdigits\n") );
+
+       data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
+
+       Account *srcacc = da_acc_get(kacc);
+       if(srcacc != NULL)
+       {
+       Currency *cur = da_cur_get(srcacc->kcur);
+
+               DB( g_print("- acc is %d '%s', curr=%d\n", srcacc->key, srcacc->name, srcacc->kcur) );
+
+               if(cur != NULL)
+               {
+                       DB( g_print("- set digits to '%s' %d\n", cur->name, cur->frac_digits) );
+                       gtk_spin_button_set_digits (GTK_SPIN_BUTTON(data->ST_amount), cur->frac_digits);
+               }
+               else
+                       gtk_spin_button_set_digits (GTK_SPIN_BUTTON(data->ST_amount), 2);
+               
+       }
+}
+
+
 static void deftransaction_update_accto(GtkWidget *widget, gpointer user_data)
 {
 struct deftransaction_data *data;
@@ -214,6 +317,7 @@ guint kacc;
 
        DB( g_print(" acc is %d\n", kacc) );
 
+       deftransaction_set_amount_nbdigits(widget, 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);
@@ -261,8 +365,8 @@ gchar *tagstr, *txt;
        //g_object_set(GTK_DATE_ENTRY(data->PO_date), "date", (guint32)entry->ope_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);
+       txt = (entry->memo != NULL) ? entry->memo : "";
+       gtk_entry_set_text(GTK_ENTRY(data->ST_memo), 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);
 
@@ -270,28 +374,35 @@ gchar *tagstr, *txt;
 
        txt = (entry->info != NULL) ? entry->info : "";
        gtk_entry_set_text(GTK_ENTRY(data->ST_info), txt);
-       ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), entry->kcat);
+       ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_cat), entry->kcat);
        ui_pay_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_pay), entry->kpay);
 
-       tagstr = transaction_tags_tostring(entry);
-
+       tagstr = tags_tostring(entry->tags);
        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 );
+       hbtk_radio_button_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
+       //let's place it at the end to avoid missvalue on the trigger function
        g_signal_handlers_block_by_func (G_OBJECT (data->PO_acc), G_CALLBACK (deftransaction_update_accto), NULL);
+       if( entry->kacc > 0 )
+       {
+               ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_acc), entry->kacc);
+       }       
+       else  //1829007 set first item if only 1 account
+       {
+       GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(data->PO_acc));
 
-       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);
-       
+               if(gtk_tree_model_iter_n_children(model, NULL) == 1)
+                       gtk_combo_box_set_active(GTK_COMBO_BOX(data->PO_acc), 0);
+       }
        g_signal_handlers_unblock_by_func (G_OBJECT (data->PO_acc), G_CALLBACK (deftransaction_update_accto), NULL);
 
+       ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_accto), entry->kxferacc);
+
        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)) ) );
@@ -319,16 +430,31 @@ gint active;
        //g_object_get(GTK_DATE_ENTRY(data->PO_date), "date", entry->ope_Date);
 
        //free any previous string
-       if(     entry->wording )
+       if(     entry->memo )
        {
-               g_free(entry->wording);
-               entry->wording = NULL;
+               g_free(entry->memo);
+               entry->memo = NULL;
        }
-       txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_word));
+       txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_memo));
        // ignore if entry is empty
        if (txt && *txt)
        {
-               entry->wording = g_strdup(txt);
+               entry->memo = g_strdup(txt);
+               
+               //#1716182 add into memo autocomplete
+               if( da_transaction_insert_memo(entry) )
+               {
+               GtkEntryCompletion *completion;
+               GtkTreeModel *model;
+               GtkTreeIter  iter;
+
+                       completion = gtk_entry_get_completion (GTK_ENTRY(data->ST_memo));
+                       model = gtk_entry_completion_get_model (completion);
+                       gtk_list_store_insert_with_values(GTK_LIST_STORE(model), &iter, -1,
+                               0, txt, 
+                               -1);
+               }
+
        }
 
        value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
@@ -358,7 +484,7 @@ gint active;
        }
 
        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->kcat     = ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data->PO_cat));
        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));
        entry->kxferacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_accto));
@@ -366,9 +492,10 @@ gint active;
        /* tags */
        txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_tags));
        DB( g_print(" - tags: '%s'\n", txt) );
-       transaction_tags_parse(entry, txt);
+       g_free(entry->tags);
+       entry->tags = tags_parse(txt);
 
-       entry->status = radio_get_active(GTK_CONTAINER(data->RA_status));
+       entry->status = hbtk_radio_button_get_active(GTK_CONTAINER(data->RA_status));
 
        //#1615245: moved here, after get combo entry key
        if( entry->paymode != PAYMODE_INTXFER )
@@ -397,8 +524,6 @@ gint active;
 }
 
 
-
-
 static gboolean deftransaction_amount_focusout(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
 {
 struct deftransaction_data *data;
@@ -409,18 +534,26 @@ gdouble amount;
 
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
 
-       paymode    = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode));
-
-       // for internal transfer add, amount must be expense by default
-       if( paymode == PAYMODE_INTXFER && data->type == TRANSACTION_EDIT_ADD )
+       //#1681532 not reproduced, so prevent
+       if( GTK_IS_COMBO_BOX(data->NU_mode) )
        {
+               paymode    = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode));
                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);
-       }
 
-       deftransaction_update_warnsign(widget, NULL);
-       
+               // for internal transfer add, amount must be expense by default
+               if( paymode == PAYMODE_INTXFER && data->type == TRANSACTION_EDIT_ADD )
+               {
+                       if(amount > 0)
+                               gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), amount *= -1);
+               }
+
+               if( paymode == PAYMODE_CHECK )
+               {
+                       deftransaction_set_cheque(widget, NULL);
+               }
+
+               deftransaction_update_warnsign(widget, NULL);
+       }
        return FALSE;
 }
 
@@ -446,11 +579,11 @@ gdouble value;
        
                if( data->ope->flags & OF_SPLIT )
                {
-                       count = da_splits_count(data->ope->splits);
+                       count = da_splits_length(data->ope->splits);
                        DB( g_print("- count = %d\n", count) );
                        for(i=0;i<count;i++)
                        {
-                               split = data->ope->splits[i];
+                               split = da_splits_get(data->ope->splits, i);
                                split->amount *= -1;
                        }
                }
@@ -475,11 +608,11 @@ gint nbsplit;
        ope = data->ope;
 
        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);
+       ui_split_dialog(data->window, &ope->splits, amount, &deftransaction_set_amount_from_split);
 
        //eval split to garantee disabled items
        ope->flags &= ~(OF_SPLIT);
-       nbsplit = da_splits_count(ope->splits);
+       nbsplit = da_splits_length(ope->splits);
        if(nbsplit > 0)
                data->ope->flags |= (OF_SPLIT);
 
@@ -487,11 +620,6 @@ gint nbsplit;
 }
 
 
-
-
-/*
-**
-*/
 static void deftransaction_paymode(GtkWidget *widget, gpointer user_data)
 {
 struct deftransaction_data *data;
@@ -509,36 +637,9 @@ gboolean sensitive;
        /* todo: prefill the cheque number ? */
        if( data->type != TRANSACTION_EDIT_MODIFY )
        {
-       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)) ) );
-
                if(payment == PAYMODE_CHECK)
                {
-                       if(expense == TRUE)
-                       {
-                       Account *acc;
-                       gint active = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc));
-                       guint cheque;
-                       gchar *cheque_str;
-
-                               DB( g_print(" - should fill cheque number for account %d\n", active) );
-
-                               //#1410166
-                               if( active > 0 )
-                               {
-                                       acc = da_acc_get( active );
-                                       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);
-                                       }
-                               }
-                       }
+                       deftransaction_set_cheque(widget, user_data);
                }
        }
 
@@ -589,14 +690,18 @@ gboolean sensitive;
 
 
 /*
-** called from outside
+** called from outside (register/report detail)
 */
 gint deftransaction_external_edit(GtkWindow *parent, Transaction *old_txn, Transaction *new_txn)
 {
 GtkWidget *dialog;
 gboolean result;
+Account *acc;
 
-       dialog = create_deftransaction_window(GTK_WINDOW(parent), TRANSACTION_EDIT_MODIFY, FALSE);
+       DB( g_print("\n[ui-transaction] external edit (from out)\n") );
+
+
+       dialog = create_deftransaction_window(GTK_WINDOW(parent), TRANSACTION_EDIT_MODIFY, FALSE, 0);
        deftransaction_set_transaction(dialog, new_txn);
 
        result = gtk_dialog_run (GTK_DIALOG (dialog));
@@ -607,86 +712,85 @@ gboolean result;
                account_balances_sub(old_txn);
                account_balances_add(new_txn);
 
+               /* update account flag */
+               acc = da_acc_get(new_txn->kacc);
+               if(acc)
+                       acc->flags |= AF_CHANGED;
+               
+               /* ok different case here
+
+                       * new is intxfer
+                               a) old was not
+                                       check for existing child or add it
+                               b) old was
+                                       sync (acc change is inside now)
+
+                       * new is not intxfer
+                               a) old was
+                                       manage break intxfer
+
+                       * always manage account change
+
+               */
+
                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) );
-
-                       if(new_txn->kxfer > 0)  //1) search a strong linked child
+                       if( old_txn->paymode != PAYMODE_INTXFER )
                        {
-                       Transaction *ltxn;
-
-                               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") );
-                               }
+                               // this call can popup a user dialog to choose
+                               transaction_xfer_search_or_add_child(GTK_WINDOW(dialog), new_txn, new_txn->kxferacc);
                        }
                        else
                        {
-                               //2) any standard transaction that match ?
-                               transaction_xfer_search_or_add_child(GTK_WINDOW(dialog), new_txn, FALSE);
+                       Transaction *child;
+
+                               //use old in case of dst_acc change
+                               child = transaction_xfer_child_strong_get(old_txn);
+                               //#1584342 was faultly old_txn
+                               transaction_xfer_child_sync(new_txn, child);
                        }
                }
-
-               //#1250061 : manage ability to break an internal xfer
-               if(old_txn->paymode == PAYMODE_INTXFER && new_txn->paymode != PAYMODE_INTXFER)
+               else
                {
-               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
+                       //#1250061 : manage ability to break an internal xfer
+                       if(old_txn->paymode == PAYMODE_INTXFER)
                        {
-                               new_txn->paymode = PAYMODE_INTXFER;
-                       }
-               }
-       }
+                       gint break_result;
+               
+                               DB( g_print(" - should break internal xfer\n") );
+
+                               break_result = ui_dialog_msg_confirm_alert(
+                                               GTK_WINDOW(parent),
+                                               NULL,
+                                               _("Do you want to break the internal transfer ?\n\n"
+                                                 "Proceeding will delete the target transaction."),
+                                               _("_Break")
+                                       );
        
-       //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;
+                               if(break_result == GTK_RESPONSE_OK)
+                               {
+                                       //we must use old_txn to ensure get the child
+                                       //#1663789 but we must clean new as well
+                                       transaction_xfer_remove_child(old_txn);
+                                       new_txn->kxfer = 0;
+                                       new_txn->kxferacc = 0;
+                               }
+                               else    //force paymode to internal xfer
+                               {
+                                       new_txn->paymode = PAYMODE_INTXFER;
+                               }
+                       }
                }
-               else
+
+               //1638035: manage account change
+               if( old_txn->kacc != new_txn->kacc )
                {
                        //todo: maybe we should restrict this also to same currency account
-                       account_balances_sub(new_txn);
+                       //=> no pb for normal, and intxfer is restricted by ui (in theory)
                        transaction_acc_move(new_txn, old_txn->kacc, new_txn->kacc);
-                       account_balances_add(new_txn);
                }
        }
        
-       
        deftransaction_dispose(dialog, NULL);
        gtk_widget_destroy (dialog);
 
@@ -698,7 +802,6 @@ void deftransaction_set_transaction(GtkWidget *widget, Transaction *ope)
 {
 struct deftransaction_data *data;
 
-
        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");
@@ -717,25 +820,13 @@ struct deftransaction_data *data;
 }
 
 
-void deftransaction_dispose(GtkWidget *widget, gpointer user_data)
-{
-struct deftransaction_data *data;
-
-       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");
-
-       g_free(data);
-}
-
-
 static void deftransaction_setup(struct deftransaction_data *data)
 {
 
        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_cat_comboboxentry_populate(GTK_COMBO_BOX(data->PO_cat), 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);
 
@@ -744,6 +835,9 @@ static void deftransaction_setup(struct deftransaction_data *data)
                deftransaction_template_popover_populate (data, GLOBALS->arc_list);
                gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(data->modelfilter));
        }
+
+       ui_tag_combobox_populate(GTK_COMBO_BOX_TEXT(data->CY_tags));
+
 }
 
 static GtkWidget *
@@ -751,20 +845,19 @@ create_popover (GtkWidget       *parent,
                 GtkWidget       *child,
                 GtkPositionType  pos)
 {
-  GtkWidget *popover;
+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);
+       popover = gtk_popover_new (parent);
+       gtk_popover_set_position (GTK_POPOVER (popover), pos);
+       gtk_container_add (GTK_CONTAINER (popover), child);
+       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);*/
+       gtk_widget_set_margin_start (child, SPACING_POPOVER);
+       gtk_widget_set_margin_end (child, SPACING_POPOVER);
+       gtk_widget_set_margin_top (child, SPACING_POPOVER);
+       gtk_widget_set_margin_bottom (child, SPACING_POPOVER);
 
-  return popover;
+       return popover;
 }
 
 
@@ -789,8 +882,6 @@ GtkTreeIter                  iter;
 
                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") );
 
@@ -822,7 +913,7 @@ GList *list;
                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,
+                       LST_DSPTPL_NAME, entry->memo,
                         -1);
 
                //DB( g_print(" populate_treeview: %d %08x\n", i, list->data) );
@@ -850,8 +941,10 @@ Archive *entry;
 gchar *str;
 gboolean visible = TRUE;
 gboolean showsched;
-       
-       showsched = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data->CM_showsched));
+gboolean showallacc;
+
+       showsched  = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data->CM_showsched));
+       showallacc = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data->CM_showallacc));
 
        gchar *needle = g_ascii_strdown(gtk_entry_get_text(GTK_ENTRY(data->ST_search)), -1);
 
@@ -861,22 +954,27 @@ gboolean showsched;
 
        if( entry )
        {
-               if( (entry->flags & OF_AUTO) && !showsched)
-               {
+               if( !showallacc && (data->kacc != 0) && (entry->kacc != data->kacc) )
                        visible = FALSE;
-               }
                else
                {
-                       gchar *haystack = g_ascii_strdown(str, -1);
-
-                       if (str && g_strrstr (haystack, needle) == NULL )
+                       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) );
+                               DB( g_print("filter: '%s' '%s' %d\n", str, needle, visible) );
 
-                       g_free(haystack);
+                               g_free(haystack);
+                       }
                }
        }
        g_free(needle);
@@ -895,7 +993,7 @@ GtkWidget *box, *widget, *scrollwin, *treeview;
 
        box = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
 
-       widget = make_search(NULL);
+       widget = make_search();
        data->ST_search = widget;
        gtk_box_pack_start (GTK_BOX(box), widget, FALSE, FALSE, 0);
 
@@ -936,134 +1034,60 @@ GtkWidget *box, *widget, *scrollwin, *treeview;
        data->CM_showsched = widget;
        gtk_box_pack_start (GTK_BOX(box), widget, FALSE, FALSE, 0);
 
+       widget = gtk_check_button_new_with_mnemonic(_("Show _all accounts"));
+       data->CM_showallacc = widget;
+       gtk_box_pack_start (GTK_BOX(box), widget, FALSE, FALSE, 0);
+
        gtk_widget_show_all (box);
 
+       //#1796564 hide show all template if no account
+       gtk_widget_set_visible (data->CM_showallacc, data->kacc == 0 ? FALSE : TRUE);
+       
        //signals
        g_signal_connect (data->CM_showsched, "toggled", G_CALLBACK (deftransaction_template_popover_refilter), data);
+       g_signal_connect (data->CM_showallacc, "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 *group_grid, *hbox, *label, *widget, *image;
-gint row;
-
-       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_widget(_("_Date:"));
-       gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
-       widget = gtk_date_entry_new();
-       data->PO_date = widget;
-       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_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_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, _("Transaction splits"));
 
-       row++;
-       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_widget_set_halign (widget, GTK_ALIGN_START);
-       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
+static GtkWidget *deftransaction_create_template(struct deftransaction_data *data)
+{
+GtkWidget *box, *menubutton, *image, *label;
 
-       row++;
-       widget = gtk_check_button_new_with_mnemonic(_("Of notebook _2"));
-       data->CM_cheque = widget;
-       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
+       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);
 
-       row++;
-       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_widget_set_hexpand (widget, TRUE);
-       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
+       gtk_menu_button_set_direction (GTK_MENU_BUTTON(menubutton), GTK_ARROW_DOWN );
+       gtk_widget_set_halign (menubutton, GTK_ALIGN_END);
+       gtk_widget_set_hexpand (menubutton, TRUE);
+       gtk_widget_show_all(menubutton);
 
-       row++;
-       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_widget_set_hexpand (widget, TRUE);
-       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
 
-       row++;
-       label = make_label_widget(_("To acc_ount:"));
-       data->LB_accto = label;
-       gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
-       widget = ui_acc_comboboxentry_new(label);
-       data->PO_accto = widget;
-       gtk_widget_set_hexpand (widget, TRUE);
-       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
+       GtkWidget *template = deftransaction_template_popover_create(data);
+       GtkWidget *popover = create_popover (menubutton, template, GTK_POS_BOTTOM);
+       gtk_widget_set_size_request (popover, 2*HB_MINWIDTH_LIST, HB_MINHEIGHT_LIST);
+       //gtk_widget_set_vexpand (popover, TRUE);
+       //gtk_widget_set_hexpand (popover, TRUE);
 
-       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_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_margin_start (popover, 10);
+       gtk_widget_set_margin_end (popover, 10);
+       gtk_widget_set_margin_bottom (popover, 10);*/
 
-       row++;
-       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_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_menu_button_set_popover(GTK_MENU_BUTTON(menubutton), popover);
 
-       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);
+       g_signal_connect (GTK_TREE_VIEW(data->LV_arc), "row-activated", G_CALLBACK (deftransaction_template_popover_onRowActivated), NULL);
 
-       row++;
-       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_widget_set_hexpand (widget, TRUE);
-       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
 
-       row++;
-       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_widget_set_hexpand (widget, TRUE);
-       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
-
-       return group_grid;
+       return menubutton;
 }
 
 
@@ -1084,13 +1108,28 @@ struct WinGeometry *wg;
 }
 
 
-GtkWidget *create_deftransaction_window (GtkWindow *parent, gint type, gboolean postmode)
+void deftransaction_dispose(GtkWidget *widget, gpointer user_data)
+{
+struct deftransaction_data *data;
+
+       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");
+
+       deftransaction_getgeometry(data->window, NULL, data);
+       
+       g_free(data);
+}
+
+
+GtkWidget *create_deftransaction_window (GtkWindow *parent, gint type, gboolean postmode, guint32 kacc)
 {
 struct deftransaction_data *data;
 struct WinGeometry *wg;
-GtkWidget *dialog, *content_area, *content_grid, *group_grid;
-GtkWidget *label, *bar;
-gint crow;
+GtkWidget *dialog, *content, *mainvbox;
+GtkWidget *bar;
+GtkWidget *group_grid, *hbox, *label, *widget;
+gint row;
 
        DB( g_print("\n[ui-transaction] new\n") );
 
@@ -1116,6 +1155,7 @@ gint crow;
 
        data->window = dialog;
        data->type = type;
+       data->kacc = kacc;
 
        // if you add/remove response_id also change into deftransaction_update_transfer
        if(type == TRANSACTION_EDIT_MODIFY)
@@ -1131,15 +1171,15 @@ gint crow;
                {
                        gtk_dialog_add_buttons (GTK_DIALOG(dialog),
                                _("_Close"), GTK_RESPONSE_REJECT,
-                               _("_Add & keep"), GTK_RESPONSE_ADDKEEP,
-                               _("_Add"), GTK_RESPONSE_ADD,
+                               _("_Add & keep"), HB_RESPONSE_ADDKEEP,
+                               _("_Add"), HB_RESPONSE_ADD,
                                NULL);
                }
                else
                {
                        gtk_dialog_add_buttons (GTK_DIALOG(dialog),
                                _("_Close"), GTK_RESPONSE_REJECT,
-                               _("_Post"), GTK_RESPONSE_ADD,
+                               _("_Post"), HB_RESPONSE_ADD,
                                NULL);
                }
        }
@@ -1159,83 +1199,165 @@ gint crow;
 
        //gtk_window_set_decorated(GTK_WINDOW(dialog), TRUE);
 
-       //window contents
-       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;
+       //dialog contents
+       content = gtk_dialog_get_content_area(GTK_DIALOG (dialog));
+       mainvbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
+       gtk_box_pack_start (GTK_BOX (content), mainvbox, TRUE, TRUE, 0);
+       gtk_container_set_border_width (GTK_CONTAINER(mainvbox), SPACING_MEDIUM);
+
+       //group main
+       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);
+       gtk_box_pack_start (GTK_BOX (mainvbox), group_grid, FALSE, FALSE, 0);
+
+       row=0;
+       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_widget_set_halign(widget, GTK_ALIGN_START);
+       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
+       gtk_widget_set_tooltip_text(widget, _("Date accepted here are:\nday,\nday/month or month/day,\nand complete date into your locale"));
 
        data->showtemplate = FALSE;
        if( data->type != TRANSACTION_EDIT_MODIFY && da_archive_length() > 0 && !postmode )
        {
-       GtkWidget *box, *menubutton, *image;
-
                data->showtemplate = TRUE;
+               widget = deftransaction_create_template(data);
+               gtk_widget_set_halign (widget, GTK_ALIGN_END);
+               gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
+       }
 
-               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);
+       row++;
+       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_widget_set_hexpand(hbox, TRUE);
+       gtk_grid_attach (GTK_GRID (group_grid), hbox, 1, row, 1, 1);
 
-               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);
+               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);
+
+               widget = make_image_button(ICONNAME_HB_BUTTON_SPLIT, _("Transaction splits"));
+               data->BT_split = widget;
+               gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
 
 
-               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);
+       row++;
+       label = make_label_widget(_("A_ccount:"));
+       data->LB_accfrom = label;
+       gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
+       widget = ui_acc_comboboxentry_new(label);
+       data->PO_acc = widget;
+       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
 
-               /*gtk_widget_set_margin_start (popover, 10);
-               gtk_widget_set_margin_end (popover, 10);
-               gtk_widget_set_margin_bottom (popover, 10);*/
+       row++;
+       label = make_label_widget(_("To acc_ount:"));
+       data->LB_accto = label;
+       gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
+       widget = ui_acc_comboboxentry_new(label);
+       data->PO_accto = widget;
+       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
 
-               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);
+       row++;
+       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_widget_set_halign(widget, GTK_ALIGN_START);
+       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
+
+       gtk_widget_set_margin_top(label, SPACING_SMALL);
+       gtk_widget_set_margin_top(widget, SPACING_SMALL);
+
        
-       }
+       widget = gtk_check_button_new_with_mnemonic(_("Of notebook _2"));
+       data->CM_cheque = widget;
+       gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
+
+       row++;
+       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_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
+
+       gtk_widget_set_margin_bottom(label, SPACING_SMALL);
+       gtk_widget_set_margin_bottom(widget, SPACING_SMALL);
+
+
+       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_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
+       gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available"));
+
+       row++;
+       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_cat = widget;
+       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
+       gtk_widget_set_tooltip_text(widget, _("Autocompletion and direct seizure\nis available"));
+
+       gtk_widget_set_margin_bottom(label, SPACING_SMALL);
+       gtk_widget_set_margin_bottom(widget, SPACING_SMALL);
 
-       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);*/
+       row++;
+       label = make_label_widget(_("_Status:"));
+       gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
+       widget = hbtk_radio_button_new (CYA_TXN_STATUS, TRUE);
+       data->RA_status = widget;
+       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
+
+       row++;
+       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_memo = widget;
+       gtk_widget_set_hexpand(widget, TRUE);
+       gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
 
-       crow++;
+       row++;
+       label = make_label_widget(_("Ta_gs:"));
+       gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
+       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+       gtk_widget_set_hexpand(hbox, TRUE);
+       gtk_grid_attach (GTK_GRID (group_grid), hbox, 1, row, 2, 1);
+
+               widget = make_string(label);
+               data->ST_tags = widget;
+               gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
+
+               widget = ui_tag_combobox_new(NULL);
+               data->CY_tags = widget;
+               gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
+       
+       gtk_widget_show_all(mainvbox);
+       
        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);
+       gtk_box_pack_start (GTK_BOX (gtk_info_bar_get_content_area (GTK_INFO_BAR (bar))), label, TRUE, TRUE, 0);
+       gtk_box_pack_start (GTK_BOX (mainvbox), bar, TRUE, TRUE, 0);
 
        
        //connect all our signals
-       g_signal_connect (dialog, "configure-event", G_CALLBACK (deftransaction_getgeometry), (gpointer)data);
+       //g_signal_connect (dialog, "configure-event", G_CALLBACK (deftransaction_getgeometry), (gpointer)data);
 
 
+       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 (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);
@@ -1244,10 +1366,9 @@ gint crow;
        g_signal_connect (data->CM_cheque, "toggled", G_CALLBACK (deftransaction_paymode), 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);
+       g_signal_connect (data->PO_cat  , "changed", G_CALLBACK (deftransaction_update_warnsign), NULL);
 
+       g_signal_connect (data->CY_tags , "changed", G_CALLBACK (deftransaction_update_tags), NULL);
 
        //setup, init and show window
        deftransaction_setup(data);
This page took 0.053317 seconds and 4 git commands to generate.